From 061076aea92a1d29058f17505b820e27bda7d846 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 17 Jan 2017 12:54:36 -0600 Subject: Support scionlib version detection (#2818) --- lib/spack/spack/test/url_parse.py | 5 +++++ lib/spack/spack/url.py | 3 +++ 2 files changed, 8 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index c4718d56b8..8913de94d0 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -364,3 +364,8 @@ class UrlParseTest(unittest.TestCase): self.check( 'luaposix', '33.4.0', 'https://github.com/luaposix/luaposix/archive/release-v33.4.0.tar.gz') + + def test_sionlib_version(self): + self.check( + 'sionlib', '1.7.1', + 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index a1eec6067e..93c443fde8 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -213,7 +213,9 @@ def parse_version_offset(path, debug=False): # Search dotted versions: # e.g., https://gitlab.kitware.com/vtk/vtk/repository/archive.tar.bz2?ref=v7.0.0 # e.g., https://example.com/org/repo/repository/archive.tar.bz2?ref=SomePrefix-2.1.1 + # e.g., http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1 (r'\?ref=(?:.*-|v)*((\d+\.)+\d+).*$', suffix), + (r'\?version=((\d+\.)+\d+)', suffix), # e.g. boost_1_39_0 (r'((\d+_)+\d+)$', stem), @@ -304,6 +306,7 @@ def parse_name_offset(path, v=None, debug=False): (r'/([^/]+)[_.-](bin|dist|stable|src|sources)[_.-]%s' % v, path), (r'github.com/[^/]+/([^/]+)/archive', path), (r'[^/]+/([^/]+)/repository/archive', path), # gitlab + (r'([^/]+)/download.php', path), (r'([^/]+)[_.-]v?%s' % v, stem), # prefer the stem (r'([^/]+)%s' % v, stem), -- cgit v1.2.3-70-g09d2 From a1f7006400f693519b9bdb9dc962e442478f0791 Mon Sep 17 00:00:00 2001 From: Jason Sarich Date: Tue, 17 Jan 2017 16:23:32 -0600 Subject: check if node is already deleted (#2799) * check if node is already deleted * fix variable name --- lib/spack/spack/spec.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index e34f2b799d..6cf80754a1 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1388,8 +1388,9 @@ class Spec(object): dependent = dep_spec.parent deptypes = dep_spec.deptypes - # remove self from all dependents. - del dependent._dependencies[self.name] + # remove self from all dependents, unless it is already removed + if self.name in dependent._dependencies: + del dependent._dependencies[self.name] # add the replacement, unless it is already a dep of dependent. if concrete.name not in dependent._dependencies: -- cgit v1.2.3-70-g09d2 From f0f230d480004161c8f052d2ccf334a4f5ce25f8 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 17 Jan 2017 19:42:45 -0600 Subject: Allow spack create to detect packages that need to run autoreconf (#2848) --- lib/spack/spack/cmd/create.py | 62 ++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 2575229581..19128e3513 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -136,7 +136,8 @@ class PackageTemplate(object): class AutotoolsPackageTemplate(PackageTemplate): - """Provides appropriate overrides for Autotools-based packages""" + """Provides appropriate overrides for Autotools-based packages + that *do* come with a ``configure`` script""" base_class_name = 'AutotoolsPackage' @@ -152,6 +153,33 @@ class AutotoolsPackageTemplate(PackageTemplate): return args""" +class AutoreconfPackageTemplate(PackageTemplate): + """Provides appropriate overrides for Autotools-based packages + that *do not* come with a ``configure`` script""" + + base_class_name = 'AutotoolsPackage' + + dependencies = """\ + depends_on('autoconf', type='build') + depends_on('automake', type='build') + depends_on('libtool', type='build') + depends_on('m4', type='build') + + # FIXME: Add additional dependencies if required. + # depends_on('foo')""" + + body = """\ + def autoreconf(self, spec, prefix): + # FIXME: Modify the autoreconf method as necessary + autoreconf('--install', '--verbose', '--force') + + def configure_args(self): + # FIXME: Add arguments other than --prefix + # FIXME: If not needed delete this function + args = [] + return args""" + + class CMakePackageTemplate(PackageTemplate): """Provides appropriate overrides for CMake-based packages""" @@ -269,14 +297,15 @@ class OctavePackageTemplate(PackageTemplate): templates = { - 'autotools': AutotoolsPackageTemplate, - 'cmake': CMakePackageTemplate, - 'scons': SconsPackageTemplate, - 'bazel': BazelPackageTemplate, - 'python': PythonPackageTemplate, - 'r': RPackageTemplate, - 'octave': OctavePackageTemplate, - 'generic': PackageTemplate + 'autotools': AutotoolsPackageTemplate, + 'autoreconf': AutoreconfPackageTemplate, + 'cmake': CMakePackageTemplate, + 'scons': SconsPackageTemplate, + 'bazel': BazelPackageTemplate, + 'python': PythonPackageTemplate, + 'r': RPackageTemplate, + 'octave': OctavePackageTemplate, + 'generic': PackageTemplate } @@ -326,12 +355,14 @@ class BuildSystemGuesser: # uses. If the regular expression matches a file contained in the # archive, the corresponding build system is assumed. clues = [ - (r'/configure$', 'autotools'), - (r'/CMakeLists.txt$', 'cmake'), - (r'/SConstruct$', 'scons'), - (r'/setup.py$', 'python'), - (r'/NAMESPACE$', 'r'), - (r'/WORKSPACE$', 'bazel') + (r'/configure$', 'autotools'), + (r'/configure.(in|ac)$', 'autoreconf'), + (r'/Makefile.am$', 'autoreconf'), + (r'/CMakeLists.txt$', 'cmake'), + (r'/SConstruct$', 'scons'), + (r'/setup.py$', 'python'), + (r'/NAMESPACE$', 'r'), + (r'/WORKSPACE$', 'bazel') ] # Peek inside the compressed file. @@ -356,6 +387,7 @@ class BuildSystemGuesser: for pattern, bs in clues: if any(re.search(pattern, l) for l in lines): build_system = bs + break self.build_system = build_system -- cgit v1.2.3-70-g09d2 From 02f92fc7f8a69618fcf91282222b8316ace9c4ae Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 18 Jan 2017 12:34:09 -0600 Subject: Massive conversion from Package to AutotoolsPackage (#2845) * Massive conversion from Package to AutotoolsPackage * Forgot to convert p4est to AutotoolsPackage * Fix typo * Fix broken link in docs --- lib/spack/docs/packaging_guide.rst | 11 ++++++++--- .../repos/builtin/packages/applewmproto/package.py | 7 +------ var/spack/repos/builtin/packages/appres/package.py | 8 +------- .../repos/builtin/packages/asciidoc/package.py | 8 +------- var/spack/repos/builtin/packages/atk/package.py | 7 +------ .../repos/builtin/packages/bdftopcf/package.py | 8 +------- .../repos/builtin/packages/beforelight/package.py | 8 +------- var/spack/repos/builtin/packages/bertini/package.py | 8 +------- .../repos/builtin/packages/bigreqsproto/package.py | 7 +------ var/spack/repos/builtin/packages/bison/package.py | 8 +------- var/spack/repos/builtin/packages/bitmap/package.py | 8 +------- var/spack/repos/builtin/packages/cddlib/package.py | 7 +------ var/spack/repos/builtin/packages/cfitsio/package.py | 7 +------ .../repos/builtin/packages/cityhash/package.py | 10 +++------- var/spack/repos/builtin/packages/compiz/package.py | 8 +------- .../builtin/packages/compositeproto/package.py | 7 +------ .../repos/builtin/packages/constype/package.py | 8 +------- .../repos/builtin/packages/coreutils/package.py | 7 +------ var/spack/repos/builtin/packages/czmq/package.py | 21 ++++++++------------- .../repos/builtin/packages/damageproto/package.py | 7 +------ .../repos/builtin/packages/datamash/package.py | 7 +------ .../repos/builtin/packages/dmxproto/package.py | 7 +------ .../repos/builtin/packages/dri2proto/package.py | 7 +------ .../repos/builtin/packages/dri3proto/package.py | 7 +------ var/spack/repos/builtin/packages/editres/package.py | 8 +------- .../repos/builtin/packages/elfutils/package.py | 9 ++++----- var/spack/repos/builtin/packages/emacs/package.py | 9 +++------ var/spack/repos/builtin/packages/evieext/package.py | 7 +------ .../builtin/packages/exuberant-ctags/package.py | 8 +------- .../repos/builtin/packages/fastx-toolkit/package.py | 8 +------- var/spack/repos/builtin/packages/fish/package.py | 8 +------- .../repos/builtin/packages/fixesproto/package.py | 7 +------ .../repos/builtin/packages/font-util/package.py | 8 +------- .../builtin/packages/fontcacheproto/package.py | 7 +------ .../repos/builtin/packages/fontsproto/package.py | 7 +------ .../repos/builtin/packages/fonttosfnt/package.py | 8 +------- .../repos/builtin/packages/fslsfonts/package.py | 8 +------- var/spack/repos/builtin/packages/fstobdf/package.py | 8 +------- .../repos/builtin/packages/gccmakedep/package.py | 8 +------- var/spack/repos/builtin/packages/gconf/package.py | 8 +------- .../repos/builtin/packages/gdk-pixbuf/package.py | 7 +------ var/spack/repos/builtin/packages/giflib/package.py | 8 +------- var/spack/repos/builtin/packages/glib/package.py | 21 ++++++++++----------- .../builtin/packages/globus-toolkit/package.py | 7 +------ var/spack/repos/builtin/packages/glog/package.py | 7 +------ var/spack/repos/builtin/packages/glproto/package.py | 7 +------ var/spack/repos/builtin/packages/gnutls/package.py | 7 +------ var/spack/repos/builtin/packages/gperf/package.py | 9 ++------- .../repos/builtin/packages/gperftools/package.py | 7 +------ var/spack/repos/builtin/packages/grandr/package.py | 9 +-------- var/spack/repos/builtin/packages/gtkplus/package.py | 7 +------ var/spack/repos/builtin/packages/gts/package.py | 7 +------ .../repos/builtin/packages/harfbuzz/package.py | 7 +------ var/spack/repos/builtin/packages/heppdt/package.py | 8 +------- var/spack/repos/builtin/packages/hsakmt/package.py | 8 +------- var/spack/repos/builtin/packages/htop/package.py | 7 +------ var/spack/repos/builtin/packages/htslib/package.py | 7 +------ var/spack/repos/builtin/packages/hwloc/package.py | 8 +------- var/spack/repos/builtin/packages/hydra/package.py | 8 +------- var/spack/repos/builtin/packages/iceauth/package.py | 8 +------- var/spack/repos/builtin/packages/ico/package.py | 8 +------- var/spack/repos/builtin/packages/ilmbase/package.py | 6 +----- var/spack/repos/builtin/packages/imake/package.py | 8 +------- .../repos/builtin/packages/inputproto/package.py | 7 +------ .../builtin/packages/intel-gpu-tools/package.py | 9 +-------- var/spack/repos/builtin/packages/itstool/package.py | 7 +------ var/spack/repos/builtin/packages/jpeg/package.py | 9 +-------- var/spack/repos/builtin/packages/judy/package.py | 9 ++------- var/spack/repos/builtin/packages/kbproto/package.py | 7 +------ .../repos/builtin/packages/lbxproxy/package.py | 8 +------- var/spack/repos/builtin/packages/lcms/package.py | 7 +------ .../repos/builtin/packages/libapplewm/package.py | 14 ++++---------- .../repos/builtin/packages/libarchive/package.py | 11 +++-------- var/spack/repos/builtin/packages/libcerf/package.py | 8 +++----- .../repos/builtin/packages/libcircle/package.py | 7 +------ var/spack/repos/builtin/packages/libdmx/package.py | 8 +------- var/spack/repos/builtin/packages/libedit/package.py | 8 +------- .../repos/builtin/packages/libepoxy/package.py | 7 +------ .../repos/builtin/packages/libevent/package.py | 8 +++----- .../repos/builtin/packages/libfontenc/package.py | 8 +------- var/spack/repos/builtin/packages/libfs/package.py | 8 +------- .../repos/builtin/packages/libgcrypt/package.py | 7 +------ var/spack/repos/builtin/packages/libgd/package.py | 7 ++----- .../repos/builtin/packages/libgpg-error/package.py | 7 +------ .../repos/builtin/packages/libgtextutils/package.py | 8 +------- var/spack/repos/builtin/packages/libhio/package.py | 7 +------ var/spack/repos/builtin/packages/libice/package.py | 8 +------- .../repos/builtin/packages/libjpeg-turbo/package.py | 7 +------ .../repos/builtin/packages/liblbxutil/package.py | 8 +------- var/spack/repos/builtin/packages/libmng/package.py | 7 +------ .../repos/builtin/packages/libmonitor/package.py | 7 +------ var/spack/repos/builtin/packages/libnbc/package.py | 7 +------ var/spack/repos/builtin/packages/liboldx/package.py | 8 +------- .../builtin/packages/libpthread-stubs/package.py | 7 +------ var/spack/repos/builtin/packages/libsm/package.py | 8 +------- .../repos/builtin/packages/libsodium/package.py | 8 +------- .../repos/builtin/packages/libunistring/package.py | 9 ++------- .../repos/builtin/packages/libunwind/package.py | 7 +------ var/spack/repos/builtin/packages/libuuid/package.py | 8 +------- var/spack/repos/builtin/packages/libuv/package.py | 9 ++------- .../repos/builtin/packages/libwindowswm/package.py | 8 +------- var/spack/repos/builtin/packages/libx11/package.py | 9 +-------- var/spack/repos/builtin/packages/libxau/package.py | 9 +-------- var/spack/repos/builtin/packages/libxaw/package.py | 8 +------- .../repos/builtin/packages/libxaw3d/package.py | 8 +------- var/spack/repos/builtin/packages/libxcb/package.py | 9 +-------- .../repos/builtin/packages/libxcomposite/package.py | 8 +------- .../repos/builtin/packages/libxcursor/package.py | 8 +------- .../repos/builtin/packages/libxdamage/package.py | 8 +------- .../repos/builtin/packages/libxdmcp/package.py | 9 +-------- .../repos/builtin/packages/libxevie/package.py | 8 +------- var/spack/repos/builtin/packages/libxext/package.py | 8 +------- .../repos/builtin/packages/libxfixes/package.py | 8 +------- .../repos/builtin/packages/libxfont/package.py | 8 +------- .../repos/builtin/packages/libxfont2/package.py | 8 +------- .../repos/builtin/packages/libxfontcache/package.py | 8 +------- var/spack/repos/builtin/packages/libxft/package.py | 8 +------- var/spack/repos/builtin/packages/libxi/package.py | 8 +------- .../repos/builtin/packages/libxinerama/package.py | 8 +------- .../repos/builtin/packages/libxkbfile/package.py | 8 +------- .../repos/builtin/packages/libxkbui/package.py | 8 +------- var/spack/repos/builtin/packages/libxml2/package.py | 11 +++-------- var/spack/repos/builtin/packages/libxmu/package.py | 8 +------- var/spack/repos/builtin/packages/libxp/package.py | 8 +------- var/spack/repos/builtin/packages/libxpm/package.py | 8 +------- .../repos/builtin/packages/libxpresent/package.py | 8 +------- .../builtin/packages/libxprintapputil/package.py | 8 +------- .../repos/builtin/packages/libxprintutil/package.py | 8 +------- .../repos/builtin/packages/libxrandr/package.py | 8 +------- .../repos/builtin/packages/libxrender/package.py | 8 +------- var/spack/repos/builtin/packages/libxres/package.py | 8 +------- .../repos/builtin/packages/libxscrnsaver/package.py | 8 +------- .../repos/builtin/packages/libxshmfence/package.py | 9 +-------- var/spack/repos/builtin/packages/libxt/package.py | 8 +------- .../repos/builtin/packages/libxtrap/package.py | 8 +------- var/spack/repos/builtin/packages/libxtst/package.py | 8 +------- var/spack/repos/builtin/packages/libxv/package.py | 8 +------- var/spack/repos/builtin/packages/libxvmc/package.py | 8 +------- .../repos/builtin/packages/libxxf86dga/package.py | 8 +------- .../repos/builtin/packages/libxxf86misc/package.py | 8 +------- .../repos/builtin/packages/libxxf86vm/package.py | 8 +------- var/spack/repos/builtin/packages/listres/package.py | 8 +------- var/spack/repos/builtin/packages/lmod/package.py | 6 +----- var/spack/repos/builtin/packages/lndir/package.py | 8 +------- var/spack/repos/builtin/packages/lwgrp/package.py | 7 +------ var/spack/repos/builtin/packages/lwm2/package.py | 7 +------ .../repos/builtin/packages/makedepend/package.py | 9 +-------- var/spack/repos/builtin/packages/mesa/package.py | 8 +------- .../repos/builtin/packages/mkfontdir/package.py | 8 +------- .../repos/builtin/packages/mkfontscale/package.py | 8 +------- var/spack/repos/builtin/packages/mpc/package.py | 9 ++------- var/spack/repos/builtin/packages/mpfr/package.py | 7 +------ var/spack/repos/builtin/packages/mpip/package.py | 8 +++----- var/spack/repos/builtin/packages/mrnet/package.py | 15 +++++++-------- var/spack/repos/builtin/packages/mxml/package.py | 8 +++----- var/spack/repos/builtin/packages/nano/package.py | 7 +------ var/spack/repos/builtin/packages/nasm/package.py | 7 +------ var/spack/repos/builtin/packages/ncview/package.py | 8 +------- .../repos/builtin/packages/netgauge/package.py | 7 +------ var/spack/repos/builtin/packages/nettle/package.py | 10 +--------- var/spack/repos/builtin/packages/npm/package.py | 12 ++---------- var/spack/repos/builtin/packages/ocaml/package.py | 8 ++------ var/spack/repos/builtin/packages/oclock/package.py | 8 +------- var/spack/repos/builtin/packages/pango/package.py | 4 +--- .../repos/builtin/packages/parallel/package.py | 8 +------- .../repos/builtin/packages/patchelf/package.py | 7 +------ var/spack/repos/builtin/packages/pcre2/package.py | 7 +------ var/spack/repos/builtin/packages/pdt/package.py | 7 +------ .../repos/builtin/packages/presentproto/package.py | 7 +------ .../repos/builtin/packages/printproto/package.py | 7 +------ var/spack/repos/builtin/packages/proj/package.py | 10 +--------- .../repos/builtin/packages/protobuf/package.py | 8 +------- .../repos/builtin/packages/proxymngr/package.py | 8 +------- var/spack/repos/builtin/packages/py-xpyb/package.py | 8 +------- .../repos/builtin/packages/randrproto/package.py | 7 +------ .../repos/builtin/packages/readline/package.py | 6 ++---- .../repos/builtin/packages/recordproto/package.py | 7 +------ .../repos/builtin/packages/rendercheck/package.py | 8 +------- .../repos/builtin/packages/renderproto/package.py | 7 +------ .../repos/builtin/packages/resourceproto/package.py | 7 +------ var/spack/repos/builtin/packages/rgb/package.py | 9 +-------- var/spack/repos/builtin/packages/rstart/package.py | 8 +------- var/spack/repos/builtin/packages/rsync/package.py | 8 +------- var/spack/repos/builtin/packages/screen/package.py | 7 +------ var/spack/repos/builtin/packages/scripts/package.py | 8 +------- .../builtin/packages/scrnsaverproto/package.py | 7 +------ .../repos/builtin/packages/sdl2-image/package.py | 8 +------- var/spack/repos/builtin/packages/sed/package.py | 8 +------- var/spack/repos/builtin/packages/sessreg/package.py | 8 +------- .../repos/builtin/packages/setxkbmap/package.py | 8 +------- .../repos/builtin/packages/showfont/package.py | 8 +------- var/spack/repos/builtin/packages/smproxy/package.py | 8 +------- var/spack/repos/builtin/packages/snappy/package.py | 7 +------ var/spack/repos/builtin/packages/sowing/package.py | 6 ++---- .../repos/builtin/packages/sparsehash/package.py | 8 +------- var/spack/repos/builtin/packages/spindle/package.py | 7 +------ var/spack/repos/builtin/packages/spot/package.py | 8 +------- var/spack/repos/builtin/packages/swig/package.py | 7 +------ .../builtin/packages/the-silver-searcher/package.py | 8 +------- .../repos/builtin/packages/transset/package.py | 8 +------- .../repos/builtin/packages/trapproto/package.py | 7 +------ var/spack/repos/builtin/packages/twm/package.py | 8 +------- var/spack/repos/builtin/packages/uberftp/package.py | 8 +------- .../repos/builtin/packages/uncrustify/package.py | 7 +------ .../repos/builtin/packages/unixodbc/package.py | 8 +------- .../repos/builtin/packages/util-macros/package.py | 7 +------ .../repos/builtin/packages/videoproto/package.py | 7 +------ var/spack/repos/builtin/packages/viewres/package.py | 8 +------- .../builtin/packages/windowswmproto/package.py | 7 +------ var/spack/repos/builtin/packages/x11perf/package.py | 8 +------- var/spack/repos/builtin/packages/xauth/package.py | 9 ++------- .../repos/builtin/packages/xbacklight/package.py | 8 +------- var/spack/repos/builtin/packages/xbiff/package.py | 8 +------- .../repos/builtin/packages/xbitmaps/package.py | 7 +------ var/spack/repos/builtin/packages/xcalc/package.py | 8 +------- .../repos/builtin/packages/xcb-demo/package.py | 13 +++---------- .../repos/builtin/packages/xcb-proto/package.py | 8 ++------ .../builtin/packages/xcb-util-cursor/package.py | 8 +------- .../builtin/packages/xcb-util-errors/package.py | 9 +-------- .../builtin/packages/xcb-util-image/package.py | 9 +-------- .../builtin/packages/xcb-util-keysyms/package.py | 8 +------- .../builtin/packages/xcb-util-renderutil/package.py | 8 +------- .../repos/builtin/packages/xcb-util-wm/package.py | 8 +------- .../repos/builtin/packages/xcb-util/package.py | 8 +------- .../repos/builtin/packages/xclipboard/package.py | 8 +------- var/spack/repos/builtin/packages/xclock/package.py | 8 +------- .../repos/builtin/packages/xcmiscproto/package.py | 7 +------ var/spack/repos/builtin/packages/xcmsdb/package.py | 8 +------- .../repos/builtin/packages/xcompmgr/package.py | 8 +------- .../repos/builtin/packages/xconsole/package.py | 8 +------- .../repos/builtin/packages/xcursorgen/package.py | 8 +------- .../repos/builtin/packages/xdbedizzy/package.py | 8 +------- .../repos/builtin/packages/xditview/package.py | 8 +------- var/spack/repos/builtin/packages/xdm/package.py | 8 +------- .../repos/builtin/packages/xdpyinfo/package.py | 8 +------- .../repos/builtin/packages/xdriinfo/package.py | 8 +------- var/spack/repos/builtin/packages/xedit/package.py | 8 +------- var/spack/repos/builtin/packages/xev/package.py | 8 +------- .../repos/builtin/packages/xextproto/package.py | 7 +------ var/spack/repos/builtin/packages/xeyes/package.py | 8 +------- .../builtin/packages/xf86bigfontproto/package.py | 7 +------ var/spack/repos/builtin/packages/xf86dga/package.py | 8 +------- .../repos/builtin/packages/xf86dgaproto/package.py | 7 +------ .../repos/builtin/packages/xf86driproto/package.py | 7 +------ .../repos/builtin/packages/xf86miscproto/package.py | 7 +------ .../repos/builtin/packages/xf86rushproto/package.py | 7 +------ .../builtin/packages/xf86vidmodeproto/package.py | 7 +------ var/spack/repos/builtin/packages/xfd/package.py | 8 +------- .../repos/builtin/packages/xfindproxy/package.py | 8 +------- .../repos/builtin/packages/xfontsel/package.py | 8 +------- var/spack/repos/builtin/packages/xfs/package.py | 8 +------- var/spack/repos/builtin/packages/xfsinfo/package.py | 8 +------- var/spack/repos/builtin/packages/xfwp/package.py | 12 +++--------- var/spack/repos/builtin/packages/xgamma/package.py | 8 +------- var/spack/repos/builtin/packages/xgc/package.py | 8 +------- var/spack/repos/builtin/packages/xhost/package.py | 8 +------- .../repos/builtin/packages/xineramaproto/package.py | 7 +------ var/spack/repos/builtin/packages/xinit/package.py | 8 +------- var/spack/repos/builtin/packages/xinput/package.py | 8 +------- var/spack/repos/builtin/packages/xkbcomp/package.py | 8 +------- var/spack/repos/builtin/packages/xkbdata/package.py | 8 +------- var/spack/repos/builtin/packages/xkbevd/package.py | 8 +------- .../repos/builtin/packages/xkbprint/package.py | 8 +------- .../repos/builtin/packages/xkbutils/package.py | 8 +------- .../builtin/packages/xkeyboard-config/package.py | 8 +------- var/spack/repos/builtin/packages/xkill/package.py | 8 +------- var/spack/repos/builtin/packages/xload/package.py | 8 +------- var/spack/repos/builtin/packages/xlogo/package.py | 8 +------- .../repos/builtin/packages/xlsatoms/package.py | 8 +------- .../repos/builtin/packages/xlsclients/package.py | 8 +------- .../repos/builtin/packages/xlsfonts/package.py | 8 +------- var/spack/repos/builtin/packages/xmag/package.py | 8 +------- var/spack/repos/builtin/packages/xman/package.py | 8 +------- .../repos/builtin/packages/xmessage/package.py | 8 +------- var/spack/repos/builtin/packages/xmh/package.py | 8 +------- var/spack/repos/builtin/packages/xmlto/package.py | 8 +------- var/spack/repos/builtin/packages/xmodmap/package.py | 8 +------- var/spack/repos/builtin/packages/xmore/package.py | 8 +------- .../repos/builtin/packages/xorg-cf-files/package.py | 7 +------ .../repos/builtin/packages/xorg-docs/package.py | 8 +------- .../repos/builtin/packages/xorg-gtest/package.py | 8 +------- .../repos/builtin/packages/xorg-server/package.py | 8 +------- .../builtin/packages/xorg-sgml-doctools/package.py | 8 +------- .../repos/builtin/packages/xphelloworld/package.py | 8 +------- .../repos/builtin/packages/xplsprinters/package.py | 8 +------- var/spack/repos/builtin/packages/xpr/package.py | 8 +------- .../builtin/packages/xprehashprinterlist/package.py | 8 +------- var/spack/repos/builtin/packages/xprop/package.py | 8 +------- var/spack/repos/builtin/packages/xproto/package.py | 7 +------ .../packages/xproxymanagementprotocol/package.py | 7 +------ var/spack/repos/builtin/packages/xrandr/package.py | 8 +------- var/spack/repos/builtin/packages/xrdb/package.py | 8 +------- .../repos/builtin/packages/xrefresh/package.py | 8 +------- var/spack/repos/builtin/packages/xrx/package.py | 8 +------- var/spack/repos/builtin/packages/xscope/package.py | 8 +------- var/spack/repos/builtin/packages/xset/package.py | 8 +------- .../repos/builtin/packages/xsetmode/package.py | 8 +------- .../repos/builtin/packages/xsetpointer/package.py | 8 +------- .../repos/builtin/packages/xsetroot/package.py | 8 +------- var/spack/repos/builtin/packages/xsm/package.py | 8 +------- .../repos/builtin/packages/xstdcmap/package.py | 8 +------- var/spack/repos/builtin/packages/xtrans/package.py | 7 +------ var/spack/repos/builtin/packages/xtrap/package.py | 8 +------- var/spack/repos/builtin/packages/xts/package.py | 12 +++--------- .../repos/builtin/packages/xvidtune/package.py | 8 +------- var/spack/repos/builtin/packages/xvinfo/package.py | 8 +------- var/spack/repos/builtin/packages/xwd/package.py | 8 +------- .../repos/builtin/packages/xwininfo/package.py | 8 +------- var/spack/repos/builtin/packages/xwud/package.py | 8 +------- var/spack/repos/builtin/packages/xz/package.py | 10 +--------- var/spack/repos/builtin/packages/yasm/package.py | 7 +------ var/spack/repos/builtin/packages/zeromq/package.py | 9 +++------ var/spack/repos/builtin/packages/zsh/package.py | 8 +------- 313 files changed, 384 insertions(+), 2119 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 8a39ee28e2..b09c677e0b 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -1490,7 +1490,7 @@ Additional hybrid dependency types are (note the lack of quotes): * ****: ``type`` assumed to be ``("build", "link")``. This is the common case for compiled language usage. - + """"""""""""""""""" Dependency Formulas """"""""""""""""""" @@ -2007,10 +2007,15 @@ The last element of a package is its ``install()`` method. This is where the real work of installation happens, and it's the main part of the package you'll need to customize for each piece of software. -.. literalinclude:: ../../../var/spack/repos/builtin/packages/mpfr/package.py - :pyobject: Mpfr.install +.. code-block:: python :linenos: + def install(self, spec prefix): + configure('--prefix={0}'.format(prefix)) + + make() + make('install') + ``install`` takes a ``spec``: a description of how the package should be built, and a ``prefix``: the path to the directory where the software should be installed. diff --git a/var/spack/repos/builtin/packages/applewmproto/package.py b/var/spack/repos/builtin/packages/applewmproto/package.py index 8d7e360bfb..41d7c4c10a 100644 --- a/var/spack/repos/builtin/packages/applewmproto/package.py +++ b/var/spack/repos/builtin/packages/applewmproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Applewmproto(Package): +class Applewmproto(AutotoolsPackage): """Apple Rootless Window Management Extension. This extension defines a protcol that allows X window managers @@ -39,8 +39,3 @@ class Applewmproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/appres/package.py b/var/spack/repos/builtin/packages/appres/package.py index 47a9c5bb54..ff13937a0e 100644 --- a/var/spack/repos/builtin/packages/appres/package.py +++ b/var/spack/repos/builtin/packages/appres/package.py @@ -25,7 +25,7 @@ from spack import * -class Appres(Package): +class Appres(AutotoolsPackage): """The appres program prints the resources seen by an application (or subhierarchy of an application) with the specified class and instance names. It can be used to determine which resources a particular @@ -42,9 +42,3 @@ class Appres(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/asciidoc/package.py b/var/spack/repos/builtin/packages/asciidoc/package.py index 552030d965..428bb7d645 100644 --- a/var/spack/repos/builtin/packages/asciidoc/package.py +++ b/var/spack/repos/builtin/packages/asciidoc/package.py @@ -25,7 +25,7 @@ from spack import * -class Asciidoc(Package): +class Asciidoc(AutotoolsPackage): """A presentable text document format for writing articles, UNIX man pages and other small to medium sized documents.""" @@ -38,9 +38,3 @@ class Asciidoc(Package): depends_on('libxslt') depends_on('docbook-xml') depends_on('docbook-xsl') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/atk/package.py b/var/spack/repos/builtin/packages/atk/package.py index 0a7d48774d..1375f2d0f9 100644 --- a/var/spack/repos/builtin/packages/atk/package.py +++ b/var/spack/repos/builtin/packages/atk/package.py @@ -25,7 +25,7 @@ from spack import * -class Atk(Package): +class Atk(AutotoolsPackage): """ATK provides the set of accessibility interfaces that are implemented by other toolkits and applications. Using the ATK interfaces, accessibility tools have full access to view and @@ -43,8 +43,3 @@ class Atk(Package): """Handle atk's version-based custom URLs.""" url = 'http://ftp.gnome.org/pub/gnome/sources/atk' return url + '/%s/atk-%s.tar.xz' % (version.up_to(2), version) - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/bdftopcf/package.py b/var/spack/repos/builtin/packages/bdftopcf/package.py index 095f0c1bd4..b6ddd04418 100644 --- a/var/spack/repos/builtin/packages/bdftopcf/package.py +++ b/var/spack/repos/builtin/packages/bdftopcf/package.py @@ -25,7 +25,7 @@ from spack import * -class Bdftopcf(Package): +class Bdftopcf(AutotoolsPackage): """bdftopcf is a font compiler for the X server and font server. Fonts in Portable Compiled Format can be read by any architecture, although the file is structured to allow one particular architecture to read @@ -42,9 +42,3 @@ class Bdftopcf(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/beforelight/package.py b/var/spack/repos/builtin/packages/beforelight/package.py index 37a91f5614..3c0cbcf3cb 100644 --- a/var/spack/repos/builtin/packages/beforelight/package.py +++ b/var/spack/repos/builtin/packages/beforelight/package.py @@ -25,7 +25,7 @@ from spack import * -class Beforelight(Package): +class Beforelight(AutotoolsPackage): """The beforelight program is a sample implementation of a screen saver for X servers supporting the MIT-SCREEN-SAVER extension. It is only recommended for use as a code sample, as it does not include features @@ -42,9 +42,3 @@ class Beforelight(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/bertini/package.py b/var/spack/repos/builtin/packages/bertini/package.py index 7dd17a062e..c6d169fbcc 100644 --- a/var/spack/repos/builtin/packages/bertini/package.py +++ b/var/spack/repos/builtin/packages/bertini/package.py @@ -25,7 +25,7 @@ from spack import * -class Bertini(Package): +class Bertini(AutotoolsPackage): """Bertini is a general-purpose solver, written in C, that was created for research about polynomial continuation. It solves for the numerical solution of systems of polynomial equations using homotopy continuation.""" @@ -42,9 +42,3 @@ class Bertini(Package): depends_on('gmp') depends_on('mpfr') depends_on('mpi', when='+mpi') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/bigreqsproto/package.py b/var/spack/repos/builtin/packages/bigreqsproto/package.py index 61fd9c5121..f2542d921e 100644 --- a/var/spack/repos/builtin/packages/bigreqsproto/package.py +++ b/var/spack/repos/builtin/packages/bigreqsproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Bigreqsproto(Package): +class Bigreqsproto(AutotoolsPackage): """Big Requests Extension. This extension defines a protocol to enable the use of requests @@ -38,8 +38,3 @@ class Bigreqsproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py index 70795f05cc..cc2d10dea1 100644 --- a/var/spack/repos/builtin/packages/bison/package.py +++ b/var/spack/repos/builtin/packages/bison/package.py @@ -25,7 +25,7 @@ from spack import * -class Bison(Package): +class Bison(AutotoolsPackage): """Bison is a general-purpose parser generator that converts an annotated context-free grammar into a deterministic LR or generalized LR (GLR) parser employing LALR(1) parser tables.""" @@ -36,9 +36,3 @@ class Bison(Package): version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8') depends_on("m4", type='build') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/bitmap/package.py b/var/spack/repos/builtin/packages/bitmap/package.py index 55fdacefd5..80bc496013 100644 --- a/var/spack/repos/builtin/packages/bitmap/package.py +++ b/var/spack/repos/builtin/packages/bitmap/package.py @@ -25,7 +25,7 @@ from spack import * -class Bitmap(Package): +class Bitmap(AutotoolsPackage): """bitmap, bmtoa, atobm - X bitmap (XBM) editor and converter utilities.""" homepage = "http://cgit.freedesktop.org/xorg/app/bitmap" @@ -43,9 +43,3 @@ class Bitmap(Package): depends_on('xproto@7.0.25:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/cddlib/package.py b/var/spack/repos/builtin/packages/cddlib/package.py index ced5f46d1f..50dc5ad472 100644 --- a/var/spack/repos/builtin/packages/cddlib/package.py +++ b/var/spack/repos/builtin/packages/cddlib/package.py @@ -26,7 +26,7 @@ from spack import * -class Cddlib(Package): +class Cddlib(AutotoolsPackage): """The C-library cddlib is a C implementation of the Double Description Method of Motzkin et al. for generating all vertices (i.e. extreme points) and extreme rays of a general convex polyhedron in R^d given by a system @@ -51,8 +51,3 @@ class Cddlib(Package): depends_on("gmp") depends_on("libtool", type="build") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/cfitsio/package.py b/var/spack/repos/builtin/packages/cfitsio/package.py index 79af31ae21..6853c33119 100644 --- a/var/spack/repos/builtin/packages/cfitsio/package.py +++ b/var/spack/repos/builtin/packages/cfitsio/package.py @@ -25,7 +25,7 @@ from spack import * -class Cfitsio(Package): +class Cfitsio(AutotoolsPackage): """CFITSIO is a library of C and Fortran subroutines for reading and writing data files in FITS (Flexible Image Transport System) data format. """ @@ -37,8 +37,3 @@ class Cfitsio(Package): def url_for_version(self, version): url = 'ftp://heasarc.gsfc.nasa.gov/software/fitsio/c/cfitsio{0}.tar.gz' return url.format(version.joined) - - def install(self, spec, prefix): - configure('--prefix=' + prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/cityhash/package.py b/var/spack/repos/builtin/packages/cityhash/package.py index 85d948cc57..b98f39a336 100644 --- a/var/spack/repos/builtin/packages/cityhash/package.py +++ b/var/spack/repos/builtin/packages/cityhash/package.py @@ -23,10 +23,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -from spack.util.environment import * -class Cityhash(Package): +class Cityhash(AutotoolsPackage): """CityHash, a family of hash functions for strings.""" homepage = "https://github.com/google/cityhash" @@ -37,8 +36,5 @@ class Cityhash(Package): version('master', branch='master', git='https://github.com/google/cityhash.git') - def install(self, spec, prefix): - configure('--enable-sse4.2', '--prefix=%s' % prefix) - - make() - make("install") + def configure_args(self): + return ['--enable-sse4.2'] diff --git a/var/spack/repos/builtin/packages/compiz/package.py b/var/spack/repos/builtin/packages/compiz/package.py index ec21f5b4f2..92820db10d 100644 --- a/var/spack/repos/builtin/packages/compiz/package.py +++ b/var/spack/repos/builtin/packages/compiz/package.py @@ -25,7 +25,7 @@ from spack import * -class Compiz(Package): +class Compiz(AutotoolsPackage): """compiz - OpenGL window and compositing manager. Compiz is an OpenGL compositing manager that use @@ -55,9 +55,3 @@ class Compiz(Package): depends_on('libpng') depends_on('glib') depends_on('gconf') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/compositeproto/package.py b/var/spack/repos/builtin/packages/compositeproto/package.py index 1b3fbda0af..3d445bd7e8 100644 --- a/var/spack/repos/builtin/packages/compositeproto/package.py +++ b/var/spack/repos/builtin/packages/compositeproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Compositeproto(Package): +class Compositeproto(AutotoolsPackage): """Composite Extension. This package contains header files and documentation for the composite @@ -38,8 +38,3 @@ class Compositeproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/constype/package.py b/var/spack/repos/builtin/packages/constype/package.py index dcf88fdd55..3a62e89727 100644 --- a/var/spack/repos/builtin/packages/constype/package.py +++ b/var/spack/repos/builtin/packages/constype/package.py @@ -25,7 +25,7 @@ from spack import * -class Constype(Package): +class Constype(AutotoolsPackage): """constype prints on the standard output the Sun code for the type of display that the specified device is. @@ -39,9 +39,3 @@ class Constype(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/coreutils/package.py b/var/spack/repos/builtin/packages/coreutils/package.py index 94cfa11341..a3c77dda9c 100644 --- a/var/spack/repos/builtin/packages/coreutils/package.py +++ b/var/spack/repos/builtin/packages/coreutils/package.py @@ -25,7 +25,7 @@ from spack import * -class Coreutils(Package): +class Coreutils(AutotoolsPackage): """The GNU Core Utilities are the basic file, shell and text manipulation utilities of the GNU operating system. These are the core utilities which are expected to exist on every @@ -35,8 +35,3 @@ class Coreutils(Package): url = "http://ftp.gnu.org/gnu/coreutils/coreutils-8.23.tar.xz" version('8.23', 'abed135279f87ad6762ce57ff6d89c41') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py index ef6374619b..f7791967b3 100644 --- a/var/spack/repos/builtin/packages/czmq/package.py +++ b/var/spack/repos/builtin/packages/czmq/package.py @@ -23,10 +23,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -import os -class Czmq(Package): +class Czmq(AutotoolsPackage): """ A C interface to the ZMQ library """ homepage = "http://czmq.zeromq.org" url = "https://github.com/zeromq/czmq/archive/v3.0.2.tar.gz" @@ -40,7 +39,7 @@ class Czmq(Package): depends_on('pkg-config', type='build') depends_on('zeromq') - def install(self, spec, prefix): + def autoreconf(self, spec, prefix): # Work around autogen.sh oddities # bash = which("bash") # bash("./autogen.sh") @@ -48,14 +47,10 @@ class Czmq(Package): autoreconf = which("autoreconf") autoreconf("--install", "--verbose", "--force", "-I", "config", - "-I", os.path.join(spec['pkg-config'].prefix, - "share", "aclocal"), - "-I", os.path.join(spec['automake'].prefix, - "share", "aclocal"), - "-I", os.path.join(spec['libtool'].prefix, - "share", "aclocal"), + "-I", join_path(spec['pkg-config'].prefix, + "share", "aclocal"), + "-I", join_path(spec['automake'].prefix, + "share", "aclocal"), + "-I", join_path(spec['libtool'].prefix, + "share", "aclocal"), ) - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/damageproto/package.py b/var/spack/repos/builtin/packages/damageproto/package.py index 84e0fac311..22eeeeddcb 100644 --- a/var/spack/repos/builtin/packages/damageproto/package.py +++ b/var/spack/repos/builtin/packages/damageproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Damageproto(Package): +class Damageproto(AutotoolsPackage): """X Damage Extension. This package contains header files and documentation for the X Damage @@ -38,8 +38,3 @@ class Damageproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/datamash/package.py b/var/spack/repos/builtin/packages/datamash/package.py index 85adeca996..4cf7d24ef1 100644 --- a/var/spack/repos/builtin/packages/datamash/package.py +++ b/var/spack/repos/builtin/packages/datamash/package.py @@ -25,7 +25,7 @@ from spack import * -class Datamash(Package): +class Datamash(AutotoolsPackage): """GNU datamash is a command-line program which performs basic numeric, textual and statistical operations on input textual data files. """ @@ -37,8 +37,3 @@ class Datamash(Package): version('1.0.7', '9f317bab07454032ba9c068e7f17b04b') version('1.0.6', 'ff26fdef0f343cb695cf1853e14a1a5b') version('1.0.5', '9a29549dc7feca49fdc5fab696614e11') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/dmxproto/package.py b/var/spack/repos/builtin/packages/dmxproto/package.py index 34213bba5f..7aa0251191 100644 --- a/var/spack/repos/builtin/packages/dmxproto/package.py +++ b/var/spack/repos/builtin/packages/dmxproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Dmxproto(Package): +class Dmxproto(AutotoolsPackage): """Distributed Multihead X (DMX) Extension. This extension defines a protocol for clients to access a front-end proxy @@ -39,8 +39,3 @@ class Dmxproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/dri2proto/package.py b/var/spack/repos/builtin/packages/dri2proto/package.py index d05e7ea231..4c906013b4 100644 --- a/var/spack/repos/builtin/packages/dri2proto/package.py +++ b/var/spack/repos/builtin/packages/dri2proto/package.py @@ -25,7 +25,7 @@ from spack import * -class Dri2proto(Package): +class Dri2proto(AutotoolsPackage): """Direct Rendering Infrastructure 2 Extension. This extension defines a protocol to securely allow user applications to @@ -39,8 +39,3 @@ class Dri2proto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/dri3proto/package.py b/var/spack/repos/builtin/packages/dri3proto/package.py index cd2594d5da..be8b521aae 100644 --- a/var/spack/repos/builtin/packages/dri3proto/package.py +++ b/var/spack/repos/builtin/packages/dri3proto/package.py @@ -25,7 +25,7 @@ from spack import * -class Dri3proto(Package): +class Dri3proto(AutotoolsPackage): """Direct Rendering Infrastructure 3 Extension. This extension defines a protocol to securely allow user applications to @@ -39,8 +39,3 @@ class Dri3proto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/editres/package.py b/var/spack/repos/builtin/packages/editres/package.py index 52ad33b133..d1823ec6fd 100644 --- a/var/spack/repos/builtin/packages/editres/package.py +++ b/var/spack/repos/builtin/packages/editres/package.py @@ -25,7 +25,7 @@ from spack import * -class Editres(Package): +class Editres(AutotoolsPackage): """Dynamic resource editor for X Toolkit applications.""" homepage = "http://cgit.freedesktop.org/xorg/app/editres" @@ -40,9 +40,3 @@ class Editres(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index ef8c2433c9..bdc858e121 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -25,7 +25,7 @@ from spack import * -class Elfutils(Package): +class Elfutils(AutotoolsPackage): """elfutils is a collection of various binary tools such as eu-objdump, eu-readelf, and other utilities that allow you to inspect and manipulate ELF files. Refer to Table 5.Tools Included @@ -41,10 +41,9 @@ class Elfutils(Package): provides('elf') - def install(self, spec, prefix): + def autoreconf(self, spec, prefix): autoreconf = which('autoreconf') autoreconf('-if') - configure('--prefix=%s' % prefix, '--enable-maintainer-mode') - make() - make("install") + def configure_args(self): + return ['--enable-maintainer-mode'] diff --git a/var/spack/repos/builtin/packages/emacs/package.py b/var/spack/repos/builtin/packages/emacs/package.py index 1f9caee24c..0075c397b6 100644 --- a/var/spack/repos/builtin/packages/emacs/package.py +++ b/var/spack/repos/builtin/packages/emacs/package.py @@ -25,7 +25,7 @@ from spack import * -class Emacs(Package): +class Emacs(AutotoolsPackage): """The Emacs programmable text editor.""" homepage = "https://www.gnu.org/software/emacs" @@ -47,7 +47,7 @@ class Emacs(Package): depends_on('libxaw', when='+X toolkit=athena') depends_on('gtkplus+X', when='+X toolkit=gtk') - def install(self, spec, prefix): + def configure_args(self): args = [] toolkit = spec.variants['toolkit'].value if '+X' in spec: @@ -61,7 +61,4 @@ class Emacs(Package): else: args = ['--without-x'] - configure('--prefix={0}'.format(prefix), *args) - - make() - make("install") + return args diff --git a/var/spack/repos/builtin/packages/evieext/package.py b/var/spack/repos/builtin/packages/evieext/package.py index afc0245f50..8814ae31c0 100644 --- a/var/spack/repos/builtin/packages/evieext/package.py +++ b/var/spack/repos/builtin/packages/evieext/package.py @@ -25,7 +25,7 @@ from spack import * -class Evieext(Package): +class Evieext(AutotoolsPackage): """Extended Visual Information Extension (XEVIE). This extension defines a protocol for a client to determine information @@ -38,8 +38,3 @@ class Evieext(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/exuberant-ctags/package.py b/var/spack/repos/builtin/packages/exuberant-ctags/package.py index 10be30ab8b..5d1c1eafc6 100644 --- a/var/spack/repos/builtin/packages/exuberant-ctags/package.py +++ b/var/spack/repos/builtin/packages/exuberant-ctags/package.py @@ -25,15 +25,9 @@ from spack import * -class ExuberantCtags(Package): +class ExuberantCtags(AutotoolsPackage): """The canonical ctags generator""" homepage = "ctags.sourceforge.net" url = "http://downloads.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz" version('5.8', 'c00f82ecdcc357434731913e5b48630d') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/fastx-toolkit/package.py b/var/spack/repos/builtin/packages/fastx-toolkit/package.py index 04b4d24b39..fed54b9b36 100644 --- a/var/spack/repos/builtin/packages/fastx-toolkit/package.py +++ b/var/spack/repos/builtin/packages/fastx-toolkit/package.py @@ -25,7 +25,7 @@ from spack import * -class FastxToolkit(Package): +class FastxToolkit(AutotoolsPackage): """The FASTX-Toolkit is a collection of command line tools for Short-Reads FASTA/FASTQ files preprocessing.""" @@ -35,9 +35,3 @@ class FastxToolkit(Package): version('0.0.14', 'bf1993c898626bb147de3d6695c20b40') depends_on('libgtextutils') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/fish/package.py b/var/spack/repos/builtin/packages/fish/package.py index fb784b7571..f0dfac70c8 100644 --- a/var/spack/repos/builtin/packages/fish/package.py +++ b/var/spack/repos/builtin/packages/fish/package.py @@ -25,7 +25,7 @@ from spack import * -class Fish(Package): +class Fish(AutotoolsPackage): """fish is a smart and user-friendly command line shell for OS X, Linux, and the rest of the family. """ @@ -35,9 +35,3 @@ class Fish(Package): list_url = "http://fishshell.com/" version('2.2.0', 'a76339fd14ce2ec229283c53e805faac48c3e99d9e3ede9d82c0554acfc7b77a') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/fixesproto/package.py b/var/spack/repos/builtin/packages/fixesproto/package.py index 64852b40e2..934848727f 100644 --- a/var/spack/repos/builtin/packages/fixesproto/package.py +++ b/var/spack/repos/builtin/packages/fixesproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Fixesproto(Package): +class Fixesproto(AutotoolsPackage): """X Fixes Extension. The extension makes changes to many areas of the protocol to resolve @@ -39,8 +39,3 @@ class Fixesproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/font-util/package.py b/var/spack/repos/builtin/packages/font-util/package.py index 0b310117c6..03a466d00a 100644 --- a/var/spack/repos/builtin/packages/font-util/package.py +++ b/var/spack/repos/builtin/packages/font-util/package.py @@ -25,7 +25,7 @@ from spack import * -class FontUtil(Package): +class FontUtil(AutotoolsPackage): """X.Org font package creation/installation utilities.""" homepage = "http://cgit.freedesktop.org/xorg/font/util" @@ -35,9 +35,3 @@ class FontUtil(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/fontcacheproto/package.py b/var/spack/repos/builtin/packages/fontcacheproto/package.py index 77feb87573..f793aba9cf 100644 --- a/var/spack/repos/builtin/packages/fontcacheproto/package.py +++ b/var/spack/repos/builtin/packages/fontcacheproto/package.py @@ -25,15 +25,10 @@ from spack import * -class Fontcacheproto(Package): +class Fontcacheproto(AutotoolsPackage): """X.org FontcacheProto protocol headers.""" homepage = "http://cgit.freedesktop.org/xorg/proto/fontcacheproto" url = "https://www.x.org/archive/individual/proto/fontcacheproto-0.1.3.tar.gz" version('0.1.3', '5a91ab914ffbfbc856e6fcde52e6f3e3') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/fontsproto/package.py b/var/spack/repos/builtin/packages/fontsproto/package.py index c3771e18fa..03e825c2f7 100644 --- a/var/spack/repos/builtin/packages/fontsproto/package.py +++ b/var/spack/repos/builtin/packages/fontsproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Fontsproto(Package): +class Fontsproto(AutotoolsPackage): """X Fonts Extension.""" homepage = "http://cgit.freedesktop.org/xorg/proto/fontsproto" @@ -35,8 +35,3 @@ class Fontsproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/fonttosfnt/package.py b/var/spack/repos/builtin/packages/fonttosfnt/package.py index 016cab1ac8..e8cc3a6f6f 100644 --- a/var/spack/repos/builtin/packages/fonttosfnt/package.py +++ b/var/spack/repos/builtin/packages/fonttosfnt/package.py @@ -25,7 +25,7 @@ from spack import * -class Fonttosfnt(Package): +class Fonttosfnt(AutotoolsPackage): """Wrap a bitmap font in a sfnt (TrueType) wrapper.""" homepage = "http://cgit.freedesktop.org/xorg/app/fonttosfnt" @@ -39,9 +39,3 @@ class Fonttosfnt(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/fslsfonts/package.py b/var/spack/repos/builtin/packages/fslsfonts/package.py index 6e46bd6b5a..2becf5a346 100644 --- a/var/spack/repos/builtin/packages/fslsfonts/package.py +++ b/var/spack/repos/builtin/packages/fslsfonts/package.py @@ -25,7 +25,7 @@ from spack import * -class Fslsfonts(Package): +class Fslsfonts(AutotoolsPackage): """fslsfonts produces a list of fonts served by an X font server.""" homepage = "http://cgit.freedesktop.org/xorg/app/fslsfonts" @@ -38,9 +38,3 @@ class Fslsfonts(Package): depends_on('xproto@7.0.25:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/fstobdf/package.py b/var/spack/repos/builtin/packages/fstobdf/package.py index 6358e33d2a..7b2d433ef2 100644 --- a/var/spack/repos/builtin/packages/fstobdf/package.py +++ b/var/spack/repos/builtin/packages/fstobdf/package.py @@ -25,7 +25,7 @@ from spack import * -class Fstobdf(Package): +class Fstobdf(AutotoolsPackage): """The fstobdf program reads a font from a font server and prints a BDF file on the standard output that may be used to recreate the font. This is useful in testing servers, debugging font metrics, and @@ -42,9 +42,3 @@ class Fstobdf(Package): depends_on('xproto@7.0.25:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/gccmakedep/package.py b/var/spack/repos/builtin/packages/gccmakedep/package.py index ed2530d89e..1e082bb050 100644 --- a/var/spack/repos/builtin/packages/gccmakedep/package.py +++ b/var/spack/repos/builtin/packages/gccmakedep/package.py @@ -25,7 +25,7 @@ from spack import * -class Gccmakedep(Package): +class Gccmakedep(AutotoolsPackage): """X.org gccmakedep utilities.""" homepage = "https://cgit.freedesktop.org/xorg/util/gccmakedep/" @@ -34,9 +34,3 @@ class Gccmakedep(Package): version('1.0.3', '127ddb6131eb4a56fdf6644a63ade788') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/gconf/package.py b/var/spack/repos/builtin/packages/gconf/package.py index 3b3abc71ed..80bc54a603 100644 --- a/var/spack/repos/builtin/packages/gconf/package.py +++ b/var/spack/repos/builtin/packages/gconf/package.py @@ -25,7 +25,7 @@ from spack import * -class Gconf(Package): +class Gconf(AutotoolsPackage): """GConf is a system for storing application preferences.""" homepage = "https://projects.gnome.org/gconf/" @@ -43,9 +43,3 @@ class Gconf(Package): # gobject-2.0 >= 2.7.0 # dbus-1 >= 1.0.0 # dbus-glib-1 >= 0.74 - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py index 4d39086b06..1159744721 100644 --- a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py +++ b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py @@ -25,7 +25,7 @@ from spack import * -class GdkPixbuf(Package): +class GdkPixbuf(AutotoolsPackage): """The Gdk Pixbuf is a toolkit for image loading and pixel buffer manipulation. It is used by GTK+ 2 and GTK+ 3 to load and manipulate images. In the past it was distributed as part of @@ -42,8 +42,3 @@ class GdkPixbuf(Package): depends_on("jpeg") depends_on("libpng") depends_on("libtiff") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/giflib/package.py b/var/spack/repos/builtin/packages/giflib/package.py index 7082384b9b..feca5b046b 100644 --- a/var/spack/repos/builtin/packages/giflib/package.py +++ b/var/spack/repos/builtin/packages/giflib/package.py @@ -25,7 +25,7 @@ from spack import * -class Giflib(Package): +class Giflib(AutotoolsPackage): """The GIFLIB project maintains the giflib service library, which has been pulling images out of GIFs since 1989.""" @@ -33,9 +33,3 @@ class Giflib(Package): url = "https://downloads.sourceforge.net/project/giflib/giflib-5.1.4.tar.bz2" version('5.1.4', '2c171ced93c0e83bb09e6ccad8e3ba2b') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py index 4d8085baf2..a4d8c289d7 100644 --- a/var/spack/repos/builtin/packages/glib/package.py +++ b/var/spack/repos/builtin/packages/glib/package.py @@ -23,10 +23,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -import os -class Glib(Package): +class Glib(AutotoolsPackage): """The GLib package contains a low-level libraries useful for providing data structure handling for C, portability wrappers and interfaces for such runtime functionality as an event loop, @@ -59,17 +58,17 @@ class Glib(Package): url = 'http://ftp.gnome.org/pub/gnome/sources/glib' return url + '/%s/glib-%s.tar.xz' % (version.up_to(2), version) - def install(self, spec, prefix): + def autoreconf(self, spec, prefix): autoreconf = which("autoreconf") autoreconf("--install", "--verbose", "--force", "-I", "config", - "-I", os.path.join(spec['pkg-config'].prefix, - "share", "aclocal"), - "-I", os.path.join(spec['automake'].prefix, - "share", "aclocal"), - "-I", os.path.join(spec['libtool'].prefix, - "share", "aclocal"), + "-I", join_path(spec['pkg-config'].prefix, + "share", "aclocal"), + "-I", join_path(spec['automake'].prefix, + "share", "aclocal"), + "-I", join_path(spec['libtool'].prefix, + "share", "aclocal"), ) - configure("--prefix=%s" % prefix) - make() + + def install(self, spec, prefix): make("install", parallel=False) diff --git a/var/spack/repos/builtin/packages/globus-toolkit/package.py b/var/spack/repos/builtin/packages/globus-toolkit/package.py index 5cec13a5af..5cdc0689a7 100644 --- a/var/spack/repos/builtin/packages/globus-toolkit/package.py +++ b/var/spack/repos/builtin/packages/globus-toolkit/package.py @@ -25,7 +25,7 @@ from spack import * -class GlobusToolkit(Package): +class GlobusToolkit(AutotoolsPackage): """The Globus Toolkit is an open source software toolkit used for building grids""" @@ -33,8 +33,3 @@ class GlobusToolkit(Package): url = "http://toolkit.globus.org/ftppub/gt6/installers/src/globus_toolkit-6.0.1470089956.tar.gz" version('6.0.1470089956', 'b77fe3cc5a5844df995688b0e630d077') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/glog/package.py b/var/spack/repos/builtin/packages/glog/package.py index 14f042732b..11d679c7ff 100644 --- a/var/spack/repos/builtin/packages/glog/package.py +++ b/var/spack/repos/builtin/packages/glog/package.py @@ -25,15 +25,10 @@ from spack import * -class Glog(Package): +class Glog(AutotoolsPackage): """C++ implementation of the Google logging module.""" homepage = "https://github.com/google/glog" url = "https://github.com/google/glog/archive/v0.3.3.tar.gz" version('0.3.3', 'c1f86af27bd9c73186730aa957607ed0') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/glproto/package.py b/var/spack/repos/builtin/packages/glproto/package.py index 462e529067..8a5eaef660 100644 --- a/var/spack/repos/builtin/packages/glproto/package.py +++ b/var/spack/repos/builtin/packages/glproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Glproto(Package): +class Glproto(AutotoolsPackage): """OpenGL Extension to the X Window System. This extension defines a protocol for the client to send 3D rendering @@ -38,8 +38,3 @@ class Glproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/gnutls/package.py b/var/spack/repos/builtin/packages/gnutls/package.py index 5f7b0daf9b..87e83649a4 100644 --- a/var/spack/repos/builtin/packages/gnutls/package.py +++ b/var/spack/repos/builtin/packages/gnutls/package.py @@ -25,7 +25,7 @@ from spack import * -class Gnutls(Package): +class Gnutls(AutotoolsPackage): """GnuTLS is a secure communications library implementing the SSL, TLS and DTLS protocols and technologies around them. It provides a simple C language application programming interface @@ -40,8 +40,3 @@ class Gnutls(Package): version('3.3.9', 'ff61b77e39d09f1140ab5a9cf52c58b6') depends_on("nettle") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/gperf/package.py b/var/spack/repos/builtin/packages/gperf/package.py index 0ae07b33fc..e7dffa017a 100644 --- a/var/spack/repos/builtin/packages/gperf/package.py +++ b/var/spack/repos/builtin/packages/gperf/package.py @@ -25,7 +25,7 @@ from spack import * -class Gperf(Package): +class Gperf(AutotoolsPackage): """GNU gperf is a perfect hash function generator. For a given list of strings, it produces a hash function and hash table, in form of C or C++ code, for looking up a value depending on the @@ -38,9 +38,4 @@ class Gperf(Package): version('3.0.4', 'c1f1db32fb6598d6a93e6e88796a8632') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - # make('check') # fails tests - make('install') + # NOTE: `make check` is known to fail tests diff --git a/var/spack/repos/builtin/packages/gperftools/package.py b/var/spack/repos/builtin/packages/gperftools/package.py index c6ca6c8057..300e0ae765 100644 --- a/var/spack/repos/builtin/packages/gperftools/package.py +++ b/var/spack/repos/builtin/packages/gperftools/package.py @@ -25,7 +25,7 @@ from spack import * -class Gperftools(Package): +class Gperftools(AutotoolsPackage): """Google's fast malloc/free implementation, especially for multi-threaded applications. Contains tcmalloc, heap-checker, heap-profiler, and cpu-profiler. @@ -40,8 +40,3 @@ class Gperftools(Package): url="https://googledrive.com/host/0B6NtGsLhIcf7MWxMMF9JdTN3UVk/gperftools-2.3.tar.gz") depends_on("libunwind") - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/grandr/package.py b/var/spack/repos/builtin/packages/grandr/package.py index 8097d4fa01..dd56426ef8 100644 --- a/var/spack/repos/builtin/packages/grandr/package.py +++ b/var/spack/repos/builtin/packages/grandr/package.py @@ -25,7 +25,7 @@ from spack import * -class Grandr(Package): +class Grandr(AutotoolsPackage): """RandR user interface using GTK+ libraries.""" homepage = "https://cgit.freedesktop.org/xorg/app/grandr" @@ -36,10 +36,3 @@ class Grandr(Package): depends_on('gtkplus@2.0.0:') depends_on('gconf') depends_on('xrandr@1.2:') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/gtkplus/package.py b/var/spack/repos/builtin/packages/gtkplus/package.py index b53b688372..b17b1877ec 100644 --- a/var/spack/repos/builtin/packages/gtkplus/package.py +++ b/var/spack/repos/builtin/packages/gtkplus/package.py @@ -25,7 +25,7 @@ from spack import * -class Gtkplus(Package): +class Gtkplus(AutotoolsPackage): """The GTK+ 2 package contains libraries used for creating graphical user interfaces for applications.""" homepage = "http://www.gtk.org" @@ -47,8 +47,3 @@ class Gtkplus(Package): # remove disable deprecated flag. filter_file(r'CFLAGS="-DGDK_PIXBUF_DISABLE_DEPRECATED $CFLAGS"', '', 'configure', string=True) - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/gts/package.py b/var/spack/repos/builtin/packages/gts/package.py index 2b3d4dd4f8..ea9443fb9d 100644 --- a/var/spack/repos/builtin/packages/gts/package.py +++ b/var/spack/repos/builtin/packages/gts/package.py @@ -25,7 +25,7 @@ from spack import * -class Gts(Package): +class Gts(AutotoolsPackage): """GTS stands for the GNU Triangulated Surface Library. It is an Open Source Free Software Library intended to provide a set of @@ -46,8 +46,3 @@ class Gts(Package): version('121130', '023ebb6b13b8707534182a3ef0d12908') depends_on('glib') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/harfbuzz/package.py b/var/spack/repos/builtin/packages/harfbuzz/package.py index 7c98c2a96a..f8d5355f87 100644 --- a/var/spack/repos/builtin/packages/harfbuzz/package.py +++ b/var/spack/repos/builtin/packages/harfbuzz/package.py @@ -25,7 +25,7 @@ from spack import * -class Harfbuzz(Package): +class Harfbuzz(AutotoolsPackage): """The Harfbuzz package contains an OpenType text shaping engine.""" homepage = "http://www.freedesktop.org/wiki/Software/HarfBuzz/" url = "http://www.freedesktop.org/software/harfbuzz/release/harfbuzz-0.9.37.tar.bz2" @@ -41,8 +41,3 @@ class Harfbuzz(Package): def patch(self): change_sed_delimiter('@', ';', 'src/Makefile.in') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/heppdt/package.py b/var/spack/repos/builtin/packages/heppdt/package.py index 54c846ae33..65946fb102 100644 --- a/var/spack/repos/builtin/packages/heppdt/package.py +++ b/var/spack/repos/builtin/packages/heppdt/package.py @@ -26,7 +26,7 @@ from spack import * -class Heppdt(Package): +class Heppdt(AutotoolsPackage): """The HepPID library contains translation methods for particle ID's to and from various Monte Carlo generators and the PDG standard numbering scheme. We realize that the generators adhere closely @@ -40,9 +40,3 @@ class Heppdt(Package): version('3.03.01', 'd411f3bfdf9c4350d802241ba2629cc2') version('3.03.00', 'cd84d0a0454be982dcd8c285e060a7b3') version('2.06.01', '5688b4bdbd84b48ed5dd2545a3dc33c0') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/hsakmt/package.py b/var/spack/repos/builtin/packages/hsakmt/package.py index 0daad4afed..534d5e4c84 100644 --- a/var/spack/repos/builtin/packages/hsakmt/package.py +++ b/var/spack/repos/builtin/packages/hsakmt/package.py @@ -25,7 +25,7 @@ from spack import * -class Hsakmt(Package): +class Hsakmt(AutotoolsPackage): """hsakmt is a thunk library that provides a userspace interface to amdkfd (AMD's HSA Linux kernel driver). It is the HSA equivalent of libdrm.""" @@ -33,9 +33,3 @@ class Hsakmt(Package): url = "https://www.x.org/archive/individual/lib/hsakmt-1.0.0.tar.gz" version('1.0.0', '9beb20104e505300daf541266c4c3c3d') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/htop/package.py b/var/spack/repos/builtin/packages/htop/package.py index 3df0a35356..7a7cc418ce 100644 --- a/var/spack/repos/builtin/packages/htop/package.py +++ b/var/spack/repos/builtin/packages/htop/package.py @@ -25,7 +25,7 @@ from spack import * -class Htop(Package): +class Htop(AutotoolsPackage): """htop is an interactive text-mode process viewer for Unix systems.""" homepage = "https://github.com/hishamhm/htop" @@ -34,8 +34,3 @@ class Htop(Package): version('2.0.2', '7d354d904bad591a931ad57e99fea84a') depends_on('ncurses') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/htslib/package.py b/var/spack/repos/builtin/packages/htslib/package.py index 1a8b8fd2f5..77829e71b9 100644 --- a/var/spack/repos/builtin/packages/htslib/package.py +++ b/var/spack/repos/builtin/packages/htslib/package.py @@ -25,7 +25,7 @@ from spack import * -class Htslib(Package): +class Htslib(AutotoolsPackage): """C library for high-throughput sequencing data formats.""" homepage = "https://github.com/samtools/htslib" @@ -34,8 +34,3 @@ class Htslib(Package): version('1.3.1', '16d78f90b72f29971b042e8da8be6843') depends_on('zlib') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/hwloc/package.py b/var/spack/repos/builtin/packages/hwloc/package.py index 5d25b6dab9..68c92b3aff 100644 --- a/var/spack/repos/builtin/packages/hwloc/package.py +++ b/var/spack/repos/builtin/packages/hwloc/package.py @@ -25,7 +25,7 @@ from spack import * -class Hwloc(Package): +class Hwloc(AutotoolsPackage): """The Portable Hardware Locality (hwloc) software package provides a portable abstraction (across OS, versions, architectures, ...) of the hierarchical topology of modern @@ -53,9 +53,3 @@ class Hwloc(Package): def url_for_version(self, version): return "http://www.open-mpi.org/software/hwloc/v%s/downloads/hwloc-%s.tar.gz" % (version.up_to(2), version) - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/hydra/package.py b/var/spack/repos/builtin/packages/hydra/package.py index eee346ba49..4461adae2e 100644 --- a/var/spack/repos/builtin/packages/hydra/package.py +++ b/var/spack/repos/builtin/packages/hydra/package.py @@ -25,7 +25,7 @@ from spack import * -class Hydra(Package): +class Hydra(AutotoolsPackage): """Hydra is a process management system for starting parallel jobs. Hydra is designed to natively work with existing launcher daemons (such as ssh, rsh, fork), as well as natively integrate with resource @@ -37,9 +37,3 @@ class Hydra(Package): list_depth = 2 version('3.2', '4d670916695bf7e3a869cc336a881b39') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/iceauth/package.py b/var/spack/repos/builtin/packages/iceauth/package.py index 59c6e0e7b7..6af0d0b4bb 100644 --- a/var/spack/repos/builtin/packages/iceauth/package.py +++ b/var/spack/repos/builtin/packages/iceauth/package.py @@ -25,7 +25,7 @@ from spack import * -class Iceauth(Package): +class Iceauth(AutotoolsPackage): """The iceauth program is used to edit and display the authorization information used in connecting with ICE. It operates very much like the xauth program for X11 connection authentication records.""" @@ -40,9 +40,3 @@ class Iceauth(Package): depends_on('xproto@7.0.22:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/ico/package.py b/var/spack/repos/builtin/packages/ico/package.py index 5e523575ca..2163e8566e 100644 --- a/var/spack/repos/builtin/packages/ico/package.py +++ b/var/spack/repos/builtin/packages/ico/package.py @@ -25,7 +25,7 @@ from spack import * -class Ico(Package): +class Ico(AutotoolsPackage): """ico is a simple animation program that may be used for testing various X11 operations and extensions. It displays a wire-frame rotating polyhedron, with hidden lines removed, or a solid-fill polyhedron with @@ -41,9 +41,3 @@ class Ico(Package): depends_on('xproto@7.0.22:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/ilmbase/package.py b/var/spack/repos/builtin/packages/ilmbase/package.py index 873c830623..7f478f2341 100644 --- a/var/spack/repos/builtin/packages/ilmbase/package.py +++ b/var/spack/repos/builtin/packages/ilmbase/package.py @@ -25,7 +25,7 @@ from spack import * -class Ilmbase(Package): +class Ilmbase(AutotoolsPackage): """OpenEXR ILM Base libraries (high dynamic-range image file format)""" homepage = "http://www.openexr.com/" @@ -36,7 +36,3 @@ class Ilmbase(Package): version('2.0.1', '74c0d0d2873960bd0dc1993f8e03f0ae') version('1.0.2', '26c133ee8ca48e1196fbfb3ffe292ab4') version('0.9.0', '4df45f8116cb7a013b286caf6da30a2e') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - make('install') diff --git a/var/spack/repos/builtin/packages/imake/package.py b/var/spack/repos/builtin/packages/imake/package.py index 32542b0391..b15a019156 100644 --- a/var/spack/repos/builtin/packages/imake/package.py +++ b/var/spack/repos/builtin/packages/imake/package.py @@ -25,7 +25,7 @@ from spack import * -class Imake(Package): +class Imake(AutotoolsPackage): """The imake build system.""" homepage = "http://www.snake.net/software/imake-stuff/" @@ -35,9 +35,3 @@ class Imake(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/inputproto/package.py b/var/spack/repos/builtin/packages/inputproto/package.py index 915986ef68..220c314ac6 100644 --- a/var/spack/repos/builtin/packages/inputproto/package.py +++ b/var/spack/repos/builtin/packages/inputproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Inputproto(Package): +class Inputproto(AutotoolsPackage): """X Input Extension. This extension defines a protocol to provide additional input devices @@ -38,8 +38,3 @@ class Inputproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/intel-gpu-tools/package.py b/var/spack/repos/builtin/packages/intel-gpu-tools/package.py index 132e29839b..f72ebf76e7 100644 --- a/var/spack/repos/builtin/packages/intel-gpu-tools/package.py +++ b/var/spack/repos/builtin/packages/intel-gpu-tools/package.py @@ -25,7 +25,7 @@ from spack import * -class IntelGpuTools(Package): +class IntelGpuTools(AutotoolsPackage): """Intel GPU Tools is a collection of tools for development and testing of the Intel DRM driver. There are many macro-level test suites that get used against the driver, including xtest, rendercheck, piglit, and oglconform, @@ -58,10 +58,3 @@ class IntelGpuTools(Package): # python-docutils # x11proto-dri2-dev # xutils-dev - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/itstool/package.py b/var/spack/repos/builtin/packages/itstool/package.py index b8b2b4459f..c78e740499 100644 --- a/var/spack/repos/builtin/packages/itstool/package.py +++ b/var/spack/repos/builtin/packages/itstool/package.py @@ -25,7 +25,7 @@ from spack import * -class Itstool(Package): +class Itstool(AutotoolsPackage): """ITS Tool allows you to translate your XML documents with PO files, using rules from the W3C Internationalization Tag Set (ITS) to determine what to translate and how to separate it into PO file messages.""" @@ -37,8 +37,3 @@ class Itstool(Package): version('2.0.1', '40935cfb08228488bd45575e5f001a34') version('2.0.0', 'd8c702c3e8961db83d04182c2aa4730b') version('1.2.0', 'c0925f6869e33af8e7fe56848c129152') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/jpeg/package.py b/var/spack/repos/builtin/packages/jpeg/package.py index 594240d950..5c45a2889c 100644 --- a/var/spack/repos/builtin/packages/jpeg/package.py +++ b/var/spack/repos/builtin/packages/jpeg/package.py @@ -25,7 +25,7 @@ from spack import * -class Jpeg(Package): +class Jpeg(AutotoolsPackage): """libjpeg is a widely used free library with functions for handling the JPEG image data format. It implements a JPEG codec (encoding and decoding) alongside various utilities for handling JPEG data.""" @@ -35,10 +35,3 @@ class Jpeg(Package): version('9b', '6a9996ce116ec5c52b4870dbcd6d3ddb') version('9a', '3353992aecaee1805ef4109aadd433e7') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("test") - make("install") diff --git a/var/spack/repos/builtin/packages/judy/package.py b/var/spack/repos/builtin/packages/judy/package.py index 8b8b261e53..ddcec05c22 100644 --- a/var/spack/repos/builtin/packages/judy/package.py +++ b/var/spack/repos/builtin/packages/judy/package.py @@ -25,16 +25,11 @@ from spack import * -class Judy(Package): +class Judy(AutotoolsPackage): """Judy: General-purpose dynamic array, associative array and hash-trie.""" homepage = "http://judy.sourceforge.net/" url = "http://downloads.sourceforge.net/project/judy/judy/Judy-1.0.5/Judy-1.0.5.tar.gz" version('1.0.5', '115a0d26302676e962ae2f70ec484a54') - parallel = False - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make("install") + parallel = False diff --git a/var/spack/repos/builtin/packages/kbproto/package.py b/var/spack/repos/builtin/packages/kbproto/package.py index 356d1c6b4f..aaf4c9e1d1 100644 --- a/var/spack/repos/builtin/packages/kbproto/package.py +++ b/var/spack/repos/builtin/packages/kbproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Kbproto(Package): +class Kbproto(AutotoolsPackage): """X Keyboard Extension. This extension defines a protcol to provide a number of new capabilities @@ -38,8 +38,3 @@ class Kbproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/lbxproxy/package.py b/var/spack/repos/builtin/packages/lbxproxy/package.py index 3de3ade0c9..3895134a7c 100644 --- a/var/spack/repos/builtin/packages/lbxproxy/package.py +++ b/var/spack/repos/builtin/packages/lbxproxy/package.py @@ -25,7 +25,7 @@ from spack import * -class Lbxproxy(Package): +class Lbxproxy(AutotoolsPackage): """lbxproxy accepts client connections, multiplexes them over a single connection to the X server, and performs various optimizations on the X protocol to make it faster over low bandwidth and/or high latency @@ -50,9 +50,3 @@ class Lbxproxy(Package): depends_on('bigreqsproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/lcms/package.py b/var/spack/repos/builtin/packages/lcms/package.py index 4d3fc59568..ad85ebe055 100644 --- a/var/spack/repos/builtin/packages/lcms/package.py +++ b/var/spack/repos/builtin/packages/lcms/package.py @@ -25,7 +25,7 @@ from spack import * -class Lcms(Package): +class Lcms(AutotoolsPackage): """Little cms is a color management library. Implements fast transforms between ICC profiles. It is focused on speed, and is portable across several platforms (MIT license).""" @@ -37,8 +37,3 @@ class Lcms(Package): depends_on("jpeg") depends_on("libtiff") depends_on("zlib") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libapplewm/package.py b/var/spack/repos/builtin/packages/libapplewm/package.py index 85408053ad..35091985e3 100644 --- a/var/spack/repos/builtin/packages/libapplewm/package.py +++ b/var/spack/repos/builtin/packages/libapplewm/package.py @@ -25,7 +25,7 @@ from spack import * -class Libapplewm(Package): +class Libapplewm(AutotoolsPackage): """AppleWM is a simple library designed to interface with the Apple-WM extension. This extension allows X window managers to better interact with the Mac OS X Aqua user interface when running X11 in a rootless mode.""" @@ -43,12 +43,6 @@ class Libapplewm(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - # Crashes with this error message on Linux: - # HIServices/Processes.h: No such file or directory - # May only build properly on macOS? - - make() - make('install') + # Crashes with this error message on Linux: + # HIServices/Processes.h: No such file or directory + # May only build properly on macOS? diff --git a/var/spack/repos/builtin/packages/libarchive/package.py b/var/spack/repos/builtin/packages/libarchive/package.py index e439bf894f..0edb3521d1 100644 --- a/var/spack/repos/builtin/packages/libarchive/package.py +++ b/var/spack/repos/builtin/packages/libarchive/package.py @@ -25,7 +25,7 @@ from spack import * -class Libarchive(Package): +class Libarchive(AutotoolsPackage): """libarchive: C library and command-line tools for reading and writing tar, cpio, zip, ISO, and other archive formats.""" @@ -48,10 +48,5 @@ class Libarchive(Package): depends_on('libxml2') depends_on('expat') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - if self.run_tests: - make('check') # cannot build test suite with Intel compilers - make('install') + # NOTE: `make check` is known to fail with the Intel compilers + # The build test suite cannot be built with Intel diff --git a/var/spack/repos/builtin/packages/libcerf/package.py b/var/spack/repos/builtin/packages/libcerf/package.py index 1964f03b95..3bc8ddbd16 100644 --- a/var/spack/repos/builtin/packages/libcerf/package.py +++ b/var/spack/repos/builtin/packages/libcerf/package.py @@ -26,7 +26,7 @@ from spack import * -class Libcerf(Package): +class Libcerf(AutotoolsPackage): """A self-contained C library providing complex error functions, based on Faddeeva's plasma dispersion function w(z). Also provides Dawson's integral and Voigt's convolution of a Gaussian and a Lorentzian @@ -37,13 +37,11 @@ class Libcerf(Package): version('1.3', 'b3504c467204df71e62aeccf73a25612') - def install(self, spec, prefix): + def configure_args(self): options = [] # Clang reports unused functions as errors, see # http://clang.debian.net/status.php?version=3.8.1&key=UNUSED_FUNCTION if spec.satisfies('%clang'): options.append('CFLAGS=-Wno-unused-function') - configure('--prefix=%s' % prefix, *options) - make() - make("install") + return options diff --git a/var/spack/repos/builtin/packages/libcircle/package.py b/var/spack/repos/builtin/packages/libcircle/package.py index 971c29f5f1..e106329219 100644 --- a/var/spack/repos/builtin/packages/libcircle/package.py +++ b/var/spack/repos/builtin/packages/libcircle/package.py @@ -25,7 +25,7 @@ from spack import * -class Libcircle(Package): +class Libcircle(AutotoolsPackage): """libcircle provides an efficient distributed queue on a cluster, using self-stabilizing work stealing.""" @@ -35,8 +35,3 @@ class Libcircle(Package): url='https://github.com/hpc/libcircle/releases/download/0.2.1-rc.1/libcircle-0.2.1-rc.1.tar.gz') depends_on('mpi') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libdmx/package.py b/var/spack/repos/builtin/packages/libdmx/package.py index fa469fd423..2aeb5b9fbb 100644 --- a/var/spack/repos/builtin/packages/libdmx/package.py +++ b/var/spack/repos/builtin/packages/libdmx/package.py @@ -25,7 +25,7 @@ from spack import * -class Libdmx(Package): +class Libdmx(AutotoolsPackage): """libdmx - X Window System DMX (Distributed Multihead X) extension library.""" @@ -41,9 +41,3 @@ class Libdmx(Package): depends_on('dmxproto@2.2.99.1:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libedit/package.py b/var/spack/repos/builtin/packages/libedit/package.py index 235e7648bc..5dcee61cab 100644 --- a/var/spack/repos/builtin/packages/libedit/package.py +++ b/var/spack/repos/builtin/packages/libedit/package.py @@ -25,7 +25,7 @@ from spack import * -class Libedit(Package): +class Libedit(AutotoolsPackage): """An autotools compatible port of the NetBSD editline library""" homepage = "http://thrysoee.dk/editline/" url = "http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz" @@ -34,9 +34,3 @@ class Libedit(Package): url="http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz") depends_on('ncurses') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libepoxy/package.py b/var/spack/repos/builtin/packages/libepoxy/package.py index 364ea1e30c..32c95fdda4 100644 --- a/var/spack/repos/builtin/packages/libepoxy/package.py +++ b/var/spack/repos/builtin/packages/libepoxy/package.py @@ -25,15 +25,10 @@ from spack import * -class Libepoxy(Package): +class Libepoxy(AutotoolsPackage): """Epoxy is a library for handling OpenGL function pointer management for you.""" homepage = "https://github.com/anholt/libepoxy" url = "https://github.com/anholt/libepoxy/releases/download/v1.3.1/libepoxy-1.3.1.tar.bz2" version('1.3.1', '96f6620a9b005a503e7b44b0b528287d') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libevent/package.py b/var/spack/repos/builtin/packages/libevent/package.py index 65b3a716c0..86aeddaf20 100644 --- a/var/spack/repos/builtin/packages/libevent/package.py +++ b/var/spack/repos/builtin/packages/libevent/package.py @@ -25,7 +25,7 @@ from spack import * -class Libevent(Package): +class Libevent(AutotoolsPackage): """The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support @@ -52,13 +52,11 @@ class Libevent(Package): description="Build with encryption enabled at the libevent level.") depends_on('openssl', when='+openssl') - def install(self, spec, prefix): + def configure_args(self): configure_args = [] if '+openssl' in spec: configure_args.append('--enable-openssl') else: configure_args.append('--enable-openssl') - configure("--prefix=%s" % prefix, *configure_args) - make() - make("install") + return configure_args diff --git a/var/spack/repos/builtin/packages/libfontenc/package.py b/var/spack/repos/builtin/packages/libfontenc/package.py index 1c7fa196d9..945f74ccad 100644 --- a/var/spack/repos/builtin/packages/libfontenc/package.py +++ b/var/spack/repos/builtin/packages/libfontenc/package.py @@ -25,7 +25,7 @@ from spack import * -class Libfontenc(Package): +class Libfontenc(AutotoolsPackage): """libfontenc - font encoding library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libfontenc" @@ -38,9 +38,3 @@ class Libfontenc(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libfs/package.py b/var/spack/repos/builtin/packages/libfs/package.py index 96bf62afd7..96cb396b0a 100644 --- a/var/spack/repos/builtin/packages/libfs/package.py +++ b/var/spack/repos/builtin/packages/libfs/package.py @@ -25,7 +25,7 @@ from spack import * -class Libfs(Package): +class Libfs(AutotoolsPackage): """libFS - X Font Service client library. This library is used by clients of X Font Servers (xfs), such as @@ -41,9 +41,3 @@ class Libfs(Package): depends_on('xtrans', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libgcrypt/package.py b/var/spack/repos/builtin/packages/libgcrypt/package.py index b556def4d3..968793315e 100644 --- a/var/spack/repos/builtin/packages/libgcrypt/package.py +++ b/var/spack/repos/builtin/packages/libgcrypt/package.py @@ -25,7 +25,7 @@ from spack import * -class Libgcrypt(Package): +class Libgcrypt(AutotoolsPackage): """Libgcrypt is a general purpose cryptographic library based on the code from GnuPG. It provides functions for all cryptographic building blocks: symmetric ciphers, hash algorithms, MACs, public @@ -37,8 +37,3 @@ class Libgcrypt(Package): version('1.6.2', 'b54395a93cb1e57619943c082da09d5f') depends_on("libgpg-error") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py index 6329adf8f3..42eb23d85a 100644 --- a/var/spack/repos/builtin/packages/libgd/package.py +++ b/var/spack/repos/builtin/packages/libgd/package.py @@ -26,7 +26,7 @@ from spack import * -class Libgd(Package): +class Libgd(AutotoolsPackage): """GD is an open source code library for the dynamic creation of images by programmers. GD is written in C, and "wrappers" are available for Perl, PHP and other languages. GD creates PNG, JPEG, GIF, @@ -55,7 +55,7 @@ class Libgd(Package): depends_on('libtiff') depends_on('fontconfig') - def install(self, spec, prefix): + def autoreconf(self, spec, prefix): autoreconf("--install", "--force", "-I", "m4", "-I", join_path(spec['gettext'].prefix, @@ -67,6 +67,3 @@ class Libgd(Package): "-I", join_path(spec['libtool'].prefix, "share", "aclocal") ) - configure('--prefix={0}'.format(prefix)) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libgpg-error/package.py b/var/spack/repos/builtin/packages/libgpg-error/package.py index a0e2acd516..26b7e6d05e 100644 --- a/var/spack/repos/builtin/packages/libgpg-error/package.py +++ b/var/spack/repos/builtin/packages/libgpg-error/package.py @@ -25,7 +25,7 @@ from spack import * -class LibgpgError(Package): +class LibgpgError(AutotoolsPackage): """Libgpg-error is a small library that defines common error values for all GnuPG components. Among these are GPG, GPGSM, GPGME, GPG-Agent, libgcrypt, Libksba, DirMngr, Pinentry, @@ -36,8 +36,3 @@ class LibgpgError(Package): version('1.21', 'ab0b5aba6d0a185b41d07bda804fd8b2') version('1.18', '12312802d2065774b787cbfc22cc04e9') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libgtextutils/package.py b/var/spack/repos/builtin/packages/libgtextutils/package.py index 201e031869..05b6b7dabe 100644 --- a/var/spack/repos/builtin/packages/libgtextutils/package.py +++ b/var/spack/repos/builtin/packages/libgtextutils/package.py @@ -25,16 +25,10 @@ from spack import * -class Libgtextutils(Package): +class Libgtextutils(AutotoolsPackage): """Gordon's Text utils Library.""" homepage = "https://github.com/agordon/libgtextutils" url = "https://github.com/agordon/libgtextutils/releases/download/0.7/libgtextutils-0.7.tar.gz" version('0.7', '593c7c62e3c76ec49f5736eed4f96806') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libhio/package.py b/var/spack/repos/builtin/packages/libhio/package.py index 17bd86d310..181aca979f 100644 --- a/var/spack/repos/builtin/packages/libhio/package.py +++ b/var/spack/repos/builtin/packages/libhio/package.py @@ -25,7 +25,7 @@ from spack import * -class Libhio(Package): +class Libhio(AutotoolsPackage): """ A library for writing to hierarchical data store systems. """ @@ -38,8 +38,3 @@ class Libhio(Package): depends_on("libjson-c") depends_on("bzip2") depends_on("pkg-config", type="build") - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libice/package.py b/var/spack/repos/builtin/packages/libice/package.py index 1f6fd2f901..36436df501 100644 --- a/var/spack/repos/builtin/packages/libice/package.py +++ b/var/spack/repos/builtin/packages/libice/package.py @@ -25,7 +25,7 @@ from spack import * -class Libice(Package): +class Libice(AutotoolsPackage): """libICE - Inter-Client Exchange Library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libICE" @@ -37,9 +37,3 @@ class Libice(Package): depends_on('xtrans', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py index 3fe159d7b9..8b9413bc86 100644 --- a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py +++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py @@ -25,7 +25,7 @@ from spack import * -class LibjpegTurbo(Package): +class LibjpegTurbo(AutotoolsPackage): """libjpeg-turbo is a fork of the original IJG libjpeg which uses SIMD to accelerate baseline JPEG compression and decompression. libjpeg is a library that implements JPEG image encoding, decoding and @@ -43,8 +43,3 @@ class LibjpegTurbo(Package): # TODO: Implement the selection between two supported assemblers. # depends_on("yasm", type='build') depends_on("nasm", type='build') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/liblbxutil/package.py b/var/spack/repos/builtin/packages/liblbxutil/package.py index 1de59defd6..fe1be09cf9 100644 --- a/var/spack/repos/builtin/packages/liblbxutil/package.py +++ b/var/spack/repos/builtin/packages/liblbxutil/package.py @@ -25,7 +25,7 @@ from spack import * -class Liblbxutil(Package): +class Liblbxutil(AutotoolsPackage): """liblbxutil - Low Bandwith X extension (LBX) utility routines.""" homepage = "http://cgit.freedesktop.org/xorg/lib/liblbxutil" @@ -43,9 +43,3 @@ class Liblbxutil(Package): # undefined symbol: Xalloc # See https://bugs.freedesktop.org/show_bug.cgi?id=8421 # Adding a dependency on libxdmcp and adding LIBS=-lXdmcp did not fix it - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libmng/package.py b/var/spack/repos/builtin/packages/libmng/package.py index a77aada79c..a867c1997e 100644 --- a/var/spack/repos/builtin/packages/libmng/package.py +++ b/var/spack/repos/builtin/packages/libmng/package.py @@ -25,7 +25,7 @@ from spack import * -class Libmng(Package): +class Libmng(AutotoolsPackage): """libmng -THE reference library for reading, displaying, writing and examining Multiple-Image Network Graphics. MNG is the animation extension to the popular PNG image-format.""" @@ -42,8 +42,3 @@ class Libmng(Package): # jpeg requires stdio to beincluded before its headrs. filter_file(r'^(\#include \)', '#include\n\\1', 'libmng_types.h') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libmonitor/package.py b/var/spack/repos/builtin/packages/libmonitor/package.py index f680baa265..26a87c78fa 100644 --- a/var/spack/repos/builtin/packages/libmonitor/package.py +++ b/var/spack/repos/builtin/packages/libmonitor/package.py @@ -25,7 +25,7 @@ from spack import * -class Libmonitor(Package): +class Libmonitor(AutotoolsPackage): """Libmonitor is a library for process and thread control.""" homepage = "https://github.com/HPCToolkit/libmonitor" version('20130218', git='https://github.com/HPCToolkit/libmonitor.git', @@ -36,8 +36,3 @@ class Libmonitor(Package): patch('libmonitorkrell-0000.patch', when='@20130218+krellpatch') patch('libmonitorkrell-0001.patch', when='@20130218+krellpatch') patch('libmonitorkrell-0002.patch', when='@20130218+krellpatch') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libnbc/package.py b/var/spack/repos/builtin/packages/libnbc/package.py index 414498a37a..e135fa6835 100644 --- a/var/spack/repos/builtin/packages/libnbc/package.py +++ b/var/spack/repos/builtin/packages/libnbc/package.py @@ -25,7 +25,7 @@ from spack import * -class Libnbc(Package): +class Libnbc(AutotoolsPackage): """LibNBC is a prototypic implementation of a nonblocking interface for MPI collective operations. Based on ANSI C and MPI-1, it supports all MPI-1 collective operations in a @@ -37,8 +37,3 @@ class Libnbc(Package): version('1.1.1', 'ece5c94992591a9fa934a90e5dbe50ce') depends_on("mpi") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/liboldx/package.py b/var/spack/repos/builtin/packages/liboldx/package.py index 9e85f1ed65..1bec00bfe3 100644 --- a/var/spack/repos/builtin/packages/liboldx/package.py +++ b/var/spack/repos/builtin/packages/liboldx/package.py @@ -25,7 +25,7 @@ from spack import * -class Liboldx(Package): +class Liboldx(AutotoolsPackage): """X version 10 backwards compatibility.""" homepage = "https://cgit.freedesktop.org/xorg/lib/liboldX/" @@ -37,9 +37,3 @@ class Liboldx(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libpthread-stubs/package.py b/var/spack/repos/builtin/packages/libpthread-stubs/package.py index fdaf327c2a..911bf6814c 100644 --- a/var/spack/repos/builtin/packages/libpthread-stubs/package.py +++ b/var/spack/repos/builtin/packages/libpthread-stubs/package.py @@ -25,7 +25,7 @@ from spack import * -class LibpthreadStubs(Package): +class LibpthreadStubs(AutotoolsPackage): """The libpthread-stubs package provides weak aliases for pthread functions not provided in libc or otherwise available by default.""" @@ -33,8 +33,3 @@ class LibpthreadStubs(Package): url = "https://xcb.freedesktop.org/dist/libpthread-stubs-0.3.tar.gz" version('0.3', 'a09d928c4af54fe5436002345ef71138') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/libsm/package.py b/var/spack/repos/builtin/packages/libsm/package.py index 4affd50127..9479da07d7 100644 --- a/var/spack/repos/builtin/packages/libsm/package.py +++ b/var/spack/repos/builtin/packages/libsm/package.py @@ -25,7 +25,7 @@ from spack import * -class Libsm(Package): +class Libsm(AutotoolsPackage): """libSM - X Session Management Library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libSM" @@ -39,9 +39,3 @@ class Libsm(Package): depends_on('xtrans', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libsodium/package.py b/var/spack/repos/builtin/packages/libsodium/package.py index 805881ce07..a7e3ab10ae 100644 --- a/var/spack/repos/builtin/packages/libsodium/package.py +++ b/var/spack/repos/builtin/packages/libsodium/package.py @@ -25,7 +25,7 @@ from spack import * -class Libsodium(Package): +class Libsodium(AutotoolsPackage): """Sodium is a modern, easy-to-use software library for encryption, decryption, signatures, password hashing and more.""" homepage = "https://download.libsodium.org/doc/" @@ -44,9 +44,3 @@ class Libsodium(Package): if version < Version('1.0.4'): url += 'old/' return url + 'libsodium-{0}.tar.gz'.format(version) - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libunistring/package.py b/var/spack/repos/builtin/packages/libunistring/package.py index 5b8837e72b..08657f89d1 100644 --- a/var/spack/repos/builtin/packages/libunistring/package.py +++ b/var/spack/repos/builtin/packages/libunistring/package.py @@ -25,7 +25,7 @@ from spack import * -class Libunistring(Package): +class Libunistring(AutotoolsPackage): """This library provides functions for manipulating Unicode strings and for manipulating C strings according to the Unicode standard.""" @@ -34,9 +34,4 @@ class Libunistring(Package): version('0.9.6', 'cb09c398020c27edac10ca590e9e9ef3') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - # make('check') # test-verify fails for me, contacted developers - make('install') + # NOTE: `make check` fails test-verify diff --git a/var/spack/repos/builtin/packages/libunwind/package.py b/var/spack/repos/builtin/packages/libunwind/package.py index 63ab4aec59..1e727f84f3 100644 --- a/var/spack/repos/builtin/packages/libunwind/package.py +++ b/var/spack/repos/builtin/packages/libunwind/package.py @@ -25,15 +25,10 @@ from spack import * -class Libunwind(Package): +class Libunwind(AutotoolsPackage): """A portable and efficient C programming interface (API) to determine the call-chain of a program.""" homepage = "http://www.nongnu.org/libunwind/" url = "http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz" version('1.1', 'fb4ea2f6fbbe45bf032cd36e586883ce') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libuuid/package.py b/var/spack/repos/builtin/packages/libuuid/package.py index b8f6b1cc3a..31f109cba3 100644 --- a/var/spack/repos/builtin/packages/libuuid/package.py +++ b/var/spack/repos/builtin/packages/libuuid/package.py @@ -25,16 +25,10 @@ from spack import * -class Libuuid(Package): +class Libuuid(AutotoolsPackage): """Portable uuid C library""" homepage = "http://sourceforge.net/projects/libuuid/" url = "http://downloads.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flibuuid%2F&ts=1433881396&use_mirror=iweb" version('1.0.3', 'd44d866d06286c08ba0846aba1086d68') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/libuv/package.py b/var/spack/repos/builtin/packages/libuv/package.py index dae10809f2..5254239019 100644 --- a/var/spack/repos/builtin/packages/libuv/package.py +++ b/var/spack/repos/builtin/packages/libuv/package.py @@ -25,7 +25,7 @@ from spack import * -class Libuv(Package): +class Libuv(AutotoolsPackage): """Multi-platform library with a focus on asynchronous IO""" homepage = "http://libuv.org" url = "https://github.com/libuv/libuv/archive/v1.9.0.tar.gz" @@ -36,11 +36,6 @@ class Libuv(Package): depends_on('autoconf', type='build') depends_on('libtool', type='build') - def install(self, spec, prefix): + def autoreconf(self, spec, prefix): bash = which("bash") bash('autogen.sh') - configure('--prefix=%s' % prefix) - - make() - make("check") - make("install") diff --git a/var/spack/repos/builtin/packages/libwindowswm/package.py b/var/spack/repos/builtin/packages/libwindowswm/package.py index 3836e0d419..5b331f428c 100644 --- a/var/spack/repos/builtin/packages/libwindowswm/package.py +++ b/var/spack/repos/builtin/packages/libwindowswm/package.py @@ -25,7 +25,7 @@ from spack import * -class Libwindowswm(Package): +class Libwindowswm(AutotoolsPackage): """WindowsWM - Cygwin/X rootless window management extension. WindowsWM is a simple library designed to interface with the @@ -45,9 +45,3 @@ class Libwindowswm(Package): depends_on('windowswmproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libx11/package.py b/var/spack/repos/builtin/packages/libx11/package.py index c5df2e0f83..d9c28836b8 100644 --- a/var/spack/repos/builtin/packages/libx11/package.py +++ b/var/spack/repos/builtin/packages/libx11/package.py @@ -25,7 +25,7 @@ from spack import * -class Libx11(Package): +class Libx11(AutotoolsPackage): """libX11 - Core X11 protocol client library.""" homepage = "https://www.x.org/" @@ -42,10 +42,3 @@ class Libx11(Package): depends_on('inputproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/libxau/package.py b/var/spack/repos/builtin/packages/libxau/package.py index eb1f1326c6..bf4e9f5e4e 100644 --- a/var/spack/repos/builtin/packages/libxau/package.py +++ b/var/spack/repos/builtin/packages/libxau/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxau(Package): +class Libxau(AutotoolsPackage): """The libXau package contains a library implementing the X11 Authorization Protocol. This is useful for restricting client access to the display.""" @@ -38,10 +38,3 @@ class Libxau(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/libxaw/package.py b/var/spack/repos/builtin/packages/libxaw/package.py index 9f92ff57d2..f3779be7ed 100644 --- a/var/spack/repos/builtin/packages/libxaw/package.py +++ b/var/spack/repos/builtin/packages/libxaw/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxaw(Package): +class Libxaw(AutotoolsPackage): """Xaw is the X Athena Widget Set. Xaw is a widget set based on the X Toolkit Intrinsics (Xt) Library.""" @@ -44,9 +44,3 @@ class Libxaw(Package): depends_on('xextproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxaw3d/package.py b/var/spack/repos/builtin/packages/libxaw3d/package.py index 498f57cbca..0e350aa2ce 100644 --- a/var/spack/repos/builtin/packages/libxaw3d/package.py +++ b/var/spack/repos/builtin/packages/libxaw3d/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxaw3d(Package): +class Libxaw3d(AutotoolsPackage): """Xaw3d is the X 3D Athena Widget Set. Xaw3d is a widget set based on the X Toolkit Intrinsics (Xt) Library.""" @@ -42,9 +42,3 @@ class Libxaw3d(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxcb/package.py b/var/spack/repos/builtin/packages/libxcb/package.py index 9fa1c6f97c..0e4d00da97 100644 --- a/var/spack/repos/builtin/packages/libxcb/package.py +++ b/var/spack/repos/builtin/packages/libxcb/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxcb(Package): +class Libxcb(AutotoolsPackage): """The X protocol C-language Binding (XCB) is a replacement for Xlib featuring a small footprint, latency hiding, direct access to the protocol, improved threading support, and @@ -52,10 +52,3 @@ class Libxcb(Package): 'typedef struct xcb_auth_info_t {', 'typedef struct {', 'src/xcb.h') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/libxcomposite/package.py b/var/spack/repos/builtin/packages/libxcomposite/package.py index 48cba00250..30d3a4c0ca 100644 --- a/var/spack/repos/builtin/packages/libxcomposite/package.py +++ b/var/spack/repos/builtin/packages/libxcomposite/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxcomposite(Package): +class Libxcomposite(AutotoolsPackage): """libXcomposite - client library for the Composite extension to the X11 protocol.""" @@ -40,9 +40,3 @@ class Libxcomposite(Package): depends_on('compositeproto@0.4:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxcursor/package.py b/var/spack/repos/builtin/packages/libxcursor/package.py index 215452ef52..ee5065bfa4 100644 --- a/var/spack/repos/builtin/packages/libxcursor/package.py +++ b/var/spack/repos/builtin/packages/libxcursor/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxcursor(Package): +class Libxcursor(AutotoolsPackage): """libXcursor - X Window System Cursor management library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXcursor" @@ -40,9 +40,3 @@ class Libxcursor(Package): depends_on('fixesproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxdamage/package.py b/var/spack/repos/builtin/packages/libxdamage/package.py index 448ac21945..4eca877421 100644 --- a/var/spack/repos/builtin/packages/libxdamage/package.py +++ b/var/spack/repos/builtin/packages/libxdamage/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxdamage(Package): +class Libxdamage(AutotoolsPackage): """This package contains the library for the X Damage extension.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXdamage" @@ -41,9 +41,3 @@ class Libxdamage(Package): depends_on('xextproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxdmcp/package.py b/var/spack/repos/builtin/packages/libxdmcp/package.py index c05d4b8771..7c4fd068f0 100644 --- a/var/spack/repos/builtin/packages/libxdmcp/package.py +++ b/var/spack/repos/builtin/packages/libxdmcp/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxdmcp(Package): +class Libxdmcp(AutotoolsPackage): """libXdmcp - X Display Manager Control Protocol library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXdmcp" @@ -36,10 +36,3 @@ class Libxdmcp(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/libxevie/package.py b/var/spack/repos/builtin/packages/libxevie/package.py index b9f0e41631..7435027b48 100644 --- a/var/spack/repos/builtin/packages/libxevie/package.py +++ b/var/spack/repos/builtin/packages/libxevie/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxevie(Package): +class Libxevie(AutotoolsPackage): """Xevie - X Event Interception Extension (XEvIE).""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXevie" @@ -41,9 +41,3 @@ class Libxevie(Package): depends_on('evieext', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxext/package.py b/var/spack/repos/builtin/packages/libxext/package.py index 192ab3957a..528f00cc35 100644 --- a/var/spack/repos/builtin/packages/libxext/package.py +++ b/var/spack/repos/builtin/packages/libxext/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxext(Package): +class Libxext(AutotoolsPackage): """libXext - library for common extensions to the X11 protocol.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXext" @@ -39,9 +39,3 @@ class Libxext(Package): depends_on('xextproto@7.1.99:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxfixes/package.py b/var/spack/repos/builtin/packages/libxfixes/package.py index 6b8b599a85..6add3bb56d 100644 --- a/var/spack/repos/builtin/packages/libxfixes/package.py +++ b/var/spack/repos/builtin/packages/libxfixes/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxfixes(Package): +class Libxfixes(AutotoolsPackage): """This package contains header files and documentation for the XFIXES extension. Library and server implementations are separate.""" @@ -41,9 +41,3 @@ class Libxfixes(Package): depends_on('xextproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxfont/package.py b/var/spack/repos/builtin/packages/libxfont/package.py index 1ebf321c9f..7538c34f07 100644 --- a/var/spack/repos/builtin/packages/libxfont/package.py +++ b/var/spack/repos/builtin/packages/libxfont/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxfont(Package): +class Libxfont(AutotoolsPackage): """libXfont provides the core of the legacy X11 font system, handling the index files (fonts.dir, fonts.alias, fonts.scale), the various font file formats, and rasterizing them. It is used by the X servers, the @@ -46,9 +46,3 @@ class Libxfont(Package): depends_on('fontsproto@2.1.3:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxfont2/package.py b/var/spack/repos/builtin/packages/libxfont2/package.py index 8611e65ebb..bc1dc06dd0 100644 --- a/var/spack/repos/builtin/packages/libxfont2/package.py +++ b/var/spack/repos/builtin/packages/libxfont2/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxfont2(Package): +class Libxfont2(AutotoolsPackage): """libXfont provides the core of the legacy X11 font system, handling the index files (fonts.dir, fonts.alias, fonts.scale), the various font file formats, and rasterizing them. It is used by the X servers, the @@ -46,9 +46,3 @@ class Libxfont2(Package): depends_on('fontsproto@2.1.3:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxfontcache/package.py b/var/spack/repos/builtin/packages/libxfontcache/package.py index 5421f093ca..c4a4d5675a 100644 --- a/var/spack/repos/builtin/packages/libxfontcache/package.py +++ b/var/spack/repos/builtin/packages/libxfontcache/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxfontcache(Package): +class Libxfontcache(AutotoolsPackage): """Xfontcache - X-TrueType font cache extension client library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXfontcache" @@ -40,9 +40,3 @@ class Libxfontcache(Package): depends_on('fontcacheproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxft/package.py b/var/spack/repos/builtin/packages/libxft/package.py index b1b8f853d0..8385b4168a 100644 --- a/var/spack/repos/builtin/packages/libxft/package.py +++ b/var/spack/repos/builtin/packages/libxft/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxft(Package): +class Libxft(AutotoolsPackage): """X FreeType library. Xft version 2.1 was the first stand alone release of Xft, a library that @@ -44,9 +44,3 @@ class Libxft(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxi/package.py b/var/spack/repos/builtin/packages/libxi/package.py index 4e9a273579..5334ef9044 100644 --- a/var/spack/repos/builtin/packages/libxi/package.py +++ b/var/spack/repos/builtin/packages/libxi/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxi(Package): +class Libxi(AutotoolsPackage): """libXi - library for the X Input Extension.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXi" @@ -40,9 +40,3 @@ class Libxi(Package): depends_on('xproto@7.0.13:', type='build') depends_on('xextproto@7.0.3:', type='build') depends_on('inputproto@2.2.99.1:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxinerama/package.py b/var/spack/repos/builtin/packages/libxinerama/package.py index a001c41ca7..9e3633629a 100644 --- a/var/spack/repos/builtin/packages/libxinerama/package.py +++ b/var/spack/repos/builtin/packages/libxinerama/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxinerama(Package): +class Libxinerama(AutotoolsPackage): """libXinerama - API for Xinerama extension to X11 Protocol.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXinerama" @@ -40,9 +40,3 @@ class Libxinerama(Package): depends_on('xineramaproto@1.1.99.1:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxkbfile/package.py b/var/spack/repos/builtin/packages/libxkbfile/package.py index af8029a024..daafa8dd65 100644 --- a/var/spack/repos/builtin/packages/libxkbfile/package.py +++ b/var/spack/repos/builtin/packages/libxkbfile/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxkbfile(Package): +class Libxkbfile(AutotoolsPackage): """XKB file handling routines.""" homepage = "https://cgit.freedesktop.org/xorg/lib/libxkbfile" @@ -38,9 +38,3 @@ class Libxkbfile(Package): depends_on('kbproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxkbui/package.py b/var/spack/repos/builtin/packages/libxkbui/package.py index d0c132d970..b6a40b656d 100644 --- a/var/spack/repos/builtin/packages/libxkbui/package.py +++ b/var/spack/repos/builtin/packages/libxkbui/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxkbui(Package): +class Libxkbui(AutotoolsPackage): """X.org libxkbui library.""" homepage = "https://cgit.freedesktop.org/xorg/lib/libxkbui/" @@ -39,9 +39,3 @@ class Libxkbui(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py index bbb934ab9f..29a83ee35e 100644 --- a/var/spack/repos/builtin/packages/libxml2/package.py +++ b/var/spack/repos/builtin/packages/libxml2/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxml2(Package): +class Libxml2(AutotoolsPackage): """Libxml2 is the XML C parser and toolkit developed for the Gnome project (but usable outside of the Gnome platform), it is free software available under the MIT License.""" @@ -45,7 +45,7 @@ class Libxml2(Package): depends_on('pkg-config@0.9.0:', type='build') - def install(self, spec, prefix): + def configure_args(self): if '+python' in spec: python_args = [ '--with-python={0}'.format(spec['python'].prefix), @@ -54,9 +54,4 @@ class Libxml2(Package): else: python_args = ['--without-python'] - configure('--prefix={0}'.format(prefix), *python_args) - - make() - if self.run_tests: - make('check') - make('install') + return python_args diff --git a/var/spack/repos/builtin/packages/libxmu/package.py b/var/spack/repos/builtin/packages/libxmu/package.py index dbba5f168d..937cf75013 100644 --- a/var/spack/repos/builtin/packages/libxmu/package.py +++ b/var/spack/repos/builtin/packages/libxmu/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxmu(Package): +class Libxmu(AutotoolsPackage): """This library contains miscellaneous utilities and is not part of the Xlib standard. It contains routines which only use public interfaces so that it may be layered on top of any proprietary implementation of Xlib @@ -43,9 +43,3 @@ class Libxmu(Package): depends_on('xextproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxp/package.py b/var/spack/repos/builtin/packages/libxp/package.py index 10aaccc54f..95d4bfa2f8 100644 --- a/var/spack/repos/builtin/packages/libxp/package.py +++ b/var/spack/repos/builtin/packages/libxp/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxp(Package): +class Libxp(AutotoolsPackage): """libXp - X Print Client Library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXp" @@ -41,9 +41,3 @@ class Libxp(Package): depends_on('printproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxpm/package.py b/var/spack/repos/builtin/packages/libxpm/package.py index b726e74b0b..cfb269db7f 100644 --- a/var/spack/repos/builtin/packages/libxpm/package.py +++ b/var/spack/repos/builtin/packages/libxpm/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxpm(Package): +class Libxpm(AutotoolsPackage): """libXpm - X Pixmap (XPM) image file format library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXpm" @@ -42,9 +42,3 @@ class Libxpm(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxpresent/package.py b/var/spack/repos/builtin/packages/libxpresent/package.py index e65d4353a0..5237b164a0 100644 --- a/var/spack/repos/builtin/packages/libxpresent/package.py +++ b/var/spack/repos/builtin/packages/libxpresent/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxpresent(Package): +class Libxpresent(AutotoolsPackage): """This package contains header files and documentation for the Present extension. Library and server implementations are separate.""" @@ -41,9 +41,3 @@ class Libxpresent(Package): depends_on('xextproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxprintapputil/package.py b/var/spack/repos/builtin/packages/libxprintapputil/package.py index fc66b76ac0..ef1963c300 100644 --- a/var/spack/repos/builtin/packages/libxprintapputil/package.py +++ b/var/spack/repos/builtin/packages/libxprintapputil/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxprintapputil(Package): +class Libxprintapputil(AutotoolsPackage): """Xprint application utility routines.""" homepage = "https://cgit.freedesktop.org/xorg/lib/libXprintAppUtil/" @@ -41,9 +41,3 @@ class Libxprintapputil(Package): depends_on('printproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxprintutil/package.py b/var/spack/repos/builtin/packages/libxprintutil/package.py index 8eb768958f..b55123a397 100644 --- a/var/spack/repos/builtin/packages/libxprintutil/package.py +++ b/var/spack/repos/builtin/packages/libxprintutil/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxprintutil(Package): +class Libxprintutil(AutotoolsPackage): """Xprint application utility routines.""" homepage = "https://cgit.freedesktop.org/xorg/lib/libXprintUtil/" @@ -41,9 +41,3 @@ class Libxprintutil(Package): depends_on('printproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxrandr/package.py b/var/spack/repos/builtin/packages/libxrandr/package.py index 56c36c0c7b..773be3ab8b 100644 --- a/var/spack/repos/builtin/packages/libxrandr/package.py +++ b/var/spack/repos/builtin/packages/libxrandr/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxrandr(Package): +class Libxrandr(AutotoolsPackage): """libXrandr - X Resize, Rotate and Reflection extension library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXrandr" @@ -42,9 +42,3 @@ class Libxrandr(Package): depends_on('renderproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxrender/package.py b/var/spack/repos/builtin/packages/libxrender/package.py index c5a6dac1be..9c7e657f1d 100644 --- a/var/spack/repos/builtin/packages/libxrender/package.py +++ b/var/spack/repos/builtin/packages/libxrender/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxrender(Package): +class Libxrender(AutotoolsPackage): """libXrender - library for the Render Extension to the X11 protocol.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXrender" @@ -38,9 +38,3 @@ class Libxrender(Package): depends_on('renderproto@0.9:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxres/package.py b/var/spack/repos/builtin/packages/libxres/package.py index 6d0684c4b8..c8a7740346 100644 --- a/var/spack/repos/builtin/packages/libxres/package.py +++ b/var/spack/repos/builtin/packages/libxres/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxres(Package): +class Libxres(AutotoolsPackage): """libXRes - X-Resource extension client library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXRes" @@ -40,9 +40,3 @@ class Libxres(Package): depends_on('resourceproto@1.0:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxscrnsaver/package.py b/var/spack/repos/builtin/packages/libxscrnsaver/package.py index c9ca6ac1c8..14f3aa0f04 100644 --- a/var/spack/repos/builtin/packages/libxscrnsaver/package.py +++ b/var/spack/repos/builtin/packages/libxscrnsaver/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxscrnsaver(Package): +class Libxscrnsaver(AutotoolsPackage): """XScreenSaver - X11 Screen Saver extension client library""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXScrnSaver" @@ -40,9 +40,3 @@ class Libxscrnsaver(Package): depends_on('scrnsaverproto@1.2:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxshmfence/package.py b/var/spack/repos/builtin/packages/libxshmfence/package.py index d4f4c85203..63604865bd 100644 --- a/var/spack/repos/builtin/packages/libxshmfence/package.py +++ b/var/spack/repos/builtin/packages/libxshmfence/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxshmfence(Package): +class Libxshmfence(AutotoolsPackage): """libxshmfence - Shared memory 'SyncFence' synchronization primitive. This library offers a CPU-based synchronization primitive compatible @@ -40,10 +40,3 @@ class Libxshmfence(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/libxt/package.py b/var/spack/repos/builtin/packages/libxt/package.py index c657c866b4..1bab6854d9 100644 --- a/var/spack/repos/builtin/packages/libxt/package.py +++ b/var/spack/repos/builtin/packages/libxt/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxt(Package): +class Libxt(AutotoolsPackage): """libXt - X Toolkit Intrinsics library.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXt" @@ -41,9 +41,3 @@ class Libxt(Package): depends_on('kbproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxtrap/package.py b/var/spack/repos/builtin/packages/libxtrap/package.py index 4589f98a87..2b22fb1679 100644 --- a/var/spack/repos/builtin/packages/libxtrap/package.py +++ b/var/spack/repos/builtin/packages/libxtrap/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxtrap(Package): +class Libxtrap(AutotoolsPackage): """libXTrap is the Xlib-based client API for the DEC-XTRAP extension. XTrap was a proposed standard extension for X11R5 which facilitated the @@ -50,9 +50,3 @@ class Libxtrap(Package): depends_on('xextproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxtst/package.py b/var/spack/repos/builtin/packages/libxtst/package.py index 0d16643f94..aaff481afc 100644 --- a/var/spack/repos/builtin/packages/libxtst/package.py +++ b/var/spack/repos/builtin/packages/libxtst/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxtst(Package): +class Libxtst(AutotoolsPackage): """libXtst provides the Xlib-based client API for the XTEST & RECORD extensions. @@ -51,9 +51,3 @@ class Libxtst(Package): depends_on('inputproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxv/package.py b/var/spack/repos/builtin/packages/libxv/package.py index 03f10a1842..2662da8647 100644 --- a/var/spack/repos/builtin/packages/libxv/package.py +++ b/var/spack/repos/builtin/packages/libxv/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxv(Package): +class Libxv(AutotoolsPackage): """libXv - library for the X Video (Xv) extension to the X Window System.""" @@ -41,9 +41,3 @@ class Libxv(Package): depends_on('videoproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxvmc/package.py b/var/spack/repos/builtin/packages/libxvmc/package.py index 9d5695c2c1..8492f660a4 100644 --- a/var/spack/repos/builtin/packages/libxvmc/package.py +++ b/var/spack/repos/builtin/packages/libxvmc/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxvmc(Package): +class Libxvmc(AutotoolsPackage): """X.org libXvMC library.""" homepage = "https://cgit.freedesktop.org/xorg/lib/libXvMC" @@ -41,9 +41,3 @@ class Libxvmc(Package): depends_on('videoproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxxf86dga/package.py b/var/spack/repos/builtin/packages/libxxf86dga/package.py index 292c5d213b..501a40705f 100644 --- a/var/spack/repos/builtin/packages/libxxf86dga/package.py +++ b/var/spack/repos/builtin/packages/libxxf86dga/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxxf86dga(Package): +class Libxxf86dga(AutotoolsPackage): """libXxf86dga - Client library for the XFree86-DGA extension.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXxf86dga" @@ -41,9 +41,3 @@ class Libxxf86dga(Package): depends_on('xf86dgaproto@2.0.99.2:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxxf86misc/package.py b/var/spack/repos/builtin/packages/libxxf86misc/package.py index 0247f8b57c..8e6f743183 100644 --- a/var/spack/repos/builtin/packages/libxxf86misc/package.py +++ b/var/spack/repos/builtin/packages/libxxf86misc/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxxf86misc(Package): +class Libxxf86misc(AutotoolsPackage): """libXxf86misc - Extension library for the XFree86-Misc X extension.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXxf86misc" @@ -41,9 +41,3 @@ class Libxxf86misc(Package): depends_on('xf86miscproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libxxf86vm/package.py b/var/spack/repos/builtin/packages/libxxf86vm/package.py index feec5ff3d2..6f91c62a2d 100644 --- a/var/spack/repos/builtin/packages/libxxf86vm/package.py +++ b/var/spack/repos/builtin/packages/libxxf86vm/package.py @@ -25,7 +25,7 @@ from spack import * -class Libxxf86vm(Package): +class Libxxf86vm(AutotoolsPackage): """libXxf86vm - Extension library for the XFree86-VidMode X extension.""" homepage = "http://cgit.freedesktop.org/xorg/lib/libXxf86vm" @@ -41,9 +41,3 @@ class Libxxf86vm(Package): depends_on('xf86vidmodeproto@2.2.99.1:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/listres/package.py b/var/spack/repos/builtin/packages/listres/package.py index c6b3d149f6..3727ddc0b4 100644 --- a/var/spack/repos/builtin/packages/listres/package.py +++ b/var/spack/repos/builtin/packages/listres/package.py @@ -25,7 +25,7 @@ from spack import * -class Listres(Package): +class Listres(AutotoolsPackage): """The listres program generates a list of X resources for a widget in an X client written using a toolkit based on libXt.""" @@ -41,9 +41,3 @@ class Listres(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/lmod/package.py b/var/spack/repos/builtin/packages/lmod/package.py index 9ac270bab5..01df3c7f24 100644 --- a/var/spack/repos/builtin/packages/lmod/package.py +++ b/var/spack/repos/builtin/packages/lmod/package.py @@ -26,7 +26,7 @@ from spack import * from glob import glob -class Lmod(Package): +class Lmod(AutotoolsPackage): """Lmod is a Lua based module system that easily handles the MODULEPATH Hierarchical problem. Environment Modules provide a convenient way to dynamically change the users' environment through modulefiles. This @@ -66,7 +66,3 @@ class Lmod(Package): if self.spec.version <= Version('6.4.3'): for tclscript in glob('src/*.tcl'): filter_file(r'^#!.*tclsh', '#!@path_to_tclsh@', tclscript) - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make('install') diff --git a/var/spack/repos/builtin/packages/lndir/package.py b/var/spack/repos/builtin/packages/lndir/package.py index a7ce892502..ce3a199fe2 100644 --- a/var/spack/repos/builtin/packages/lndir/package.py +++ b/var/spack/repos/builtin/packages/lndir/package.py @@ -25,7 +25,7 @@ from spack import * -class Lndir(Package): +class Lndir(AutotoolsPackage): """lndir - create a shadow directory of symbolic links to another directory tree.""" @@ -36,9 +36,3 @@ class Lndir(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/lwgrp/package.py b/var/spack/repos/builtin/packages/lwgrp/package.py index 9322d69b9b..169f7540be 100644 --- a/var/spack/repos/builtin/packages/lwgrp/package.py +++ b/var/spack/repos/builtin/packages/lwgrp/package.py @@ -25,7 +25,7 @@ from spack import * -class Lwgrp(Package): +class Lwgrp(AutotoolsPackage): """Thie light-weight group library provides process group representations using O(log N) space and time.""" @@ -35,8 +35,3 @@ class Lwgrp(Package): version('1.0.2', 'ab7ba3bdd8534a651da5076f47f27d8a') depends_on('mpi') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/lwm2/package.py b/var/spack/repos/builtin/packages/lwm2/package.py index 063204b84a..03cb634271 100644 --- a/var/spack/repos/builtin/packages/lwm2/package.py +++ b/var/spack/repos/builtin/packages/lwm2/package.py @@ -25,7 +25,7 @@ from spack import * -class Lwm2(Package): +class Lwm2(AutotoolsPackage): """LWM2: Light Weight Measurement Module. This is a PMPI module that can collect a number of time-sliced MPI and POSIX I/O measurements from a program. @@ -36,8 +36,3 @@ class Lwm2(Package): depends_on("papi") depends_on("mpi") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/makedepend/package.py b/var/spack/repos/builtin/packages/makedepend/package.py index 5675793abc..68be988d82 100644 --- a/var/spack/repos/builtin/packages/makedepend/package.py +++ b/var/spack/repos/builtin/packages/makedepend/package.py @@ -25,7 +25,7 @@ from spack import * -class Makedepend(Package): +class Makedepend(AutotoolsPackage): """makedepend - create dependencies in makefiles.""" homepage = "http://cgit.freedesktop.org/xorg/util/makedepend" @@ -35,10 +35,3 @@ class Makedepend(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py index f19bb466fd..094a7155d2 100644 --- a/var/spack/repos/builtin/packages/mesa/package.py +++ b/var/spack/repos/builtin/packages/mesa/package.py @@ -25,7 +25,7 @@ from spack import * -class Mesa(Package): +class Mesa(AutotoolsPackage): """Mesa is an open-source implementation of the OpenGL specification - a system for rendering interactive 3D graphics.""" @@ -59,9 +59,3 @@ class Mesa(Package): # TODO: Add package for systemd, provides libudev # Using the system package manager to install systemd didn't work for me - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/mkfontdir/package.py b/var/spack/repos/builtin/packages/mkfontdir/package.py index 15c85b24e4..1a43a028a8 100644 --- a/var/spack/repos/builtin/packages/mkfontdir/package.py +++ b/var/spack/repos/builtin/packages/mkfontdir/package.py @@ -25,7 +25,7 @@ from spack import * -class Mkfontdir(Package): +class Mkfontdir(AutotoolsPackage): """mkfontdir creates the fonts.dir files needed by the legacy X server core font system. The current implementation is a simple wrapper script around the mkfontscale program, which must be built and installed first.""" @@ -39,9 +39,3 @@ class Mkfontdir(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/mkfontscale/package.py b/var/spack/repos/builtin/packages/mkfontscale/package.py index 4c907831b6..397ba03a62 100644 --- a/var/spack/repos/builtin/packages/mkfontscale/package.py +++ b/var/spack/repos/builtin/packages/mkfontscale/package.py @@ -25,7 +25,7 @@ from spack import * -class Mkfontscale(Package): +class Mkfontscale(AutotoolsPackage): """mkfontscale creates the fonts.scale and fonts.dir index files used by the legacy X11 font system.""" @@ -40,9 +40,3 @@ class Mkfontscale(Package): depends_on('xproto@7.0.25:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/mpc/package.py b/var/spack/repos/builtin/packages/mpc/package.py index 2fe3900981..40e7d95de9 100644 --- a/var/spack/repos/builtin/packages/mpc/package.py +++ b/var/spack/repos/builtin/packages/mpc/package.py @@ -25,7 +25,7 @@ from spack import * -class Mpc(Package): +class Mpc(AutotoolsPackage): """Gnu Mpc is a C library for the arithmetic of complex numbers with arbitrarily high precision and correct rounding of the result.""" @@ -40,11 +40,6 @@ class Mpc(Package): def url_for_version(self, version): if version < Version("1.0.1"): - return "http://www.multiprecision.org/mpc/download/mpc-%s.tar.gz" % version # NOQA + return "http://www.multiprecision.org/mpc/download/mpc-%s.tar.gz" % version else: return "ftp://ftp.gnu.org/gnu/mpc/mpc-%s.tar.gz" % version - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/mpfr/package.py b/var/spack/repos/builtin/packages/mpfr/package.py index 4612d03849..5dc33b2fb9 100644 --- a/var/spack/repos/builtin/packages/mpfr/package.py +++ b/var/spack/repos/builtin/packages/mpfr/package.py @@ -25,7 +25,7 @@ from spack import * -class Mpfr(Package): +class Mpfr(AutotoolsPackage): """The MPFR library is a C library for multiple-precision floating-point computations with correct rounding.""" homepage = "http://www.mpfr.org" @@ -36,8 +36,3 @@ class Mpfr(Package): version('3.1.2', 'ee2c3ac63bf0c2359bf08fc3ee094c19') depends_on('gmp') # mpir is a drop-in replacement for this - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/mpip/package.py b/var/spack/repos/builtin/packages/mpip/package.py index 78e1dca68a..235c66c882 100644 --- a/var/spack/repos/builtin/packages/mpip/package.py +++ b/var/spack/repos/builtin/packages/mpip/package.py @@ -26,7 +26,7 @@ from spack import * import os -class Mpip(Package): +class Mpip(AutotoolsPackage): """mpiP: Lightweight, Scalable MPI Profiling""" homepage = "http://mpip.sourceforge.net/" url = "http://downloads.sourceforge.net/project/mpip/mpiP/mpiP-3.4.1/mpiP-3.4.1.tar.gz" @@ -38,7 +38,5 @@ class Mpip(Package): depends_on('libunwind', when=os.uname()[4] == "x86_64", type="build") depends_on("mpi", type="build") - def install(self, spec, prefix): - configure("--prefix=" + prefix, "--without-f77") - make() - make("install") + def configure_args(self): + return ['--without-f77'] diff --git a/var/spack/repos/builtin/packages/mrnet/package.py b/var/spack/repos/builtin/packages/mrnet/package.py index 9da9e29a2e..b58d7a8c87 100644 --- a/var/spack/repos/builtin/packages/mrnet/package.py +++ b/var/spack/repos/builtin/packages/mrnet/package.py @@ -25,7 +25,7 @@ from spack import * -class Mrnet(Package): +class Mrnet(AutotoolsPackage): """The MRNet Multi-Cast Reduction Network.""" homepage = "http://paradyn.org/mrnet" url = "ftp://ftp.cs.wisc.edu/paradyn/mrnet/mrnet_5.0.1.tar.gz" @@ -43,14 +43,13 @@ class Mrnet(Package): depends_on("boost") - def install(self, spec, prefix): + def configure_args(self): + spec = self.spec + config_args = ['--enable-shared'] + # Build the MRNet LW thread safe libraries when the # lwthreads variant is present if '+lwthreads' in spec: - configure("--prefix=%s" % prefix, "--enable-shared", - "--enable-ltwt-threadsafe") - else: - configure("--prefix=%s" % prefix, "--enable-shared") + config_args.append('--enable-ltwt-threadsafe') - make() - make("install") + return config_args diff --git a/var/spack/repos/builtin/packages/mxml/package.py b/var/spack/repos/builtin/packages/mxml/package.py index 29e3b27d6e..bae1984bde 100644 --- a/var/spack/repos/builtin/packages/mxml/package.py +++ b/var/spack/repos/builtin/packages/mxml/package.py @@ -25,7 +25,7 @@ from spack import * -class Mxml(Package): +class Mxml(AutotoolsPackage): """Mini-XML is a small XML library that you can use to read and write XML and XML-like data files in your application without requiring large non-standard libraries. @@ -44,7 +44,5 @@ class Mxml(Package): # (Can use whatever compiler you want to use) # Case statement to change CC and CXX flags - def install(self, spec, prefix): - configure('--prefix=%s' % prefix, "--disable-shared", 'CFLAGS=-static') - make() - make("install") + def configure_args(self): + return ['--disable-shared', 'CFLAGS=-static'] diff --git a/var/spack/repos/builtin/packages/nano/package.py b/var/spack/repos/builtin/packages/nano/package.py index 3e87ec8ffe..d303b5e424 100644 --- a/var/spack/repos/builtin/packages/nano/package.py +++ b/var/spack/repos/builtin/packages/nano/package.py @@ -25,7 +25,7 @@ from spack import * -class Nano(Package): +class Nano(AutotoolsPackage): """Tiny little text editor""" homepage = "http://www.nano-editor.org" @@ -33,8 +33,3 @@ class Nano(Package): version('2.6.3', '1213c7f17916e65afefc95054c1f90f9') version('2.6.2', '58568a4b8a33841d774c25f285fc11c1') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/nasm/package.py b/var/spack/repos/builtin/packages/nasm/package.py index 9faccccaae..979d002b4c 100644 --- a/var/spack/repos/builtin/packages/nasm/package.py +++ b/var/spack/repos/builtin/packages/nasm/package.py @@ -25,15 +25,10 @@ from spack import * -class Nasm(Package): +class Nasm(AutotoolsPackage): """NASM (Netwide Assembler) is an 80x86 assembler designed for portability and modularity. It includes a disassembler as well.""" homepage = "http://www.nasm.us" url = "http://www.nasm.us/pub/nasm/releasebuilds/2.11.06/nasm-2.11.06.tar.xz" version('2.11.06', '2b958e9f5d200641e6fc9564977aecc5') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/ncview/package.py b/var/spack/repos/builtin/packages/ncview/package.py index 5c3cf300d2..da541c18b3 100644 --- a/var/spack/repos/builtin/packages/ncview/package.py +++ b/var/spack/repos/builtin/packages/ncview/package.py @@ -25,7 +25,7 @@ from spack import * -class Ncview(Package): +class Ncview(AutotoolsPackage): """Simple viewer for NetCDF files.""" homepage = "http://meteora.ucsd.edu/~pierce/ncview_home_page.html" url = "ftp://cirrus.ucsd.edu/pub/ncview/ncview-2.1.7.tar.gz" @@ -36,9 +36,3 @@ class Ncview(Package): depends_on('udunits2') depends_on('libpng') depends_on('libxaw') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/netgauge/package.py b/var/spack/repos/builtin/packages/netgauge/package.py index b57cdbe5f3..e7e669410b 100644 --- a/var/spack/repos/builtin/packages/netgauge/package.py +++ b/var/spack/repos/builtin/packages/netgauge/package.py @@ -25,7 +25,7 @@ from spack import * -class Netgauge(Package): +class Netgauge(AutotoolsPackage): """Netgauge is a high-precision network parameter measurement tool. It supports benchmarking of many different network protocols and communication patterns. The main focus lies on accuracy, @@ -37,8 +37,3 @@ class Netgauge(Package): version('2.4.6', 'e0e040ec6452e93ca21ccc54deac1d7f') depends_on("mpi") - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/nettle/package.py b/var/spack/repos/builtin/packages/nettle/package.py index 7e2b758bc0..6112dc6507 100644 --- a/var/spack/repos/builtin/packages/nettle/package.py +++ b/var/spack/repos/builtin/packages/nettle/package.py @@ -25,7 +25,7 @@ from spack import * -class Nettle(Package): +class Nettle(AutotoolsPackage): """The Nettle package contains the low-level cryptographic library that is designed to fit easily in many contexts.""" @@ -37,11 +37,3 @@ class Nettle(Package): depends_on('gmp') depends_on('m4', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - if self.run_tests: - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/npm/package.py b/var/spack/repos/builtin/packages/npm/package.py index 7910a8af9b..500674d1d8 100644 --- a/var/spack/repos/builtin/packages/npm/package.py +++ b/var/spack/repos/builtin/packages/npm/package.py @@ -26,7 +26,7 @@ import os from spack import * -class Npm(Package): +class Npm(AutotoolsPackage): """npm: A package manager for javascript.""" homepage = "https://github.com/npm/npm" @@ -37,18 +37,10 @@ class Npm(Package): version('3.10.5', '46002413f4a71de9b0da5b506bf1d992') depends_on('node-js') - + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): npm_config_cache_dir = "%s/npm-cache" % dependent_spec.prefix if not os.path.isdir(npm_config_cache_dir): mkdir(npm_config_cache_dir) run_env.set('npm_config_cache', npm_config_cache_dir) spack_env.set('npm_config_cache', npm_config_cache_dir) - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - if self.run_tests: - make('test') - - make('install') diff --git a/var/spack/repos/builtin/packages/ocaml/package.py b/var/spack/repos/builtin/packages/ocaml/package.py index 9488d3b7a6..855e2d7b3b 100644 --- a/var/spack/repos/builtin/packages/ocaml/package.py +++ b/var/spack/repos/builtin/packages/ocaml/package.py @@ -25,7 +25,7 @@ from spack import * -class Ocaml(Package): +class Ocaml(AutotoolsPackage): """OCaml is an industrial strength programming language supporting functional, imperative and object-oriented styles""" @@ -36,8 +36,4 @@ class Ocaml(Package): depends_on('ncurses') - def install(self, spec, prefix): - configure('-prefix', '{0}'.format(prefix)) - - make('world.opt') - make('install') + build_targets = ['world.opt'] diff --git a/var/spack/repos/builtin/packages/oclock/package.py b/var/spack/repos/builtin/packages/oclock/package.py index 84da93c36e..ec656b23f1 100644 --- a/var/spack/repos/builtin/packages/oclock/package.py +++ b/var/spack/repos/builtin/packages/oclock/package.py @@ -25,7 +25,7 @@ from spack import * -class Oclock(Package): +class Oclock(AutotoolsPackage): """oclock is a simple analog clock using the SHAPE extension to make a round (possibly transparent) window.""" @@ -42,9 +42,3 @@ class Oclock(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/pango/package.py b/var/spack/repos/builtin/packages/pango/package.py index c45054be58..0f082527b9 100644 --- a/var/spack/repos/builtin/packages/pango/package.py +++ b/var/spack/repos/builtin/packages/pango/package.py @@ -25,7 +25,7 @@ from spack import * -class Pango(Package): +class Pango(AutotoolsPackage): """Pango is a library for laying out and rendering of text, with an emphasis on internationalization. It can be used anywhere that text layout is needed, though most of the work on Pango so @@ -49,6 +49,4 @@ class Pango(Package): depends_on("glib") def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() make("install", parallel=False) diff --git a/var/spack/repos/builtin/packages/parallel/package.py b/var/spack/repos/builtin/packages/parallel/package.py index 81c0195651..4297e8acb0 100644 --- a/var/spack/repos/builtin/packages/parallel/package.py +++ b/var/spack/repos/builtin/packages/parallel/package.py @@ -25,7 +25,7 @@ from spack import * -class Parallel(Package): +class Parallel(AutotoolsPackage): """GNU parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. @@ -36,9 +36,3 @@ class Parallel(Package): version('20160422', '24621f684130472694333709bd4454cb') version('20160322', '4e81e0d36902ab4c4e969ee6f35e6e57') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/patchelf/package.py b/var/spack/repos/builtin/packages/patchelf/package.py index c391f491eb..1d429361b6 100644 --- a/var/spack/repos/builtin/packages/patchelf/package.py +++ b/var/spack/repos/builtin/packages/patchelf/package.py @@ -25,7 +25,7 @@ from spack import * -class Patchelf(Package): +class Patchelf(AutotoolsPackage): """PatchELF is a small utility to modify the dynamic linker and RPATH of ELF executables.""" @@ -37,8 +37,3 @@ class Patchelf(Package): version('0.9', '3c265508526760f233620f35d79c79fc') version('0.8', '407b229e6a681ffb0e2cdd5915cb2d01') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/pcre2/package.py b/var/spack/repos/builtin/packages/pcre2/package.py index a2739e0584..d2915dd60e 100644 --- a/var/spack/repos/builtin/packages/pcre2/package.py +++ b/var/spack/repos/builtin/packages/pcre2/package.py @@ -25,7 +25,7 @@ from spack import * -class Pcre2(Package): +class Pcre2(AutotoolsPackage): """The PCRE2 package contains Perl Compatible Regular Expression libraries. These are useful for implementing regular expression pattern matching using the same syntax and semantics as Perl 5.""" @@ -33,8 +33,3 @@ class Pcre2(Package): url = "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-10.20.tar.bz2" version('10.20', 'dcd027c57ecfdc8a6c3af9d0acf5e3f7') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/pdt/package.py b/var/spack/repos/builtin/packages/pdt/package.py index bed01aeefb..081c32c861 100644 --- a/var/spack/repos/builtin/packages/pdt/package.py +++ b/var/spack/repos/builtin/packages/pdt/package.py @@ -25,7 +25,7 @@ from spack import * -class Pdt(Package): +class Pdt(AutotoolsPackage): """Program Database Toolkit (PDT) is a framework for analyzing source code written in several programming languages and for making rich program knowledge accessible to developers of static and dynamic @@ -43,8 +43,3 @@ class Pdt(Package): version('3.20', 'c3edabe202926abe04552e33cd39672d') version('3.19', '5c5e1e6607086aa13bf4b1b9befc5864') version('3.18.1', 'e401534f5c476c3e77f05b7f73b6c4f2') - - def install(self, spec, prefix): - configure('-prefix=%s' % prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/presentproto/package.py b/var/spack/repos/builtin/packages/presentproto/package.py index ca145abb6b..32560ade65 100644 --- a/var/spack/repos/builtin/packages/presentproto/package.py +++ b/var/spack/repos/builtin/packages/presentproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Presentproto(Package): +class Presentproto(AutotoolsPackage): """Present protocol specification and Xlib/Xserver headers.""" homepage = "https://cgit.freedesktop.org/xorg/proto/presentproto/" @@ -35,8 +35,3 @@ class Presentproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/printproto/package.py b/var/spack/repos/builtin/packages/printproto/package.py index 151924dd49..0f905c3172 100644 --- a/var/spack/repos/builtin/packages/printproto/package.py +++ b/var/spack/repos/builtin/packages/printproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Printproto(Package): +class Printproto(AutotoolsPackage): """Xprint extension to the X11 protocol - a portable, network-transparent printing system.""" @@ -36,8 +36,3 @@ class Printproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/proj/package.py b/var/spack/repos/builtin/packages/proj/package.py index 06ab6108b6..3008baa690 100644 --- a/var/spack/repos/builtin/packages/proj/package.py +++ b/var/spack/repos/builtin/packages/proj/package.py @@ -25,7 +25,7 @@ from spack import * -class Proj(Package): +class Proj(AutotoolsPackage): """Cartographic Projections""" homepage = "https://github.com/OSGeo/proj.4/wiki" url = "http://download.osgeo.org/proj/proj-4.9.2.tar.gz" @@ -35,11 +35,3 @@ class Proj(Package): version('4.8.0', 'd815838c92a29179298c126effbb1537') version('4.7.0', '927d34623b52e0209ba2bfcca18fe8cd') version('4.6.1', '7dbaab8431ad50c25669fd3fb28dc493') - - # No dependencies - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/protobuf/package.py b/var/spack/repos/builtin/packages/protobuf/package.py index bf0073b16a..6faa0376ad 100644 --- a/var/spack/repos/builtin/packages/protobuf/package.py +++ b/var/spack/repos/builtin/packages/protobuf/package.py @@ -25,16 +25,10 @@ from spack import * -class Protobuf(Package): +class Protobuf(AutotoolsPackage): """Google's data interchange format.""" homepage = "https://developers.google.com/protocol-buffers" url = "https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.bz2" version('2.5.0', 'a72001a9067a4c2c4e0e836d0f92ece4') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("check") - make("install") diff --git a/var/spack/repos/builtin/packages/proxymngr/package.py b/var/spack/repos/builtin/packages/proxymngr/package.py index 896f4a516b..896f2d00b7 100644 --- a/var/spack/repos/builtin/packages/proxymngr/package.py +++ b/var/spack/repos/builtin/packages/proxymngr/package.py @@ -25,7 +25,7 @@ from spack import * -class Proxymngr(Package): +class Proxymngr(AutotoolsPackage): """The proxy manager (proxymngr) is responsible for resolving requests from xfindproxy (and other similar clients), starting new proxies when appropriate, and keeping track of all of the available proxy services. @@ -44,9 +44,3 @@ class Proxymngr(Package): depends_on('xproxymanagementprotocol', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/py-xpyb/package.py b/var/spack/repos/builtin/packages/py-xpyb/package.py index 49c6343c45..136da54dcf 100644 --- a/var/spack/repos/builtin/packages/py-xpyb/package.py +++ b/var/spack/repos/builtin/packages/py-xpyb/package.py @@ -25,7 +25,7 @@ from spack import * -class PyXpyb(Package): +class PyXpyb(AutotoolsPackage): """xpyb provides a Python binding to the X Window System protocol via libxcb.""" @@ -39,9 +39,3 @@ class PyXpyb(Package): depends_on('libxcb@1.5:') depends_on('xcb-proto@1.7.1:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/randrproto/package.py b/var/spack/repos/builtin/packages/randrproto/package.py index ecff886a3b..ff33620448 100644 --- a/var/spack/repos/builtin/packages/randrproto/package.py +++ b/var/spack/repos/builtin/packages/randrproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Randrproto(Package): +class Randrproto(AutotoolsPackage): """X Resize and Rotate Extension (RandR). This extension defines a protocol for clients to dynamically change X @@ -39,8 +39,3 @@ class Randrproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/readline/package.py b/var/spack/repos/builtin/packages/readline/package.py index abb6ba04ce..ab9454b0fc 100644 --- a/var/spack/repos/builtin/packages/readline/package.py +++ b/var/spack/repos/builtin/packages/readline/package.py @@ -25,7 +25,7 @@ from spack import * -class Readline(Package): +class Readline(AutotoolsPackage): """The GNU Readline library provides a set of functions for use by applications that allow users to edit command lines as they are typed in. Both Emacs and vi editing modes are @@ -40,7 +40,5 @@ class Readline(Package): depends_on("ncurses") - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) + def build(self, spec, prefix): make("SHLIB_LIBS=-lncurses") - make("install") diff --git a/var/spack/repos/builtin/packages/recordproto/package.py b/var/spack/repos/builtin/packages/recordproto/package.py index 02018a76ff..b38eeae079 100644 --- a/var/spack/repos/builtin/packages/recordproto/package.py +++ b/var/spack/repos/builtin/packages/recordproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Recordproto(Package): +class Recordproto(AutotoolsPackage): """X Record Extension. This extension defines a protocol for the recording and playback of user @@ -38,8 +38,3 @@ class Recordproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/rendercheck/package.py b/var/spack/repos/builtin/packages/rendercheck/package.py index 07cc809e9a..f53925fe28 100644 --- a/var/spack/repos/builtin/packages/rendercheck/package.py +++ b/var/spack/repos/builtin/packages/rendercheck/package.py @@ -25,7 +25,7 @@ from spack import * -class Rendercheck(Package): +class Rendercheck(AutotoolsPackage): """rendercheck is a program to test a Render extension implementation against separate calculations of expected output.""" @@ -40,9 +40,3 @@ class Rendercheck(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/renderproto/package.py b/var/spack/repos/builtin/packages/renderproto/package.py index 10be4c941c..81348d7347 100644 --- a/var/spack/repos/builtin/packages/renderproto/package.py +++ b/var/spack/repos/builtin/packages/renderproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Renderproto(Package): +class Renderproto(AutotoolsPackage): """X Rendering Extension. This extension defines the protcol for a digital image composition as @@ -38,8 +38,3 @@ class Renderproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/resourceproto/package.py b/var/spack/repos/builtin/packages/resourceproto/package.py index 4e0a495d83..11e143b5fc 100644 --- a/var/spack/repos/builtin/packages/resourceproto/package.py +++ b/var/spack/repos/builtin/packages/resourceproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Resourceproto(Package): +class Resourceproto(AutotoolsPackage): """X Resource Extension. This extension defines a protocol that allows a client to query the @@ -38,8 +38,3 @@ class Resourceproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/rgb/package.py b/var/spack/repos/builtin/packages/rgb/package.py index ddc5419305..985b90449d 100644 --- a/var/spack/repos/builtin/packages/rgb/package.py +++ b/var/spack/repos/builtin/packages/rgb/package.py @@ -25,7 +25,7 @@ from spack import * -class Rgb(Package): +class Rgb(AutotoolsPackage): """X color name database. This package includes both the list mapping X color names to RGB values @@ -42,10 +42,3 @@ class Rgb(Package): depends_on('xorg-server') depends_on('xproto', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/rstart/package.py b/var/spack/repos/builtin/packages/rstart/package.py index 7b80e88ae7..198c9c8be5 100644 --- a/var/spack/repos/builtin/packages/rstart/package.py +++ b/var/spack/repos/builtin/packages/rstart/package.py @@ -25,7 +25,7 @@ from spack import * -class Rstart(Package): +class Rstart(AutotoolsPackage): """This package includes both the client and server sides implementing the protocol described in the "A Flexible Remote Execution Protocol Based on rsh" paper found in the specs/ subdirectory. @@ -41,9 +41,3 @@ class Rstart(Package): depends_on('xproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/rsync/package.py b/var/spack/repos/builtin/packages/rsync/package.py index 4e741b255f..2c21262b39 100644 --- a/var/spack/repos/builtin/packages/rsync/package.py +++ b/var/spack/repos/builtin/packages/rsync/package.py @@ -25,16 +25,10 @@ from spack import * -class Rsync(Package): +class Rsync(AutotoolsPackage): """An open source utility that provides fast incremental file transfer.""" homepage = "https://rsync.samba.org" url = "https://download.samba.org/pub/rsync/rsync-3.1.1.tar.gz" version('3.1.2', '0f758d7e000c0f7f7d3792610fad70cb') version('3.1.1', '43bd6676f0b404326eee2d63be3cdcfe') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/screen/package.py b/var/spack/repos/builtin/packages/screen/package.py index 7edfb44a4d..542612f207 100644 --- a/var/spack/repos/builtin/packages/screen/package.py +++ b/var/spack/repos/builtin/packages/screen/package.py @@ -25,7 +25,7 @@ from spack import * -class Screen(Package): +class Screen(AutotoolsPackage): """Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. """ @@ -51,8 +51,3 @@ class Screen(Package): version('3.7.1', '27cdd29318446561ef7c966041cbd2c9') depends_on('ncurses') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/scripts/package.py b/var/spack/repos/builtin/packages/scripts/package.py index 7086cfd6fe..4bdf63e70a 100644 --- a/var/spack/repos/builtin/packages/scripts/package.py +++ b/var/spack/repos/builtin/packages/scripts/package.py @@ -25,7 +25,7 @@ from spack import * -class Scripts(Package): +class Scripts(AutotoolsPackage): """Various X related scripts.""" homepage = "http://cgit.freedesktop.org/xorg/app/scripts" @@ -37,9 +37,3 @@ class Scripts(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/scrnsaverproto/package.py b/var/spack/repos/builtin/packages/scrnsaverproto/package.py index 3675fd0eff..c849d12713 100644 --- a/var/spack/repos/builtin/packages/scrnsaverproto/package.py +++ b/var/spack/repos/builtin/packages/scrnsaverproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Scrnsaverproto(Package): +class Scrnsaverproto(AutotoolsPackage): """MIT Screen Saver Extension. This extension defines a protocol to control screensaver features @@ -38,8 +38,3 @@ class Scrnsaverproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/sdl2-image/package.py b/var/spack/repos/builtin/packages/sdl2-image/package.py index 5df207ac55..6e953a1451 100644 --- a/var/spack/repos/builtin/packages/sdl2-image/package.py +++ b/var/spack/repos/builtin/packages/sdl2-image/package.py @@ -25,7 +25,7 @@ from spack import * -class Sdl2Image(Package): +class Sdl2Image(AutotoolsPackage): """SDL is designed to provide the bare bones of creating a graphical program. """ @@ -35,9 +35,3 @@ class Sdl2Image(Package): version('2.0.1', 'd94b94555ba022fa249a53a021dc3606') depends_on('sdl2') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/sed/package.py b/var/spack/repos/builtin/packages/sed/package.py index f2a240e1b3..57e00f4e77 100644 --- a/var/spack/repos/builtin/packages/sed/package.py +++ b/var/spack/repos/builtin/packages/sed/package.py @@ -25,15 +25,9 @@ from spack import * -class Sed(Package): +class Sed(AutotoolsPackage): """GNU implementation of the famous stream editor.""" homepage = "http://www.gnu.org/software/sed/" url = "http://ftpmirror.gnu.org/sed/sed-4.2.2.tar.bz2" version('4.2.2', '7ffe1c7cdc3233e1e0c4b502df253974') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/sessreg/package.py b/var/spack/repos/builtin/packages/sessreg/package.py index 2ab505cc7a..d50e65f4b0 100644 --- a/var/spack/repos/builtin/packages/sessreg/package.py +++ b/var/spack/repos/builtin/packages/sessreg/package.py @@ -25,7 +25,7 @@ from spack import * -class Sessreg(Package): +class Sessreg(AutotoolsPackage): """Sessreg is a simple program for managing utmp/wtmp entries for X sessions. It was originally written for use with xdm, but may also be used with other display managers such as gdm or kdm.""" @@ -43,9 +43,3 @@ class Sessreg(Package): kwargs = {'string': True} filter_file('$(CPP) $(DEFS)', '$(CPP) -P $(DEFS)', 'man/Makefile.in', **kwargs) - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/setxkbmap/package.py b/var/spack/repos/builtin/packages/setxkbmap/package.py index db365530c9..2c0f4380e3 100644 --- a/var/spack/repos/builtin/packages/setxkbmap/package.py +++ b/var/spack/repos/builtin/packages/setxkbmap/package.py @@ -25,7 +25,7 @@ from spack import * -class Setxkbmap(Package): +class Setxkbmap(AutotoolsPackage): """setxkbmap is an X11 client to change the keymaps in the X server for a specified keyboard to use the layout determined by the options listed on the command line.""" @@ -40,9 +40,3 @@ class Setxkbmap(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/showfont/package.py b/var/spack/repos/builtin/packages/showfont/package.py index 232988193b..2dd8360311 100644 --- a/var/spack/repos/builtin/packages/showfont/package.py +++ b/var/spack/repos/builtin/packages/showfont/package.py @@ -25,7 +25,7 @@ from spack import * -class Showfont(Package): +class Showfont(AutotoolsPackage): """showfont displays data about a font from an X font server. The information shown includes font information, font properties, character metrics, and character bitmaps.""" @@ -39,9 +39,3 @@ class Showfont(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/smproxy/package.py b/var/spack/repos/builtin/packages/smproxy/package.py index 5bdde800d4..f7c7ebfe99 100644 --- a/var/spack/repos/builtin/packages/smproxy/package.py +++ b/var/spack/repos/builtin/packages/smproxy/package.py @@ -25,7 +25,7 @@ from spack import * -class Smproxy(Package): +class Smproxy(AutotoolsPackage): """smproxy allows X applications that do not support X11R6 session management to participate in an X11R6 session.""" @@ -41,9 +41,3 @@ class Smproxy(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/snappy/package.py b/var/spack/repos/builtin/packages/snappy/package.py index 1e94980c92..c7b8118a24 100644 --- a/var/spack/repos/builtin/packages/snappy/package.py +++ b/var/spack/repos/builtin/packages/snappy/package.py @@ -25,15 +25,10 @@ from spack import * -class Snappy(Package): +class Snappy(AutotoolsPackage): """A fast compressor/decompressor: https://code.google.com/p/snappy""" homepage = "https://code.google.com/p/snappy" url = "https://github.com/google/snappy/releases/download/1.1.3/snappy-1.1.3.tar.gz" version('1.1.3', '7358c82f133dc77798e4c2062a749b73') - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/sowing/package.py b/var/spack/repos/builtin/packages/sowing/package.py index f7f6297488..5dc23579b8 100644 --- a/var/spack/repos/builtin/packages/sowing/package.py +++ b/var/spack/repos/builtin/packages/sowing/package.py @@ -26,7 +26,7 @@ from spack import * -class Sowing(Package): +class Sowing(AutotoolsPackage): """Sowing generates Fortran interfaces and documentation for PETSc and MPICH. """ @@ -36,7 +36,5 @@ class Sowing(Package): version('1.1.23-p1', '65aaf3ae2a4c0f30d532fec291702e16') - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) + def build(self, spec, prefix): make('ALL', parallel=False) - make("install") diff --git a/var/spack/repos/builtin/packages/sparsehash/package.py b/var/spack/repos/builtin/packages/sparsehash/package.py index e5abd42ae6..6216987bce 100644 --- a/var/spack/repos/builtin/packages/sparsehash/package.py +++ b/var/spack/repos/builtin/packages/sparsehash/package.py @@ -25,15 +25,9 @@ from spack import * -class Sparsehash(Package): +class Sparsehash(AutotoolsPackage): """Sparse and dense hash-tables for C++ by Google""" homepage = "https://github.com/sparsehash/sparsehash" url = "https://github.com/sparsehash/sparsehash/archive/sparsehash-2.0.3.tar.gz" version('2.0.3', 'd8d5e2538c1c25577b3f066d7a55e99e') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/spindle/package.py b/var/spack/repos/builtin/packages/spindle/package.py index 213d41e970..c23fb56f03 100644 --- a/var/spack/repos/builtin/packages/spindle/package.py +++ b/var/spack/repos/builtin/packages/spindle/package.py @@ -25,7 +25,7 @@ from spack import * -class Spindle(Package): +class Spindle(AutotoolsPackage): """Spindle improves the library-loading performance of dynamically linked HPC applications. Without Spindle large MPI jobs can overload on a shared file system when loading dynamically @@ -38,8 +38,3 @@ class Spindle(Package): version('0.8.1', 'f11793a6b9d8df2cd231fccb2857d912') depends_on("launchmon") - - def install(self, spec, prefix): - configure("--prefix=" + prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/spot/package.py b/var/spack/repos/builtin/packages/spot/package.py index 096aa24c02..abb1776aaf 100644 --- a/var/spack/repos/builtin/packages/spot/package.py +++ b/var/spack/repos/builtin/packages/spot/package.py @@ -25,7 +25,7 @@ from spack import * -class Spot(Package): +class Spot(AutotoolsPackage): """Spot is a C++11 library for omega-automata manipulation and model checking.""" homepage = "https://spot.lrde.epita.fr/index.html" @@ -35,9 +35,3 @@ class Spot(Package): # depends_on("gcc@4.8:", type='build') depends_on("python@3.2:") - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/swig/package.py b/var/spack/repos/builtin/packages/swig/package.py index b43246dcee..77f2c69772 100644 --- a/var/spack/repos/builtin/packages/swig/package.py +++ b/var/spack/repos/builtin/packages/swig/package.py @@ -25,7 +25,7 @@ from spack import * -class Swig(Package): +class Swig(AutotoolsPackage): """SWIG is an interface compiler that connects programs written in C and C++ with scripting languages such as Perl, Python, Ruby, and Tcl. It works by taking the declarations found in C/C++ @@ -46,8 +46,3 @@ class Swig(Package): version('1.3.40', '2df766c9e03e02811b1ab4bba1c7b9cc') depends_on('pcre') - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/the-silver-searcher/package.py b/var/spack/repos/builtin/packages/the-silver-searcher/package.py index c98e964efa..9721554663 100644 --- a/var/spack/repos/builtin/packages/the-silver-searcher/package.py +++ b/var/spack/repos/builtin/packages/the-silver-searcher/package.py @@ -25,7 +25,7 @@ from spack import * -class TheSilverSearcher(Package): +class TheSilverSearcher(AutotoolsPackage): """Fast recursive grep alternative""" homepage = "http://geoff.greer.fm/ag/" url = "http://geoff.greer.fm/ag/releases/the_silver_searcher-0.32.0.tar.gz" @@ -36,9 +36,3 @@ class TheSilverSearcher(Package): depends_on('pcre') depends_on('xz') depends_on('pkg-config', type='build') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/transset/package.py b/var/spack/repos/builtin/packages/transset/package.py index 0f60738741..27f3a2f882 100644 --- a/var/spack/repos/builtin/packages/transset/package.py +++ b/var/spack/repos/builtin/packages/transset/package.py @@ -25,7 +25,7 @@ from spack import * -class Transset(Package): +class Transset(AutotoolsPackage): """transset is an utility for setting opacity property.""" homepage = "http://cgit.freedesktop.org/xorg/app/transset" @@ -38,9 +38,3 @@ class Transset(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/trapproto/package.py b/var/spack/repos/builtin/packages/trapproto/package.py index eebab74410..879ac569df 100644 --- a/var/spack/repos/builtin/packages/trapproto/package.py +++ b/var/spack/repos/builtin/packages/trapproto/package.py @@ -25,15 +25,10 @@ from spack import * -class Trapproto(Package): +class Trapproto(AutotoolsPackage): """X.org TrapProto protocol headers.""" homepage = "https://cgit.freedesktop.org/xorg/proto/trapproto" url = "https://www.x.org/archive/individual/proto/trapproto-3.4.3.tar.gz" version('3.4.3', '1344759ae8d7d923e64f5eec078a679b') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/twm/package.py b/var/spack/repos/builtin/packages/twm/package.py index 3e37f4903d..a1a221b969 100644 --- a/var/spack/repos/builtin/packages/twm/package.py +++ b/var/spack/repos/builtin/packages/twm/package.py @@ -25,7 +25,7 @@ from spack import * -class Twm(Package): +class Twm(AutotoolsPackage): """twm is a window manager for the X Window System. It provides titlebars, shaped windows, several forms of icon management, user-defined macro functions, click-to-type and pointer-driven @@ -48,9 +48,3 @@ class Twm(Package): depends_on('flex', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/uberftp/package.py b/var/spack/repos/builtin/packages/uberftp/package.py index b0c6c8a42f..f9d0174b78 100644 --- a/var/spack/repos/builtin/packages/uberftp/package.py +++ b/var/spack/repos/builtin/packages/uberftp/package.py @@ -25,7 +25,7 @@ from spack import * -class Uberftp(Package): +class Uberftp(AutotoolsPackage): """UberFTP is an interactive (text-based) client for GridFTP""" homepage = "http://toolkit.globus.org/grid_software/data/uberftp.php" @@ -36,9 +36,3 @@ class Uberftp(Package): version('2_6', '784210976f259f9d19c0798c19778d34') depends_on('globus-toolkit') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/uncrustify/package.py b/var/spack/repos/builtin/packages/uncrustify/package.py index c3182d0dc8..7e4b3bd24d 100644 --- a/var/spack/repos/builtin/packages/uncrustify/package.py +++ b/var/spack/repos/builtin/packages/uncrustify/package.py @@ -25,15 +25,10 @@ from spack import * -class Uncrustify(Package): +class Uncrustify(AutotoolsPackage): """Source Code Beautifier for C, C++, C#, ObjectiveC, Java, and others.""" homepage = "http://uncrustify.sourceforge.net/" url = "http://downloads.sourceforge.net/project/uncrustify/uncrustify/uncrustify-0.61/uncrustify-0.61.tar.gz" version('0.61', 'b6140106e74c64e831d0b1c4b6cf7727') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/unixodbc/package.py b/var/spack/repos/builtin/packages/unixodbc/package.py index 15de127b7e..cba34b29c3 100644 --- a/var/spack/repos/builtin/packages/unixodbc/package.py +++ b/var/spack/repos/builtin/packages/unixodbc/package.py @@ -25,7 +25,7 @@ from spack import * -class Unixodbc(Package): +class Unixodbc(AutotoolsPackage): """ODBC is an open specification for providing application developers with a predictable API with which to access Data Sources. Data Sources include SQL Servers and any Data Source with an ODBC Driver.""" @@ -34,9 +34,3 @@ class Unixodbc(Package): url = "ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.4.tar.gz" version('2.3.4', 'bd25d261ca1808c947cb687e2034be81') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/util-macros/package.py b/var/spack/repos/builtin/packages/util-macros/package.py index 486d4463b0..181302a34a 100644 --- a/var/spack/repos/builtin/packages/util-macros/package.py +++ b/var/spack/repos/builtin/packages/util-macros/package.py @@ -25,7 +25,7 @@ from spack import * -class UtilMacros(Package): +class UtilMacros(AutotoolsPackage): """This is a set of autoconf macros used by the configure.ac scripts in other Xorg modular packages, and is needed to generate new versions of their configure scripts with autoconf.""" @@ -34,8 +34,3 @@ class UtilMacros(Package): url = "https://www.x.org/archive/individual/util/util-macros-1.19.0.tar.bz2" version('1.19.0', '1cf984125e75f8204938d998a8b6c1e1') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/videoproto/package.py b/var/spack/repos/builtin/packages/videoproto/package.py index 93b0e61ca4..d1495fe33d 100644 --- a/var/spack/repos/builtin/packages/videoproto/package.py +++ b/var/spack/repos/builtin/packages/videoproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Videoproto(Package): +class Videoproto(AutotoolsPackage): """X Video Extension. This extension provides a protocol for a video output mechanism, @@ -38,8 +38,3 @@ class Videoproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/viewres/package.py b/var/spack/repos/builtin/packages/viewres/package.py index 3a32555075..9e6daafc8b 100644 --- a/var/spack/repos/builtin/packages/viewres/package.py +++ b/var/spack/repos/builtin/packages/viewres/package.py @@ -25,7 +25,7 @@ from spack import * -class Viewres(Package): +class Viewres(AutotoolsPackage): """viewres displays a tree showing the widget class hierarchy of the Athena Widget Set (libXaw).""" @@ -40,9 +40,3 @@ class Viewres(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/windowswmproto/package.py b/var/spack/repos/builtin/packages/windowswmproto/package.py index f163d1afb0..9341cbd22c 100644 --- a/var/spack/repos/builtin/packages/windowswmproto/package.py +++ b/var/spack/repos/builtin/packages/windowswmproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Windowswmproto(Package): +class Windowswmproto(AutotoolsPackage): """This module provides the definition of the WindowsWM extension to the X11 protocol, used for coordination between an X11 server and the Microsoft Windows native window manager. @@ -37,8 +37,3 @@ class Windowswmproto(Package): url = "https://www.x.org/archive/individual/proto/windowswmproto-1.0.4.tar.gz" version('1.0.4', '558db92a8e4e1b07e9c62eca3f04dd8d') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/x11perf/package.py b/var/spack/repos/builtin/packages/x11perf/package.py index 91db1e8a59..89936e77f5 100644 --- a/var/spack/repos/builtin/packages/x11perf/package.py +++ b/var/spack/repos/builtin/packages/x11perf/package.py @@ -25,7 +25,7 @@ from spack import * -class X11perf(Package): +class X11perf(AutotoolsPackage): """Simple X server performance benchmarker.""" homepage = "http://cgit.freedesktop.org/xorg/app/x11perf" @@ -41,9 +41,3 @@ class X11perf(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xauth/package.py b/var/spack/repos/builtin/packages/xauth/package.py index 6d6a03c899..fa172b5dc0 100644 --- a/var/spack/repos/builtin/packages/xauth/package.py +++ b/var/spack/repos/builtin/packages/xauth/package.py @@ -25,7 +25,7 @@ from spack import * -class Xauth(Package): +class Xauth(AutotoolsPackage): """The xauth program is used to edit and display the authorization information used in connecting to the X server.""" @@ -43,9 +43,4 @@ class Xauth(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - # make('check') # TODO: add package for cmdtest build dependency - make('install') + # TODO: add package for cmdtest test dependency diff --git a/var/spack/repos/builtin/packages/xbacklight/package.py b/var/spack/repos/builtin/packages/xbacklight/package.py index f1a9ecc124..da9ab8f3bd 100644 --- a/var/spack/repos/builtin/packages/xbacklight/package.py +++ b/var/spack/repos/builtin/packages/xbacklight/package.py @@ -25,7 +25,7 @@ from spack import * -class Xbacklight(Package): +class Xbacklight(AutotoolsPackage): """Xbacklight is used to adjust the backlight brightness where supported. It uses the RandR extension to find all outputs on the X server supporting backlight brightness control and changes them all in the @@ -41,9 +41,3 @@ class Xbacklight(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xbiff/package.py b/var/spack/repos/builtin/packages/xbiff/package.py index f5c53c5997..29bd9086d8 100644 --- a/var/spack/repos/builtin/packages/xbiff/package.py +++ b/var/spack/repos/builtin/packages/xbiff/package.py @@ -25,7 +25,7 @@ from spack import * -class Xbiff(Package): +class Xbiff(AutotoolsPackage): """xbiff provides graphical notification of new e-mail. It only handles mail stored in a filesystem accessible file, not via IMAP, POP or other remote access protocols.""" @@ -43,9 +43,3 @@ class Xbiff(Package): depends_on('xbitmaps', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xbitmaps/package.py b/var/spack/repos/builtin/packages/xbitmaps/package.py index 1c6fb79d3a..6fcaf1240d 100644 --- a/var/spack/repos/builtin/packages/xbitmaps/package.py +++ b/var/spack/repos/builtin/packages/xbitmaps/package.py @@ -25,7 +25,7 @@ from spack import * -class Xbitmaps(Package): +class Xbitmaps(AutotoolsPackage): """The xbitmaps package contains bitmap images used by multiple applications built in Xorg.""" @@ -36,8 +36,3 @@ class Xbitmaps(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xcalc/package.py b/var/spack/repos/builtin/packages/xcalc/package.py index a470d1c9d0..7b4717db65 100644 --- a/var/spack/repos/builtin/packages/xcalc/package.py +++ b/var/spack/repos/builtin/packages/xcalc/package.py @@ -25,7 +25,7 @@ from spack import * -class Xcalc(Package): +class Xcalc(AutotoolsPackage): """xcalc is a scientific calculator X11 client that can emulate a TI-30 or an HP-10C.""" @@ -41,9 +41,3 @@ class Xcalc(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-demo/package.py b/var/spack/repos/builtin/packages/xcb-demo/package.py index 62433e3b32..6c3ccfa8aa 100644 --- a/var/spack/repos/builtin/packages/xcb-demo/package.py +++ b/var/spack/repos/builtin/packages/xcb-demo/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbDemo(Package): +class XcbDemo(AutotoolsPackage): """xcb-demo: A collection of demo programs that use the XCB library.""" homepage = "https://xcb.freedesktop.org/" @@ -40,12 +40,5 @@ class XcbDemo(Package): depends_on('pkg-config@0.9.0:', type='build') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - # FIXME: crashes with the following error message - # X11/XCB/xcb.h: No such file or directory - - make() - make('check') - make('install') + # FIXME: crashes with the following error message + # X11/XCB/xcb.h: No such file or directory diff --git a/var/spack/repos/builtin/packages/xcb-proto/package.py b/var/spack/repos/builtin/packages/xcb-proto/package.py index d2ac54d34f..be8a09ef62 100644 --- a/var/spack/repos/builtin/packages/xcb-proto/package.py +++ b/var/spack/repos/builtin/packages/xcb-proto/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbProto(Package): +class XcbProto(AutotoolsPackage): """xcb-proto provides the XML-XCB protocol descriptions that libxcb uses to generate the majority of its code and API.""" @@ -37,8 +37,4 @@ class XcbProto(Package): extends('python') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - # make('check') # fails xmllint validation - make('install') + # NOTE: `make check` fails xmllint validation diff --git a/var/spack/repos/builtin/packages/xcb-util-cursor/package.py b/var/spack/repos/builtin/packages/xcb-util-cursor/package.py index b25fb181a6..83ae52ae93 100644 --- a/var/spack/repos/builtin/packages/xcb-util-cursor/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-cursor/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtilCursor(Package): +class XcbUtilCursor(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -43,9 +43,3 @@ class XcbUtilCursor(Package): depends_on('xcb-util-image') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-util-errors/package.py b/var/spack/repos/builtin/packages/xcb-util-errors/package.py index c287a0ec6e..f7c950841d 100644 --- a/var/spack/repos/builtin/packages/xcb-util-errors/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-errors/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtilErrors(Package): +class XcbUtilErrors(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -42,10 +42,3 @@ class XcbUtilErrors(Package): depends_on('xcb-proto', type='build') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-util-image/package.py b/var/spack/repos/builtin/packages/xcb-util-image/package.py index 4413c7e11d..58a5f82d18 100644 --- a/var/spack/repos/builtin/packages/xcb-util-image/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-image/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtilImage(Package): +class XcbUtilImage(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -43,10 +43,3 @@ class XcbUtilImage(Package): depends_on('xproto@7.0.8:', type='build') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py b/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py index 0de6391b18..026ac2a129 100644 --- a/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtilKeysyms(Package): +class XcbUtilKeysyms(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -42,9 +42,3 @@ class XcbUtilKeysyms(Package): depends_on('xproto@7.0.8:', type='build') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py b/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py index d41c88206c..aa4db33112 100644 --- a/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtilRenderutil(Package): +class XcbUtilRenderutil(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -41,9 +41,3 @@ class XcbUtilRenderutil(Package): depends_on('libxcb@1.4:') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-util-wm/package.py b/var/spack/repos/builtin/packages/xcb-util-wm/package.py index ef3db06aec..c5dfe65423 100644 --- a/var/spack/repos/builtin/packages/xcb-util-wm/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-wm/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtilWm(Package): +class XcbUtilWm(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -41,9 +41,3 @@ class XcbUtilWm(Package): depends_on('libxcb@1.4:') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcb-util/package.py b/var/spack/repos/builtin/packages/xcb-util/package.py index 820592a319..6dcfbb6447 100644 --- a/var/spack/repos/builtin/packages/xcb-util/package.py +++ b/var/spack/repos/builtin/packages/xcb-util/package.py @@ -25,7 +25,7 @@ from spack import * -class XcbUtil(Package): +class XcbUtil(AutotoolsPackage): """The XCB util modules provides a number of libraries which sit on top of libxcb, the core X protocol library, and some of the extension libraries. These experimental libraries provide convenience functions @@ -41,9 +41,3 @@ class XcbUtil(Package): depends_on('libxcb@1.4:') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xclipboard/package.py b/var/spack/repos/builtin/packages/xclipboard/package.py index d9af19da71..309a09bd76 100644 --- a/var/spack/repos/builtin/packages/xclipboard/package.py +++ b/var/spack/repos/builtin/packages/xclipboard/package.py @@ -25,7 +25,7 @@ from spack import * -class Xclipboard(Package): +class Xclipboard(AutotoolsPackage): """xclipboard is used to collect and display text selections that are sent to the CLIPBOARD by other clients. It is typically used to save CLIPBOARD selections for later use. It stores each CLIPBOARD @@ -45,9 +45,3 @@ class Xclipboard(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xclock/package.py b/var/spack/repos/builtin/packages/xclock/package.py index 5bd38826db..0ec33e78de 100644 --- a/var/spack/repos/builtin/packages/xclock/package.py +++ b/var/spack/repos/builtin/packages/xclock/package.py @@ -25,7 +25,7 @@ from spack import * -class Xclock(Package): +class Xclock(AutotoolsPackage): """xclock is the classic X Window System clock utility. It displays the time in analog or digital form, continuously updated at a frequency which may be specified by the user.""" @@ -46,9 +46,3 @@ class Xclock(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcmiscproto/package.py b/var/spack/repos/builtin/packages/xcmiscproto/package.py index 2b15d1b3e7..c31b19f04b 100644 --- a/var/spack/repos/builtin/packages/xcmiscproto/package.py +++ b/var/spack/repos/builtin/packages/xcmiscproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xcmiscproto(Package): +class Xcmiscproto(AutotoolsPackage): """XC-MISC Extension. This extension defines a protocol that provides Xlib two ways to query @@ -38,8 +38,3 @@ class Xcmiscproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xcmsdb/package.py b/var/spack/repos/builtin/packages/xcmsdb/package.py index 4d12e3a843..74e1f6267f 100644 --- a/var/spack/repos/builtin/packages/xcmsdb/package.py +++ b/var/spack/repos/builtin/packages/xcmsdb/package.py @@ -25,7 +25,7 @@ from spack import * -class Xcmsdb(Package): +class Xcmsdb(AutotoolsPackage): """xcmsdb is used to load, query, or remove Device Color Characterization data stored in properties on the root window of the screen as specified in section 7, Device Color Characterization, of the @@ -40,9 +40,3 @@ class Xcmsdb(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcompmgr/package.py b/var/spack/repos/builtin/packages/xcompmgr/package.py index fc5bbb4b9c..1c0771e38d 100644 --- a/var/spack/repos/builtin/packages/xcompmgr/package.py +++ b/var/spack/repos/builtin/packages/xcompmgr/package.py @@ -25,7 +25,7 @@ from spack import * -class Xcompmgr(Package): +class Xcompmgr(AutotoolsPackage): """xcompmgr is a sample compositing manager for X servers supporting the XFIXES, DAMAGE, RENDER, and COMPOSITE extensions. It enables basic eye-candy effects.""" @@ -43,9 +43,3 @@ class Xcompmgr(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xconsole/package.py b/var/spack/repos/builtin/packages/xconsole/package.py index f86fe753b6..eabd5a48ed 100644 --- a/var/spack/repos/builtin/packages/xconsole/package.py +++ b/var/spack/repos/builtin/packages/xconsole/package.py @@ -25,7 +25,7 @@ from spack import * -class Xconsole(Package): +class Xconsole(AutotoolsPackage): """xconsole displays in a X11 window the messages which are usually sent to /dev/console.""" @@ -42,9 +42,3 @@ class Xconsole(Package): depends_on('xproto@7.0.17:') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xcursorgen/package.py b/var/spack/repos/builtin/packages/xcursorgen/package.py index 4e43844646..8098723fc8 100644 --- a/var/spack/repos/builtin/packages/xcursorgen/package.py +++ b/var/spack/repos/builtin/packages/xcursorgen/package.py @@ -25,7 +25,7 @@ from spack import * -class Xcursorgen(Package): +class Xcursorgen(AutotoolsPackage): """xcursorgen prepares X11 cursor sets for use with libXcursor.""" homepage = "http://cgit.freedesktop.org/xorg/app/xcursorgen" @@ -39,9 +39,3 @@ class Xcursorgen(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xdbedizzy/package.py b/var/spack/repos/builtin/packages/xdbedizzy/package.py index 7a8f97401f..61ad98dc61 100644 --- a/var/spack/repos/builtin/packages/xdbedizzy/package.py +++ b/var/spack/repos/builtin/packages/xdbedizzy/package.py @@ -25,7 +25,7 @@ from spack import * -class Xdbedizzy(Package): +class Xdbedizzy(AutotoolsPackage): """xdbedizzy is a demo of the X11 Double Buffer Extension (DBE) creating a double buffered spinning scene.""" @@ -39,9 +39,3 @@ class Xdbedizzy(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xditview/package.py b/var/spack/repos/builtin/packages/xditview/package.py index 3fececd12e..4f5384b81c 100644 --- a/var/spack/repos/builtin/packages/xditview/package.py +++ b/var/spack/repos/builtin/packages/xditview/package.py @@ -25,7 +25,7 @@ from spack import * -class Xditview(Package): +class Xditview(AutotoolsPackage): """xditview displays ditroff output on an X display.""" homepage = "http://cgit.freedesktop.org/xorg/app/xditview" @@ -40,9 +40,3 @@ class Xditview(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xdm/package.py b/var/spack/repos/builtin/packages/xdm/package.py index d42ced9a57..384077e556 100644 --- a/var/spack/repos/builtin/packages/xdm/package.py +++ b/var/spack/repos/builtin/packages/xdm/package.py @@ -25,7 +25,7 @@ from spack import * -class Xdm(Package): +class Xdm(AutotoolsPackage): """X Display Manager / XDMCP server.""" homepage = "http://cgit.freedesktop.org/xorg/app/xdm" @@ -46,9 +46,3 @@ class Xdm(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xdpyinfo/package.py b/var/spack/repos/builtin/packages/xdpyinfo/package.py index c69af3b357..f3838999eb 100644 --- a/var/spack/repos/builtin/packages/xdpyinfo/package.py +++ b/var/spack/repos/builtin/packages/xdpyinfo/package.py @@ -25,7 +25,7 @@ from spack import * -class Xdpyinfo(Package): +class Xdpyinfo(AutotoolsPackage): """xdpyinfo is a utility for displaying information about an X server. It is used to examine the capabilities of a server, the predefined @@ -46,9 +46,3 @@ class Xdpyinfo(Package): depends_on('xproto@7.0.22:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xdriinfo/package.py b/var/spack/repos/builtin/packages/xdriinfo/package.py index 7548175f6f..9545f7707d 100644 --- a/var/spack/repos/builtin/packages/xdriinfo/package.py +++ b/var/spack/repos/builtin/packages/xdriinfo/package.py @@ -25,7 +25,7 @@ from spack import * -class Xdriinfo(Package): +class Xdriinfo(AutotoolsPackage): """xdriinfo - query configuration information of X11 DRI drivers.""" homepage = "http://cgit.freedesktop.org/xorg/app/xdriinfo" @@ -44,9 +44,3 @@ class Xdriinfo(Package): depends_on('glproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xedit/package.py b/var/spack/repos/builtin/packages/xedit/package.py index da5f28809f..73aca40a3b 100644 --- a/var/spack/repos/builtin/packages/xedit/package.py +++ b/var/spack/repos/builtin/packages/xedit/package.py @@ -25,7 +25,7 @@ from spack import * -class Xedit(Package): +class Xedit(AutotoolsPackage): """Xedit is a simple text editor for X.""" homepage = "https://cgit.freedesktop.org/xorg/app/xedit" @@ -40,9 +40,3 @@ class Xedit(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xev/package.py b/var/spack/repos/builtin/packages/xev/package.py index 5727d4e428..79ff7b08a7 100644 --- a/var/spack/repos/builtin/packages/xev/package.py +++ b/var/spack/repos/builtin/packages/xev/package.py @@ -25,7 +25,7 @@ from spack import * -class Xev(Package): +class Xev(AutotoolsPackage): """xev creates a window and then asks the X server to send it X11 events whenever anything happens to the window (such as it being moved, resized, typed in, clicked in, etc.). You can also attach it to an @@ -45,9 +45,3 @@ class Xev(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xextproto/package.py b/var/spack/repos/builtin/packages/xextproto/package.py index 9c1c123527..012a023e72 100644 --- a/var/spack/repos/builtin/packages/xextproto/package.py +++ b/var/spack/repos/builtin/packages/xextproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xextproto(Package): +class Xextproto(AutotoolsPackage): """X Protocol Extensions.""" homepage = "http://cgit.freedesktop.org/xorg/proto/xextproto" @@ -37,8 +37,3 @@ class Xextproto(Package): depends_on('util-macros', type='build') parallel = False - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xeyes/package.py b/var/spack/repos/builtin/packages/xeyes/package.py index cfea92fda3..599b08544b 100644 --- a/var/spack/repos/builtin/packages/xeyes/package.py +++ b/var/spack/repos/builtin/packages/xeyes/package.py @@ -25,7 +25,7 @@ from spack import * -class Xeyes(Package): +class Xeyes(AutotoolsPackage): """xeyes - a follow the mouse X demo, using the X SHAPE extension""" homepage = "http://cgit.freedesktop.org/xorg/app/xeyes" @@ -41,9 +41,3 @@ class Xeyes(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xf86bigfontproto/package.py b/var/spack/repos/builtin/packages/xf86bigfontproto/package.py index 6c1dc8f37d..5a2e10a7ba 100644 --- a/var/spack/repos/builtin/packages/xf86bigfontproto/package.py +++ b/var/spack/repos/builtin/packages/xf86bigfontproto/package.py @@ -25,15 +25,10 @@ from spack import * -class Xf86bigfontproto(Package): +class Xf86bigfontproto(AutotoolsPackage): """X.org XF86BigFontProto protocol headers.""" homepage = "https://cgit.freedesktop.org/xorg/proto/xf86bigfontproto" url = "https://www.x.org/archive/individual/proto/xf86bigfontproto-1.2.0.tar.gz" version('1.2.0', '91b0733ff4cbe55808d96073258aa3d1') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xf86dga/package.py b/var/spack/repos/builtin/packages/xf86dga/package.py index 8add6fbca7..1bd2feaaa3 100644 --- a/var/spack/repos/builtin/packages/xf86dga/package.py +++ b/var/spack/repos/builtin/packages/xf86dga/package.py @@ -25,7 +25,7 @@ from spack import * -class Xf86dga(Package): +class Xf86dga(AutotoolsPackage): """dga is a simple test client for the XFree86-DGA extension.""" homepage = "http://cgit.freedesktop.org/xorg/app/xf86dga" @@ -38,9 +38,3 @@ class Xf86dga(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xf86dgaproto/package.py b/var/spack/repos/builtin/packages/xf86dgaproto/package.py index 05b64c9534..3c92582a3a 100644 --- a/var/spack/repos/builtin/packages/xf86dgaproto/package.py +++ b/var/spack/repos/builtin/packages/xf86dgaproto/package.py @@ -25,15 +25,10 @@ from spack import * -class Xf86dgaproto(Package): +class Xf86dgaproto(AutotoolsPackage): """X.org XF86DGAProto protocol headers.""" homepage = "https://cgit.freedesktop.org/xorg/proto/xf86dgaproto" url = "https://www.x.org/archive/individual/proto/xf86dgaproto-2.1.tar.gz" version('2.1', '1fe79dc07857ad3e1fb8b8f2bdd70d1b') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xf86driproto/package.py b/var/spack/repos/builtin/packages/xf86driproto/package.py index 655d1bc60b..8378eb9e5e 100644 --- a/var/spack/repos/builtin/packages/xf86driproto/package.py +++ b/var/spack/repos/builtin/packages/xf86driproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xf86driproto(Package): +class Xf86driproto(AutotoolsPackage): """XFree86 Direct Rendering Infrastructure Extension. This extension defines a protocol to allow user applications to access @@ -39,8 +39,3 @@ class Xf86driproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xf86miscproto/package.py b/var/spack/repos/builtin/packages/xf86miscproto/package.py index 4b7e279077..4368eed326 100644 --- a/var/spack/repos/builtin/packages/xf86miscproto/package.py +++ b/var/spack/repos/builtin/packages/xf86miscproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xf86miscproto(Package): +class Xf86miscproto(AutotoolsPackage): """This package includes the protocol definitions of the "XFree86-Misc" extension to the X11 protocol. The "XFree86-Misc" extension is supported by the XFree86 X server and versions of the Xorg X server @@ -35,8 +35,3 @@ class Xf86miscproto(Package): url = "https://www.x.org/archive/individual/proto/xf86miscproto-0.9.3.tar.gz" version('0.9.3', 'c6432f04f84929c94fa05b3a466c489d') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xf86rushproto/package.py b/var/spack/repos/builtin/packages/xf86rushproto/package.py index bdd192970b..05b9afa40a 100644 --- a/var/spack/repos/builtin/packages/xf86rushproto/package.py +++ b/var/spack/repos/builtin/packages/xf86rushproto/package.py @@ -25,15 +25,10 @@ from spack import * -class Xf86rushproto(Package): +class Xf86rushproto(AutotoolsPackage): """X.org XF86RushProto protocol headers.""" homepage = "https://cgit.freedesktop.org/xorg/proto/xf86rushproto" url = "https://www.x.org/archive/individual/proto/xf86rushproto-1.1.2.tar.gz" version('1.1.2', '6a6389473332ace01146cccfef228576') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py b/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py index ece389f9e6..aaf1db4472 100644 --- a/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py +++ b/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xf86vidmodeproto(Package): +class Xf86vidmodeproto(AutotoolsPackage): """XFree86 Video Mode Extension. This extension defines a protocol for dynamically configuring modelines @@ -38,8 +38,3 @@ class Xf86vidmodeproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xfd/package.py b/var/spack/repos/builtin/packages/xfd/package.py index 669cd83bf5..b7d1282b27 100644 --- a/var/spack/repos/builtin/packages/xfd/package.py +++ b/var/spack/repos/builtin/packages/xfd/package.py @@ -25,7 +25,7 @@ from spack import * -class Xfd(Package): +class Xfd(AutotoolsPackage): """xfd - display all the characters in a font using either the X11 core protocol or libXft2.""" @@ -44,9 +44,3 @@ class Xfd(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xfindproxy/package.py b/var/spack/repos/builtin/packages/xfindproxy/package.py index e4b83433c4..af767be8a1 100644 --- a/var/spack/repos/builtin/packages/xfindproxy/package.py +++ b/var/spack/repos/builtin/packages/xfindproxy/package.py @@ -25,7 +25,7 @@ from spack import * -class Xfindproxy(Package): +class Xfindproxy(AutotoolsPackage): """xfindproxy is used to locate available X11 proxy services. It utilizes the Proxy Management Protocol to communicate with a proxy @@ -45,9 +45,3 @@ class Xfindproxy(Package): depends_on('xproxymanagementprotocol', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xfontsel/package.py b/var/spack/repos/builtin/packages/xfontsel/package.py index 772ff8d570..ca14f1460c 100644 --- a/var/spack/repos/builtin/packages/xfontsel/package.py +++ b/var/spack/repos/builtin/packages/xfontsel/package.py @@ -25,7 +25,7 @@ from spack import * -class Xfontsel(Package): +class Xfontsel(AutotoolsPackage): """xfontsel application provides a simple way to display the X11 core protocol fonts known to your X server, examine samples of each, and retrieve the X Logical Font Description ("XLFD") full name for a font.""" @@ -42,9 +42,3 @@ class Xfontsel(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xfs/package.py b/var/spack/repos/builtin/packages/xfs/package.py index 72429dee90..e5a71e4a27 100644 --- a/var/spack/repos/builtin/packages/xfs/package.py +++ b/var/spack/repos/builtin/packages/xfs/package.py @@ -25,7 +25,7 @@ from spack import * -class Xfs(Package): +class Xfs(AutotoolsPackage): """X Font Server.""" homepage = "http://cgit.freedesktop.org/xorg/app/xfs" @@ -40,9 +40,3 @@ class Xfs(Package): depends_on('xtrans', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xfsinfo/package.py b/var/spack/repos/builtin/packages/xfsinfo/package.py index b31ad1c1e0..9913537995 100644 --- a/var/spack/repos/builtin/packages/xfsinfo/package.py +++ b/var/spack/repos/builtin/packages/xfsinfo/package.py @@ -25,7 +25,7 @@ from spack import * -class Xfsinfo(Package): +class Xfsinfo(AutotoolsPackage): """xfsinfo is a utility for displaying information about an X font server. It is used to examine the capabilities of a server, the predefined values for various parameters used in communicating between @@ -42,9 +42,3 @@ class Xfsinfo(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xfwp/package.py b/var/spack/repos/builtin/packages/xfwp/package.py index 5f073a8806..c199b50f6c 100644 --- a/var/spack/repos/builtin/packages/xfwp/package.py +++ b/var/spack/repos/builtin/packages/xfwp/package.py @@ -25,7 +25,7 @@ from spack import * -class Xfwp(Package): +class Xfwp(AutotoolsPackage): """xfwp proxies X11 protocol connections, such as through a firewall.""" homepage = "http://cgit.freedesktop.org/xorg/app/xfwp" @@ -40,11 +40,5 @@ class Xfwp(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - # FIXME: fails with the error message: - # io.c:1039:7: error: implicit declaration of function 'swab' - - make() - make('install') + # FIXME: fails with the error message: + # io.c:1039:7: error: implicit declaration of function 'swab' diff --git a/var/spack/repos/builtin/packages/xgamma/package.py b/var/spack/repos/builtin/packages/xgamma/package.py index b8abec293a..845f2a54e3 100644 --- a/var/spack/repos/builtin/packages/xgamma/package.py +++ b/var/spack/repos/builtin/packages/xgamma/package.py @@ -25,7 +25,7 @@ from spack import * -class Xgamma(Package): +class Xgamma(AutotoolsPackage): """xgamma allows X users to query and alter the gamma correction of a monitor via the X video mode extension (XFree86-VidModeExtension).""" @@ -40,9 +40,3 @@ class Xgamma(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xgc/package.py b/var/spack/repos/builtin/packages/xgc/package.py index 608e6e0360..23ba36809e 100644 --- a/var/spack/repos/builtin/packages/xgc/package.py +++ b/var/spack/repos/builtin/packages/xgc/package.py @@ -25,7 +25,7 @@ from spack import * -class Xgc(Package): +class Xgc(AutotoolsPackage): """xgc is an X11 graphics demo that shows various features of the X11 core protocol graphics primitives.""" @@ -41,9 +41,3 @@ class Xgc(Package): depends_on('bison', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xhost/package.py b/var/spack/repos/builtin/packages/xhost/package.py index f01c481ee7..3928593611 100644 --- a/var/spack/repos/builtin/packages/xhost/package.py +++ b/var/spack/repos/builtin/packages/xhost/package.py @@ -25,7 +25,7 @@ from spack import * -class Xhost(Package): +class Xhost(AutotoolsPackage): """xhost is used to manage the list of host names or user names allowed to make connections to the X server.""" @@ -41,9 +41,3 @@ class Xhost(Package): depends_on('xproto@7.0.22:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xineramaproto/package.py b/var/spack/repos/builtin/packages/xineramaproto/package.py index baededbb25..0a3374b1b6 100644 --- a/var/spack/repos/builtin/packages/xineramaproto/package.py +++ b/var/spack/repos/builtin/packages/xineramaproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xineramaproto(Package): +class Xineramaproto(AutotoolsPackage): """X Xinerama Extension. This is an X extension that allows multiple physical screens controlled @@ -38,8 +38,3 @@ class Xineramaproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xinit/package.py b/var/spack/repos/builtin/packages/xinit/package.py index 9f3bc09229..8bf7227cc8 100644 --- a/var/spack/repos/builtin/packages/xinit/package.py +++ b/var/spack/repos/builtin/packages/xinit/package.py @@ -25,7 +25,7 @@ from spack import * -class Xinit(Package): +class Xinit(AutotoolsPackage): """The xinit program is used to start the X Window System server and a first client program on systems that are not using a display manager such as xdm.""" @@ -40,9 +40,3 @@ class Xinit(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xinput/package.py b/var/spack/repos/builtin/packages/xinput/package.py index 3c4fb35503..b512d86495 100644 --- a/var/spack/repos/builtin/packages/xinput/package.py +++ b/var/spack/repos/builtin/packages/xinput/package.py @@ -25,7 +25,7 @@ from spack import * -class Xinput(Package): +class Xinput(AutotoolsPackage): """xinput is a utility to configure and test XInput devices.""" homepage = "http://cgit.freedesktop.org/xorg/app/xinput" @@ -42,9 +42,3 @@ class Xinput(Package): depends_on('inputproto@2.1.99.1:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkbcomp/package.py b/var/spack/repos/builtin/packages/xkbcomp/package.py index e6e8875fa7..315c49a22d 100644 --- a/var/spack/repos/builtin/packages/xkbcomp/package.py +++ b/var/spack/repos/builtin/packages/xkbcomp/package.py @@ -25,7 +25,7 @@ from spack import * -class Xkbcomp(Package): +class Xkbcomp(AutotoolsPackage): """The X Keyboard (XKB) Extension essentially replaces the core protocol definition of a keyboard. The extension makes it possible to specify clearly and explicitly most aspects of keyboard behaviour on a per-key @@ -45,9 +45,3 @@ class Xkbcomp(Package): depends_on('bison', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkbdata/package.py b/var/spack/repos/builtin/packages/xkbdata/package.py index fc84631e36..c67e047d71 100644 --- a/var/spack/repos/builtin/packages/xkbdata/package.py +++ b/var/spack/repos/builtin/packages/xkbdata/package.py @@ -25,7 +25,7 @@ from spack import * -class Xkbdata(Package): +class Xkbdata(AutotoolsPackage): """The XKB data files for the various keyboard models, layouts, and locales.""" @@ -35,9 +35,3 @@ class Xkbdata(Package): version('1.0.1', 'a7e0fbc9cc84c621243c777694388064') depends_on('xkbcomp', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkbevd/package.py b/var/spack/repos/builtin/packages/xkbevd/package.py index 462d989db2..8793a3a38b 100644 --- a/var/spack/repos/builtin/packages/xkbevd/package.py +++ b/var/spack/repos/builtin/packages/xkbevd/package.py @@ -25,7 +25,7 @@ from spack import * -class Xkbevd(Package): +class Xkbevd(AutotoolsPackage): """XKB event daemon demo.""" homepage = "http://cgit.freedesktop.org/xorg/app/xkbevd" @@ -39,9 +39,3 @@ class Xkbevd(Package): depends_on('bison', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkbprint/package.py b/var/spack/repos/builtin/packages/xkbprint/package.py index dc92ac4126..100d4e4436 100644 --- a/var/spack/repos/builtin/packages/xkbprint/package.py +++ b/var/spack/repos/builtin/packages/xkbprint/package.py @@ -25,7 +25,7 @@ from spack import * -class Xkbprint(Package): +class Xkbprint(AutotoolsPackage): """xkbprint generates a printable or encapsulated PostScript description of an XKB keyboard description.""" @@ -40,9 +40,3 @@ class Xkbprint(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkbutils/package.py b/var/spack/repos/builtin/packages/xkbutils/package.py index a4c6c97578..eef24a0145 100644 --- a/var/spack/repos/builtin/packages/xkbutils/package.py +++ b/var/spack/repos/builtin/packages/xkbutils/package.py @@ -25,7 +25,7 @@ from spack import * -class Xkbutils(Package): +class Xkbutils(AutotoolsPackage): """xkbutils is a collection of small utilities utilizing the XKeyboard (XKB) extension to the X11 protocol.""" @@ -42,9 +42,3 @@ class Xkbutils(Package): depends_on('inputproto', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkeyboard-config/package.py b/var/spack/repos/builtin/packages/xkeyboard-config/package.py index 3ad7ea197c..d7ae34e1e6 100644 --- a/var/spack/repos/builtin/packages/xkeyboard-config/package.py +++ b/var/spack/repos/builtin/packages/xkeyboard-config/package.py @@ -25,7 +25,7 @@ from spack import * -class XkeyboardConfig(Package): +class XkeyboardConfig(AutotoolsPackage): """This project provides a consistent, well-structured, frequently released, open source database of keyboard configuration data. The project is targeted to XKB-based systems.""" @@ -49,9 +49,3 @@ class XkeyboardConfig(Package): # gmsgfmt # perl@5.8.1: # perl XML::Parser - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xkill/package.py b/var/spack/repos/builtin/packages/xkill/package.py index 061d756eec..e73fa3b9a2 100644 --- a/var/spack/repos/builtin/packages/xkill/package.py +++ b/var/spack/repos/builtin/packages/xkill/package.py @@ -25,7 +25,7 @@ from spack import * -class Xkill(Package): +class Xkill(AutotoolsPackage): """xkill is a utility for forcing the X server to close connections to clients. This program is very dangerous, but is useful for aborting programs that have displayed undesired windows on a user's screen.""" @@ -41,9 +41,3 @@ class Xkill(Package): depends_on('xproto@7.0.22:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xload/package.py b/var/spack/repos/builtin/packages/xload/package.py index 2fc91043b5..412c0aa0c4 100644 --- a/var/spack/repos/builtin/packages/xload/package.py +++ b/var/spack/repos/builtin/packages/xload/package.py @@ -25,7 +25,7 @@ from spack import * -class Xload(Package): +class Xload(AutotoolsPackage): """xload displays a periodically updating histogram of the system load average.""" @@ -42,9 +42,3 @@ class Xload(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xlogo/package.py b/var/spack/repos/builtin/packages/xlogo/package.py index 77f5bd3639..8e1250cc69 100644 --- a/var/spack/repos/builtin/packages/xlogo/package.py +++ b/var/spack/repos/builtin/packages/xlogo/package.py @@ -25,7 +25,7 @@ from spack import * -class Xlogo(Package): +class Xlogo(AutotoolsPackage): """The xlogo program simply displays the X Window System logo.""" homepage = "http://cgit.freedesktop.org/xorg/app/xlogo" @@ -45,9 +45,3 @@ class Xlogo(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xlsatoms/package.py b/var/spack/repos/builtin/packages/xlsatoms/package.py index 8722b57c8c..5f0dc8adc7 100644 --- a/var/spack/repos/builtin/packages/xlsatoms/package.py +++ b/var/spack/repos/builtin/packages/xlsatoms/package.py @@ -25,7 +25,7 @@ from spack import * -class Xlsatoms(Package): +class Xlsatoms(AutotoolsPackage): """xlsatoms lists the interned atoms defined on an X11 server.""" homepage = "http://cgit.freedesktop.org/xorg/app/xlsatoms" @@ -38,9 +38,3 @@ class Xlsatoms(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xlsclients/package.py b/var/spack/repos/builtin/packages/xlsclients/package.py index 3714de2706..fb232a1d0f 100644 --- a/var/spack/repos/builtin/packages/xlsclients/package.py +++ b/var/spack/repos/builtin/packages/xlsclients/package.py @@ -25,7 +25,7 @@ from spack import * -class Xlsclients(Package): +class Xlsclients(AutotoolsPackage): """xlsclients is a utility for listing information about the client applications running on a X11 server.""" @@ -39,9 +39,3 @@ class Xlsclients(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xlsfonts/package.py b/var/spack/repos/builtin/packages/xlsfonts/package.py index 011ca5aa0e..61696a5010 100644 --- a/var/spack/repos/builtin/packages/xlsfonts/package.py +++ b/var/spack/repos/builtin/packages/xlsfonts/package.py @@ -25,7 +25,7 @@ from spack import * -class Xlsfonts(Package): +class Xlsfonts(AutotoolsPackage): """xlsfonts lists fonts available from an X server via the X11 core protocol.""" @@ -39,9 +39,3 @@ class Xlsfonts(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xmag/package.py b/var/spack/repos/builtin/packages/xmag/package.py index 27843299c8..65eb9e636b 100644 --- a/var/spack/repos/builtin/packages/xmag/package.py +++ b/var/spack/repos/builtin/packages/xmag/package.py @@ -25,7 +25,7 @@ from spack import * -class Xmag(Package): +class Xmag(AutotoolsPackage): """xmag displays a magnified snapshot of a portion of an X11 screen.""" homepage = "http://cgit.freedesktop.org/xorg/app/xmag" @@ -40,9 +40,3 @@ class Xmag(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xman/package.py b/var/spack/repos/builtin/packages/xman/package.py index 629a457edc..0a3bf893ee 100644 --- a/var/spack/repos/builtin/packages/xman/package.py +++ b/var/spack/repos/builtin/packages/xman/package.py @@ -25,7 +25,7 @@ from spack import * -class Xman(Package): +class Xman(AutotoolsPackage): """xman is a graphical manual page browser using the Athena Widgets (Xaw) toolkit.""" @@ -40,9 +40,3 @@ class Xman(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xmessage/package.py b/var/spack/repos/builtin/packages/xmessage/package.py index 9b2ee5102e..7481713c1b 100644 --- a/var/spack/repos/builtin/packages/xmessage/package.py +++ b/var/spack/repos/builtin/packages/xmessage/package.py @@ -25,7 +25,7 @@ from spack import * -class Xmessage(Package): +class Xmessage(AutotoolsPackage): """xmessage displays a message or query in a window. The user can click on an "okay" button to dismiss it or can select one of several buttons to answer a question. xmessage can also exit after a specified time.""" @@ -40,9 +40,3 @@ class Xmessage(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xmh/package.py b/var/spack/repos/builtin/packages/xmh/package.py index cdde63e149..1c7bc8a346 100644 --- a/var/spack/repos/builtin/packages/xmh/package.py +++ b/var/spack/repos/builtin/packages/xmh/package.py @@ -25,7 +25,7 @@ from spack import * -class Xmh(Package): +class Xmh(AutotoolsPackage): """The xmh program provides a graphical user interface to the MH Message Handling System. To actually do things with your mail, it makes calls to the MH package.""" @@ -43,9 +43,3 @@ class Xmh(Package): depends_on('xbitmaps@1.1.0:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xmlto/package.py b/var/spack/repos/builtin/packages/xmlto/package.py index 0dbc81de32..2ed392b9b8 100644 --- a/var/spack/repos/builtin/packages/xmlto/package.py +++ b/var/spack/repos/builtin/packages/xmlto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xmlto(Package): +class Xmlto(AutotoolsPackage): """Utility xmlto is a simple shell script for converting XML files to various formats. It serves as easy to use command line frontend to make fine output without remembering many long options and searching for the syntax of the @@ -38,9 +38,3 @@ class Xmlto(Package): # FIXME: missing a lot of dependencies depends_on('libxslt') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xmodmap/package.py b/var/spack/repos/builtin/packages/xmodmap/package.py index abe40dbb43..323a16cbe8 100644 --- a/var/spack/repos/builtin/packages/xmodmap/package.py +++ b/var/spack/repos/builtin/packages/xmodmap/package.py @@ -25,7 +25,7 @@ from spack import * -class Xmodmap(Package): +class Xmodmap(AutotoolsPackage): """The xmodmap program is used to edit and display the keyboard modifier map and keymap table that are used by client applications to convert event keycodes into keysyms. It is usually run from the user's @@ -42,9 +42,3 @@ class Xmodmap(Package): depends_on('xproto@7.0.25:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xmore/package.py b/var/spack/repos/builtin/packages/xmore/package.py index 8f8ccd7138..bb1f0ada27 100644 --- a/var/spack/repos/builtin/packages/xmore/package.py +++ b/var/spack/repos/builtin/packages/xmore/package.py @@ -25,7 +25,7 @@ from spack import * -class Xmore(Package): +class Xmore(AutotoolsPackage): """xmore - plain text display program for the X Window System.""" homepage = "http://cgit.freedesktop.org/xorg/app/xmore" @@ -38,9 +38,3 @@ class Xmore(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xorg-cf-files/package.py b/var/spack/repos/builtin/packages/xorg-cf-files/package.py index c7b22d904f..a203911d0e 100644 --- a/var/spack/repos/builtin/packages/xorg-cf-files/package.py +++ b/var/spack/repos/builtin/packages/xorg-cf-files/package.py @@ -25,7 +25,7 @@ from spack import * -class XorgCfFiles(Package): +class XorgCfFiles(AutotoolsPackage): """The xorg-cf-files package contains the data files for the imake utility, defining the known settings for a wide variety of platforms (many of which have not been verified or tested in over a decade), and for many of the @@ -37,8 +37,3 @@ class XorgCfFiles(Package): version('1.0.6', 'c0ce98377c70d95fb48e1bd856109bf8') depends_on('pkg-config@0.9.0:', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xorg-docs/package.py b/var/spack/repos/builtin/packages/xorg-docs/package.py index 5c320bba7b..7bee98859d 100644 --- a/var/spack/repos/builtin/packages/xorg-docs/package.py +++ b/var/spack/repos/builtin/packages/xorg-docs/package.py @@ -25,7 +25,7 @@ from spack import * -class XorgDocs(Package): +class XorgDocs(AutotoolsPackage): """This package provides miscellaneous documentation for the X Window System that doesn't better fit into other packages. @@ -40,9 +40,3 @@ class XorgDocs(Package): depends_on('util-macros', type='build') depends_on('xorg-sgml-doctools@1.8:', type='build') depends_on('xmlto', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xorg-gtest/package.py b/var/spack/repos/builtin/packages/xorg-gtest/package.py index 6978d610d3..ede26149e1 100644 --- a/var/spack/repos/builtin/packages/xorg-gtest/package.py +++ b/var/spack/repos/builtin/packages/xorg-gtest/package.py @@ -25,7 +25,7 @@ from spack import * -class XorgGtest(Package): +class XorgGtest(AutotoolsPackage): """Provides a Google Test environment for starting and stopping a X server for testing purposes.""" @@ -43,9 +43,3 @@ class XorgGtest(Package): # TODO: may be missing evemu package? # TODO: what is the difference between xorg-gtest and googletest packages? - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xorg-server/package.py b/var/spack/repos/builtin/packages/xorg-server/package.py index 9d9b49f9c2..fcc4918a02 100644 --- a/var/spack/repos/builtin/packages/xorg-server/package.py +++ b/var/spack/repos/builtin/packages/xorg-server/package.py @@ -25,7 +25,7 @@ from spack import * -class XorgServer(Package): +class XorgServer(AutotoolsPackage): """X.Org Server is the free and open source implementation of the display server for the X Window System stewarded by the X.Org Foundation.""" @@ -100,9 +100,3 @@ class XorgServer(Package): # LIBUDEV="libudev >= 143" # LIBSELINUX="libselinux >= 2.0.86" # LIBDBUS="dbus-1 >= 1.0" - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py b/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py index c2e5797efa..c9a5d4fd80 100644 --- a/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py +++ b/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py @@ -25,7 +25,7 @@ from spack import * -class XorgSgmlDoctools(Package): +class XorgSgmlDoctools(AutotoolsPackage): """This package provides a common set of SGML entities and XML/CSS style sheets used in building/formatting the documentation provided in other X.Org packages.""" @@ -37,9 +37,3 @@ class XorgSgmlDoctools(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xphelloworld/package.py b/var/spack/repos/builtin/packages/xphelloworld/package.py index 6d445d69be..ce593e746b 100644 --- a/var/spack/repos/builtin/packages/xphelloworld/package.py +++ b/var/spack/repos/builtin/packages/xphelloworld/package.py @@ -25,7 +25,7 @@ from spack import * -class Xphelloworld(Package): +class Xphelloworld(AutotoolsPackage): """Xprint sample applications.""" homepage = "http://cgit.freedesktop.org/xorg/app/xphelloworld" @@ -46,9 +46,3 @@ class Xphelloworld(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xplsprinters/package.py b/var/spack/repos/builtin/packages/xplsprinters/package.py index 55de272a33..b8fdb08472 100644 --- a/var/spack/repos/builtin/packages/xplsprinters/package.py +++ b/var/spack/repos/builtin/packages/xplsprinters/package.py @@ -25,7 +25,7 @@ from spack import * -class Xplsprinters(Package): +class Xplsprinters(AutotoolsPackage): """List Xprint printers.""" homepage = "http://cgit.freedesktop.org/xorg/app/xplsprinters" @@ -39,9 +39,3 @@ class Xplsprinters(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xpr/package.py b/var/spack/repos/builtin/packages/xpr/package.py index 669693e084..6e933e0994 100644 --- a/var/spack/repos/builtin/packages/xpr/package.py +++ b/var/spack/repos/builtin/packages/xpr/package.py @@ -25,7 +25,7 @@ from spack import * -class Xpr(Package): +class Xpr(AutotoolsPackage): """xpr takes as input a window dump file produced by xwd and formats it for output on various types of printers.""" @@ -40,9 +40,3 @@ class Xpr(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xprehashprinterlist/package.py b/var/spack/repos/builtin/packages/xprehashprinterlist/package.py index 4578c3c191..3f7de96c12 100644 --- a/var/spack/repos/builtin/packages/xprehashprinterlist/package.py +++ b/var/spack/repos/builtin/packages/xprehashprinterlist/package.py @@ -25,7 +25,7 @@ from spack import * -class Xprehashprinterlist(Package): +class Xprehashprinterlist(AutotoolsPackage): """Rehash list of Xprint printers.""" homepage = "http://cgit.freedesktop.org/xorg/app/xprehashprinterlist" @@ -38,9 +38,3 @@ class Xprehashprinterlist(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xprop/package.py b/var/spack/repos/builtin/packages/xprop/package.py index 0e1a591bcb..ece50c9205 100644 --- a/var/spack/repos/builtin/packages/xprop/package.py +++ b/var/spack/repos/builtin/packages/xprop/package.py @@ -25,7 +25,7 @@ from spack import * -class Xprop(Package): +class Xprop(AutotoolsPackage): """xprop is a command line tool to display and/or set window and font properties of an X server.""" @@ -39,9 +39,3 @@ class Xprop(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xproto/package.py b/var/spack/repos/builtin/packages/xproto/package.py index 67074a6993..9e1b6d4474 100644 --- a/var/spack/repos/builtin/packages/xproto/package.py +++ b/var/spack/repos/builtin/packages/xproto/package.py @@ -25,7 +25,7 @@ from spack import * -class Xproto(Package): +class Xproto(AutotoolsPackage): """X Window System Core Protocol. This package provides the headers and specification documents defining @@ -42,8 +42,3 @@ class Xproto(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py b/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py index e5bfcb8cbc..cec6a13f5f 100644 --- a/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py +++ b/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py @@ -25,7 +25,7 @@ from spack import * -class Xproxymanagementprotocol(Package): +class Xproxymanagementprotocol(AutotoolsPackage): """The Proxy Management Protocol is an ICE based protocol that provides a way for application servers to easily locate proxy services available to them.""" @@ -34,8 +34,3 @@ class Xproxymanagementprotocol(Package): url = "https://www.x.org/archive/individual/proto/xproxymanagementprotocol-1.0.3.tar.gz" version('1.0.3', 'c4ab05a6174b4e9b6ae5b7cfbb6d718e') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xrandr/package.py b/var/spack/repos/builtin/packages/xrandr/package.py index 35e21c6047..6fdc4da4fe 100644 --- a/var/spack/repos/builtin/packages/xrandr/package.py +++ b/var/spack/repos/builtin/packages/xrandr/package.py @@ -25,7 +25,7 @@ from spack import * -class Xrandr(Package): +class Xrandr(AutotoolsPackage): """xrandr - primitive command line interface to X11 Resize, Rotate, and Reflect (RandR) extension.""" @@ -41,9 +41,3 @@ class Xrandr(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xrdb/package.py b/var/spack/repos/builtin/packages/xrdb/package.py index 93847a19a0..c0374e7056 100644 --- a/var/spack/repos/builtin/packages/xrdb/package.py +++ b/var/spack/repos/builtin/packages/xrdb/package.py @@ -25,7 +25,7 @@ from spack import * -class Xrdb(Package): +class Xrdb(AutotoolsPackage): """xrdb - X server resource database utility.""" homepage = "http://cgit.freedesktop.org/xorg/app/xrdb" @@ -39,9 +39,3 @@ class Xrdb(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xrefresh/package.py b/var/spack/repos/builtin/packages/xrefresh/package.py index f99810beea..3a2c47b086 100644 --- a/var/spack/repos/builtin/packages/xrefresh/package.py +++ b/var/spack/repos/builtin/packages/xrefresh/package.py @@ -25,7 +25,7 @@ from spack import * -class Xrefresh(Package): +class Xrefresh(AutotoolsPackage): """xrefresh - refresh all or part of an X screen.""" homepage = "http://cgit.freedesktop.org/xorg/app/xrefresh" @@ -38,9 +38,3 @@ class Xrefresh(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xrx/package.py b/var/spack/repos/builtin/packages/xrx/package.py index 4457c2f164..eae7b76768 100644 --- a/var/spack/repos/builtin/packages/xrx/package.py +++ b/var/spack/repos/builtin/packages/xrx/package.py @@ -25,7 +25,7 @@ from spack import * -class Xrx(Package): +class Xrx(AutotoolsPackage): """The remote execution (RX) service specifies a MIME format for invoking applications remotely, for example via a World Wide Web browser. This RX format specifies a syntax for listing network services required by @@ -49,9 +49,3 @@ class Xrx(Package): depends_on('xproxymanagementprotocol', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xscope/package.py b/var/spack/repos/builtin/packages/xscope/package.py index cf33c9767e..04f00a5f5d 100644 --- a/var/spack/repos/builtin/packages/xscope/package.py +++ b/var/spack/repos/builtin/packages/xscope/package.py @@ -25,7 +25,7 @@ from spack import * -class Xscope(Package): +class Xscope(AutotoolsPackage): """XSCOPE -- a program to monitor X11/Client conversations.""" homepage = "http://cgit.freedesktop.org/xorg/app/xscope" @@ -37,9 +37,3 @@ class Xscope(Package): depends_on('xtrans', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xset/package.py b/var/spack/repos/builtin/packages/xset/package.py index 462bea8cfe..5ca84431fd 100644 --- a/var/spack/repos/builtin/packages/xset/package.py +++ b/var/spack/repos/builtin/packages/xset/package.py @@ -25,7 +25,7 @@ from spack import * -class Xset(Package): +class Xset(AutotoolsPackage): """User preference utility for X.""" homepage = "http://cgit.freedesktop.org/xorg/app/xset" @@ -39,9 +39,3 @@ class Xset(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xsetmode/package.py b/var/spack/repos/builtin/packages/xsetmode/package.py index f05fd0f123..8d39de26a4 100644 --- a/var/spack/repos/builtin/packages/xsetmode/package.py +++ b/var/spack/repos/builtin/packages/xsetmode/package.py @@ -25,7 +25,7 @@ from spack import * -class Xsetmode(Package): +class Xsetmode(AutotoolsPackage): """Set the mode for an X Input device.""" homepage = "http://cgit.freedesktop.org/xorg/app/xsetmode" @@ -38,9 +38,3 @@ class Xsetmode(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xsetpointer/package.py b/var/spack/repos/builtin/packages/xsetpointer/package.py index e9bf2fc9fe..194ef186ae 100644 --- a/var/spack/repos/builtin/packages/xsetpointer/package.py +++ b/var/spack/repos/builtin/packages/xsetpointer/package.py @@ -25,7 +25,7 @@ from spack import * -class Xsetpointer(Package): +class Xsetpointer(AutotoolsPackage): """Set an X Input device as the main pointer.""" homepage = "http://cgit.freedesktop.org/xorg/app/xsetpointer" @@ -39,9 +39,3 @@ class Xsetpointer(Package): depends_on('inputproto@1.4:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xsetroot/package.py b/var/spack/repos/builtin/packages/xsetroot/package.py index 3e62d41e9b..8be0625ff1 100644 --- a/var/spack/repos/builtin/packages/xsetroot/package.py +++ b/var/spack/repos/builtin/packages/xsetroot/package.py @@ -25,7 +25,7 @@ from spack import * -class Xsetroot(Package): +class Xsetroot(AutotoolsPackage): """xsetroot - root window parameter setting utility for X.""" homepage = "http://cgit.freedesktop.org/xorg/app/xsetroot" @@ -41,9 +41,3 @@ class Xsetroot(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xsm/package.py b/var/spack/repos/builtin/packages/xsm/package.py index 9d9c896365..4d91dae142 100644 --- a/var/spack/repos/builtin/packages/xsm/package.py +++ b/var/spack/repos/builtin/packages/xsm/package.py @@ -25,7 +25,7 @@ from spack import * -class Xsm(Package): +class Xsm(AutotoolsPackage): """X Session Manager.""" homepage = "http://cgit.freedesktop.org/xorg/app/xsm" @@ -41,9 +41,3 @@ class Xsm(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xstdcmap/package.py b/var/spack/repos/builtin/packages/xstdcmap/package.py index bb19bdff1a..8c3a081ae7 100644 --- a/var/spack/repos/builtin/packages/xstdcmap/package.py +++ b/var/spack/repos/builtin/packages/xstdcmap/package.py @@ -25,7 +25,7 @@ from spack import * -class Xstdcmap(Package): +class Xstdcmap(AutotoolsPackage): """The xstdcmap utility can be used to selectively define standard colormap properties. It is intended to be run from a user's X startup script to create standard colormap definitions in order to facilitate sharing of @@ -42,9 +42,3 @@ class Xstdcmap(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xtrans/package.py b/var/spack/repos/builtin/packages/xtrans/package.py index ed46059d9d..62f74b8cec 100644 --- a/var/spack/repos/builtin/packages/xtrans/package.py +++ b/var/spack/repos/builtin/packages/xtrans/package.py @@ -25,7 +25,7 @@ from spack import * -class Xtrans(Package): +class Xtrans(AutotoolsPackage): """xtrans is a library of code that is shared among various X packages to handle network protocol transport in a modular fashion, allowing a single place to add new transport types. It is used by the X server, @@ -38,8 +38,3 @@ class Xtrans(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make('install') diff --git a/var/spack/repos/builtin/packages/xtrap/package.py b/var/spack/repos/builtin/packages/xtrap/package.py index 405ec2f848..4a899b5111 100644 --- a/var/spack/repos/builtin/packages/xtrap/package.py +++ b/var/spack/repos/builtin/packages/xtrap/package.py @@ -25,7 +25,7 @@ from spack import * -class Xtrap(Package): +class Xtrap(AutotoolsPackage): """XTrap sample clients.""" homepage = "http://cgit.freedesktop.org/xorg/app/xtrap" @@ -38,9 +38,3 @@ class Xtrap(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xts/package.py b/var/spack/repos/builtin/packages/xts/package.py index c3993cf391..9dd3e4a05c 100644 --- a/var/spack/repos/builtin/packages/xts/package.py +++ b/var/spack/repos/builtin/packages/xts/package.py @@ -25,7 +25,7 @@ from spack import * -class Xts(Package): +class Xts(AutotoolsPackage): """This is a revamped version of X Test Suite (XTS) which removes some of the ugliness of building and running the tests.""" @@ -50,11 +50,5 @@ class Xts(Package): depends_on('xset', type='build') depends_on('xdpyinfo', type='build') - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - # FIXME: Crashes during compilation - # error: redeclaration of enumerator 'XawChainTop' - - make() - make('install') + # FIXME: Crashes during compilation + # error: redeclaration of enumerator 'XawChainTop' diff --git a/var/spack/repos/builtin/packages/xvidtune/package.py b/var/spack/repos/builtin/packages/xvidtune/package.py index ac5352df5f..42dbc23aa0 100644 --- a/var/spack/repos/builtin/packages/xvidtune/package.py +++ b/var/spack/repos/builtin/packages/xvidtune/package.py @@ -25,7 +25,7 @@ from spack import * -class Xvidtune(Package): +class Xvidtune(AutotoolsPackage): """xvidtune is a client interface to the X server video mode extension (XFree86-VidModeExtension).""" @@ -42,9 +42,3 @@ class Xvidtune(Package): depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xvinfo/package.py b/var/spack/repos/builtin/packages/xvinfo/package.py index 359f1f23de..f7a275f452 100644 --- a/var/spack/repos/builtin/packages/xvinfo/package.py +++ b/var/spack/repos/builtin/packages/xvinfo/package.py @@ -25,7 +25,7 @@ from spack import * -class Xvinfo(Package): +class Xvinfo(AutotoolsPackage): """xvinfo prints out the capabilities of any video adaptors associated with the display that are accessible through the X-Video extension.""" @@ -40,9 +40,3 @@ class Xvinfo(Package): depends_on('xproto@7.0.25:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xwd/package.py b/var/spack/repos/builtin/packages/xwd/package.py index d1f9ee1dfb..9016e17915 100644 --- a/var/spack/repos/builtin/packages/xwd/package.py +++ b/var/spack/repos/builtin/packages/xwd/package.py @@ -25,7 +25,7 @@ from spack import * -class Xwd(Package): +class Xwd(AutotoolsPackage): """xwd - dump an image of an X window.""" homepage = "http://cgit.freedesktop.org/xorg/app/xwd" @@ -39,9 +39,3 @@ class Xwd(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xwininfo/package.py b/var/spack/repos/builtin/packages/xwininfo/package.py index bba97ca671..61aa86bf46 100644 --- a/var/spack/repos/builtin/packages/xwininfo/package.py +++ b/var/spack/repos/builtin/packages/xwininfo/package.py @@ -25,7 +25,7 @@ from spack import * -class Xwininfo(Package): +class Xwininfo(AutotoolsPackage): """xwininfo prints information about windows on an X server. Various information is displayed depending on which options are selected.""" @@ -40,9 +40,3 @@ class Xwininfo(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xwud/package.py b/var/spack/repos/builtin/packages/xwud/package.py index a30d55b7c6..9294156e16 100644 --- a/var/spack/repos/builtin/packages/xwud/package.py +++ b/var/spack/repos/builtin/packages/xwud/package.py @@ -25,7 +25,7 @@ from spack import * -class Xwud(Package): +class Xwud(AutotoolsPackage): """xwud allows X users to display in a window an image saved in a specially formatted dump file, such as produced by xwd.""" @@ -39,9 +39,3 @@ class Xwud(Package): depends_on('xproto@7.0.17:', type='build') depends_on('pkg-config@0.9.0:', type='build') depends_on('util-macros', type='build') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/xz/package.py b/var/spack/repos/builtin/packages/xz/package.py index 8b0609f50e..c86c8c64b2 100644 --- a/var/spack/repos/builtin/packages/xz/package.py +++ b/var/spack/repos/builtin/packages/xz/package.py @@ -25,7 +25,7 @@ from spack import * -class Xz(Package): +class Xz(AutotoolsPackage): """XZ Utils is free general-purpose data compression software with high compression ratio. XZ Utils were written for POSIX-like systems, but also work on some not-so-POSIX systems. XZ Utils are @@ -35,11 +35,3 @@ class Xz(Package): version('5.2.0', '867cc8611760240ebf3440bd6e170bb9') version('5.2.2', 'f90c9a0c8b259aee2234c4e0d7fd70af') - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - - make() - if self.run_tests: - make('check') - make('install') diff --git a/var/spack/repos/builtin/packages/yasm/package.py b/var/spack/repos/builtin/packages/yasm/package.py index f14bdbcee7..e42ea6a5a7 100644 --- a/var/spack/repos/builtin/packages/yasm/package.py +++ b/var/spack/repos/builtin/packages/yasm/package.py @@ -25,7 +25,7 @@ from spack import * -class Yasm(Package): +class Yasm(AutotoolsPackage): """Yasm is a complete rewrite of the NASM-2.11.06 assembler. It supports the x86 and AMD64 instruction sets, accepts NASM and GAS assembler syntaxes and outputs binary, ELF32 and ELF64 @@ -34,8 +34,3 @@ class Yasm(Package): url = "http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz" version('1.3.0', 'fc9e586751ff789b34b1f21d572d96af') - - def install(self, spec, prefix): - configure("--prefix=%s" % prefix) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/zeromq/package.py b/var/spack/repos/builtin/packages/zeromq/package.py index cafd3c2125..51fff7222d 100644 --- a/var/spack/repos/builtin/packages/zeromq/package.py +++ b/var/spack/repos/builtin/packages/zeromq/package.py @@ -25,7 +25,7 @@ from spack import * -class Zeromq(Package): +class Zeromq(AutotoolsPackage): """ The ZMQ networking/concurrency library and core API """ homepage = "http://zguide.zeromq.org/" url = "http://download.zeromq.org/zeromq-4.1.2.tar.gz" @@ -40,8 +40,5 @@ class Zeromq(Package): depends_on("libsodium") depends_on("libsodium@:1.0.3", when='@:4.1.2') - def install(self, spec, prefix): - configure("--with-libsodium", "--prefix=%s" % prefix) - - make() - make("install") + def configure_args(self): + return ['--with-libsodium'] diff --git a/var/spack/repos/builtin/packages/zsh/package.py b/var/spack/repos/builtin/packages/zsh/package.py index a70d307be9..7b9c485966 100644 --- a/var/spack/repos/builtin/packages/zsh/package.py +++ b/var/spack/repos/builtin/packages/zsh/package.py @@ -25,7 +25,7 @@ from spack import * -class Zsh(Package): +class Zsh(AutotoolsPackage): """Zsh is a shell designed for interactive use, although it is also a powerful scripting language. Many of the useful features of bash, ksh, and tcsh were incorporated into zsh; many original features were added. @@ -37,9 +37,3 @@ class Zsh(Package): version('5.1.1', checksum='8ba28a9ef82e40c3a271602f18343b2f') depends_on("pcre") - - def install(self, spec, prefix): - configure('--prefix=%s' % prefix) - - make() - make("install") -- cgit v1.2.3-70-g09d2 From 4dad5aab8402f787afd8f9e440ac4bbbecd4b80f Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 18 Jan 2017 20:49:48 -0600 Subject: Add spack edit option for build systems (#2865) --- lib/spack/spack/__init__.py | 1 + lib/spack/spack/cmd/edit.py | 4 ++++ 2 files changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 34a7b01616..0b1934112e 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -46,6 +46,7 @@ build_env_path = join_path(lib_path, "env") module_path = join_path(lib_path, "spack") platform_path = join_path(module_path, 'platforms') compilers_path = join_path(module_path, "compilers") +build_systems_path = join_path(module_path, 'build_systems') operating_system_path = join_path(module_path, 'operating_systems') test_path = join_path(module_path, "test") hooks_path = join_path(module_path, "hooks") diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py index 77f23333b6..23fd307ab4 100644 --- a/lib/spack/spack/cmd/edit.py +++ b/lib/spack/spack/cmd/edit.py @@ -69,6 +69,10 @@ def setup_parser(subparser): # Various types of Spack files that can be edited # Edits package files by default + excl_args.add_argument( + '-b', '--build-system', dest='path', action='store_const', + const=spack.build_systems_path, + help="Edit the build system with the supplied name.") excl_args.add_argument( '-c', '--command', dest='path', action='store_const', const=spack.cmd.command_path, -- cgit v1.2.3-70-g09d2 From cade0181fd0d1d0dfe018bb848bbd0f309e5c825 Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Fri, 20 Jan 2017 13:22:59 -0500 Subject: Spack: Correct fix_darwin_install_name (#2886) Previously, fix_darwin_install_name would only handle dependencies that have no path set, and it ignore dependencies that have the build directory as path baked in. Catch this, and replace it by the install directory. --- lib/spack/llnl/util/filesystem.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 31e09f2fe6..79f15f9a21 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -455,7 +455,12 @@ def fix_darwin_install_name(path): # fix all dependencies: for dep in deps: for loc in libs: - if dep == os.path.basename(loc): + # We really want to check for either + # dep == os.path.basename(loc) or + # dep == join_path(builddir, os.path.basename(loc)), + # but we don't know builddir (nor how symbolic links look + # in builddir). We thus only compare the basenames. + if os.path.basename(dep) == os.path.basename(loc): subprocess.Popen( ["install_name_tool", "-change", dep, loc, lib], stdout=subprocess.PIPE).communicate()[0] -- cgit v1.2.3-70-g09d2 From dae353374eb9e2a3561ea590063fad51ddaafe2d Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 23 Jan 2017 11:48:49 -0600 Subject: Simplify unit tests listed in Contribution Guide (#2904) * Simplify unit tests listed in Contribution Guide * Use long name for option flags --- lib/spack/docs/contribution_guide.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/contribution_guide.rst b/lib/spack/docs/contribution_guide.rst index 4abf97ef92..e9cfe1fa54 100644 --- a/lib/spack/docs/contribution_guide.rst +++ b/lib/spack/docs/contribution_guide.rst @@ -75,7 +75,10 @@ This allows you to develop iteratively: make a change, test that change, make another change, test that change, etc. To get a list of all available unit tests, run: -.. command-output:: spack test --collect-only +.. command-output:: spack test --list + +A more detailed list of available unit tests can be found by running +``spack test --long-list``. Unit tests are crucial to making sure bugs aren't introduced into Spack. If you are modifying core Spack libraries or adding new functionality, please consider -- cgit v1.2.3-70-g09d2 From a8e1d78881ce09f3c3d3a22b84dca4a0630d49e5 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 23 Jan 2017 22:55:39 +0100 Subject: documentation: build-system phases + build-time tests (#2780) * documentation: reworked packaging guide to add build-system phases * documentation: improvements to AutotoolsPackage autodocs * build_systems: updated autodocs * run-tests: added a few information on how to run tests fixes #2606 fixes#2605 * documentation: fixed items brought up by @davydden * typos in docs * consistent use of 'build system' (i.e. removed 'build-system' from docs) * added a note on possible default implementations for build-time tests * documentation: fixed items brought up by @citibeth * added note to explain the difference between build system and language used in a package * capitalized bullet items * added link to API docs * documentation: fixed multiple cross-references after rebase * documentation: fixed minor issues raised by @tgamblin * documentation: added entry in table for the `PythonPackage` class * docs: fixed issues brought up by @citybeth in the second review --- lib/spack/docs/packaging_guide.rst | 213 ++++++++++++++++++++++------- lib/spack/spack/build_systems/autotools.py | 93 +++++++++---- lib/spack/spack/build_systems/cmake.py | 69 +++++++--- lib/spack/spack/build_systems/makefile.py | 53 +++++-- lib/spack/spack/build_systems/r.py | 10 +- lib/spack/spack/package.py | 8 +- 6 files changed, 332 insertions(+), 114 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index b09c677e0b..f3927a0709 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -1999,41 +1999,122 @@ the Python extensions provided by them: once for ``+python`` and once for ``~python``. Other than using a little extra disk space, that solution has no serious problems. ------------------------------------ -Implementing the ``install`` method ------------------------------------ +.. _installation_procedure: -The last element of a package is its ``install()`` method. This is +--------------------------------------- +Implementing the installation procedure +--------------------------------------- + +The last element of a package is its **installation procedure**. This is where the real work of installation happens, and it's the main part of the package you'll need to customize for each piece of software. -.. code-block:: python - :linenos: +Defining an installation procedure means overriding a set of methods or attributes +that will be called at some point during the installation of the package. +The package base class, usually specialized for a given build system, determines the +actual set of entities available for overriding. +The classes that are currently provided by Spack are: + + +------------------------------------+----------------------------------+ + | | **Base class purpose** | + +====================================+==================================+ + | :py:class:`.Package` | General base class not | + | | specialized for any build system | + +------------------------------------+----------------------------------+ + | :py:class:`.MakefilePackage` | Specialized class for packages | + | | built invoking | + | | hand-written Makefiles | + +------------------------------------+----------------------------------+ + | :py:class:`.AutotoolsPackage` | Specialized class for packages | + | | built using GNU Autotools | + +------------------------------------+----------------------------------+ + | :py:class:`.CMakePackage` | Specialized class for packages | + | | built using CMake | + +------------------------------------+----------------------------------+ + | :py:class:`.RPackage` | Specialized class for | + | | :py:class:`.R` extensions | + +------------------------------------+----------------------------------+ + | :py:class:`.PythonPackage` | Specialized class for | + | | :py:class:`.Python` extensions | + +------------------------------------+----------------------------------+ - def install(self, spec prefix): - configure('--prefix={0}'.format(prefix)) - make() - make('install') -``install`` takes a ``spec``: a description of how the package should -be built, and a ``prefix``: the path to the directory where the -software should be installed. +.. note:: + Choice of the appropriate base class for a package + In most cases packagers don't have to worry about the selection of the right base class + for a package, as ``spack create`` will make the appropriate choice on their behalf. In those + rare cases where manual intervention is needed we need to stress that a + package base class depends on the *build system* being used, not the language of the package. + For example, a Python extension installed with CMake would ``extends('python')`` and + subclass from :py:class:`.CMakePackage`. + +^^^^^^^^^^^^^^^^^^^^^ +Installation pipeline +^^^^^^^^^^^^^^^^^^^^^ + +When a user runs ``spack install``, Spack: + +1. Fetches an archive for the correct version of the software. +2. Expands the archive. +3. Sets the current working directory to the root directory of the expanded archive. + +Then, depending on the base class of the package under consideration, it will execute +a certain number of **phases** that reflect the way a package of that type is usually built. +The name and order in which the phases will be executed can be obtained either reading the API +docs at :py:mod:`~.spack.build_systems`, or using the ``spack info`` command: + +.. code-block:: console + :emphasize-lines: 13,14 + + $ spack info m4 + AutotoolsPackage: m4 + Homepage: https://www.gnu.org/software/m4/m4.html -Spack provides wrapper functions for ``configure`` and ``make`` so -that you can call them in a similar way to how you'd call a shell -command. In reality, these are Python functions. Spack provides -these functions to make writing packages more natural. See the section -on :ref:`shell wrappers `. + Safe versions: + 1.4.17 ftp://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz -Now that the metadata is out of the way, we can move on to the -``install()`` method. When a user runs ``spack install``, Spack -fetches an archive for the correct version of the software, expands -the archive, and sets the current working directory to the root -directory of the expanded archive. It then instantiates a package -object and calls the ``install()`` method. + Variants: + Name Default Description + + sigsegv on Build the libsigsegv dependency + + Installation Phases: + autoreconf configure build install + + Build Dependencies: + libsigsegv + + ... + + +Typically, phases have default implementations that fit most of the common cases: + +.. literalinclude:: ../../../lib/spack/spack/build_systems/autotools.py + :pyobject: AutotoolsPackage.configure + :linenos: + +It is thus just sufficient for a packager to override a few +build system specific helper methods or attributes to provide, for instance, +configure arguments: + +.. literalinclude:: ../../../var/spack/repos/builtin/packages/m4/package.py + :pyobject: M4.configure_args + :linenos: + +.. note:: + Each specific build system has a list of attributes that can be overridden to + fine-tune the installation of a package without overriding an entire phase. To + have more information on them the place to go is the API docs of the :py:mod:`~.spack.build_systems` + module. + +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Overriding an entire phase +^^^^^^^^^^^^^^^^^^^^^^^^^^ -The ``install()`` signature looks like this: +In extreme cases it may be necessary to override an entire phase. Regardless +of the build system, the signature is the same. For example, the signature +for the install phase is: .. code-block:: python @@ -2041,8 +2122,6 @@ The ``install()`` signature looks like this: def install(self, spec, prefix): ... -The parameters are as follows: - ``self`` For those not used to Python instance methods, this is the package itself. In this case it's an instance of ``Foo``, which @@ -2059,19 +2138,15 @@ The parameters are as follows: targets into. It acts like a string, but it's actually its own special type, :py:class:`Prefix `. -``spec`` and ``prefix`` are passed to ``install`` for convenience. -``spec`` is also available as an attribute on the package -(``self.spec``), and ``prefix`` is actually an attribute of ``spec`` -(``spec.prefix``). +The arguments ``spec`` and ``prefix`` are passed only for convenience, as they always +correspond to ``self.spec`` and ``self.spec.prefix`` respectively. -As mentioned in :ref:`install-environment`, you will usually not need -to refer to dependencies explicitly in your package file, as the -compiler wrappers take care of most of the heavy lifting here. There -will be times, though, when you need to refer to the install locations -of dependencies, or when you need to do something different depending -on the version, compiler, dependencies, etc. that your package is -built with. These parameters give you access to this type of -information. +As mentioned in :ref:`install-environment`, you will usually not need to refer +to dependencies explicitly in your package file, as the compiler wrappers take care of most of +the heavy lifting here. There will be times, though, when you need to refer to +the install locations of dependencies, or when you need to do something different +depending on the version, compiler, dependencies, etc. that your package is +built with. These parameters give you access to this type of information. .. _install-environment: @@ -2629,9 +2704,9 @@ build system. .. _sanity-checks: -------------------------------- -Sanity checking an installation -------------------------------- +------------------------ +Checking an installation +------------------------ By default, Spack assumes that a build has failed if nothing is written to the install prefix, and that it has succeeded if anything @@ -2650,16 +2725,18 @@ Consider a simple autotools build like this: If you are using using standard autotools or CMake, ``configure`` and ``make`` will not write anything to the install prefix. Only ``make install`` writes the files, and only once the build is already -complete. Not all builds are like this. Many builds of scientific -software modify the install prefix *before* ``make install``. Builds -like this can falsely report that they were successfully installed if -an error occurs before the install is complete but after files have -been written to the ``prefix``. +complete. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``sanity_check_is_file`` and ``sanity_check_is_dir`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Unfortunately, many builds of scientific +software modify the install prefix *before* ``make install``. Builds +like this can falsely report that they were successfully installed if +an error occurs before the install is complete but after files have +been written to the ``prefix``. + You can optionally specify *sanity checks* to deal with this problem. Add properties like this to your package: @@ -2683,6 +2760,48 @@ the build will fail and the install prefix will be removed. If they succeed, Spack considers the build successful and keeps the prefix in place. +^^^^^^^^^^^^^^^^ +Build-time tests +^^^^^^^^^^^^^^^^ + +Sometimes packages finish to build "correctly" and issues with their run-time +behavior are discovered only at a later stage, maybe after a full software stack +relying on them has already been built. To avoid situations of that kind it's possible +to write build-time tests that will be executed only if the option ``--run-tests`` +of ``spack install`` has been activated. + +The proper way to write these tests is relying on two decorators that come with +any base class listed in :ref:`installation_procedure`. + +.. code-block:: python + + @MakefilePackage.sanity_check('build') + @MakefilePackage.on_package_attributes(run_tests=True) + def check_build(self): + # Custom implementation goes here + pass + +The first decorator ``MakefilePackage.sanity_check('build')`` schedules this +function to be invoked after the ``build`` phase has been executed, while the +second one makes the invocation conditional on the fact that ``self.run_tests == True``. +It is also possible to schedule a function to be invoked *before* a given phase +using the ``MakefilePackage.precondition`` decorator. + +.. note:: + + Default implementations for build-time tests + + Packages that are built using specific build systems may already have a + default implementation for build-time tests. For instance :py:class:`~.AutotoolsPackage` + based packages will try to invoke ``make test`` and ``make check`` if + Spack is asked to run tests. + More information on each class is available in the the :py:mod:`~.spack.build_systems` + documentation. + +.. warning:: + + The API for adding tests is not yet considered stable and may change drastically in future releases. + .. _file-manipulation: --------------------------- diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 78a4df5e11..37c780b360 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -36,31 +36,51 @@ from spack.package import PackageBase class AutotoolsPackage(PackageBase): - """Specialized class for packages that are built using GNU Autotools + """Specialized class for packages built using GNU Autotools. This class provides four phases that can be overridden: - * autoreconf - * configure - * build - * install + 1. :py:meth:`~.AutotoolsPackage.autoreconf` + 2. :py:meth:`~.AutotoolsPackage.configure` + 3. :py:meth:`~.AutotoolsPackage.build` + 4. :py:meth:`~.AutotoolsPackage.install` They all have sensible defaults and for many packages the only thing - necessary will be to override ``configure_args`` + necessary will be to override the helper method :py:meth:`.configure_args`. + For a finer tuning you may also override: + + +-----------------------------------------------+--------------------+ + | **Method** | **Purpose** | + +===============================================+====================+ + | :py:attr:`~.AutotoolsPackage.build_targets` | Specify ``make`` | + | | targets for the | + | | build phase | + +-----------------------------------------------+--------------------+ + | :py:attr:`~.AutotoolsPackage.install_targets` | Specify ``make`` | + | | targets for the | + | | install phase | + +-----------------------------------------------+--------------------+ + | :py:meth:`~.AutotoolsPackage.check` | Run build time | + | | tests if required | + +-----------------------------------------------+--------------------+ - Additionally, you may specify make targets for build and install - phases by overriding ``build_targets`` and ``install_targets`` """ + #: Phases of a GNU Autotools package phases = ['autoreconf', 'configure', 'build', 'install'] - # To be used in UI queries that require to know which - # build-system class we are using + #: This attribute is used in UI queries that need to know the build + #: system base class build_system_class = 'AutotoolsPackage' + #: Whether or not to update ``config.guess`` on old architectures patch_config_guess = True + #: Targets for ``make`` during the :py:meth:`~.AutotoolsPackage.build` + #: phase build_targets = [] + #: Targets for ``make`` during the :py:meth:`~.AutotoolsPackage.install` + #: phase install_targets = ['install'] - def do_patch_config_guess(self): + def _do_patch_config_guess(self): """Some packages ship with an older config.guess and need to have this updated when installed on a newer architecture.""" @@ -86,7 +106,7 @@ class AutotoolsPackage(PackageBase): check_call([my_config_guess], stdout=PIPE, stderr=PIPE) # The package's config.guess already runs OK, so just use it return True - except: + except Exception: pass else: return True @@ -104,7 +124,7 @@ class AutotoolsPackage(PackageBase): check_call([config_guess], stdout=PIPE, stderr=PIPE) shutil.copyfile(config_guess, my_config_guess) return True - except: + except Exception: pass # Look for the system's config.guess @@ -121,7 +141,7 @@ class AutotoolsPackage(PackageBase): check_call([config_guess], stdout=PIPE, stderr=PIPE) shutil.copyfile(config_guess, my_config_guess) return True - except: + except Exception: pass return False @@ -131,11 +151,17 @@ class AutotoolsPackage(PackageBase): return self.stage.source_path def patch(self): - """Perform any required patches.""" + """Patches config.guess if + :py:attr:``~.AutotoolsPackage.patch_config_guess`` is True + + :raise RuntimeError: if something goes wrong when patching + ``config.guess`` + """ if self.patch_config_guess and self.spec.satisfies( - 'arch=linux-rhel7-ppc64le'): - if not self.do_patch_config_guess(): + 'arch=linux-rhel7-ppc64le' + ): + if not self._do_patch_config_guess(): raise RuntimeError('Failed to find suitable config.guess') def autoreconf(self, spec, prefix): @@ -144,22 +170,27 @@ class AutotoolsPackage(PackageBase): @PackageBase.sanity_check('autoreconf') def is_configure_or_die(self): - """Checks the presence of a ``configure`` file after the - autoreconf phase""" + """Checks the presence of a `configure` file after the + :py:meth:`.autoreconf` phase. + + :raise RuntimeError: if the ``configure`` script does not exist. + """ with working_dir(self.build_directory()): if not os.path.exists('configure'): raise RuntimeError( 'configure script not found in {0}'.format(os.getcwd())) def configure_args(self): - """Method to be overridden. Should return an iterable containing - all the arguments that must be passed to configure, except ``--prefix`` + """Produces a list containing all the arguments that must be passed to + configure, except ``--prefix`` which will be pre-pended to the list. + + :return: list of arguments for configure """ return [] def configure(self, spec, prefix): - """Runs configure with the arguments specified in ``configure_args`` - and an appropriately set prefix + """Runs configure with the arguments specified in :py:meth:`.configure_args` + and an appropriately set prefix. """ options = ['--prefix={0}'.format(prefix)] + self.configure_args() @@ -167,12 +198,16 @@ class AutotoolsPackage(PackageBase): inspect.getmodule(self).configure(*options) def build(self, spec, prefix): - """Make the build targets""" + """Makes the build targets specified by + :py:attr:``~.AutotoolsPackage.build_targets`` + """ with working_dir(self.build_directory()): inspect.getmodule(self).make(*self.build_targets) def install(self, spec, prefix): - """Make the install targets""" + """Makes the install targets specified by + :py:attr:``~.AutotoolsPackage.install_targets`` + """ with working_dir(self.build_directory()): inspect.getmodule(self).make(*self.install_targets) @@ -181,8 +216,8 @@ class AutotoolsPackage(PackageBase): def _run_default_function(self): """This function is run after build if ``self.run_tests == True`` - It will search for a method named ``check`` and run it. A sensible - default is provided in the base class. + It will search for a method named :py:meth:`.check` and run it. A + sensible default is provided in the base class. """ try: fn = getattr(self, 'check') @@ -192,8 +227,8 @@ class AutotoolsPackage(PackageBase): tty.msg('Skipping default sanity checks [method `check` not implemented]') # NOQA: ignore=E501 def check(self): - """Default test: search the Makefile for targets ``test`` and ``check`` - and run them if found. + """Searches the Makefile for targets ``test`` and ``check`` + and runs them if found. """ with working_dir(self.build_directory()): self._if_make_target_execute('test') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 61d45784e8..a5e23e54f4 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -34,23 +34,39 @@ from spack.package import PackageBase class CMakePackage(PackageBase): - """Specialized class for packages that are built using CMake + """Specialized class for packages built using CMake This class provides three phases that can be overridden: - * cmake - * build - * install + 1. :py:meth:`~.CMakePackage.cmake` + 2. :py:meth:`~.CMakePackage.build` + 3. :py:meth:`~.CMakePackage.install` They all have sensible defaults and for many packages the only thing - necessary will be to override ``cmake_args`` + necessary will be to override :py:meth:`~.CMakePackage.cmake_args`. + For a finer tuning you may also override: + + +-----------------------------------------------+--------------------+ + | **Method** | **Purpose** | + +===============================================+====================+ + | :py:meth:`~.CMakePackage.build_type` | Specify the value | + | | for the | + | | CMAKE_BUILD_TYPE | + | | variable | + +-----------------------------------------------+--------------------+ + | :py:meth:`~.CMakePackage.root_cmakelists_dir` | Location of the | + | | root CMakeLists.txt| + +-----------------------------------------------+--------------------+ + | :py:meth:`~.CMakePackage.build_directory` | Directory where to | + | | build the package | + +-----------------------------------------------+--------------------+ + - Additionally, you may specify make targets for build and install - phases by overriding ``build_targets`` and ``install_targets`` """ + #: Phases of a CMake package phases = ['cmake', 'build', 'install'] - # To be used in UI queries that require to know which - # build-system class we are using + #: This attribute is used in UI queries that need to know the build + #: system base class build_system_class = 'CMakePackage' build_targets = [] @@ -59,19 +75,25 @@ class CMakePackage(PackageBase): depends_on('cmake', type='build') def build_type(self): - """Override to provide the correct build_type in case a complex - logic is needed + """Returns the correct value for the ``CMAKE_BUILD_TYPE`` variable + + :return: value for ``CMAKE_BUILD_TYPE`` """ return 'RelWithDebInfo' def root_cmakelists_dir(self): - """Directory where to find the root CMakeLists.txt""" + """Returns the location of the root CMakeLists.txt + + :return: directory containing the root CMakeLists.txt + """ return self.stage.source_path @property def std_cmake_args(self): """Standard cmake arguments provided as a property for convenience of package writers + + :return: standard cmake arguments """ # standard CMake arguments return CMakePackage._std_args(self) @@ -97,20 +119,27 @@ class CMakePackage(PackageBase): return args def build_directory(self): - """Override to provide another place to build the package""" + """Returns the directory to use when building the package + + :return: directory where to build the package + """ return join_path(self.stage.source_path, 'spack-build') def cmake_args(self): - """Method to be overridden. Should return an iterable containing - all the arguments that must be passed to configure, except: + """Produces a list containing all the arguments that must be passed to + cmake, except: + + * CMAKE_INSTALL_PREFIX + * CMAKE_BUILD_TYPE + + which will be set automatically. - * CMAKE_INSTALL_PREFIX - * CMAKE_BUILD_TYPE + :return: list of arguments for cmake """ return [] def cmake(self, spec, prefix): - """Run cmake in the build directory""" + """Runs ``cmake`` in the build directory""" options = [self.root_cmakelists_dir()] + self.std_cmake_args + \ self.cmake_args() with working_dir(self.build_directory(), create=True): @@ -142,8 +171,8 @@ class CMakePackage(PackageBase): tty.msg('Skipping default build sanity checks [method `check` not implemented]') # NOQA: ignore=E501 def check(self): - """Default test: search the Makefile for the target ``test`` - and run them if found. + """Searches the CMake-generated Makefile for the target ``test`` + and runs it if found. """ with working_dir(self.build_directory()): self._if_make_target_execute('test') diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index a56f316109..e8fa86264b 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -35,36 +35,67 @@ class MakefilePackage(PackageBase): This class provides three phases that can be overridden: - * edit - * build - * install + 1. :py:meth:`~.MakefilePackage.edit` + 2. :py:meth:`~.MakefilePackage.build` + 3. :py:meth:`~.MakefilePackage.install` - It is necessary to override the 'edit' phase, while 'build' and 'install' - have sensible defaults. + It is usually necessary to override the :py:meth:`~.MakefilePackage.edit` + phase, while :py:meth:`~.MakefilePackage.build` and + :py:meth:`~.MakefilePackage.install` have sensible defaults. + For a finer tuning you may override: + + +-----------------------------------------------+--------------------+ + | **Method** | **Purpose** | + +===============================================+====================+ + | :py:attr:`~.MakefilePackage.build_targets` | Specify ``make`` | + | | targets for the | + | | build phase | + +-----------------------------------------------+--------------------+ + | :py:attr:`~.MakefilePackage.install_targets` | Specify ``make`` | + | | targets for the | + | | install phase | + +-----------------------------------------------+--------------------+ + | :py:meth:`~.MakefilePackage.build_directory` | Directory where the| + | | Makefile is located| + +-----------------------------------------------+--------------------+ """ + #: Phases of a package that is built with an hand-written Makefile phases = ['edit', 'build', 'install'] - # To be used in UI queries that require to know which - # build-system class we are using + #: This attribute is used in UI queries that need to know the build + #: system base class build_system_class = 'MakefilePackage' + #: Targets for ``make`` during the :py:meth:`~.MakefilePackage.build` + #: phase build_targets = [] + #: Targets for ``make`` during the :py:meth:`~.MakefilePackage.install` + #: phase install_targets = ['install'] def build_directory(self): - """Directory where the main Makefile is located""" + """Returns the directory containing the main Makefile + + :return: build directory + """ return self.stage.source_path def edit(self, spec, prefix): - """This phase cannot be defaulted for obvious reasons...""" + """Edits the Makefile before calling make. This phase cannot + be defaulted. + """ tty.msg('Using default implementation: skipping edit phase.') def build(self, spec, prefix): - """Make the build targets""" + """Calls make, passing :py:attr:`~.MakefilePackage.build_targets` + as targets. + """ with working_dir(self.build_directory()): inspect.getmodule(self).make(*self.build_targets) def install(self, spec, prefix): - """Make the install targets""" + """Calls make, passing :py:attr:`~.MakefilePackage.install_targets` + as targets. + """ with working_dir(self.build_directory()): inspect.getmodule(self).make(*self.install_targets) diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index f642f2dfd8..a4f7359ec8 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -34,21 +34,21 @@ class RPackage(PackageBase): This class provides a single phase that can be overridden: - * install + 1. :py:meth:`~.RPackage.install` - It has sensible defaults and for many packages the only thing + It has sensible defaults, and for many packages the only thing necessary will be to add dependencies """ phases = ['install'] - # To be used in UI queries that require to know which - # build-system class we are using + #: This attribute is used in UI queries that need to know the build + #: system base class build_system_class = 'RPackage' extends('r') def install(self, spec, prefix): - """Install the R package""" + """Installs an R package.""" inspect.getmodule(self).R( 'CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir), diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index f9bc1fafbc..24ff82fa38 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1706,9 +1706,13 @@ class PackageBase(object): class Package(PackageBase): + """General purpose class with a single ``install`` + phase that needs to be coded by packagers. + """ + #: The one and only phase phases = ['install'] - # To be used in UI queries that require to know which - # build-system class we are using + #: This attribute is used in UI queries that require to know which + #: build-system class we are using build_system_class = 'Package' # This will be used as a registration decorator in user # packages, if need be -- cgit v1.2.3-70-g09d2 From 7d3da2ebdcdbd5e42aebb41db4cf497d8219a53d Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 24 Jan 2017 11:25:44 -0600 Subject: Grammar and broken link fixes in modules tutorial (#2912) --- lib/spack/docs/tutorial_sc16_modules.rst | 35 +++++++++++++++----------------- 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/tutorial_sc16_modules.rst b/lib/spack/docs/tutorial_sc16_modules.rst index 407f679ae6..0a79d943f9 100644 --- a/lib/spack/docs/tutorial_sc16_modules.rst +++ b/lib/spack/docs/tutorial_sc16_modules.rst @@ -45,7 +45,7 @@ Add a new compiler ^^^^^^^^^^^^^^^^^^ Spack automatically scans the environment to search for available -compilers on first use. On a Ubuntu 14.04 a fresh clone will show +compilers on first use. On Ubuntu 14.04, a fresh clone will show something like this: .. code-block:: console @@ -58,9 +58,10 @@ something like this: -- gcc ---------------------------------------------------------- gcc@4.8 -For the purpose of building a limited set of packages with some features -that will help showcasing the capabilities of -module customization the first thing we need is to build a new compiler: +In order to showcase the capabilities of module customization, we will want to +build a limited set of packages with multiple compilers. If you do not already +have multiple compilers listed by ``spack compilers``, you should build one +with Spack: .. code-block:: console @@ -85,7 +86,7 @@ Then we can use shell support for modules to add it to the list of known compile -- gcc ---------------------------------------------------------- gcc@6.2.0 gcc@4.8 -Note that the final 7 digits hash at the end of the generated module may vary depending +Note that the 7-digit hash at the end of the generated module may vary depending on architecture or package version. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -96,16 +97,11 @@ Next you should install a few modules that will be used in the tutorial: .. code-block:: console - $ spack install netlib-scalapack ^openmpi ^openblas - # ... - -The packages you need to install are: - -- ``netlib-scalapack ^openmpi ^openblas`` -- ``netlib-scalapack ^mpich ^openblas`` -- ``netlib-scalapack ^openmpi ^netlib-lapack`` -- ``netlib-scalapack ^mpich ^netlib-lapack`` -- ``py-scipy ^openblas`` + $ spack install netlib-scalapack ^openmpi ^openblas + $ spack install netlib-scalapack ^mpich ^openblas + $ spack install netlib-scalapack ^openmpi ^netlib-lapack + $ spack install netlib-scalapack ^mpich ^netlib-lapack + $ spack install py-scipy ^openblas In the end your environment should look something like: @@ -500,7 +496,7 @@ Regenerating the module files should result in something like: Fortran, and Java. ]]) -As you see the ``gcc`` module has the environment variable ``GCC_ROOT`` set. +As you can see, the ``gcc`` module has the environment variable ``GCC_ROOT`` set. Sometimes it's also useful to apply environment modifications selectively and target only certain packages. You can, for instance set the common variables ``CC``, ``CXX``, @@ -727,7 +723,7 @@ Core/Compiler/MPI The most common hierarchy is the so called ``Core/Compiler/MPI``. To have an idea how a hierarchy is organized you may refer to the -`Lmod guide `_. +`Lmod guide `_. Since ``lmod`` is not enabled by default, you need to add it to the list of enabled module file generators. The other things you need to do are: @@ -782,9 +778,10 @@ After modifications the configuration file will be: purpose of overriding the default list of enabled generators so that only ``lmod`` will be active (see :ref:`the reference manual ` for a more detailed explanation of - config scopes). + config scopes). If a single colon is used, it will append instead + of override. -The directive ``core_compilers`` accepts a list of compilers : everything built +The directive ``core_compilers`` accepts a list of compilers; everything built using these compilers will create a module in the ``Core`` part of the hierarchy. It is common practice to put the OS provided compilers in the list and only build common utilities and other compilers in ``Core``. -- cgit v1.2.3-70-g09d2 From fc866ae0fe960abf723d5f89c2ae6c6baaa3ce5e Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 25 Jan 2017 16:57:01 +0100 Subject: build systems: simpler, clearer decorators: run_after, run_before (#2860) * PackageMeta: `run_before` is an alias of `precondition`, `run_after` an alias of `sanity_check` * PackageMeta: removed `precondition` and `sanity_check` * PackageMeta: decorators are now free-standing * package: modified/added docstrings. Fixed the semantics of `on_package_attributes`. * package: added unit test assertion as side effects of install * build_systems: factored build-time test running into base class * r: updated decorators in package.py * docs: updated decorator names --- lib/spack/docs/packaging_guide.rst | 8 +- lib/spack/spack/__init__.py | 16 ++- lib/spack/spack/build_systems/autotools.py | 24 +--- lib/spack/spack/build_systems/cmake.py | 22 +-- lib/spack/spack/build_systems/makefile.py | 4 +- lib/spack/spack/build_systems/python.py | 4 +- lib/spack/spack/build_systems/r.py | 4 +- lib/spack/spack/package.py | 158 ++++++++++++--------- .../builtin.mock/packages/cmake-client/package.py | 33 ++++- var/spack/repos/builtin/packages/cmor/package.py | 2 +- var/spack/repos/builtin/packages/h5hut/package.py | 2 +- var/spack/repos/builtin/packages/hdf5/package.py | 4 +- var/spack/repos/builtin/packages/mpich/package.py | 4 +- .../repos/builtin/packages/openblas/package.py | 6 +- .../repos/builtin/packages/openmpi/package.py | 4 +- .../repos/builtin/packages/py-basemap/package.py | 2 +- .../builtin/packages/py-matplotlib/package.py | 2 +- var/spack/repos/builtin/packages/py-yt/package.py | 2 +- var/spack/repos/builtin/packages/r/package.py | 4 +- var/spack/repos/builtin/packages/tcl/package.py | 2 +- .../repos/builtin/packages/trilinos/package.py | 2 +- 21 files changed, 174 insertions(+), 135 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index f3927a0709..9b08a7d498 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2775,17 +2775,17 @@ any base class listed in :ref:`installation_procedure`. .. code-block:: python - @MakefilePackage.sanity_check('build') - @MakefilePackage.on_package_attributes(run_tests=True) + @run_after('build') + @on_package_attributes(run_tests=True) def check_build(self): # Custom implementation goes here pass -The first decorator ``MakefilePackage.sanity_check('build')`` schedules this +The first decorator ``run_after('build')`` schedules this function to be invoked after the ``build`` phase has been executed, while the second one makes the invocation conditional on the fact that ``self.run_tests == True``. It is also possible to schedule a function to be invoked *before* a given phase -using the ``MakefilePackage.precondition`` decorator. +using the ``run_before`` decorator. .. note:: diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 0b1934112e..6a28fbb2b0 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -156,14 +156,24 @@ dirty = _config.get('dirty', False) #----------------------------------------------------------------------------- __all__ = [] -from spack.package import Package +from spack.package import Package, run_before, run_after, on_package_attributes from spack.build_systems.makefile import MakefilePackage from spack.build_systems.autotools import AutotoolsPackage from spack.build_systems.cmake import CMakePackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage -__all__ += ['Package', 'CMakePackage', 'AutotoolsPackage', 'MakefilePackage', - 'PythonPackage', 'RPackage'] + +__all__ += [ + 'run_before', + 'run_after', + 'on_package_attributes', + 'Package', + 'CMakePackage', + 'AutotoolsPackage', + 'MakefilePackage', + 'PythonPackage', + 'RPackage' +] from spack.version import Version, ver __all__ += ['Version', 'ver'] diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 37c780b360..d08ea02428 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -30,9 +30,8 @@ import shutil from subprocess import PIPE from subprocess import check_call -import llnl.util.tty as tty from llnl.util.filesystem import working_dir -from spack.package import PackageBase +from spack.package import PackageBase, run_after class AutotoolsPackage(PackageBase): @@ -80,6 +79,8 @@ class AutotoolsPackage(PackageBase): #: phase install_targets = ['install'] + build_time_test_callbacks = ['check'] + def _do_patch_config_guess(self): """Some packages ship with an older config.guess and need to have this updated when installed on a newer architecture.""" @@ -168,7 +169,7 @@ class AutotoolsPackage(PackageBase): """Not needed usually, configure should be already there""" pass - @PackageBase.sanity_check('autoreconf') + @run_after('autoreconf') def is_configure_or_die(self): """Checks the presence of a `configure` file after the :py:meth:`.autoreconf` phase. @@ -211,20 +212,7 @@ class AutotoolsPackage(PackageBase): with working_dir(self.build_directory()): inspect.getmodule(self).make(*self.install_targets) - @PackageBase.sanity_check('build') - @PackageBase.on_package_attributes(run_tests=True) - def _run_default_function(self): - """This function is run after build if ``self.run_tests == True`` - - It will search for a method named :py:meth:`.check` and run it. A - sensible default is provided in the base class. - """ - try: - fn = getattr(self, 'check') - tty.msg('Trying default sanity checks [check]') - fn() - except AttributeError: - tty.msg('Skipping default sanity checks [method `check` not implemented]') # NOQA: ignore=E501 + run_after('build')(PackageBase._run_default_build_time_test_callbacks) def check(self): """Searches the Makefile for targets ``test`` and ``check`` @@ -235,4 +223,4 @@ class AutotoolsPackage(PackageBase): self._if_make_target_execute('check') # Check that self.prefix is there after installation - PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix) + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index a5e23e54f4..823ef502c4 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -26,11 +26,10 @@ import inspect import platform -import llnl.util.tty as tty import spack.build_environment from llnl.util.filesystem import working_dir, join_path from spack.directives import depends_on -from spack.package import PackageBase +from spack.package import PackageBase, run_after class CMakePackage(PackageBase): @@ -72,6 +71,8 @@ class CMakePackage(PackageBase): build_targets = [] install_targets = ['install'] + build_time_test_callbacks = ['check'] + depends_on('cmake', type='build') def build_type(self): @@ -155,20 +156,7 @@ class CMakePackage(PackageBase): with working_dir(self.build_directory()): inspect.getmodule(self).make(*self.install_targets) - @PackageBase.sanity_check('build') - @PackageBase.on_package_attributes(run_tests=True) - def _run_default_function(self): - """This function is run after build if ``self.run_tests == True`` - - It will search for a method named ``check`` and run it. A sensible - default is provided in the base class. - """ - try: - fn = getattr(self, 'check') - tty.msg('Trying default build sanity checks [check]') - fn() - except AttributeError: - tty.msg('Skipping default build sanity checks [method `check` not implemented]') # NOQA: ignore=E501 + run_after('build')(PackageBase._run_default_build_time_test_callbacks) def check(self): """Searches the CMake-generated Makefile for the target ``test`` @@ -178,4 +166,4 @@ class CMakePackage(PackageBase): self._if_make_target_execute('test') # Check that self.prefix is there after installation - PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix) + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index e8fa86264b..f07bcd62ab 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -27,7 +27,7 @@ import inspect import llnl.util.tty as tty from llnl.util.filesystem import working_dir -from spack.package import PackageBase +from spack.package import PackageBase, run_after class MakefilePackage(PackageBase): @@ -100,4 +100,4 @@ class MakefilePackage(PackageBase): inspect.getmodule(self).make(*self.install_targets) # Check that self.prefix is there after installation - PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix) + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index d21c291ae6..5e7c1c356d 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -26,7 +26,7 @@ import inspect from spack.directives import extends -from spack.package import PackageBase +from spack.package import PackageBase, run_after from llnl.util.filesystem import working_dir @@ -306,4 +306,4 @@ class PythonPackage(PackageBase): return [] # Check that self.prefix is there after installation - PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix) + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index a4f7359ec8..cde3dc9fdd 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -26,7 +26,7 @@ import inspect from spack.directives import extends -from spack.package import PackageBase +from spack.package import PackageBase, run_after class RPackage(PackageBase): @@ -55,4 +55,4 @@ class RPackage(PackageBase): self.stage.source_path) # Check that self.prefix is there after installation - PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix) + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 24ff82fa38..0841ddcd61 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -78,13 +78,14 @@ class InstallPhase(object): search for execution. The method is retrieved at __get__ time, so that it can be overridden by subclasses of whatever class declared the phases. - It also provides hooks to execute prerequisite and sanity checks. + It also provides hooks to execute arbitrary callbacks before and after + the phase. """ def __init__(self, name): self.name = name - self.preconditions = [] - self.sanity_checks = [] + self.run_before = [] + self.run_after = [] def __get__(self, instance, owner): # The caller is a class that is trying to customize @@ -101,14 +102,13 @@ class InstallPhase(object): self._on_phase_start(instance) # Execute phase pre-conditions, # and give them the chance to fail - for check in self.preconditions: - # Do something sensible at some point - check(instance) + for callback in self.run_before: + callback(instance) phase(spec, prefix) # Execute phase sanity_checks, # and give them the chance to fail - for check in self.sanity_checks: - check(instance) + for callback in self.run_after: + callback(instance) # Check instance attributes at the end of a phase self._on_phase_exit(instance) return phase_wrapper @@ -129,8 +129,8 @@ class InstallPhase(object): # This bug-fix was not back-ported in Python 2.6 # http://bugs.python.org/issue1515 other = InstallPhase(self.name) - other.preconditions.extend(self.preconditions) - other.sanity_checks.extend(self.sanity_checks) + other.run_before.extend(self.run_before) + other.run_after.extend(self.run_after) return other @@ -142,22 +142,23 @@ class PackageMeta(spack.directives.DirectiveMetaMixin): """ phase_fmt = '_InstallPhase_{0}' - _InstallPhase_sanity_checks = {} - _InstallPhase_preconditions = {} + _InstallPhase_run_before = {} + _InstallPhase_run_after = {} + + def __new__(mcs, name, bases, attr_dict): - def __new__(meta, name, bases, attr_dict): - # Check if phases is in attr dict, then set - # install phases wrappers if 'phases' in attr_dict: + # Turn the strings in 'phases' into InstallPhase instances + # and add them as private attributes _InstallPhase_phases = [PackageMeta.phase_fmt.format(x) for x in attr_dict['phases']] # NOQA: ignore=E501 for phase_name, callback_name in zip(_InstallPhase_phases, attr_dict['phases']): # NOQA: ignore=E501 attr_dict[phase_name] = InstallPhase(callback_name) attr_dict['_InstallPhase_phases'] = _InstallPhase_phases - def _append_checks(check_name): + def _flush_callbacks(check_name): # Name of the attribute I am going to check it exists attr_name = PackageMeta.phase_fmt.format(check_name) - checks = getattr(meta, attr_name) + checks = getattr(mcs, attr_name) if checks: for phase_name, funcs in checks.items(): try: @@ -180,57 +181,61 @@ class PackageMeta(spack.directives.DirectiveMetaMixin): PackageMeta.phase_fmt.format(phase_name)] getattr(phase, check_name).extend(funcs) # Clear the attribute for the next class - setattr(meta, attr_name, {}) - - @classmethod - def _register_checks(cls, check_type, *args): - def _register_sanity_checks(func): - attr_name = PackageMeta.phase_fmt.format(check_type) - check_list = getattr(meta, attr_name) - for item in args: - checks = check_list.setdefault(item, []) - checks.append(func) - setattr(meta, attr_name, check_list) - return func - return _register_sanity_checks - - @staticmethod - def on_package_attributes(**attrs): - def _execute_under_condition(func): - @functools.wraps(func) - def _wrapper(instance): - # If all the attributes have the value we require, then - # execute - if all([getattr(instance, key, None) == value for key, value in attrs.items()]): # NOQA: ignore=E501 - func(instance) - return _wrapper - return _execute_under_condition - - @classmethod - def precondition(cls, *args): - return cls._register_checks('preconditions', *args) - - @classmethod - def sanity_check(cls, *args): - return cls._register_checks('sanity_checks', *args) - - if all([not hasattr(x, '_register_checks') for x in bases]): - attr_dict['_register_checks'] = _register_checks - - if all([not hasattr(x, 'sanity_check') for x in bases]): - attr_dict['sanity_check'] = sanity_check - - if all([not hasattr(x, 'precondition') for x in bases]): - attr_dict['precondition'] = precondition - - if all([not hasattr(x, 'on_package_attributes') for x in bases]): - attr_dict['on_package_attributes'] = on_package_attributes + setattr(mcs, attr_name, {}) # Preconditions - _append_checks('preconditions') + _flush_callbacks('run_before') # Sanity checks - _append_checks('sanity_checks') - return super(PackageMeta, meta).__new__(meta, name, bases, attr_dict) + _flush_callbacks('run_after') + return super(PackageMeta, mcs).__new__(mcs, name, bases, attr_dict) + + @staticmethod + def register_callback(check_type, *phases): + def _decorator(func): + attr_name = PackageMeta.phase_fmt.format(check_type) + check_list = getattr(PackageMeta, attr_name) + for item in phases: + checks = check_list.setdefault(item, []) + checks.append(func) + setattr(PackageMeta, attr_name, check_list) + return func + return _decorator + + +def run_before(*phases): + """Registers a method of a package to be run before a given phase""" + return PackageMeta.register_callback('run_before', *phases) + + +def run_after(*phases): + """Registers a method of a package to be run after a given phase""" + return PackageMeta.register_callback('run_after', *phases) + + +def on_package_attributes(**attr_dict): + """Executes the decorated method only if at the moment of calling + the instance has attributes that are equal to certain values. + + :param dict attr_dict: dictionary mapping attribute names to their + required values + """ + def _execute_under_condition(func): + + @functools.wraps(func) + def _wrapper(instance, *args, **kwargs): + # If all the attributes have the value we require, then execute + has_all_attributes = all( + [hasattr(instance, key) for key in attr_dict] + ) + if has_all_attributes: + has_the_right_values = all( + [getattr(instance, key) == value for key, value in attr_dict.items()] # NOQA: ignore=E501 + ) + if has_the_right_values: + func(instance, *args, **kwargs) + return _wrapper + + return _execute_under_condition class PackageBase(object): @@ -1704,6 +1709,27 @@ class PackageBase(object): """ return " ".join("-Wl,-rpath,%s" % p for p in self.rpath) + build_time_test_callbacks = None + + @on_package_attributes(run_tests=True) + def _run_default_build_time_test_callbacks(self): + """Tries to call all the methods that are listed in the attribute + ``build_time_test_callbacks`` if ``self.run_tests is True``. + + If ``build_time_test_callbacks is None`` returns immediately. + """ + if self.build_time_test_callbacks is None: + return + + for name in self.build_time_test_callbacks: + try: + fn = getattr(self, name) + tty.msg('RUN-TESTS: build-time tests [{0}]'.format(name)) + fn() + except AttributeError: + msg = 'RUN-TESTS: method not implemented [{0}]' + tty.warn(msg.format(name)) + class Package(PackageBase): """General purpose class with a single ``install`` @@ -1716,7 +1742,7 @@ class Package(PackageBase): build_system_class = 'Package' # This will be used as a registration decorator in user # packages, if need be - PackageBase.sanity_check('install')(PackageBase.sanity_check_prefix) + run_after('install')(PackageBase.sanity_check_prefix) def install_dependency_symlinks(pkg, spec, prefix): diff --git a/var/spack/repos/builtin.mock/packages/cmake-client/package.py b/var/spack/repos/builtin.mock/packages/cmake-client/package.py index 51704e3f4b..e82d2cd781 100644 --- a/var/spack/repos/builtin.mock/packages/cmake-client/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake-client/package.py @@ -22,9 +22,10 @@ # 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 +from spack import * + def check(condition, msg): """Raise an install error if condition is False.""" @@ -39,6 +40,28 @@ class CmakeClient(CMakePackage): version('1.0', '4cb3ff35b2472aae70f542116d616e63') + callback_counter = 0 + + flipped = False + run_this = True + check_this_is_None = None + did_something = False + + @run_after('cmake') + @run_before('cmake', 'build', 'install') + def increment(self): + self.callback_counter += 1 + + @run_after('cmake') + @on_package_attributes(run_this=True, check_this_is_None=None) + def flip(self): + self.flipped = True + + @run_after('cmake') + @on_package_attributes(does_not_exist=None) + def do_not_execute(self): + self.did_something = True + def setup_environment(self, spack_env, run_env): spack_cc # Ensure spack module-scope variable is avaiabl check(from_cmake == "from_cmake", @@ -67,11 +90,15 @@ class CmakeClient(CMakePackage): "setup_dependent_package.") def cmake(self, spec, prefix): - pass + assert self.callback_counter == 1 - build = cmake + def build(self, spec, prefix): + assert self.did_something is False + assert self.flipped is True + assert self.callback_counter == 3 def install(self, spec, prefix): + assert self.callback_counter == 4 # check that cmake is in the global scope. global cmake check(cmake is not None, "No cmake was in environment!") diff --git a/var/spack/repos/builtin/packages/cmor/package.py b/var/spack/repos/builtin/packages/cmor/package.py index b5debf9537..bb4f3b4df2 100644 --- a/var/spack/repos/builtin/packages/cmor/package.py +++ b/var/spack/repos/builtin/packages/cmor/package.py @@ -49,7 +49,7 @@ class Cmor(AutotoolsPackage): depends_on('python@:2.7', when='+python') depends_on('py-numpy', type=('build', 'run'), when='+python') - @AutotoolsPackage.precondition('configure') + @run_before('configure') def validate(self): if '+fortran' in self.spec and not self.compiler.fc: msg = 'cannot build a fortran variant without a fortran compiler' diff --git a/var/spack/repos/builtin/packages/h5hut/package.py b/var/spack/repos/builtin/packages/h5hut/package.py index 22146372dc..b12549df0d 100644 --- a/var/spack/repos/builtin/packages/h5hut/package.py +++ b/var/spack/repos/builtin/packages/h5hut/package.py @@ -47,7 +47,7 @@ class H5hut(AutotoolsPackage): # install: .libs/libH5hut.a: No such file or directory parallel = False - @AutotoolsPackage.precondition('configure') + @run_before('configure') def validate(self): """Checks if Fortran compiler is available.""" diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 222af53601..5e82818697 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -70,7 +70,7 @@ class Hdf5(AutotoolsPackage): depends_on('szip', when='+szip') depends_on('zlib@1.1.2:') - @AutotoolsPackage.precondition('configure') + @run_before('configure') def validate(self): """ Checks if incompatible variants have been activated at the same time @@ -170,7 +170,7 @@ class Hdf5(AutotoolsPackage): arg for arg in m.group(1).split(' ') if arg != '-l'), 'libtool') - @AutotoolsPackage.sanity_check('install') + @run_after('install') def check_install(self): # Build and run a small program to test the installed HDF5 library spec = self.spec diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index dd864acbe3..4c34f3e3a0 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -86,7 +86,7 @@ class Mpich(AutotoolsPackage): join_path(self.prefix.lib, 'libmpi.{0}'.format(dso_suffix)) ] - @AutotoolsPackage.precondition('autoreconf') + @run_before('autoreconf') def die_without_fortran(self): # Until we can pass variants such as +fortran through virtual # dependencies depends_on('mpi'), require Fortran compiler to @@ -106,7 +106,7 @@ class Mpich(AutotoolsPackage): '--{0}-ibverbs'.format('with' if '+verbs' in spec else 'without') ] - @AutotoolsPackage.sanity_check('install') + @run_after('install') def filter_compilers(self): """Run after install to make the MPI compilers use the compilers that Spack built the package with. diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index d5a70f077b..327031b87e 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -68,7 +68,7 @@ class Openblas(MakefilePackage): def lapack_libs(self): return self.blas_libs - @MakefilePackage.precondition('edit') + @run_before('edit') def check_compilers(self): # As of 06/2016 there is no mechanism to specify that packages which # depends on Blas/Lapack need C or/and Fortran symbols. For now @@ -126,7 +126,7 @@ class Openblas(MakefilePackage): return self.make_defs + targets - @MakefilePackage.sanity_check('build') + @run_after('build') def check_build(self): make('tests', *self.make_defs) @@ -138,7 +138,7 @@ class Openblas(MakefilePackage): ] return make_args + self.make_defs - @MakefilePackage.sanity_check('install') + @run_after('install') def check_install(self): spec = self.spec # Openblas may pass its own test but still fail to compile Lapack diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 2c6b6d68ac..bf844b7459 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -145,7 +145,7 @@ class Openmpi(AutotoolsPackage): elif self.spec.satisfies('@1.7:'): return 'verbs' - @AutotoolsPackage.precondition('autoreconf') + @run_before('autoreconf') def die_without_fortran(self): # Until we can pass variants such as +fortran through virtual # dependencies depends_on('mpi'), require Fortran compiler to @@ -239,7 +239,7 @@ class Openmpi(AutotoolsPackage): return config_args - @AutotoolsPackage.sanity_check('install') + @run_after('install') def filter_compilers(self): """Run after install to make the MPI compilers use the compilers that Spack built the package with. diff --git a/var/spack/repos/builtin/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py index 4a35134e40..d2934eb3c7 100644 --- a/var/spack/repos/builtin/packages/py-basemap/package.py +++ b/var/spack/repos/builtin/packages/py-basemap/package.py @@ -44,7 +44,7 @@ class PyBasemap(PythonPackage): def setup_environment(self, spack_env, run_env): spack_env.set('GEOS_DIR', self.spec['geos'].prefix) - @PythonPackage.sanity_check('install') + @run_after('install') def post_install_patch(self): spec = self.spec # We are not sure if this fix is needed before Python 3.5.2. diff --git a/var/spack/repos/builtin/packages/py-matplotlib/package.py b/var/spack/repos/builtin/packages/py-matplotlib/package.py index d808b0fc4b..fc40dce9c1 100644 --- a/var/spack/repos/builtin/packages/py-matplotlib/package.py +++ b/var/spack/repos/builtin/packages/py-matplotlib/package.py @@ -95,7 +95,7 @@ class PyMatplotlib(PythonPackage): # depends_on('ttconv') depends_on('py-six@1.9.0:', type=('build', 'run')) - @PythonPackage.sanity_check('install') + @run_after('install') def set_backend(self): spec = self.spec prefix = self.prefix diff --git a/var/spack/repos/builtin/packages/py-yt/package.py b/var/spack/repos/builtin/packages/py-yt/package.py index 6ab967d8a5..4a61bfcec9 100644 --- a/var/spack/repos/builtin/packages/py-yt/package.py +++ b/var/spack/repos/builtin/packages/py-yt/package.py @@ -65,7 +65,7 @@ class PyYt(PythonPackage): depends_on("py-sympy", type=('build', 'run')) depends_on("python @2.7:2.999,3.4:") - @PythonPackage.sanity_check('install') + @run_after('install') def check_install(self): # The Python interpreter path can be too long for this # yt = Executable(join_path(prefix.bin, "yt")) diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py index 30a6887a69..2babb250a5 100644 --- a/var/spack/repos/builtin/packages/r/package.py +++ b/var/spack/repos/builtin/packages/r/package.py @@ -113,7 +113,7 @@ class R(AutotoolsPackage): return config_args - @AutotoolsPackage.sanity_check('install') + @run_after('install') def copy_makeconf(self): # Make a copy of Makeconf because it will be needed to properly build R # dependencies in Spack. @@ -121,7 +121,7 @@ class R(AutotoolsPackage): dst_makeconf = join_path(self.etcdir, 'Makeconf.spack') shutil.copy(src_makeconf, dst_makeconf) - @AutotoolsPackage.sanity_check('install') + @run_after('install') def filter_compilers(self): """Run after install to tell the configuration files and Makefiles to use the compilers that Spack built the package with. diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index d9b535305d..2ec8bb5236 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -55,7 +55,7 @@ class Tcl(AutotoolsPackage): def build_directory(self): return 'unix' - @AutotoolsPackage.sanity_check('install') + @run_after('install') def symlink_tclsh(self): with working_dir(self.prefix.bin): symlink('tclsh{0}'.format(self.version.up_to(2)), 'tclsh') diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index 5f8c2debb0..9add3b238c 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -379,7 +379,7 @@ class Trilinos(CMakePackage): ]) return options - @CMakePackage.sanity_check('install') + @run_after('install') def filter_python(self): # When trilinos is built with Python, libpytrilinos is included # through cmake configure files. Namely, Trilinos_LIBRARIES in -- cgit v1.2.3-70-g09d2 From 5e2a96574b4a08d9558bfce82c05a07cd7571dbd Mon Sep 17 00:00:00 2001 From: serbanmaerean Date: Wed, 25 Jan 2017 18:26:17 -0500 Subject: Add support for IBM threaded compilers: xl*_r (#2894) * Add support for IBM threaded compilers, xl*_r Added new compiler class, xl_r; added default flags to the compilers.yaml file. * Add cppflags to the set of default flags to be added to the compilers stanza in compiler.yaml. These flags are optional. Only defined flags will be listed in the compilers.yaml file. * Fix scripting warnings revealed by flake8. Updated __init__.py and xl_r.py to conform with flake8 rules. * Add justification to the definition of the XL default compiler flags. --- lib/spack/env/cc | 8 +-- lib/spack/env/xl_r/xlc++_r | 1 + lib/spack/env/xl_r/xlc_r | 1 + lib/spack/env/xl_r/xlf90_r | 1 + lib/spack/env/xl_r/xlf_r | 1 + lib/spack/spack/compilers/__init__.py | 4 ++ lib/spack/spack/compilers/xl.py | 23 ++++-- lib/spack/spack/compilers/xl_r.py | 128 ++++++++++++++++++++++++++++++++++ 8 files changed, 158 insertions(+), 9 deletions(-) create mode 120000 lib/spack/env/xl_r/xlc++_r create mode 120000 lib/spack/env/xl_r/xlc_r create mode 120000 lib/spack/env/xl_r/xlf90_r create mode 120000 lib/spack/env/xl_r/xlf_r create mode 100644 lib/spack/spack/compilers/xl_r.py (limited to 'lib') diff --git a/lib/spack/env/cc b/lib/spack/env/cc index c4e51834a5..c0e97f3416 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -98,25 +98,25 @@ case "$command" in cpp) mode=cpp ;; - cc|c89|c99|gcc|clang|icc|pgcc|xlc) + cc|c89|c99|gcc|clang|icc|pgcc|xlc|xlc_r) command="$SPACK_CC" language="C" comp="CC" lang_flags=C ;; - c++|CC|g++|clang++|icpc|pgc++|xlc++) + c++|CC|g++|clang++|icpc|pgc++|xlc++|xlc++_r) command="$SPACK_CXX" language="C++" comp="CXX" lang_flags=CXX ;; - ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|nagfor) + ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|xlf90_r|nagfor) command="$SPACK_FC" language="Fortran 90" comp="FC" lang_flags=F ;; - f77|gfortran|ifort|pgfortran|xlf|nagfor|ftn) + f77|gfortran|ifort|pgfortran|xlf|xlf_r|nagfor|ftn) command="$SPACK_F77" language="Fortran 77" comp="F77" diff --git a/lib/spack/env/xl_r/xlc++_r b/lib/spack/env/xl_r/xlc++_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlc++_r @@ -0,0 +1 @@ +../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlc_r b/lib/spack/env/xl_r/xlc_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlc_r @@ -0,0 +1 @@ +../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlf90_r b/lib/spack/env/xl_r/xlf90_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlf90_r @@ -0,0 +1 @@ +../cc \ No newline at end of file diff --git a/lib/spack/env/xl_r/xlf_r b/lib/spack/env/xl_r/xlf_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlf_r @@ -0,0 +1 @@ +../cc \ No newline at end of file diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 6e65f50269..731acaf9c2 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -40,6 +40,7 @@ from spack.util.naming import mod_to_class _imported_compilers_module = 'spack.compilers' _path_instance_vars = ['cc', 'cxx', 'f77', 'fc'] +_flags_instance_vars = ['cflags', 'cppflags', 'cxxflags', 'fflags'] _other_instance_vars = ['modules', 'operating_system', 'environment', 'extra_rpaths'] _cache_config_file = [] @@ -60,6 +61,9 @@ def _to_dict(compiler): d['paths'] = dict((attr, getattr(compiler, attr, None)) for attr in _path_instance_vars) d['flags'] = dict((fname, fvals) for fname, fvals in compiler.flags) + d['flags'].update(dict((attr, getattr(compiler, attr, None)) + for attr in _flags_instance_vars + if hasattr(compiler, attr))) d['operating_system'] = str(compiler.operating_system) d['target'] = str(compiler.target) d['modules'] = compiler.modules if compiler.modules else [] diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py index f4b7c4237d..77a5ed7acd 100644 --- a/lib/spack/spack/compilers/xl.py +++ b/lib/spack/spack/compilers/xl.py @@ -29,17 +29,16 @@ from spack.version import ver class Xl(Compiler): # Subclasses use possible names of C compiler - cc_names = ['xlc', 'xlc_r'] + cc_names = ['xlc'] # Subclasses use possible names of C++ compiler - cxx_names = ['xlC', 'xlC_r', 'xlc++', 'xlc++_r'] + cxx_names = ['xlC', 'xlc++'] # Subclasses use possible names of Fortran 77 compiler - f77_names = ['xlf', 'xlf_r'] + f77_names = ['xlf'] # Subclasses use possible names of Fortran 90 compiler - fc_names = ['xlf90', 'xlf90_r', 'xlf95', 'xlf95_r', - 'xlf2003', 'xlf2003_r', 'xlf2008', 'xlf2008_r'] + fc_names = ['xlf90', 'xlf95', 'xlf2003', 'xlf2008'] # Named wrapper links within spack.build_env_path link_paths = {'cc': 'xl/xlc', @@ -62,6 +61,20 @@ class Xl(Compiler): def pic_flag(self): return "-qpic" + @property + def fflags(self): + # The -qzerosize flag is effective only for the Fortran 77 + # compilers and allows the use of zero size objects. + # For Fortran 90 and beyond, it is set by default and has not impact. + # Its use has no negative side effects. + # The -qstrict flag allows the Fortran 90+ compilers to parse the + # source files using fixed form rule. As a result, if -qfixed is in + # effect, free form files (that are not also fixed form files) will + # fail to compile regardless of the compiler invocation command. + # Use the -qfree flag in the packages' configuration file to undo the + # -qfixed flag, as the last one wins. + return "-qzerosize -qfixed" + @classmethod def default_version(cls, comp): """The '-qversion' is the standard option fo XL compilers. diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py new file mode 100644 index 0000000000..ca76f219ce --- /dev/null +++ b/lib/spack/spack/compilers/xl_r.py @@ -0,0 +1,128 @@ +############################################################################## +# Copyright (c) 2016, International Business Machines Corporation +# +# This file is part of Spack. +# Created by Serban Maerean, serban@us.ibm.com based on a similar file, +# spack/lib/spack/spack/compilers/xl.py, produced 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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.compiler import * +import llnl.util.tty as tty +from spack.version import ver + + +class XlR(Compiler): + # Subclasses use possible names of C compiler + cc_names = ['xlc_r'] + + # Subclasses use possible names of C++ compiler + cxx_names = ['xlC_r', 'xlc++_r'] + + # Subclasses use possible names of Fortran 77 compiler + f77_names = ['xlf_r'] + + # Subclasses use possible names of Fortran 90 compiler + fc_names = ['xlf90_r', 'xlf95_r', 'xlf2003_r', 'xlf2008_r'] + + # Named wrapper links within spack.build_env_path + link_paths = {'cc': 'xl_r/xlc_r', + 'cxx': 'xl_r/xlc++_r', + 'f77': 'xl_r/xlf_r', + 'fc': 'xl_r/xlf90_r'} + + @property + def openmp_flag(self): + return "-qsmp=omp" + + @property + def cxx11_flag(self): + if self.version < ver('13.1'): + tty.die("Only xlC 13.1 and above have some c++11 support.") + else: + return "-qlanglvl=extended0x" + + @property + def pic_flag(self): + return("-qpic") + + @property + def fflags(self): + # The -qzerosize flag is effective only for the Fortran 77 + # compilers and allows the use of zero size objects. + # For Fortran 90 and beyond, it is set by default and has not impact. + # Its use has no negative side effects. + # The -qstrict flag allows the Fortran 90+ compilers to parse the + # source files using fixed form rule. As a result, if -qfixed is in + # effect, free form files (that are not also fixed form files) will + # fail to compile regardless of the compiler invocation command. + # Use the -qfree flag in the packages' configuration file to undo the + # -qfixed flag, as the last one wins. + return "-qzerosize -qfixed" + + @classmethod + def default_version(self, comp): + """The '-qversion' is the standard option fo XL compilers. + Output looks like this:: + + IBM XL C/C++ for Linux, V11.1 (5724-X14) + Version: 11.01.0000.0000 + + or:: + + IBM XL Fortran for Linux, V13.1 (5724-X16) + Version: 13.01.0000.0000 + + or:: + + IBM XL C/C++ for AIX, V11.1 (5724-X13) + Version: 11.01.0000.0009 + + or:: + + IBM XL C/C++ Advanced Edition for Blue Gene/P, V9.0 + Version: 09.00.0000.0017 + """ + + return get_compiler_version( + comp, '-qversion', r'([0-9]?[0-9]\.[0-9])') + + @classmethod + def fc_version(cls, fc): + """The fortran and C/C++ versions of the XL compiler are always + two units apart. By this we mean that the fortran release that + goes with XL C/C++ 11.1 is 13.1. Having such a difference in + version number is confusing spack quite a lot. Most notably + if you keep the versions as is the default xl compiler will + only have fortran and no C/C++. So we associate the Fortran + compiler with the version associated to the C/C++ compiler. + One last stumble. Version numbers over 10 have at least a .1 + those under 10 a .0. There is no xlf 9.x or under currently + available. BG/P and BG/L can such a compiler mix and possibly + older version of AIX and linux on power. + """ + fver = get_compiler_version(fc, '-qversion', r'([0-9]?[0-9]\.[0-9])') + cver = float(fver) - 2 + if cver < 10: + cver = cver - 0.1 + return str(cver) + + @classmethod + def f77_version(cls, f77): + return cls.fc_version(f77) -- cgit v1.2.3-70-g09d2 From 8ae380fb71eefc288a532b4574cf53cec32f74e4 Mon Sep 17 00:00:00 2001 From: becker33 Date: Wed, 25 Jan 2017 20:38:10 -0800 Subject: Fixes for parsing specs with hashes (#2889) - Allows hashes to be specified after other parts of the spec - Does not allow other parts of the spec to be specified after the hash - The hash must either end input or be followed by another separate spec - The next spec cannot be an anonymous spec (it must start with a package name or a hash) See #2769 (after it was merged) for further discussion of this interface addition. That discussion resulted in these requirements: ``` python # 1 spec /abc123 # 1 spec python /abc123 # 1 spec /456789 # 1 spec python /abc123 /456789 # 2 specs python /456789 /abc123 # 2 specs /abc123 /456789 # 2 specs /456789 /abc123 # 2 specs /456789 /abc123 python # 3 specs ``` assuming `abc123` and `456789` are both hashes of different python specs. --- lib/spack/spack/spec.py | 122 ++++++++++++++++++++++-------------- lib/spack/spack/test/spec_syntax.py | 116 ++++++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+), 46 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 6cf80754a1..8f315fdabf 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -152,7 +152,9 @@ __all__ = [ 'UnsatisfiableArchitectureSpecError', 'UnsatisfiableProviderSpecError', 'UnsatisfiableDependencySpecError', - 'AmbiguousHashError'] + 'AmbiguousHashError', + 'InvalidHashError', + 'RedundantSpecError'] # Valid pattern for an identifier in Spack identifier_re = r'\w[\w-]*' @@ -1993,7 +1995,7 @@ class Spec(object): except SpecError: return parse_anonymous_spec(spec_like, self.name) - def satisfies(self, other, deps=True, strict=False): + def satisfies(self, other, deps=True, strict=False, strict_deps=False): """Determine if this spec satisfies all constraints of another. There are two senses for satisfies: @@ -2067,7 +2069,8 @@ class Spec(object): # If we need to descend into dependencies, do it, otherwise we're done. if deps: deps_strict = strict - if not (self.name and other.name): + if self.concrete and not other.name: + # We're dealing with existing specs deps_strict = True return self.satisfies_dependencies(other, strict=deps_strict) else: @@ -2083,9 +2086,10 @@ class Spec(object): if other._dependencies and not self._dependencies: return False - alldeps = set(d.name for d in self.traverse(root=False)) - if not all(dep.name in alldeps - for dep in other.traverse(root=False)): + selfdeps = self.traverse(root=False) + otherdeps = other.traverse(root=False) + if not all(any(d.satisfies(dep) for d in selfdeps) + for dep in otherdeps): return False elif not self._dependencies or not other._dependencies: @@ -2697,30 +2701,28 @@ class SpecParser(spack.parse.Parser): specs = [] try: - while self.next or self.previous: + while self.next: # TODO: clean this parsing up a bit - if self.previous: - # We picked up the name of this spec while finishing the - # previous spec - specs.append(self.spec(self.previous.value)) - self.previous = None - elif self.accept(ID): + if self.accept(ID): self.previous = self.token if self.accept(EQ): - # We're either parsing an anonymous spec beginning - # with a key-value pair or adding a key-value pair - # to the last spec + # We're parsing an anonymous spec beginning with a + # key-value pair. if not specs: specs.append(self.spec(None)) self.expect(VAL) + # Raise an error if the previous spec is already + # concrete (assigned by hash) + if specs[-1]._hash: + raise RedundantSpecError(specs[-1], + 'key-value pair') specs[-1]._add_flag( self.previous.value, self.token.value) self.previous = None else: # We're parsing a new spec by name - value = self.previous.value self.previous = None - specs.append(self.spec(value)) + specs.append(self.spec(self.token.value)) elif self.accept(HASH): # We're finding a spec by hash specs.append(self.spec_by_hash()) @@ -2728,27 +2730,38 @@ class SpecParser(spack.parse.Parser): elif self.accept(DEP): if not specs: # We're parsing an anonymous spec beginning with a - # dependency - self.previous = self.token + # dependency. Push the token to recover after creating + # anonymous spec + self.push_tokens([self.token]) specs.append(self.spec(None)) - self.previous = None - if self.accept(HASH): - # We're finding a dependency by hash for an anonymous - # spec - dep = self.spec_by_hash() else: - # We're adding a dependency to the last spec - self.expect(ID) - dep = self.spec(self.token.value) - - # command line deps get empty deptypes now. - # Real deptypes are assigned later per packages. - specs[-1]._add_dependency(dep, ()) + if self.accept(HASH): + # We're finding a dependency by hash for an + # anonymous spec + dep = self.spec_by_hash() + else: + # We're adding a dependency to the last spec + self.expect(ID) + dep = self.spec(self.token.value) + + # Raise an error if the previous spec is already + # concrete (assigned by hash) + if specs[-1]._hash: + raise RedundantSpecError(specs[-1], 'dependency') + # command line deps get empty deptypes now. + # Real deptypes are assigned later per packages. + specs[-1]._add_dependency(dep, ()) else: # If the next token can be part of a valid anonymous spec, # create the anonymous spec if self.next.type in (AT, ON, OFF, PCT): + # Raise an error if the previous spec is already + # concrete (assigned by hash) + if specs and specs[-1]._hash: + raise RedundantSpecError(specs[-1], + 'compiler, version, ' + 'or variant') specs.append(self.spec(None)) else: self.unexpected_token() @@ -2783,13 +2796,13 @@ class SpecParser(spack.parse.Parser): if len(matches) != 1: raise AmbiguousHashError( - "Multiple packages specify hash %s." % self.token.value, - *matches) + "Multiple packages specify hash beginning %s." + % self.token.value, *matches) return matches[0] def spec(self, name): - """Parse a spec out of the input. If a spec is supplied, then initialize + """Parse a spec out of the input. If a spec is supplied, initialize and return it instead of creating a new one.""" if name: spec_namespace, dot, spec_name = name.rpartition('.') @@ -2823,16 +2836,6 @@ class SpecParser(spack.parse.Parser): # unspecified or not. added_version = False - if self.previous and self.previous.value == DEP: - if self.accept(HASH): - spec.add_dependency(self.spec_by_hash()) - else: - self.expect(ID) - if self.accept(EQ): - raise SpecParseError(spack.parse.ParseError( - "", "", "Expected dependency received anonymous spec")) - spec.add_dependency(self.spec(self.token.value)) - while self.next: if self.accept(AT): vlist = self.version_list() @@ -2858,13 +2861,25 @@ class SpecParser(spack.parse.Parser): self.previous = None else: # We've found the start of a new spec. Go back to do_parse + # and read this token again. + self.push_tokens([self.token]) + self.previous = None break + elif self.accept(HASH): + # Get spec by hash and confirm it matches what we already have + hash_spec = self.spec_by_hash() + if hash_spec.satisfies(spec): + spec = hash_spec + break + else: + raise InvalidHashError(spec, hash_spec.dag_hash()) + else: break # If there was no version in the spec, consier it an open range - if not added_version: + if not added_version and not spec._hash: spec.versions = VersionList(':') return spec @@ -3139,3 +3154,18 @@ class AmbiguousHashError(SpecError): super(AmbiguousHashError, self).__init__(msg) for spec in specs: print(' ', spec.format('$.$@$%@+$+$=$#')) + + +class InvalidHashError(SpecError): + def __init__(self, spec, hash): + super(InvalidHashError, self).__init__( + "The spec specified by %s does not match provided spec %s" + % (hash, spec)) + + +class RedundantSpecError(SpecError): + def __init__(self, spec, addition): + super(RedundantSpecError, self).__init__( + "Attempting to add %s to spec %s which is already concrete." + " This is likely the result of adding to a spec specified by hash." + % (addition, spec)) diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index 043d9b176f..fcb6cfa907 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -132,6 +132,13 @@ class TestSpecSyntax(object): self.check_parse("mvapich_foo") self.check_parse("_mvapich_foo") + def test_anonymous_specs(self): + self.check_parse("%intel") + self.check_parse("@2.7") + self.check_parse("^zlib") + self.check_parse("+foo") + self.check_parse("arch=test-None-None", "platform=test") + def test_simple_dependence(self): self.check_parse("openmpi^hwloc") self.check_parse("openmpi^hwloc^libunwind") @@ -218,6 +225,115 @@ class TestSpecSyntax(object): errors = ['x@@1.2', 'x ^y@@1.2', 'x@1.2::', 'x::'] self._check_raises(SpecParseError, errors) + def test_spec_by_hash(self, database): + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + # Make sure the database is still the shape we expect + assert len(specs) > 3 + + self.check_parse(str(specs[0]), '/' + hashes[0]) + self.check_parse(str(specs[1]), '/ ' + hashes[1][:5]) + self.check_parse(str(specs[2]), specs[2].name + '/' + hashes[2]) + self.check_parse(str(specs[3]), + specs[3].name + '@' + str(specs[3].version) + + ' /' + hashes[3][:6]) + + def test_dep_spec_by_hash(self, database): + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + # Make sure the database is still the shape we expect + assert len(specs) > 10 + assert specs[4].name in specs[10] + assert specs[-1].name in specs[10] + + spec1 = sp.Spec(specs[10].name + '^/' + hashes[4]) + assert specs[4].name in spec1 and spec1[specs[4].name] == specs[4] + spec2 = sp.Spec(specs[10].name + '%' + str(specs[10].compiler) + + ' ^ / ' + hashes[-1]) + assert (specs[-1].name in spec2 and + spec2[specs[-1].name] == specs[-1] and + spec2.compiler == specs[10].compiler) + spec3 = sp.Spec(specs[10].name + '^/' + hashes[4][:4] + + '^ / ' + hashes[-1][:5]) + assert (specs[-1].name in spec3 and + spec3[specs[-1].name] == specs[-1] and + specs[4].name in spec3 and spec3[specs[4].name] == specs[4]) + + def test_multiple_specs_with_hash(self, database): + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + assert len(specs) > 3 + + output = sp.parse(specs[0].name + '/' + hashes[0] + '/' + hashes[1]) + assert len(output) == 2 + output = sp.parse('/' + hashes[0] + '/' + hashes[1]) + assert len(output) == 2 + output = sp.parse('/' + hashes[0] + '/' + hashes[1] + + ' ' + specs[2].name) + assert len(output) == 3 + output = sp.parse('/' + hashes[0] + + ' ' + specs[1].name + ' ' + specs[2].name) + assert len(output) == 3 + output = sp.parse('/' + hashes[0] + ' ' + + specs[1].name + ' / ' + hashes[1]) + assert len(output) == 2 + + def test_ambiguous_hash(self, database): + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + # Make sure the database is as expected + assert hashes[1][:1] == hashes[2][:1] == 'b' + + ambiguous_hashes = ['/b', + specs[1].name + '/b', + specs[0].name + '^/b', + specs[0].name + '^' + specs[1].name + '/b'] + self._check_raises(AmbiguousHashError, ambiguous_hashes) + + def test_invalid_hash(self, database): + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + # Make sure the database is as expected + assert (hashes[0] != hashes[3] and + hashes[1] != hashes[4] and len(specs) > 4) + + inputs = [specs[0].name + '/' + hashes[3], + specs[1].name + '^' + specs[4].name + '/' + hashes[0], + specs[1].name + '^' + specs[4].name + '/' + hashes[1]] + self._check_raises(InvalidHashError, inputs) + + def test_nonexistent_hash(self, database): + # This test uses database to make sure we don't accidentally access + # real installs, however unlikely + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + # Make sure the database is as expected + assert 'abc123' not in [h[:6] for h in hashes] + + nonexistant_hashes = ['/abc123', + specs[0].name + '/abc123'] + self._check_raises(SystemExit, nonexistant_hashes) + + def test_redundant_spec(self, database): + specs = database.mock.db.query() + hashes = [s._hash for s in specs] # Preserves order of elements + + # Make sure the database is as expected + assert len(specs) > 3 + + redundant_specs = ['/' + hashes[0] + '%' + str(specs[0].compiler), + specs[1].name + '/' + hashes[1] + + '@' + str(specs[1].version), + specs[2].name + '/' + hashes[2] + '^ libelf', + '/' + hashes[3] + ' cflags="-O3 -fPIC"'] + self._check_raises(RedundantSpecError, redundant_specs) + def test_duplicate_variant(self): duplicates = [ 'x@1.2+debug+debug', -- cgit v1.2.3-70-g09d2 From e4d2d747ce247f726551e9207f6bedb7c68f2162 Mon Sep 17 00:00:00 2001 From: scheibelp Date: Wed, 25 Jan 2017 20:43:12 -0800 Subject: Spec.satisfies accesses Spec.concrete as property (#2928) * Spec.satisfies accesses Spec.concrete as property Fixes #2760 When copying a spec, _concrete is always set to False for each dependency. "Spec.satisfies" was accessing the member "_concrete" directly instead of using the property "concrete". This means that if you copy a spec, the dependencies will be considered equal, but did not necessarily satisfy one another. Spec.satisfies is a prerequisite for a package to be considered an extension; as a consequence, an extension with run-time dependencies that were also extensions did not activate those extensions. This updates Spec.satisfies to avoid checking the cached member "_concrete" directly. * Added test to check for activation of dependency extension * Added test to check for transitive satisfiability between a spec and its copy --- lib/spack/spack/package.py | 11 +++--- lib/spack/spack/spec.py | 4 +-- lib/spack/spack/test/packages.py | 7 ++++ lib/spack/spack/test/spec_semantics.py | 8 +++++ .../builtin.mock/packages/extendee/package.py | 39 ++++++++++++++++++++ .../builtin.mock/packages/extension1/package.py | 39 ++++++++++++++++++++ .../builtin.mock/packages/extension2/package.py | 41 ++++++++++++++++++++++ 7 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/extendee/package.py create mode 100644 var/spack/repos/builtin.mock/packages/extension1/package.py create mode 100644 var/spack/repos/builtin.mock/packages/extension2/package.py (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 0841ddcd61..797ae1ff5d 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1560,10 +1560,9 @@ class PackageBase(object): # Activate any package dependencies that are also extensions. if not force: - for spec in self.spec.traverse(root=False, deptype='run'): - if spec.package.extends(self.extendee_spec): - if not spec.package.activated: - spec.package.do_activate(force=force) + for spec in self.dependency_activations(): + if not spec.package.activated: + spec.package.do_activate(force=force) self.extendee_spec.package.activate(self, **self.extendee_args) @@ -1571,6 +1570,10 @@ class PackageBase(object): tty.msg("Activated extension %s for %s" % (self.spec.short_spec, self.extendee_spec.format("$_$@$+$%@"))) + def dependency_activations(self): + return (spec for spec in self.spec.traverse(root=False, deptype='run') + if spec.package.extends(self.extendee_spec)) + def activate(self, extension, **kwargs): """Symlinks all files from the extension into extendee's install dir. diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 8f315fdabf..059653a72a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2011,8 +2011,8 @@ class Spec(object): other = self._autospec(other) # The only way to satisfy a concrete spec is to match its hash exactly. - if other._concrete: - return self._concrete and self.dag_hash() == other.dag_hash() + if other.concrete: + return self.concrete and self.dag_hash() == other.dag_hash() # A concrete provider can satisfy a virtual dependency. if not self.virtual and other.virtual: diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index 6ae8a33a24..bc1f438e44 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -108,6 +108,13 @@ def test_inheritance_of_diretives(): assert 'mpi' in s +def test_dependency_extensions(): + s = Spec('extension2') + s.concretize() + deps = set(x.name for x in s.package.dependency_activations()) + assert deps == set(['extension1']) + + def test_import_class_from_package(builtin_mock): from spack.pkg.builtin.mock.mpich import Mpich # noqa diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 84c8650f15..2f3b2b1b8d 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -287,6 +287,14 @@ class TestSpecSematics(object): # 'mpich' is concrete: check_unsatisfiable('mpich', 'mpich cppflags="-O3"', True) + def test_copy_satisfies_transitive(self): + spec = Spec('dttop') + spec.concretize() + copy = spec.copy() + for s in spec.traverse(): + assert s.satisfies(copy[s.name]) + assert copy[s.name].satisfies(s) + def test_unsatisfiable_compiler_flag_mismatch(self): # No matchi in specs check_unsatisfiable( diff --git a/var/spack/repos/builtin.mock/packages/extendee/package.py b/var/spack/repos/builtin.mock/packages/extendee/package.py new file mode 100644 index 0000000000..f86bcf7de5 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/extendee/package.py @@ -0,0 +1,39 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Extendee(Package): + """A package with extensions""" + + homepage = "http://www.example.com" + url = "http://www.example.com/extendee-1.0.tar.gz" + + extendable = True + + version('1.0', 'hash-extendee-1.0') + + def install(self, spec, prefix): + pass diff --git a/var/spack/repos/builtin.mock/packages/extension1/package.py b/var/spack/repos/builtin.mock/packages/extension1/package.py new file mode 100644 index 0000000000..d3babc6ce4 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/extension1/package.py @@ -0,0 +1,39 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Extension1(Package): + """A package which extends another package""" + + homepage = "http://www.example.com" + url = "http://www.example.com/extension1-1.0.tar.gz" + + extends('extendee') + + version('1.0', 'hash-extension1-1.0') + + def install(self, spec, prefix): + pass diff --git a/var/spack/repos/builtin.mock/packages/extension2/package.py b/var/spack/repos/builtin.mock/packages/extension2/package.py new file mode 100644 index 0000000000..fcb23ab8ed --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/extension2/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Extension2(Package): + """A package which extends another package. It also depends on another + package which extends the same package.""" + + homepage = "http://www.example.com" + url = "http://www.example.com/extension2-1.0.tar.gz" + + extends('extendee') + depends_on('extension1', type=('build', 'run')) + + version('1.0', 'hash-extension2-1.0') + + def install(self, spec, prefix): + pass -- cgit v1.2.3-70-g09d2 From a5700a8888dd26789a8f8d36cec565a4a18d72bc Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Thu, 26 Jan 2017 02:19:35 -0800 Subject: Use codecov for coverage instead of coveralls (#2933) * Switch from coveralls to codecov - Add .codecov.yml, simplify .travis.yml - Add codecov badge to README.md * Add tests for spack graph. --- .codecov.yml | 10 +++ .travis.yml | 46 +++++++------- README.md | 2 +- lib/spack/spack/graph.py | 13 ++-- lib/spack/spack/test/graph.py | 138 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 176 insertions(+), 33 deletions(-) create mode 100644 .codecov.yml create mode 100644 lib/spack/spack/test/graph.py (limited to 'lib') diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000000..a6ec081c85 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,10 @@ +coverage: + precision: 2 + round: nearest + range: 60...100 + +ignore: + - lib/spack/spack/test/.* + - lib/spack/env/.* + - lib/spack/docs/.* + - lib/spack/external/.* diff --git a/.travis.yml b/.travis.yml index 0a9a118b73..2e7b1c64fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,6 @@ #============================================================================= # Project settings #============================================================================= -language: python - # Only build master and develop on push; do not build every branch. branches: only: @@ -13,29 +11,27 @@ branches: #============================================================================= # Build matrix #============================================================================= -python: - - 2.6 - - 2.7 - -env: - - TEST_SUITE=unit - - TEST_SUITE=flake8 - - TEST_SUITE=doc - matrix: - # Flake8 and Sphinx no longer support Python 2.6, and one run is enough. - exclude: - - python: 2.6 - env: TEST_SUITE=flake8 - - python: 2.6 - env: TEST_SUITE=doc - # Explicitly include an OS X build with homebrew's python. - # Works around Python issues on Travis for OSX, described here: - # http://blog.fizyk.net.pl/blog/running-python-tests-on-traviss-osx-workers.html include: - - os: osx - language: generic - env: TEST_SUITE=unit + - python: '2.6' + os: linux + language: python + env: TEST_SUITE=unit + - python: '2.7' + os: linux + language: python + env: TEST_SUITE=unit + - python: '2.7' + os: linux + language: python + env: TEST_SUITE=flake8 + - python: '2.7' + os: linux + language: python + env: TEST_SUITE=doc + - os: osx + language: generic + env: [ TEST_SUITE=unit, PYTHON_VERSION=2.7 ] #============================================================================= # Environment @@ -61,7 +57,7 @@ before_install: # Install various dependencies install: - - pip install --upgrade coveralls + - pip install --upgrade codecov - pip install --upgrade flake8 - pip install --upgrade sphinx - pip install --upgrade mercurial @@ -80,7 +76,7 @@ before_script: script: share/spack/qa/run-$TEST_SUITE-tests after_success: - - if [[ $TEST_SUITE == unit && $TRAVIS_PYTHON_VERSION == 2.7 && $TRAVIS_OS_NAME == "linux" ]]; then coveralls; fi + - if [[ $TEST_SUITE == unit && $TRAVIS_PYTHON_VERSION == 2.7 && $TRAVIS_OS_NAME == "linux" ]]; then codecov --env PY_VERSION; fi #============================================================================= # Notifications diff --git a/README.md b/README.md index 9d005605eb..375aad4dd7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ============ [![Build Status](https://travis-ci.org/LLNL/spack.svg?branch=develop)](https://travis-ci.org/LLNL/spack) -[![Coverage Status](https://coveralls.io/repos/github/LLNL/spack/badge.svg?branch=develop)](https://coveralls.io/github/LLNL/spack?branch=develop) +[![codecov](https://codecov.io/gh/LLNL/spack/branch/develop/graph/badge.svg)](https://codecov.io/gh/LLNL/spack) Spack is a package management tool designed to support multiple versions and configurations of software on a wide variety of platforms diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py index 1f0390dae9..7cc2046b9d 100644 --- a/lib/spack/spack/graph.py +++ b/lib/spack/spack/graph.py @@ -138,7 +138,7 @@ class AsciiGraph(object): def __init__(self): # These can be set after initialization or after a call to # graph() to change behavior. - self.node_character = '*' + self.node_character = 'o' self.debug = False self.indent = 0 self.deptype = alldeps @@ -364,7 +364,7 @@ class AsciiGraph(object): self._set_state(EXPAND_RIGHT, index) self._out.write("\n") - def write(self, spec, **kwargs): + def write(self, spec, color=None, out=None): """Write out an ascii graph of the provided spec. Arguments: @@ -378,14 +378,13 @@ class AsciiGraph(object): based on output file. """ - out = kwargs.get('out', None) - if not out: + if out is None: out = sys.stdout - color = kwargs.get('color', None) - if not color: + if color is None: color = out.isatty() - self._out = ColorStream(sys.stdout, color=color) + + self._out = ColorStream(out, color=color) # We'll traverse the spec in topo order as we graph it. topo_order = topological_sort(spec, reverse=True, deptype=self.deptype) diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py new file mode 100644 index 0000000000..09dbcd0548 --- /dev/null +++ b/lib/spack/spack/test/graph.py @@ -0,0 +1,138 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 StringIO import StringIO + +from spack.spec import Spec +from spack.graph import AsciiGraph, topological_sort, graph_dot + + +def test_topo_sort(builtin_mock): + """Test topo sort gives correct order.""" + s = Spec('mpileaks').normalized() + + topo = topological_sort(s) + + assert topo.index('mpileaks') < topo.index('callpath') + assert topo.index('mpileaks') < topo.index('mpi') + assert topo.index('mpileaks') < topo.index('dyninst') + assert topo.index('mpileaks') < topo.index('libdwarf') + assert topo.index('mpileaks') < topo.index('libelf') + + assert topo.index('callpath') < topo.index('mpi') + assert topo.index('callpath') < topo.index('dyninst') + assert topo.index('callpath') < topo.index('libdwarf') + assert topo.index('callpath') < topo.index('libelf') + + assert topo.index('dyninst') < topo.index('libdwarf') + assert topo.index('dyninst') < topo.index('libelf') + + assert topo.index('libdwarf') < topo.index('libelf') + + +def test_static_graph_mpileaks(builtin_mock): + """Test a static spack graph for a simple package.""" + s = Spec('mpileaks').normalized() + + stream = StringIO() + graph_dot([s], static=True, out=stream) + + dot = stream.getvalue() + + assert ' "mpileaks" [label="mpileaks"]\n' in dot + assert ' "dyninst" [label="dyninst"]\n' in dot + assert ' "callpath" [label="callpath"]\n' in dot + assert ' "libelf" [label="libelf"]\n' in dot + assert ' "libdwarf" [label="libdwarf"]\n' in dot + + assert ' "dyninst" -> "libdwarf"\n' in dot + assert ' "callpath" -> "dyninst"\n' in dot + assert ' "mpileaks" -> "mpi"\n' in dot + assert ' "libdwarf" -> "libelf"\n' in dot + assert ' "callpath" -> "mpi"\n' in dot + assert ' "mpileaks" -> "callpath"\n' in dot + assert ' "dyninst" -> "libelf"\n' in dot + + +def test_dynamic_dot_graph_mpileaks(builtin_mock): + """Test dynamically graphing the mpileaks package.""" + s = Spec('mpileaks').normalized() + + stream = StringIO() + graph_dot([s], static=False, out=stream) + + dot = stream.getvalue() + + mpileaks_hash, mpileaks_lbl = s.dag_hash(), s.format('$_$#') + mpi_hash, mpi_lbl = s['mpi'].dag_hash(), s['mpi'].format('$_$#') + callpath_hash, callpath_lbl = ( + s['callpath'].dag_hash(), s['callpath'].format('$_$#')) + dyninst_hash, dyninst_lbl = ( + s['dyninst'].dag_hash(), s['dyninst'].format('$_$#')) + libdwarf_hash, libdwarf_lbl = ( + s['libdwarf'].dag_hash(), s['libdwarf'].format('$_$#')) + libelf_hash, libelf_lbl = ( + s['libelf'].dag_hash(), s['libelf'].format('$_$#')) + + assert ' "%s" [label="%s"]\n' % (mpileaks_hash, mpileaks_lbl) in dot + assert ' "%s" [label="%s"]\n' % (callpath_hash, callpath_lbl) in dot + assert ' "%s" [label="%s"]\n' % (mpi_hash, mpi_lbl) in dot + assert ' "%s" [label="%s"]\n' % (dyninst_hash, dyninst_lbl) in dot + assert ' "%s" [label="%s"]\n' % (libdwarf_hash, libdwarf_lbl) in dot + assert ' "%s" [label="%s"]\n' % (libelf_hash, libelf_lbl) in dot + + assert ' "%s" -> "%s"\n' % (dyninst_hash, libdwarf_hash) in dot + assert ' "%s" -> "%s"\n' % (callpath_hash, dyninst_hash) in dot + assert ' "%s" -> "%s"\n' % (mpileaks_hash, mpi_hash) in dot + assert ' "%s" -> "%s"\n' % (libdwarf_hash, libelf_hash) in dot + assert ' "%s" -> "%s"\n' % (callpath_hash, mpi_hash) in dot + assert ' "%s" -> "%s"\n' % (mpileaks_hash, callpath_hash) in dot + assert ' "%s" -> "%s"\n' % (dyninst_hash, libelf_hash) in dot + + +def test_ascii_graph_mpileaks(builtin_mock): + """Test dynamically graphing the mpileaks package.""" + s = Spec('mpileaks').normalized() + + stream = StringIO() + graph = AsciiGraph() + graph.write(s, out=stream, color=False) + string = stream.getvalue() + + # Some lines in spack graph still have trailing space + # TODO: fix this. + string = '\n'.join([line.rstrip() for line in string.split('\n')]) + + assert string == r'''o mpileaks +|\ +| o callpath +|/| +o | mpi + / +o dyninst +|\ +| o libdwarf +|/ +o libelf +''' -- cgit v1.2.3-70-g09d2 From 81a5146b1df1f69172c0f76bc3dbe469f4e366f9 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 26 Jan 2017 11:27:15 +0100 Subject: AutotoolsPackage: minor improvements (#2859) * AutotoolsPackage: added configure_directory to permit build out of source. The configure script executable is now invoked with an absolute path. Modified a few packages accordingly. * build_systems: functions returning directories are now properties * build_systems: fixed issues with tcl and tk * AutotoolsPackage: reworked recipe for autoreconf --- lib/spack/spack/build_systems/autotools.py | 98 ++++++++++++++++++---- lib/spack/spack/build_systems/cmake.py | 12 +-- lib/spack/spack/build_systems/makefile.py | 5 +- lib/spack/spack/build_systems/python.py | 5 +- var/spack/repos/builtin/packages/astyle/package.py | 1 + .../repos/builtin/packages/autoconf/package.py | 2 + .../repos/builtin/packages/automake/package.py | 2 + .../builtin/packages/bash-completion/package.py | 19 ++--- var/spack/repos/builtin/packages/bison/package.py | 2 + var/spack/repos/builtin/packages/czmq/package.py | 16 ---- .../repos/builtin/packages/elfutils/package.py | 8 +- var/spack/repos/builtin/packages/flex/package.py | 8 -- var/spack/repos/builtin/packages/gcc/package.py | 26 +++--- var/spack/repos/builtin/packages/glib/package.py | 17 +--- var/spack/repos/builtin/packages/gource/package.py | 26 +++--- var/spack/repos/builtin/packages/libgd/package.py | 16 +--- var/spack/repos/builtin/packages/libquo/package.py | 28 ++----- .../repos/builtin/packages/libtool/package.py | 2 + var/spack/repos/builtin/packages/libuv/package.py | 2 + var/spack/repos/builtin/packages/m4/package.py | 2 + .../repos/builtin/packages/netcdf-cxx4/package.py | 7 +- var/spack/repos/builtin/packages/plumed/package.py | 20 +++-- .../repos/builtin/packages/py-meep/package.py | 4 +- .../repos/builtin/packages/py-pypar/package.py | 5 +- .../repos/builtin/packages/swiftsim/package.py | 7 -- var/spack/repos/builtin/packages/tcl/package.py | 5 +- var/spack/repos/builtin/packages/tk/package.py | 5 +- 27 files changed, 178 insertions(+), 172 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index d08ea02428..af6f5507b2 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -30,8 +30,10 @@ import shutil from subprocess import PIPE from subprocess import check_call -from llnl.util.filesystem import working_dir -from spack.package import PackageBase, run_after +import llnl.util.tty as tty +from llnl.util.filesystem import working_dir, join_path, force_remove +from spack.package import PackageBase, run_after, run_before +from spack.util.executable import Executable class AutotoolsPackage(PackageBase): @@ -79,8 +81,14 @@ class AutotoolsPackage(PackageBase): #: phase install_targets = ['install'] + #: Callback names for build-time test build_time_test_callbacks = ['check'] + #: Set to true to force the autoreconf step even if configure is present + force_autoreconf = False + #: Options to be passed to autoreconf when using the default implementation + autoreconf_extra_args = [] + def _do_patch_config_guess(self): """Some packages ship with an older config.guess and need to have this updated when installed on a newer architecture.""" @@ -147,9 +155,26 @@ class AutotoolsPackage(PackageBase): return False + @property + def configure_directory(self): + """Returns the directory where 'configure' resides. + + :return: directory where to find configure + """ + return self.stage.source_path + + @property + def configure_abs_path(self): + # Absolute path to configure + configure_abs_path = join_path( + os.path.abspath(self.configure_directory), 'configure' + ) + return configure_abs_path + + @property def build_directory(self): """Override to provide another place to build the package""" - return self.stage.source_path + return self.configure_directory def patch(self): """Patches config.guess if @@ -165,21 +190,62 @@ class AutotoolsPackage(PackageBase): if not self._do_patch_config_guess(): raise RuntimeError('Failed to find suitable config.guess') + @run_before('autoreconf') + def delete_configure_to_force_update(self): + if self.force_autoreconf: + force_remove(self.configure_abs_path) + def autoreconf(self, spec, prefix): """Not needed usually, configure should be already there""" - pass + # If configure exists nothing needs to be done + if os.path.exists(self.configure_abs_path): + return + # Else try to regenerate it + autotools = ['m4', 'autoconf', 'automake', 'libtool'] + missing = [x for x in autotools if x not in spec] + if missing: + msg = 'Cannot generate configure: missing dependencies {0}' + raise RuntimeError(msg.format(missing)) + tty.msg('Configure script not found: trying to generate it') + tty.warn('*********************************************************') + tty.warn('* If the default procedure fails, consider implementing *') + tty.warn('* a custom AUTORECONF phase in the package *') + tty.warn('*********************************************************') + with working_dir(self.configure_directory): + m = inspect.getmodule(self) + # This part should be redundant in principle, but + # won't hurt + m.libtoolize() + m.aclocal() + # This line is what is needed most of the time + # --install, --verbose, --force + autoreconf_args = ['-ivf'] + if 'pkg-config' in spec: + autoreconf_args += [ + '-I', + join_path(spec['pkg-config'].prefix, 'share', 'aclocal'), + ] + autoreconf_args += self.autoreconf_extra_args + m.autoreconf(*autoreconf_args) @run_after('autoreconf') - def is_configure_or_die(self): - """Checks the presence of a `configure` file after the - :py:meth:`.autoreconf` phase. + def set_configure_or_die(self): + """Checks the presence of a ``configure`` file after the + autoreconf phase. If it is found sets a module attribute + appropriately, otherwise raises an error. - :raise RuntimeError: if the ``configure`` script does not exist. + :raises RuntimeError: if a configure script is not found in + :py:meth:`~.configure_directory` """ - with working_dir(self.build_directory()): - if not os.path.exists('configure'): - raise RuntimeError( - 'configure script not found in {0}'.format(os.getcwd())) + # Check if a configure script is there. If not raise a RuntimeError. + if not os.path.exists(self.configure_abs_path): + msg = 'configure script not found in {0}' + raise RuntimeError(msg.format(self.configure_directory)) + + # Monkey-patch the configure script in the corresponding module + inspect.getmodule(self).configure = Executable( + self.configure_abs_path + ) def configure_args(self): """Produces a list containing all the arguments that must be passed to @@ -195,21 +261,21 @@ class AutotoolsPackage(PackageBase): """ options = ['--prefix={0}'.format(prefix)] + self.configure_args() - with working_dir(self.build_directory()): + with working_dir(self.build_directory, create=True): inspect.getmodule(self).configure(*options) def build(self, spec, prefix): """Makes the build targets specified by :py:attr:``~.AutotoolsPackage.build_targets`` """ - with working_dir(self.build_directory()): + with working_dir(self.build_directory): inspect.getmodule(self).make(*self.build_targets) def install(self, spec, prefix): """Makes the install targets specified by :py:attr:``~.AutotoolsPackage.install_targets`` """ - with working_dir(self.build_directory()): + with working_dir(self.build_directory): inspect.getmodule(self).make(*self.install_targets) run_after('build')(PackageBase._run_default_build_time_test_callbacks) @@ -218,7 +284,7 @@ class AutotoolsPackage(PackageBase): """Searches the Makefile for targets ``test`` and ``check`` and runs them if found. """ - with working_dir(self.build_directory()): + with working_dir(self.build_directory): self._if_make_target_execute('test') self._if_make_target_execute('check') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 823ef502c4..43d177d3cb 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -82,6 +82,7 @@ class CMakePackage(PackageBase): """ return 'RelWithDebInfo' + @property def root_cmakelists_dir(self): """Returns the location of the root CMakeLists.txt @@ -119,6 +120,7 @@ class CMakePackage(PackageBase): args.append('-DCMAKE_INSTALL_RPATH:STRING={0}'.format(rpaths)) return args + @property def build_directory(self): """Returns the directory to use when building the package @@ -141,19 +143,19 @@ class CMakePackage(PackageBase): def cmake(self, spec, prefix): """Runs ``cmake`` in the build directory""" - options = [self.root_cmakelists_dir()] + self.std_cmake_args + \ + options = [self.root_cmakelists_dir] + self.std_cmake_args + \ self.cmake_args() - with working_dir(self.build_directory(), create=True): + with working_dir(self.build_directory, create=True): inspect.getmodule(self).cmake(*options) def build(self, spec, prefix): """Make the build targets""" - with working_dir(self.build_directory()): + with working_dir(self.build_directory): inspect.getmodule(self).make(*self.build_targets) def install(self, spec, prefix): """Make the install targets""" - with working_dir(self.build_directory()): + with working_dir(self.build_directory): inspect.getmodule(self).make(*self.install_targets) run_after('build')(PackageBase._run_default_build_time_test_callbacks) @@ -162,7 +164,7 @@ class CMakePackage(PackageBase): """Searches the CMake-generated Makefile for the target ``test`` and runs it if found. """ - with working_dir(self.build_directory()): + with working_dir(self.build_directory): self._if_make_target_execute('test') # Check that self.prefix is there after installation diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index f07bcd62ab..7274384478 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -72,6 +72,7 @@ class MakefilePackage(PackageBase): #: phase install_targets = ['install'] + @property def build_directory(self): """Returns the directory containing the main Makefile @@ -89,14 +90,14 @@ class MakefilePackage(PackageBase): """Calls make, passing :py:attr:`~.MakefilePackage.build_targets` as targets. """ - with working_dir(self.build_directory()): + with working_dir(self.build_directory): inspect.getmodule(self).make(*self.build_targets) def install(self, spec, prefix): """Calls make, passing :py:attr:`~.MakefilePackage.install_targets` as targets. """ - with working_dir(self.build_directory()): + with working_dir(self.build_directory): inspect.getmodule(self).make(*self.install_targets) # Check that self.prefix is there after installation diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 5e7c1c356d..60a850d356 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -97,10 +97,11 @@ class PythonPackage(PackageBase): extends('python') - def setup_file(self, spec, prefix): + def setup_file(self): """Returns the name of the setup file to use.""" return 'setup.py' + @property def build_directory(self): """The directory containing the ``setup.py`` file.""" return self.stage.source_path @@ -109,7 +110,7 @@ class PythonPackage(PackageBase): inspect.getmodule(self).python(*args) def setup_py(self, *args): - setup = self.setup_file(self.spec, self.prefix) + setup = self.setup_file() with working_dir(self.build_directory()): self.python(setup, '--no-user-cfg', *args) diff --git a/var/spack/repos/builtin/packages/astyle/package.py b/var/spack/repos/builtin/packages/astyle/package.py index 16c59469fa..851952be66 100644 --- a/var/spack/repos/builtin/packages/astyle/package.py +++ b/var/spack/repos/builtin/packages/astyle/package.py @@ -39,6 +39,7 @@ class Astyle(MakefilePackage): parallel = False + @property def build_directory(self): return join_path(self.stage.source_path, 'build', self.compiler.name) diff --git a/var/spack/repos/builtin/packages/autoconf/package.py b/var/spack/repos/builtin/packages/autoconf/package.py index d812350ae8..3dcf8f36b5 100644 --- a/var/spack/repos/builtin/packages/autoconf/package.py +++ b/var/spack/repos/builtin/packages/autoconf/package.py @@ -38,6 +38,8 @@ class Autoconf(AutotoolsPackage): depends_on('m4@1.4.6:', type='build') + build_directory = 'spack-build' + def _make_executable(self, name): return Executable(join_path(self.prefix.bin, name)) diff --git a/var/spack/repos/builtin/packages/automake/package.py b/var/spack/repos/builtin/packages/automake/package.py index 6c0a47ff95..8643f5d836 100644 --- a/var/spack/repos/builtin/packages/automake/package.py +++ b/var/spack/repos/builtin/packages/automake/package.py @@ -37,6 +37,8 @@ class Automake(AutotoolsPackage): depends_on('autoconf', type='build') + build_directory = 'spack-build' + def _make_executable(self, name): return Executable(join_path(self.prefix.bin, name)) diff --git a/var/spack/repos/builtin/packages/bash-completion/package.py b/var/spack/repos/builtin/packages/bash-completion/package.py index 666a1bef13..0bd4d7c294 100644 --- a/var/spack/repos/builtin/packages/bash-completion/package.py +++ b/var/spack/repos/builtin/packages/bash-completion/package.py @@ -25,10 +25,10 @@ from spack import * -class BashCompletion(Package): +class BashCompletion(AutotoolsPackage): """Programmable completion functions for bash.""" homepage = "https://github.com/scop/bash-completion" - url = "https://github.com/scop/bash-completion/archive/2.3.tar.gz" + url = "https://github.com/scop/bash-completion/archive/2.3.tar.gz" version('2.3', '67e50f5f3c804350b43f2b664c33dde811d24292') version('develop', git='https://github.com/scop/bash-completion.git') @@ -41,16 +41,9 @@ class BashCompletion(Package): # Other dependencies depends_on('bash@4.1:', type='run') - def install(self, spec, prefix): - make_args = ['--prefix=%s' % prefix] - - autoreconf('-i') - configure(*make_args) - make() - # make("check") # optional, requires dejagnu and tcllib - make("install", - parallel=False) - + @run_after('install') + def show_message_to_user(self): + prefix = self.prefix # Guidelines for individual user as provided by the author at # https://github.com/scop/bash-completion print('=====================================================') @@ -59,6 +52,6 @@ class BashCompletion(Package): print('') print('# Use bash-completion, if available') print('[[ $PS1 && -f %s/share/bash-completion/bash_completion ]] && \ ' % prefix) # NOQA: ignore=E501 - print(' . %s/share/bash-completion/bash_completion' % prefix) + print(' . %s/share/bash-completion/bash_completion' % prefix) print('') print('=====================================================') diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py index cc2d10dea1..a9691fab8b 100644 --- a/var/spack/repos/builtin/packages/bison/package.py +++ b/var/spack/repos/builtin/packages/bison/package.py @@ -36,3 +36,5 @@ class Bison(AutotoolsPackage): version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8') depends_on("m4", type='build') + + build_directory = 'spack-build' diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py index f7791967b3..fd50197326 100644 --- a/var/spack/repos/builtin/packages/czmq/package.py +++ b/var/spack/repos/builtin/packages/czmq/package.py @@ -38,19 +38,3 @@ class Czmq(AutotoolsPackage): depends_on('autoconf', type='build') depends_on('pkg-config', type='build') depends_on('zeromq') - - def autoreconf(self, spec, prefix): - # Work around autogen.sh oddities - # bash = which("bash") - # bash("./autogen.sh") - mkdirp("config") - autoreconf = which("autoreconf") - autoreconf("--install", "--verbose", "--force", - "-I", "config", - "-I", join_path(spec['pkg-config'].prefix, - "share", "aclocal"), - "-I", join_path(spec['automake'].prefix, - "share", "aclocal"), - "-I", join_path(spec['libtool'].prefix, - "share", "aclocal"), - ) diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index bdc858e121..4a91c7db30 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -35,15 +35,15 @@ class Elfutils(AutotoolsPackage): homepage = "https://fedorahosted.org/elfutils/" + depends_on('libtool', type='build') + depends_on('automake', type='build') + depends_on('autoconf', type='build') + version('0.163', git='git://git.fedorahosted.org/git/elfutils.git', tag='elfutils-0.163') provides('elf') - def autoreconf(self, spec, prefix): - autoreconf = which('autoreconf') - autoreconf('-if') - def configure_args(self): return ['--enable-maintainer-mode'] diff --git a/var/spack/repos/builtin/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py index e4117877c1..0314950140 100644 --- a/var/spack/repos/builtin/packages/flex/package.py +++ b/var/spack/repos/builtin/packages/flex/package.py @@ -61,11 +61,3 @@ class Flex(AutotoolsPackage): url += "/archive/flex-{0}.tar.gz".format(version.dashed) return url - - def autoreconf(self, spec, prefix): - pass - - @when('@:2.6.0') - def autoreconf(self, spec, prefix): - libtoolize('--install', '--force') - autoreconf('--install', '--force') diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index 31da068d72..a9fed4d8dd 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -30,7 +30,7 @@ import sys from os.path import isfile -class Gcc(Package): +class Gcc(AutotoolsPackage): """The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, and Java.""" homepage = "https://gcc.gnu.org" @@ -85,7 +85,9 @@ class Gcc(Package): patch('piclibs.patch', when='+piclibs') patch('gcc-backport.patch', when='@4.7:4.9.2,5:5.3') - def install(self, spec, prefix): + def configure_args(self): + spec = self.spec + prefix = self.spec.prefix # libjava/configure needs a minor fix to install into spack paths. filter_file(r"'@.*@'", "'@[[:alnum:]]*@'", 'libjava/configure', string=True) @@ -138,18 +140,15 @@ class Gcc(Package): darwin_options = ["--with-build-config=bootstrap-debug"] options.extend(darwin_options) - build_dir = join_path(self.stage.path, 'spack-build') - configure = Executable(join_path(self.stage.source_path, 'configure')) - with working_dir(build_dir, create=True): - # Rest of install is straightforward. - configure(*options) - if sys.platform == 'darwin': - make("bootstrap") - else: - make() - make("install") + return options - self.write_rpath_specs() + build_directory = 'spack-build' + + @property + def build_targets(self): + if sys.platform == 'darwin': + return ['bootstrap'] + return [] @property def spec_dir(self): @@ -157,6 +156,7 @@ class Gcc(Package): spec_dir = glob("%s/lib64/gcc/*/*" % self.prefix) return spec_dir[0] if spec_dir else None + @run_after('install') def write_rpath_specs(self): """Generate a spec file so the linker adds a rpath to the libs the compiler used to build the executable.""" diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py index a4d8c289d7..e2eb984876 100644 --- a/var/spack/repos/builtin/packages/glib/package.py +++ b/var/spack/repos/builtin/packages/glib/package.py @@ -53,22 +53,9 @@ class Glib(AutotoolsPackage): # around a legitimate usage. patch('no-Werror=format-security.patch') + force_autoreconf = True + def url_for_version(self, version): """Handle glib's version-based custom URLs.""" url = 'http://ftp.gnome.org/pub/gnome/sources/glib' return url + '/%s/glib-%s.tar.xz' % (version.up_to(2), version) - - def autoreconf(self, spec, prefix): - autoreconf = which("autoreconf") - autoreconf("--install", "--verbose", "--force", - "-I", "config", - "-I", join_path(spec['pkg-config'].prefix, - "share", "aclocal"), - "-I", join_path(spec['automake'].prefix, - "share", "aclocal"), - "-I", join_path(spec['libtool'].prefix, - "share", "aclocal"), - ) - - def install(self, spec, prefix): - make("install", parallel=False) diff --git a/var/spack/repos/builtin/packages/gource/package.py b/var/spack/repos/builtin/packages/gource/package.py index dda00420a3..21994ad42c 100644 --- a/var/spack/repos/builtin/packages/gource/package.py +++ b/var/spack/repos/builtin/packages/gource/package.py @@ -25,11 +25,11 @@ from spack import * -class Gource(Package): +class Gource(AutotoolsPackage): """Software version control visualization.""" homepage = "http://gource.io" - url = "https://github.com/acaudwell/Gource/releases/download/gource-0.44/gource-0.44.tar.gz" + url = "https://github.com/acaudwell/Gource/releases/download/gource-0.44/gource-0.44.tar.gz" version('0.44', '79cda1bfaad16027d59cce55455bfab88b57c69d') @@ -49,15 +49,17 @@ class Gource(Package): depends_on('sdl2') depends_on('sdl2-image') - def install(self, spec, prefix): - make_args = ['--prefix=%s' % prefix, - '--disable-dependency-tracking', - '--without-x', - '--with-boost=%s' % spec['boost'].prefix] + parallel = False + force_autoreconf = True - autoreconf('-i') - configure(*make_args) - make() + def url_for_version(self, version): + tmp = 'https://github.com/acaudwell/Gource/releases/download/gource-{0}/gource-{0}.tar.gz' # NOQA: ignore=E501 + return tmp.format(version.dotted) - make("install", - parallel=False) + def configure_args(self): + spec = self.spec + return [ + '--disable-dependency-tracking', + '--without-x', + '--with-boost=%s' % spec['boost'].prefix + ] diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py index 42eb23d85a..58867c85f8 100644 --- a/var/spack/repos/builtin/packages/libgd/package.py +++ b/var/spack/repos/builtin/packages/libgd/package.py @@ -38,8 +38,9 @@ class Libgd(AutotoolsPackage): """ homepage = "https://github.com/libgd/libgd" - url = "https://github.com/libgd/libgd/archive/gd-2.1.1.tar.gz" + url = 'https://github.com/libgd/libgd/releases/download/gd-2.2.4/libgd-2.2.4.tar.gz' + version('2.2.4', '0a3c307b5075edbe1883543dd1153c02') version('2.2.3', 'a67bd15fa33d4aac0a1c7904aed19f49') version('2.1.1', 'e91a1a99903e460e7ba00a794e72cc1e') @@ -54,16 +55,3 @@ class Libgd(AutotoolsPackage): depends_on('libpng') depends_on('libtiff') depends_on('fontconfig') - - def autoreconf(self, spec, prefix): - autoreconf("--install", "--force", - "-I", "m4", - "-I", join_path(spec['gettext'].prefix, - "share", "aclocal"), - "-I", join_path(spec['pkg-config'].prefix, - "share", "aclocal"), - "-I", join_path(spec['automake'].prefix, - "share", "aclocal"), - "-I", join_path(spec['libtool'].prefix, - "share", "aclocal") - ) diff --git a/var/spack/repos/builtin/packages/libquo/package.py b/var/spack/repos/builtin/packages/libquo/package.py index 3e574f7004..76a508f9c6 100644 --- a/var/spack/repos/builtin/packages/libquo/package.py +++ b/var/spack/repos/builtin/packages/libquo/package.py @@ -23,10 +23,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -import os -class Libquo(Package): +class Libquo(AutotoolsPackage): """QUO (as in "status quo") is a runtime library that aids in accommodating thread-level heterogeneity in dynamic, phased MPI+X applications comprising @@ -42,25 +41,8 @@ class Libquo(Package): depends_on('automake', type='build') depends_on('libtool', type='build') - def install(self, spec, prefix): - autoreconf_options = [ - '--install', - '--verbose', - '--force', - '-I', 'config', - '-I', os.path.join(spec['automake'].prefix, - 'share', 'aclocal'), - '-I', os.path.join(spec['libtool'].prefix, - 'share', 'aclocal') + def configure_args(self): + return [ + 'CC={0}'.format(self.spec['mpi'].mpicc), + 'FC={0}'.format(self.spec['mpi'].mpifc) ] - autoreconf(*autoreconf_options) - - configure_options = [ - '--prefix={0}'.format(prefix), - 'CC=%s' % join_path(spec['mpi'].prefix.bin, "mpicc"), - 'FC=%s' % join_path(spec['mpi'].prefix.bin, "mpif90") - ] - configure(*configure_options) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/libtool/package.py b/var/spack/repos/builtin/packages/libtool/package.py index cd12503681..ae706089c9 100644 --- a/var/spack/repos/builtin/packages/libtool/package.py +++ b/var/spack/repos/builtin/packages/libtool/package.py @@ -36,6 +36,8 @@ class Libtool(AutotoolsPackage): depends_on('m4@1.4.6:', type='build') + build_directory = 'spack-build' + def _make_executable(self, name): return Executable(join_path(self.prefix.bin, name)) diff --git a/var/spack/repos/builtin/packages/libuv/package.py b/var/spack/repos/builtin/packages/libuv/package.py index 5254239019..2f303280da 100644 --- a/var/spack/repos/builtin/packages/libuv/package.py +++ b/var/spack/repos/builtin/packages/libuv/package.py @@ -37,5 +37,7 @@ class Libuv(AutotoolsPackage): depends_on('libtool', type='build') def autoreconf(self, spec, prefix): + # This is needed because autogen.sh generates on-the-fly + # an m4 macro needed during configuration bash = which("bash") bash('autogen.sh') diff --git a/var/spack/repos/builtin/packages/m4/package.py b/var/spack/repos/builtin/packages/m4/package.py index 415c55b21a..a8b0423933 100644 --- a/var/spack/repos/builtin/packages/m4/package.py +++ b/var/spack/repos/builtin/packages/m4/package.py @@ -41,6 +41,8 @@ class M4(AutotoolsPackage): depends_on('libsigsegv', when='+sigsegv') + build_directory = 'spack-build' + def configure_args(self): spec = self.spec args = ['--enable-c++'] diff --git a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py index 2da30c7b0c..36ab8766b9 100644 --- a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py +++ b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py @@ -34,8 +34,9 @@ class NetcdfCxx4(AutotoolsPackage): version('4.2.1', 'd019853802092cf686254aaba165fc81') depends_on('netcdf') + + depends_on('automake', type='build') depends_on('autoconf', type='build') + depends_on('libtool', type='build') - def autoreconf(self, spec, prefix): - # Rebuild to prevent problems of inconsistency in git repo - which('autoreconf')('-ivf') + force_autoreconf = True diff --git a/var/spack/repos/builtin/packages/plumed/package.py b/var/spack/repos/builtin/packages/plumed/package.py index 60dfdf7405..69949b0017 100644 --- a/var/spack/repos/builtin/packages/plumed/package.py +++ b/var/spack/repos/builtin/packages/plumed/package.py @@ -27,7 +27,7 @@ import subprocess from spack import * -class Plumed(Package): +class Plumed(AutotoolsPackage): """PLUMED is an open source library for free energy calculations in molecular systems which works together with some of the most popular molecular dynamics engines. @@ -67,6 +67,8 @@ class Plumed(Package): depends_on('gsl', when='+gsl') depends_on('autoconf', type='build') + depends_on('automake', type='build') + depends_on('libtool', type='build') # Dictionary mapping PLUMED versions to the patches it provides # interactively @@ -84,6 +86,8 @@ class Plumed(Package): } } + force_autoreconf = True + def apply_patch(self, other): plumed = subprocess.Popen( [join_path(self.spec.prefix.bin, 'plumed'), 'patch', '-p'], @@ -99,12 +103,15 @@ class Plumed(Package): # Make plumed visible from dependent packages module.plumed = Executable(join_path(self.spec.prefix.bin, 'plumed')) - def install(self, spec, prefix): + @run_before('autoreconf') + def filter_gslcblas(self): # This part is needed to avoid linking with gsl cblas # interface which will mask the cblas interface # provided by optimized libraries due to linking order filter_file('-lgslcblas', '', 'configure.ac') - autoreconf('-ivf') + + def configure_args(self): + spec = self.spec # From plumed docs : # Also consider that this is different with respect to what some other @@ -114,8 +121,7 @@ class Plumed(Package): # with MPI you should use: # # > ./configure CXX="$MPICXX" - configure_opts = ['--prefix=' + prefix] - + configure_opts = [] # If using MPI then ensure the correct compiler wrapper is used. if '+mpi' in spec: configure_opts.extend([ @@ -153,6 +159,4 @@ class Plumed(Package): configure_opts.extend([ '--enable-modules={0}'.format("".join(module_opts))]) - configure(*configure_opts) - make() - make('install') + return configure_opts diff --git a/var/spack/repos/builtin/packages/py-meep/package.py b/var/spack/repos/builtin/packages/py-meep/package.py index 0ebba77ac6..64ca4e25d9 100644 --- a/var/spack/repos/builtin/packages/py-meep/package.py +++ b/var/spack/repos/builtin/packages/py-meep/package.py @@ -51,8 +51,8 @@ class PyMeep(PythonPackage): phases = ['clean', 'build_ext', 'install', 'bdist'] - def setup_file(self, spec, prefix): - return 'setup-mpi.py' if '+mpi' in spec else 'setup.py' + def setup_file(self): + return 'setup-mpi.py' if '+mpi' in self.spec else 'setup.py' def common_args(self, spec, prefix): include_dirs = [ diff --git a/var/spack/repos/builtin/packages/py-pypar/package.py b/var/spack/repos/builtin/packages/py-pypar/package.py index f10b6d807f..6ba999c063 100644 --- a/var/spack/repos/builtin/packages/py-pypar/package.py +++ b/var/spack/repos/builtin/packages/py-pypar/package.py @@ -37,8 +37,7 @@ class PyPypar(PythonPackage): depends_on('mpi') depends_on('py-numpy', type=('build', 'run')) + build_directory = 'source' + def url_for_version(self, version): return "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-%s.tgz" % version - - def build_directory(self): - return 'source' diff --git a/var/spack/repos/builtin/packages/swiftsim/package.py b/var/spack/repos/builtin/packages/swiftsim/package.py index 1c424b5ca0..2ebdc1fdcb 100644 --- a/var/spack/repos/builtin/packages/swiftsim/package.py +++ b/var/spack/repos/builtin/packages/swiftsim/package.py @@ -58,13 +58,6 @@ class Swiftsim(AutotoolsPackage): tty.warn('This is needed to clone SWIFT repository') spack_env.set('GIT_SSL_NO_VERIFY', 1) - def autoreconf(self, spec, prefix): - libtoolize() - aclocal() - autoconf() - autogen = Executable('./autogen.sh') - autogen() - def configure_args(self): return ['--prefix=%s' % self.prefix, '--enable-mpi' if '+mpi' in self.spec else '--disable-mpi', diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index 2ec8bb5236..a9bc3cceaa 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -42,6 +42,8 @@ class Tcl(AutotoolsPackage): depends_on('zlib') + configure_directory = 'unix' + def url_for_version(self, version): base_url = 'http://prdownloads.sourceforge.net/tcl' return '{0}/tcl{1}-src.tar.gz'.format(base_url, version) @@ -52,9 +54,6 @@ class Tcl(AutotoolsPackage): env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format( self.spec.version.up_to(2)))) - def build_directory(self): - return 'unix' - @run_after('install') def symlink_tclsh(self): with working_dir(self.prefix.bin): diff --git a/var/spack/repos/builtin/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py index 071db04e63..66573eaa45 100644 --- a/var/spack/repos/builtin/packages/tk/package.py +++ b/var/spack/repos/builtin/packages/tk/package.py @@ -42,6 +42,8 @@ class Tk(AutotoolsPackage): depends_on("tcl") depends_on("libx11", when='+X') + configure_directory = 'unix' + def url_for_version(self, version): base_url = "http://prdownloads.sourceforge.net/tcl" return "{0}/tk{1}-src.tar.gz".format(base_url, version) @@ -52,9 +54,6 @@ class Tk(AutotoolsPackage): run_env.set('TK_LIBRARY', join_path(self.prefix.lib, 'tk{0}'.format( self.spec.version.up_to(2)))) - def build_directory(self): - return 'unix' - def configure_args(self): spec = self.spec return ['--with-tcl={0}'.format(spec['tcl'].prefix.lib)] -- cgit v1.2.3-70-g09d2 From ffb8aaa3f30669e8189aa72c30f3674721023a6f Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Thu, 26 Jan 2017 02:29:31 -0800 Subject: Packaging docs for MPI (#2838) * Add MPI docs to packaging guide and simplify packaging guide TOC a bit. --- lib/spack/docs/packaging_guide.rst | 730 +++++++++++++++++++++++-------------- 1 file changed, 447 insertions(+), 283 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 9b08a7d498..75546d943e 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -405,70 +405,22 @@ For tarball downloads, Spack can currently support checksums using the MD5, SHA-1, SHA-224, SHA-256, SHA-384, and SHA-512 algorithms. It determines the algorithm to use based on the hash length. ------------------------ -Package Version Numbers ------------------------ - -Most Spack versions are numeric, a tuple of integers; for example, -``apex@0.1``, ``ferret@6.96`` or ``py-netcdf@1.2.3.1``. Spack knows -how to compare and sort numeric versions. - -Some Spack versions involve slight extensions of numeric syntax; for -example, ``py-sphinx-rtd-theme@0.1.10a0``. In this case, numbers are -always considered to be "newer" than letters. This is for consistency -with `RPM `_. - -Spack versions may also be arbitrary non-numeric strings; any string -here will suffice; for example, ``@develop``, ``@master``, ``@local``. -The following rules determine the sort order of numeric -vs. non-numeric versions: - -#. The non-numeric versions ``@develop`` is considered greatest (newest). - -#. Numeric versions are all less than ``@develop`` version, and are - sorted numerically. - -#. All other non-numeric versions are less than numeric versions, and - are sorted alphabetically. - -The logic behind this sort order is two-fold: - -#. Non-numeric versions are usually used for special cases while - developing or debugging a piece of software. Keeping most of them - less than numeric versions ensures that Spack choose numeric - versions by default whenever possible. - -#. The most-recent development version of a package will usually be - newer than any released numeric versions. This allows the - ``develop`` version to satisfy dependencies like ``depends_on(abc, - when="@x.y.z:")`` - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Concretization Version Selection -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When concretizing, many versions might match a user-supplied spec. -For example, the spec ``python`` matches all available versions of the -package ``python``. Similarly, ``python@3:`` matches all versions of -Python3. Given a set of versions that match a spec, Spack -concretization uses the following priorities to decide which one to -use: +--------------------- +Versions and fetching +--------------------- -#. If the user provided a list of versions in ``packages.yaml``, the - first matching version in that list will be used. +The most straightforward way to add new versions to your package is to +add a line like this in the package class: -#. If one or more versions is specified as ``preferred=True``, in - either ``packages.yaml`` or ``package.py``, the largest matching - version will be used. ("Latest" is defined by the sort order - above). +.. code-block:: python + :linenos: -#. If no preferences in particular are specified in the package or in - ``packages.yaml``, then the largest matching non-develop version - will be used. By avoiding ``@develop``, this prevents users from - accidentally installing a ``@develop`` version. + class Foo(Package): + url = 'http://example.com/foo-1.0.tar.gz' + version('8.2.1', '4136d7b4c04df68b686570afa26988ac') + ... -#. If all else fails and ``@develop`` is the only matching version, it - will be used. +Versions should be listed with the newest version first. ^^^^^^^^^^^^^ Date Versions @@ -484,24 +436,6 @@ Alternately, you might use a hybrid release-version / date scheme. For example, ``@1.3.2016.08.31`` would mean the version from the ``1.3`` branch, as of August 31, 2016. - -------------------- -Adding new versions -------------------- - -The most straightforward way to add new versions to your package is to -add a line like this in the package class: - -.. code-block:: python - :linenos: - - class Foo(Package): - url = 'http://example.com/foo-1.0.tar.gz' - version('8.2.1', '4136d7b4c04df68b686570afa26988ac') - ... - -Versions should be listed with the newest version first. - ^^^^^^^^^^^^ Version URLs ^^^^^^^^^^^^ @@ -566,6 +500,37 @@ way to guess the URL systematically. When you supply a custom URL for a version, Spack uses that URL *verbatim* and does not perform extrapolation. +^^^^^^^^^^^^^^^^^^^^^ +PyPI and version URLs +^^^^^^^^^^^^^^^^^^^^^ + +In addition to their developer websites, many python packages are hosted at the +`Python Package Index (PyPi) `_. Although links to +these individual files are typically `generated using a hash +`_ it is often possible to find a +reliable link of the format + +.. code-block:: sh + + https://pypi.python.org/packages/source///-. + +Packages hosted on GitHub and the like are often developer versions that do not +contain all of the files (e.g. configuration scripts) necessary to support +compilation. For this reason it is ideal to link to a repository such as PyPi +if possible. + +More recently, sources are being indexed at `pypi.io `_ as +well. Links obtained from this site follow a similar pattern, namely + +.. code-block:: sh + + https://pypi.io/packages/source///-. + +These links currently redirect back to `pypi.python.org +`_, but this `may change in the future +`_. + + ^^^^^^^^^^^^^^^^^^^^^^^^ Skipping the expand step ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -596,6 +561,79 @@ it executable, then runs it with some arguments. installer = Executable(self.stage.archive_file) installer('--prefix=%s' % prefix, 'arg1', 'arg2', 'etc.') +^^^^^^^^^^^^^^^^ +Download caching +^^^^^^^^^^^^^^^^ + +Spack maintains a cache (described :ref:`here `) which saves files +retrieved during package installations to avoid re-downloading in the case that +a package is installed with a different specification (but the same version) or +reinstalled on account of a change in the hashing scheme. + +^^^^^^^^^^^^^^^^^^ +Version comparison +^^^^^^^^^^^^^^^^^^ + +Most Spack versions are numeric, a tuple of integers; for example, +``apex@0.1``, ``ferret@6.96`` or ``py-netcdf@1.2.3.1``. Spack knows +how to compare and sort numeric versions. + +Some Spack versions involve slight extensions of numeric syntax; for +example, ``py-sphinx-rtd-theme@0.1.10a0``. In this case, numbers are +always considered to be "newer" than letters. This is for consistency +with `RPM `_. + +Spack versions may also be arbitrary non-numeric strings; any string +here will suffice; for example, ``@develop``, ``@master``, ``@local``. +The following rules determine the sort order of numeric +vs. non-numeric versions: + +#. The non-numeric versions ``@develop`` is considered greatest (newest). + +#. Numeric versions are all less than ``@develop`` version, and are + sorted numerically. + +#. All other non-numeric versions are less than numeric versions, and + are sorted alphabetically. + +The logic behind this sort order is two-fold: + +#. Non-numeric versions are usually used for special cases while + developing or debugging a piece of software. Keeping most of them + less than numeric versions ensures that Spack choose numeric + versions by default whenever possible. + +#. The most-recent development version of a package will usually be + newer than any released numeric versions. This allows the + ``develop`` version to satisfy dependencies like ``depends_on(abc, + when="@x.y.z:")`` + +^^^^^^^^^^^^^^^^^ +Version selection +^^^^^^^^^^^^^^^^^ + +When concretizing, many versions might match a user-supplied spec. +For example, the spec ``python`` matches all available versions of the +package ``python``. Similarly, ``python@3:`` matches all versions of +Python3. Given a set of versions that match a spec, Spack +concretization uses the following priorities to decide which one to +use: + +#. If the user provided a list of versions in ``packages.yaml``, the + first matching version in that list will be used. + +#. If one or more versions is specified as ``preferred=True``, in + either ``packages.yaml`` or ``package.py``, the largest matching + version will be used. ("Latest" is defined by the sort order + above). + +#. If no preferences in particular are specified in the package or in + ``packages.yaml``, then the largest matching non-develop version + will be used. By avoiding ``@develop``, this prevents users from + accidentally installing a ``@develop`` version. + +#. If all else fails and ``@develop`` is the only matching version, it + will be used. ^^^^^^^^^^^^^ ``spack md5`` @@ -693,9 +731,9 @@ versions. See the documentation on `attribute_list_url`_ and .. _vcs-fetch: ------------------------------- -Fetching from VCS repositories ------------------------------- +------------------------------- +Fetching from code repositories +------------------------------- For some packages, source code is provided in a Version Control System (VCS) repository rather than in a tarball. Spack can fetch packages @@ -793,9 +831,9 @@ Submodules .. _github-fetch: -"""""" +^^^^^^ GitHub -"""""" +^^^^^^ If a project is hosted on GitHub, *any* valid Git branch, tag or hash may be downloaded as a tarball. This is accomplished simply by @@ -875,38 +913,8 @@ Fetching a revision Subversion branches are handled as part of the directory structure, so you can check out a branch or tag by changing the ``url``. ------------------------------------------ -Standard repositories for python packages ------------------------------------------ - -In addition to their developer websites, many python packages are hosted at the -`Python Package Index (PyPi) `_. Although links to -these individual files are typically `generated using a hash -`_ it is often possible to find a -reliable link of the format - -.. code-block:: sh - - https://pypi.python.org/packages/source///-. - -Packages hosted on GitHub and the like are often developer versions that do not -contain all of the files (e.g. configuration scripts) necessary to support -compilation. For this reason it is ideal to link to a repository such as PyPi -if possible. - -More recently, sources are being indexed at `pypi.io `_ as -well. Links obtained from this site follow a similar pattern, namely - -.. code-block:: sh - - https://pypi.io/packages/source///-. - -These links currently redirect back to `pypi.python.org -`_, but this `may change in the future -`_. - ------------------------------------------------- -Expanding additional resources in the source tree +Resources (expanding extra tarballs) ------------------------------------------------- Some packages (most notably compilers) provide optional features if additional @@ -926,15 +934,6 @@ Based on the keywords present among the arguments the appropriate ``FetchStrateg will be used for the resource. The keyword ``destination`` is relative to the source root of the package and should point to where the resource is to be expanded. ------------------------------------------------------- -Automatic caching of files fetched during installation ------------------------------------------------------- - -Spack maintains a cache (described :ref:`here `) which saves files -retrieved during package installations to avoid re-downloading in the case that -a package is installed with a different specification (but the same version) or -reinstalled on account of a change in the hashing scheme. - .. _license: ----------------- @@ -1099,20 +1098,28 @@ structure like this: package.py ad_lustre_rwcontig_open_source.patch -If you supply a URL instead of a filename, the patch will be fetched -from the URL and then applied to your source code. +If you supply a URL instead of a filename, you need to supply a checksum, +like this: -.. warning:: +.. code-block:: python + + patch('http://www.nwchem-sw.org/images/Tddft_mxvec20.patch.gz', + md5='f91c6a04df56e228fe946291d2f38c9a') - It is generally better to use a filename rather than a URL for your - patch. Patches fetched from URLs are not currently checksummed, - and adding checksums for them is tedious for the package builder. - File patches go into the spack repository, which gives you git's - integrity guarantees. URL patches may be removed in a future spack - version. +This directive provides an ``md5`` checksum. You can use other hashing +algorihtms like ``sha256`` as well. The patch will be fetched from the +URL, checked, and applied to your source code. You can use the ``spack +md5`` command to generate a checksum for a patch file. ``patch`` can take two options keyword arguments. They are: +"""""""""""""""""""""""""""""""""""""" +``md5``, ``sha256``, ``sha512``, etc. +"""""""""""""""""""""""""""""""""""""" + +Use one of these when you supply a patch to be downloaded from a remote +site. The downloaded file will be validated using the given checksum. + """""""" ``when`` """""""" @@ -1960,7 +1967,7 @@ See the :ref:`concretization-preferences` section for more details. .. _install-method: ------------------ -Inconsistent Specs +Conflicting Specs ------------------ Suppose a user needs to install package C, which depends on packages A @@ -2151,7 +2158,7 @@ built with. These parameters give you access to this type of information. .. _install-environment: ----------------------- -The install environment +The build environment ----------------------- In general, you should not have to do much differently in your install @@ -2169,6 +2176,17 @@ custom Makefiles, you may need to add logic to modify the makefiles. The remainder of the section covers the way Spack's build environment works. +^^^^^^^^^^^^^^^^^^^^^ +Forking ``install()`` +^^^^^^^^^^^^^^^^^^^^^ + +To give packagers free reign over their install environment, Spack forks +a new process each time it invokes a package's ``install()`` method. +This allows packages to have a sandboxed build environment, without +impacting the environments ofother jobs that the main Spack process runs. +Packages are free to change the environment or to modify Spack internals, +because each ``install()`` call has its own dedicated process. + ^^^^^^^^^^^^^^^^^^^^^ Environment variables ^^^^^^^^^^^^^^^^^^^^^ @@ -2190,6 +2208,10 @@ The Compiler environment variables that Spack sets are: ``FC`` Fortran 90 and above compiler ============ =============================== +Spack sets these variables so that they point to *compiler +wrappers*. These are covered in :ref:`their own section +` below. + All of these are standard variables respected by most build systems. If your project uses ``Autotools`` or ``CMake``, then it should pick them up automatically when you run ``configure`` or ``cmake`` in the @@ -2237,158 +2259,102 @@ if you want to run commands in that environment to test them out, you can use the :ref:`cmd-spack-env` command, documented below. -.. _compiler-wrappers: - ^^^^^^^^^^^^^^^^^^^^^ -Compiler interceptors +Failing the build ^^^^^^^^^^^^^^^^^^^^^ -As mentioned, ``CC``, ``CXX``, ``F77``, and ``FC`` are set to point to -Spack's compiler wrappers. These are simply called ``cc``, ``c++``, -``f77``, and ``f90``, and they live in ``$SPACK_ROOT/lib/spack/env``. - -``$SPACK_ROOT/lib/spack/env`` is added first in the ``PATH`` -environment variable when ``install()`` runs so that system compilers -are not picked up instead. +Sometimes you don't want a package to successfully install unless some +condition is true. You can explicitly cause the build to fail from +``install()`` by raising an ``InstallError``, for example: -All of these compiler wrappers point to a single compiler wrapper -script that figures out which *real* compiler it should be building -with. This comes either from spec `concretization -`_ or from a user explicitly asking for a -particular compiler using, e.g., ``%intel`` on the command line. +.. code-block:: python -In addition to invoking the right compiler, the compiler wrappers add -flags to the compile line so that dependencies can be easily found. -These flags are added for each dependency, if they exist: + if spec.architecture.startswith('darwin'): + raise InstallError('This package does not build on Mac OS X!') -Compile-time library search paths -* ``-L$dep_prefix/lib`` -* ``-L$dep_prefix/lib64`` +.. _shell-wrappers: -Runtime library search paths (RPATHs) -* ``$rpath_flag$dep_prefix/lib`` -* ``$rpath_flag$dep_prefix/lib64`` +^^^^^^^^^^^^^^^^^^^^^^^ +Shell command functions +^^^^^^^^^^^^^^^^^^^^^^^ -Include search paths -* ``-I$dep_prefix/include`` +Recall the install method from ``libelf``: -An example of this would be the ``libdwarf`` build, which has one -dependency: ``libelf``. Every call to ``cc`` in the ``libdwarf`` -build will have ``-I$LIBELF_PREFIX/include``, -``-L$LIBELF_PREFIX/lib``, and ``$rpath_flag$LIBELF_PREFIX/lib`` -inserted on the command line. This is done transparently to the -project's build system, which will just think it's using a system -where ``libelf`` is readily available. Because of this, you **do -not** have to insert extra ``-I``, ``-L``, etc. on the command line. +.. literalinclude:: ../../../var/spack/repos/builtin/packages/libelf/package.py + :pyobject: Libelf.install + :linenos: -Another useful consequence of this is that you often do *not* have to -add extra parameters on the ``configure`` line to get autotools to -find dependencies. The ``libdwarf`` install method just calls -configure like this: +Normally in Python, you'd have to write something like this in order +to execute shell commands: .. code-block:: python - configure("--prefix=" + prefix) + import subprocess + subprocess.check_call('configure', '--prefix={0}'.format(prefix)) -Because of the ``-L`` and ``-I`` arguments, configure will -successfully find ``libdwarf.h`` and ``libdwarf.so``, without the -packager having to provide ``--with-libdwarf=/path/to/libdwarf`` on -the command line. +We've tried to make this a bit easier by providing callable wrapper +objects for some shell commands. By default, ``configure``, +``cmake``, and ``make`` wrappers are are provided, so you can call +them more naturally in your package files. -.. note:: +If you need other commands, you can use ``which`` to get them: - For most compilers, ``$rpath_flag`` is ``-Wl,-rpath,``. However, NAG - passes its flags to GCC instead of passing them directly to the linker. - Therefore, its ``$rpath_flag`` is doubly wrapped: ``-Wl,-Wl,,-rpath,``. - ``$rpath_flag`` can be overriden on a compiler specific basis in - ``lib/spack/spack/compilers/$compiler.py``. +.. code-block:: python -The compiler wrappers also pass the compiler flags specified by the user from -the command line (``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, -and/or ``ldlibs``). They do not override the canonical autotools flags with the -same names (but in ALL-CAPS) that may be passed into the build by particularly -challenging package scripts. + sed = which('sed') + sed('s/foo/bar/', filename) + +The ``which`` function will search the ``PATH`` for the application. + +Callable wrappers also allow spack to provide some special features. +For example, in Spack, ``make`` is parallel by default, and Spack +figures out the number of cores on your machine and passes an +appropriate value for ``-j`` when it calls ``make`` (see the +``parallel`` `package attribute `). In +a package file, you can supply a keyword argument, ``parallel=False``, +to the ``make`` wrapper to disable parallel make. In the ``libelf`` +package, this allows us to avoid race conditions in the library's +build system. ^^^^^^^^^^^^^^ Compiler flags ^^^^^^^^^^^^^^ -In rare circumstances such as compiling and running small unit tests, a package -developer may need to know what are the appropriate compiler flags to enable -features like ``OpenMP``, ``c++11``, ``c++14`` and alike. To that end the -compiler classes in ``spack`` implement the following **properties**: -``openmp_flag``, ``cxx11_flag``, ``cxx14_flag``, which can be accessed in a -package by ``self.compiler.cxx11_flag`` and alike. Note that the implementation -is such that if a given compiler version does not support this feature, an -error will be produced. Therefore package developers can also use these properties -to assert that a compiler supports the requested feature. This is handy when a -package supports additional variants like +In rare circumstances such as compiling and running small unit tests, a +package developer may need to know what are the appropriate compiler +flags to enable features like ``OpenMP``, ``c++11``, ``c++14`` and +alike. To that end the compiler classes in ``spack`` implement the +following **properties**: ``openmp_flag``, ``cxx11_flag``, +``cxx14_flag``, which can be accessed in a package by +``self.compiler.cxx11_flag`` and alike. Note that the implementation is +such that if a given compiler version does not support this feature, an +error will be produced. Therefore package developers can also use these +properties to assert that a compiler supports the requested feature. This +is handy when a package supports additional variants like .. code-block:: python variant('openmp', default=True, description="Enable OpenMP support.") -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Message Parsing Interface (MPI) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -It is common for high performance computing software/packages to use ``MPI``. -As a result of conretization, a given package can be built using different -implementations of MPI such as ``Openmpi``, ``MPICH`` or ``IntelMPI``. -In some scenarios, to configure a package, one has to provide it with appropriate MPI -compiler wrappers such as ``mpicc``, ``mpic++``. -However different implementations of ``MPI`` may have different names for those -wrappers. In order to make package's ``install()`` method indifferent to the -choice ``MPI`` implementation, each package which implements ``MPI`` sets up -``self.spec.mpicc``, ``self.spec.mpicxx``, ``self.spec.mpifc`` and ``self.spec.mpif77`` -to point to ``C``, ``C++``, ``Fortran 90`` and ``Fortran 77`` ``MPI`` wrappers. -Package developers are advised to use these variables, for example ``self.spec['mpi'].mpicc`` -instead of hard-coding ``join_path(self.spec['mpi'].prefix.bin, 'mpicc')`` for -the reasons outlined above. - ^^^^^^^^^^^^^^^^^^^^^^^^^ Blas and Lapack libraries ^^^^^^^^^^^^^^^^^^^^^^^^^ -Different packages provide implementation of ``Blas`` and ``Lapack`` routines. -The names of the resulting static and/or shared libraries differ from package -to package. In order to make the ``install()`` method independent of the -choice of ``Blas`` implementation, each package which provides it -sets up ``self.spec.blas_libs`` to point to the correct ``Blas`` libraries. -The same applies to packages which provide ``Lapack``. Package developers are advised to -use these variables, for example ``spec['blas'].blas_libs.joined()`` instead of -hard-coding ``join_path(spec['blas'].prefix.lib, 'libopenblas.so')``. - -^^^^^^^^^^^^^^^^^^^^^ -Forking ``install()`` -^^^^^^^^^^^^^^^^^^^^^ - -To give packagers free reign over their install environment, Spack -forks a new process each time it invokes a package's ``install()`` -method. This allows packages to have their own completely sandboxed -build environment, without impacting other jobs that the main Spack -process runs. Packages are free to change the environment or to -modify Spack internals, because each ``install()`` call has its own -dedicated process. +Different packages provide implementation of ``Blas`` and ``Lapack`` +routines. The names of the resulting static and/or shared libraries +differ from package to package. In order to make the ``install()`` method +independent of the choice of ``Blas`` implementation, each package which +provides it sets up ``self.spec.blas_libs`` to point to the correct +``Blas`` libraries. The same applies to packages which provide +``Lapack``. Package developers are advised to use these variables, for +example ``spec['blas'].blas_libs.joined()`` instead of hard-coding +``join_path(spec['blas'].prefix.lib, 'libopenblas.so')``. .. _prefix-objects: ------------------ -Failing the build ------------------ - -Sometimes you don't want a package to successfully install unless some -condition is true. You can explicitly cause the build to fail from -``install()`` by raising an ``InstallError``, for example: - -.. code-block:: python - - if spec.architecture.startswith('darwin'): - raise InstallError('This package does not build on Mac OS X!') - --------------- +^^^^^^^^^^^^^^^^^^^^^ Prefix objects --------------- +^^^^^^^^^^^^^^^^^^^^^ Spack passes the ``prefix`` parameter to the install method so that you can pass it to ``configure``, ``cmake``, or some other installer, @@ -2657,50 +2623,248 @@ method (the one without the ``@when`` decorator) will be called. versions. There's not much we can do to get around this because of the way decorators work. +.. _compiler-wrappers: -.. _shell-wrappers: +--------------------- +Compiler wrappers +--------------------- ------------------------ -Shell command functions ------------------------ +As mentioned, ``CC``, ``CXX``, ``F77``, and ``FC`` are set to point to +Spack's compiler wrappers. These are simply called ``cc``, ``c++``, +``f77``, and ``f90``, and they live in ``$SPACK_ROOT/lib/spack/env``. -Recall the install method from ``libelf``: +``$SPACK_ROOT/lib/spack/env`` is added first in the ``PATH`` +environment variable when ``install()`` runs so that system compilers +are not picked up instead. -.. literalinclude:: ../../../var/spack/repos/builtin/packages/libelf/package.py - :pyobject: Libelf.install - :linenos: +All of these compiler wrappers point to a single compiler wrapper +script that figures out which *real* compiler it should be building +with. This comes either from spec `concretization +`_ or from a user explicitly asking for a +particular compiler using, e.g., ``%intel`` on the command line. -Normally in Python, you'd have to write something like this in order -to execute shell commands: +In addition to invoking the right compiler, the compiler wrappers add +flags to the compile line so that dependencies can be easily found. +These flags are added for each dependency, if they exist: + +Compile-time library search paths +* ``-L$dep_prefix/lib`` +* ``-L$dep_prefix/lib64`` + +Runtime library search paths (RPATHs) +* ``$rpath_flag$dep_prefix/lib`` +* ``$rpath_flag$dep_prefix/lib64`` + +Include search paths +* ``-I$dep_prefix/include`` + +An example of this would be the ``libdwarf`` build, which has one +dependency: ``libelf``. Every call to ``cc`` in the ``libdwarf`` +build will have ``-I$LIBELF_PREFIX/include``, +``-L$LIBELF_PREFIX/lib``, and ``$rpath_flag$LIBELF_PREFIX/lib`` +inserted on the command line. This is done transparently to the +project's build system, which will just think it's using a system +where ``libelf`` is readily available. Because of this, you **do +not** have to insert extra ``-I``, ``-L``, etc. on the command line. + +Another useful consequence of this is that you often do *not* have to +add extra parameters on the ``configure`` line to get autotools to +find dependencies. The ``libdwarf`` install method just calls +configure like this: .. code-block:: python - import subprocess - subprocess.check_call('configure', '--prefix={0}'.format(prefix)) + configure("--prefix=" + prefix) -We've tried to make this a bit easier by providing callable wrapper -objects for some shell commands. By default, ``configure``, -``cmake``, and ``make`` wrappers are are provided, so you can call -them more naturally in your package files. +Because of the ``-L`` and ``-I`` arguments, configure will +successfully find ``libdwarf.h`` and ``libdwarf.so``, without the +packager having to provide ``--with-libdwarf=/path/to/libdwarf`` on +the command line. -If you need other commands, you can use ``which`` to get them: +.. note:: + + For most compilers, ``$rpath_flag`` is ``-Wl,-rpath,``. However, NAG + passes its flags to GCC instead of passing them directly to the linker. + Therefore, its ``$rpath_flag`` is doubly wrapped: ``-Wl,-Wl,,-rpath,``. + ``$rpath_flag`` can be overriden on a compiler specific basis in + ``lib/spack/spack/compilers/$compiler.py``. + +The compiler wrappers also pass the compiler flags specified by the user from +the command line (``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, +and/or ``ldlibs``). They do not override the canonical autotools flags with the +same names (but in ALL-CAPS) that may be passed into the build by particularly +challenging package scripts. + +--------------------- +MPI support in Spack +--------------------- + +It is common for high performance computing software/packages to use the +Message Passing Interface ( ``MPI``). As a result of conretization, a +given package can be built using different implementations of MPI such as +``Openmpi``, ``MPICH`` or ``IntelMPI``. That is, when your package +declares that it ``depends_on('mpi')``, it can be built with any of these +``mpi`` implementations. In some scenarios, to configure a package, one +has to provide it with appropriate MPI compiler wrappers such as +``mpicc``, ``mpic++``. However different implementations of ``MPI`` may +have different names for those wrappers. + +Spack provides an idiomatic way to use MPI compilers in your package. To +use MPI wrappers to compile your whole build, do this in your +``install()`` method: .. code-block:: python - sed = which('sed') - sed('s/foo/bar/', filename) + env['CC'] = spec['mpi'].mpicc + env['CXX'] = spec['mpi'].mpicxx + env['F77'] = spec['mpi'].mpif77 + env['FC'] = spec['mpi'].mpifc -The ``which`` function will search the ``PATH`` for the application. +That's all. A longer explanation of why this works is below. -Callable wrappers also allow spack to provide some special features. -For example, in Spack, ``make`` is parallel by default, and Spack -figures out the number of cores on your machine and passes an -appropriate value for ``-j`` when it calls ``make`` (see the -``parallel`` `package attribute `). In -a package file, you can supply a keyword argument, ``parallel=False``, -to the ``make`` wrapper to disable parallel make. In the ``libelf`` -package, this allows us to avoid race conditions in the library's -build system. +We don't try to force any particular build method on packagers. The +decision to use MPI wrappers depends on the way the package is written, +on common practice, and on "what works". Loosely, There are three types +of MPI builds: + + 1. Some build systems work well without the wrappers and can treat MPI + as an external library, where the person doing the build has to + supply includes/libs/etc. This is fairly uncommon. + + 2. Others really want the wrappers and assume you're using an MPI + "compiler" – i.e., they have no mechanism to add MPI + includes/libraries/etc. + + 3. CMake's ``FindMPI`` needs the compiler wrappers, but it uses them to + extract ``–I`` / ``-L`` / ``-D`` arguments, then treats MPI like a + regular library. + +Note that some CMake builds fall into case 2 because they either don't +know about or don't like CMake's ``FindMPI`` support – they just assume +an MPI compiler. Also, some autotools builds fall into case 3 (e.g. `here +is an autotools version of CMake's FindMPI +`_). + +Given all of this, we leave the use of the wrappers up to the packager. +Spack will support all three ways of building MPI packages. + +^^^^^^^^^^^^^^^^^^^^^ +Packaging Conventions +^^^^^^^^^^^^^^^^^^^^^ + +As mentioned above, in the ``install()`` method, ``CC``, ``CXX``, +``F77``, and ``FC`` point to Spack's wrappers around the chosen compiler. +Spack's wrappers are not the MPI compiler wrappers, though they do +automatically add ``–I``, ``–L``, and ``–Wl,-rpath`` args for +dependencies in a similar way. The MPI wrappers are a bit different in +that they also add ``-l`` arguments for the MPI libraries, and some add +special ``-D`` arguments to trigger build options in MPI programs. + +For case 1 above, you generally don't need to do more than patch your +Makefile or add configure args as you normally would. + +For case 3, you don't need to do much of anything, as Spack puts the MPI +compiler wrappers in the PATH, and the build will find them and +interrogate them. + +For case 2, things are a bit more complicated, as you'll need to tell the +build to use the MPI compiler wrappers instead of Spack's compiler +wrappers. All it takes some lines like this: + +.. code-block:: python + + env['CC'] = spec['mpi'].mpicc + env['CXX'] = spec['mpi'].mpicxx + env['F77'] = spec['mpi'].mpif77 + env['FC'] = spec['mpi'].mpifc + +Or, if you pass CC, CXX, etc. directly to your build with, e.g., +`--with-cc=`, you'll want to substitute `spec['mpi'].mpicc` in +there instead, e.g.: + +.. code-block:: python + + configure('—prefix=%s' % prefix, + '—with-cc=%s' % spec['mpi'].mpicc) + +Now, you may think that doing this will lose the includes, library paths, +and RPATHs that Spack's compiler wrapper get you, but we've actually set +things up so that the MPI compiler wrappers use Spack's compiler wrappers +when run from within Spack. So using the MPI wrappers should really be as +simple as the code above. + +^^^^^^^^^^^^^^^^^^^^^ +``spec['mpi']`` +^^^^^^^^^^^^^^^^^^^^^ + +Ok, so how does all this work? + +If your package has a virtual dependency like ``mpi``, then referring to +``spec['mpi']`` within ``install()`` will get you the concrete ``mpi`` +implementation in your dependency DAG. That is a spec object just like +the one passed to install, only the MPI implementations all set some +additional properties on it to help you out. E.g., in mvapich2, you'll +find this: + +.. code-block:: python + + def setup_dependent_package(self, module, dep_spec): + self.spec.mpicc = join_path(self.prefix.bin, 'mpicc') + # … etc … + +That code allows the mvapich2 package to associate an ``mpicc`` property +with the ``mvapich2`` node in the DAG, so that dependents can access it. +``openmpi`` and ``mpich`` do similar things. So, no matter what MPI +you're using, spec['mpi'].mpicc gets you the location of the MPI +compilers. This allows us to have a fairly simple polymorphic interface +for information about virtual dependencies like MPI. + +^^^^^^^^^^^^^^^^^^^^^ +Wrapping wrappers +^^^^^^^^^^^^^^^^^^^^^ + +Spack likes to use its own compiler wrappers to make it easy to add +``RPATHs`` to builds, and to try hard to ensure that your builds use the +right dependencies. This doesn't play nicely by default with MPI, so we +have to do a couple tricks. + + 1. If we build MPI with Spack's wrappers, mpicc and friends will be + installed with hard-coded paths to Spack's wrappers, and using them + from outside of Spack will fail because they only work within Spack. + To fix this, we patch mpicc and friends to use the regular + compilers. Look at the filter_compilers method in mpich, openmpi, + or mvapich2 for details. + + 2. We still want to use the Spack compiler wrappers when Spack is + calling mpicc. Luckily, wrappers in all mainstream MPI + implementations provide environment variables that allow us to + dynamically set the compiler to be used by mpicc, mpicxx, etc. + Denis pasted some code from this below – Spack's build environment + sets ``MPICC``, ``MPICXX``, etc. for mpich derivatives and + ``OMPI_CC``, ``OMPI_CXX``, etc. for OpenMPI. This makes the MPI + compiler wrappers use the Spack compiler wrappers so that your + dependencies still get proper RPATHs even if you use the MPI + wrappers. + +^^^^^^^^^^^^^^^^^^^^^ +MPI on Cray machines +^^^^^^^^^^^^^^^^^^^^^ + +The Cray programming environment notably uses ITS OWN compiler wrappers, +which function like MPI wrappers. On Cray systems, the ``CC``, ``cc``, +and ``ftn`` wrappers ARE the MPI compiler wrappers, and it's assumed that +you'll use them for all of your builds. So on Cray we don't bother with +``mpicc``, ``mpicxx``, etc, Spack MPI implementations set +``spec['mpi'].mpicc`` to point to Spack's wrappers, which wrap the Cray +wrappers, which wrap the regular compilers and include MPI flags. That +may seem complicated, but for packagers, that means the same code for +using MPI wrappers will work, even on even on a Cray: + +.. code-block:: python + + env['CC'] = spec['mpi'].mpicc + +This is because on Cray, ``spec['mpi'].mpicc`` is just ``spack_cc``. .. _sanity-checks: @@ -2963,9 +3127,9 @@ File functions .. _package-lifecycle: ------------------------ -Coding Style Guidelines ------------------------ +----------------------------- +Style guidelines for packages +----------------------------- The following guidelines are provided, in the interests of making Spack packages work in a consistent manner: -- cgit v1.2.3-70-g09d2 From 6158115ca8ca8604d69865b38099134c30aa4fc8 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 26 Jan 2017 04:33:01 -0600 Subject: Standardize argparse help messages (#2847) --- bin/spack | 14 +++++++------- lib/spack/spack/cmd/activate.py | 6 +++--- lib/spack/spack/cmd/arch.py | 4 ++-- lib/spack/spack/cmd/bootstrap.py | 2 +- lib/spack/spack/cmd/build.py | 2 +- lib/spack/spack/cmd/cd.py | 2 +- lib/spack/spack/cmd/checksum.py | 8 ++++---- lib/spack/spack/cmd/clean.py | 2 +- lib/spack/spack/cmd/common/arguments.py | 16 ++++++++-------- lib/spack/spack/cmd/compiler.py | 18 +++++++++--------- lib/spack/spack/cmd/compilers.py | 4 ++-- lib/spack/spack/cmd/config.py | 16 ++++++++-------- lib/spack/spack/cmd/configure.py | 4 ++-- lib/spack/spack/cmd/create.py | 12 ++++++------ lib/spack/spack/cmd/deactivate.py | 10 +++++----- lib/spack/spack/cmd/debug.py | 4 ++-- lib/spack/spack/cmd/dependents.py | 4 ++-- lib/spack/spack/cmd/diy.py | 12 ++++++------ lib/spack/spack/cmd/doc.py | 4 ++-- lib/spack/spack/cmd/edit.py | 12 ++++++------ lib/spack/spack/cmd/env.py | 4 ++-- lib/spack/spack/cmd/extensions.py | 10 +++++----- lib/spack/spack/cmd/fetch.py | 8 ++++---- lib/spack/spack/cmd/find.py | 24 ++++++++++++------------ lib/spack/spack/cmd/flake8.py | 10 +++++----- lib/spack/spack/cmd/graph.py | 16 ++++++++-------- lib/spack/spack/cmd/help.py | 2 +- lib/spack/spack/cmd/info.py | 4 ++-- lib/spack/spack/cmd/install.py | 28 ++++++++++++++-------------- lib/spack/spack/cmd/list.py | 8 ++++---- lib/spack/spack/cmd/load.py | 6 +++--- lib/spack/spack/cmd/location.py | 22 +++++++++++----------- lib/spack/spack/cmd/md5.py | 4 ++-- lib/spack/spack/cmd/mirror.py | 24 ++++++++++++------------ lib/spack/spack/cmd/module.py | 18 +++++++++--------- lib/spack/spack/cmd/patch.py | 4 ++-- lib/spack/spack/cmd/pkg.py | 18 +++++++++--------- lib/spack/spack/cmd/providers.py | 4 ++-- lib/spack/spack/cmd/purge.py | 10 +++++----- lib/spack/spack/cmd/python.py | 10 +++++----- lib/spack/spack/cmd/reindex.py | 2 +- lib/spack/spack/cmd/repo.py | 18 +++++++++--------- lib/spack/spack/cmd/restage.py | 2 +- lib/spack/spack/cmd/setup.py | 8 ++++---- lib/spack/spack/cmd/spec.py | 14 +++++++------- lib/spack/spack/cmd/stage.py | 6 +++--- lib/spack/spack/cmd/test.py | 10 +++++----- lib/spack/spack/cmd/uninstall.py | 18 +++++++++--------- lib/spack/spack/cmd/unload.py | 4 ++-- lib/spack/spack/cmd/unuse.py | 4 ++-- lib/spack/spack/cmd/url_parse.py | 4 ++-- lib/spack/spack/cmd/urls.py | 10 +++++----- lib/spack/spack/cmd/use.py | 4 ++-- lib/spack/spack/cmd/versions.py | 4 ++-- lib/spack/spack/cmd/view.py | 20 ++++++++++---------- 55 files changed, 259 insertions(+), 259 deletions(-) (limited to 'lib') diff --git a/bin/spack b/bin/spack index 66bebe57e7..9f17443d00 100755 --- a/bin/spack +++ b/bin/spack @@ -102,19 +102,19 @@ spec expressions: [^DEPENDENCY [CONSTRAINTS] ...]""")) parser.add_argument('-d', '--debug', action='store_true', - help="Write out debug logs during compile") + help="write out debug logs during compile") parser.add_argument('-D', '--pdb', action='store_true', - help="Run spack under the pdb debugger") + help="run spack under the pdb debugger") parser.add_argument('-k', '--insecure', action='store_true', - help="Do not check ssl certificates when downloading.") + help="do not check ssl certificates when downloading") parser.add_argument('-m', '--mock', action='store_true', - help="Use mock packages instead of real ones.") + help="use mock packages instead of real ones") parser.add_argument('-p', '--profile', action='store_true', - help="Profile execution using cProfile.") + help="profile execution using cProfile") parser.add_argument('-v', '--verbose', action='store_true', - help="Print additional output during builds") + help="print additional output during builds") parser.add_argument('-s', '--stacktrace', action='store_true', - help="Add stacktrace information to all printed statements") + help="add stacktrace information to all printed statements") parser.add_argument('-V', '--version', action='version', version="%s" % spack.spack_version) diff --git a/lib/spack/spack/cmd/activate.py b/lib/spack/spack/cmd/activate.py index 797cdcb136..f21799753b 100644 --- a/lib/spack/spack/cmd/activate.py +++ b/lib/spack/spack/cmd/activate.py @@ -27,16 +27,16 @@ import llnl.util.tty as tty import spack import spack.cmd -description = "Activate a package extension." +description = "activate a package extension" def setup_parser(subparser): subparser.add_argument( '-f', '--force', action='store_true', - help="Activate without first activating dependencies.") + help="activate without first activating dependencies") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="spec of package extension to activate.") + help="spec of package extension to activate") def activate(parser, args): diff --git a/lib/spack/spack/cmd/arch.py b/lib/spack/spack/cmd/arch.py index 4e29230c28..5b9daf9dea 100644 --- a/lib/spack/spack/cmd/arch.py +++ b/lib/spack/spack/cmd/arch.py @@ -24,14 +24,14 @@ ############################################################################## import spack.architecture as architecture -description = "Print architecture information about this machine." +description = "print architecture information about this machine" def setup_parser(subparser): parts = subparser.add_mutually_exclusive_group() parts.add_argument( '-p', '--platform', action='store_true', default=False, - help="Print only the platform.") + help="print only the platform") def arch(parser, args): diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index a79ef4aa68..a804086a38 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -32,7 +32,7 @@ from spack.util.executable import ProcessError, which _SPACK_UPSTREAM = 'https://github.com/llnl/spack' -description = "Create a new installation of spack in another prefix" +description = "create a new installation of spack in another prefix" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 6c0029794f..6a90af907d 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -26,7 +26,7 @@ import spack.cmd.configure as cfg from spack import * -description = 'Stops at build stage when installing a package, if possible' +description = 'stops at build stage when installing a package, if possible' build_system_to_phase = { CMakePackage: 'build', diff --git a/lib/spack/spack/cmd/cd.py b/lib/spack/spack/cmd/cd.py index cf7232258c..784ad4ac83 100644 --- a/lib/spack/spack/cmd/cd.py +++ b/lib/spack/spack/cmd/cd.py @@ -25,7 +25,7 @@ import spack.cmd.location import spack.modules -description = "cd to spack directories in the shell." +description = "cd to spack directories in the shell" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index 8e4de0efc3..4ea31efe08 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -35,19 +35,19 @@ from spack.stage import Stage, FailedDownloadError from spack.util.naming import * from spack.version import * -description = "Checksum available versions of a package." +description = "checksum available versions of a package" def setup_parser(subparser): subparser.add_argument( 'package', - help='Package to checksum versions for') + help='package to checksum versions for') subparser.add_argument( '--keep-stage', action='store_true', - help="Don't clean up staging area when command completes.") + help="don't clean up staging area when command completes") subparser.add_argument( 'versions', nargs=argparse.REMAINDER, - help='Versions to generate checksums for') + help='versions to generate checksums for') def get_checksums(url_dict, name, **kwargs): diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py index dc62fbcaf6..6c70b5bd38 100644 --- a/lib/spack/spack/cmd/clean.py +++ b/lib/spack/spack/cmd/clean.py @@ -29,7 +29,7 @@ import llnl.util.tty as tty import spack import spack.cmd -description = "Remove build stage and source tarball for packages." +description = "remove build stage and source tarball for packages" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index f091b9cf75..b527c7f138 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -76,32 +76,32 @@ class ConstraintAction(argparse.Action): _arguments['constraint'] = Args( 'constraint', nargs=argparse.REMAINDER, action=ConstraintAction, - help='Constraint to select a subset of installed packages') + help='constraint to select a subset of installed packages') _arguments['module_type'] = Args( - '-m', '--module-type', help='Type of module files', + '-m', '--module-type', help='type of module files', default='tcl', choices=spack.modules.module_types) _arguments['yes_to_all'] = Args( '-y', '--yes-to-all', action='store_true', dest='yes_to_all', - help='Assume "yes" is the answer to every confirmation request.') + help='assume "yes" is the answer to every confirmation request') _arguments['recurse_dependencies'] = Args( '-r', '--dependencies', action='store_true', dest='recurse_dependencies', - help='Recursively traverse spec dependencies') + help='recursively traverse spec dependencies') _arguments['clean'] = Args( '--clean', action='store_false', dest='dirty', - help='Clean environment before installing package.') + help='clean environment before installing package') _arguments['dirty'] = Args( '--dirty', action='store_true', dest='dirty', - help='Do NOT clean environment before installing.') + help='do NOT clean environment before installing') _arguments['long'] = Args( '-l', '--long', action='store_true', - help='Show dependency hashes as well as versions.') + help='show dependency hashes as well as versions') _arguments['very_long'] = Args( '-L', '--very-long', action='store_true', - help='Show full dependency hashes as well as versions.') + help='show full dependency hashes as well as versions') diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 609210f77e..c609794185 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -35,7 +35,7 @@ from llnl.util.tty.color import colorize from spack.spec import CompilerSpec, ArchSpec from spack.util.environment import get_path -description = "Manage compilers" +description = "manage compilers" def setup_parser(subparser): @@ -47,35 +47,35 @@ def setup_parser(subparser): # Find find_parser = sp.add_parser( 'find', aliases=['add'], - help='Search the system for compilers to add to Spack configuration.') + help='search the system for compilers to add to Spack configuration') find_parser.add_argument('add_paths', nargs=argparse.REMAINDER) find_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_modify_scope, - help="Configuration scope to modify.") + help="configuration scope to modify") # Remove remove_parser = sp.add_parser( - 'remove', aliases=['rm'], help='Remove compiler by spec.') + 'remove', aliases=['rm'], help='remove compiler by spec') remove_parser.add_argument( '-a', '--all', action='store_true', - help='Remove ALL compilers that match spec.') + help='remove ALL compilers that match spec') remove_parser.add_argument('compiler_spec') remove_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_modify_scope, - help="Configuration scope to modify.") + help="configuration scope to modify") # List list_parser = sp.add_parser('list', help='list available compilers') list_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_list_scope, - help="Configuration scope to read from.") + help="configuration scope to read from") # Info - info_parser = sp.add_parser('info', help='Show compiler paths.') + info_parser = sp.add_parser('info', help='show compiler paths') info_parser.add_argument('compiler_spec') info_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_list_scope, - help="Configuration scope to read from.") + help="configuration scope to read from") def compiler_find(args): diff --git a/lib/spack/spack/cmd/compilers.py b/lib/spack/spack/cmd/compilers.py index b87f977e5a..934fc6cf06 100644 --- a/lib/spack/spack/cmd/compilers.py +++ b/lib/spack/spack/cmd/compilers.py @@ -25,12 +25,12 @@ import spack from spack.cmd.compiler import compiler_list -description = "List available compilers. Same as 'spack compiler list'." +description = "list available compilers, same as 'spack compiler list'" def setup_parser(subparser): subparser.add_argument('--scope', choices=spack.config.config_scopes, - help="Configuration scope to read/modify.") + help="configuration scope to read/modify") def compilers(parser, args): diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index 3288c4cb8b..1a9e44a8b9 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -24,27 +24,27 @@ ############################################################################## import spack.config -description = "Get and set configuration options." +description = "get and set configuration options" def setup_parser(subparser): # User can only choose one subparser.add_argument('--scope', choices=spack.config.config_scopes, - help="Configuration scope to read/modify.") + help="configuration scope to read/modify") sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='config_command') - get_parser = sp.add_parser('get', help='Print configuration values.') + get_parser = sp.add_parser('get', help='print configuration values') get_parser.add_argument('section', - help="Configuration section to print. " - "Options: %(choices)s.", + help="configuration section to print. " + "options: %(choices)s", metavar='SECTION', choices=spack.config.section_schemas) - edit_parser = sp.add_parser('edit', help='Edit configuration file.') + edit_parser = sp.add_parser('edit', help='edit configuration file') edit_parser.add_argument('section', - help="Configuration section to edit. " - "Options: %(choices)s.", + help="configuration section to edit. " + "options: %(choices)s", metavar='SECTION', choices=spack.config.section_schemas) diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 3eebe2584b..7b1ef04522 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -31,7 +31,7 @@ import spack.cmd.install as inst from spack import * -description = 'Stops at configuration stage when installing a package, if possible' # NOQA: ignore=E501 +description = 'stops at configuration stage when installing a package, if possible' # NOQA: ignore=E501 build_system_to_phase = { @@ -49,7 +49,7 @@ def setup_parser(subparser): subparser.add_argument( '-v', '--verbose', action='store_true', - help="Print additional output during builds" + help="print additional output during builds" ) diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 19128e3513..aa3f82a331 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -39,7 +39,7 @@ from spack.spec import Spec from spack.util.executable import which from spack.util.naming import * -description = "Create a new package file" +description = "create a new package file" package_template = '''\ ############################################################################## @@ -315,7 +315,7 @@ def setup_parser(subparser): help="url of package archive") subparser.add_argument( '--keep-stage', action='store_true', - help="Don't clean up staging area when command completes.") + help="don't clean up staging area when command completes") subparser.add_argument( '-n', '--name', help="name of the package to create") @@ -324,14 +324,14 @@ def setup_parser(subparser): help="build system template to use. options: %(choices)s") subparser.add_argument( '-r', '--repo', - help="Path to a repository where the package should be created.") + help="path to a repository where the package should be created") subparser.add_argument( '-N', '--namespace', - help="Specify a namespace for the package. Must be the namespace of " - "a repository registered with Spack.") + help="specify a namespace for the package. must be the namespace of " + "a repository registered with Spack") subparser.add_argument( '-f', '--force', action='store_true', - help="Overwrite any existing package file with the same name.") + help="overwrite any existing package file with the same name") class BuildSystemGuesser: diff --git a/lib/spack/spack/cmd/deactivate.py b/lib/spack/spack/cmd/deactivate.py index fedd078972..7ea2039236 100644 --- a/lib/spack/spack/cmd/deactivate.py +++ b/lib/spack/spack/cmd/deactivate.py @@ -30,20 +30,20 @@ import spack.cmd import spack.store from spack.graph import topological_sort -description = "Deactivate a package extension." +description = "deactivate a package extension" def setup_parser(subparser): subparser.add_argument( '-f', '--force', action='store_true', - help="Run deactivation even if spec is NOT currently activated.") + help="run deactivation even if spec is NOT currently activated") subparser.add_argument( '-a', '--all', action='store_true', - help="Deactivate all extensions of an extendable package, or " - "deactivate an extension AND its dependencies.") + help="deactivate all extensions of an extendable package, or " + "deactivate an extension AND its dependencies") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="spec of package extension to deactivate.") + help="spec of package extension to deactivate") def deactivate(parser, args): diff --git a/lib/spack/spack/cmd/debug.py b/lib/spack/spack/cmd/debug.py index c7e90cb210..06dea9ea70 100644 --- a/lib/spack/spack/cmd/debug.py +++ b/lib/spack/spack/cmd/debug.py @@ -33,13 +33,13 @@ from llnl.util.filesystem import working_dir import spack from spack.util.executable import which -description = "Debugging commands for troubleshooting Spack." +description = "debugging commands for troubleshooting Spack" def setup_parser(subparser): sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='debug_command') sp.add_parser('create-db-tarball', - help="Create a tarball of Spack's installation metadata.") + help="create a tarball of Spack's installation metadata") def _debug_tarball_suffix(): diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index dc2ee658ac..8c533561e3 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -30,13 +30,13 @@ import spack import spack.store import spack.cmd -description = "Show installed packages that depend on another." +description = "show installed packages that depend on another" def setup_parser(subparser): subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="specs to list dependencies of.") + help="specs to list dependencies of") def dependents(parser, args): diff --git a/lib/spack/spack/cmd/diy.py b/lib/spack/spack/cmd/diy.py index dbb5a253ec..c67e189f73 100644 --- a/lib/spack/spack/cmd/diy.py +++ b/lib/spack/spack/cmd/diy.py @@ -33,25 +33,25 @@ import spack.cmd import spack.cmd.common.arguments as arguments from spack.stage import DIYStage -description = "Do-It-Yourself: build from an existing source directory." +description = "do-it-yourself: build from an existing source directory" 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.") + help="don't try to install dependencies of requested packages") subparser.add_argument( '--keep-prefix', action='store_true', - help="Don't remove the install prefix if installation fails.") + help="do not remove the install prefix if installation fails") subparser.add_argument( '--skip-patch', action='store_true', - help="Skip patching for the DIY build.") + help="skip patching for the DIY build") subparser.add_argument( '-q', '--quiet', action='store_true', dest='quiet', - help="Do not display verbose build output while installing.") + help="do not display verbose build output while installing") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="specs to use for install. Must contain package AND version.") + help="specs to use for install. must contain package AND version") cd_group = subparser.add_mutually_exclusive_group() arguments.add_common_arguments(cd_group, ['clean', 'dirty']) diff --git a/lib/spack/spack/cmd/doc.py b/lib/spack/spack/cmd/doc.py index 291b17216f..12ae6b4973 100644 --- a/lib/spack/spack/cmd/doc.py +++ b/lib/spack/spack/cmd/doc.py @@ -23,11 +23,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -description = "Run pydoc from within spack." +description = "run pydoc from within spack" def setup_parser(subparser): - subparser.add_argument('entity', help="Run pydoc help on entity") + subparser.add_argument('entity', help="run pydoc help on entity") def doc(parser, args): diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py index 23fd307ab4..f439736192 100644 --- a/lib/spack/spack/cmd/edit.py +++ b/lib/spack/spack/cmd/edit.py @@ -32,7 +32,7 @@ import spack.cmd from spack.spec import Spec from spack.repository import Repo -description = "Open package files in $EDITOR" +description = "open package files in $EDITOR" def edit_package(name, repo_path, namespace): @@ -76,23 +76,23 @@ def setup_parser(subparser): excl_args.add_argument( '-c', '--command', dest='path', action='store_const', const=spack.cmd.command_path, - help="Edit the command with the supplied name.") + help="edit the command with the supplied name") excl_args.add_argument( '-t', '--test', dest='path', action='store_const', const=spack.test_path, - help="Edit the test with the supplied name.") + help="edit the test with the supplied name") excl_args.add_argument( '-m', '--module', dest='path', action='store_const', const=spack.module_path, - help="Edit the main spack module with the supplied name.") + help="edit the main spack module with the supplied name") # Options for editing packages excl_args.add_argument( '-r', '--repo', default=None, - help="Path to repo to edit package in.") + help="path to repo to edit package in") excl_args.add_argument( '-N', '--namespace', default=None, - help="Namespace of package to edit.") + help="namespace of package to edit") subparser.add_argument( 'name', nargs='?', default=None, diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index f3bad039d4..49fc48700c 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -28,13 +28,13 @@ import llnl.util.tty as tty import spack.cmd import spack.build_environment as build_env -description = "Run a command with the install environment for a spec." +description = "run a command with the install environment for a spec" def setup_parser(subparser): subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="specs of package environment to emulate.") + help="specs of package environment to emulate") def env(parser, args): diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py index bd149044ca..94a3e8288f 100644 --- a/lib/spack/spack/cmd/extensions.py +++ b/lib/spack/spack/cmd/extensions.py @@ -32,24 +32,24 @@ import spack.cmd import spack.cmd.find import spack.store -description = "List extensions for package." +description = "list extensions for package" def setup_parser(subparser): format_group = subparser.add_mutually_exclusive_group() format_group.add_argument( '-l', '--long', action='store_true', dest='long', - help='Show dependency hashes as well as versions.') + help='show dependency hashes as well as versions') format_group.add_argument( '-p', '--paths', action='store_const', dest='mode', const='paths', - help='Show paths to extension install directories') + help='show paths to extension install directories') format_group.add_argument( '-d', '--deps', action='store_const', dest='mode', const='deps', - help='Show full dependency DAG of extensions') + help='show full dependency DAG of extensions') subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help='Spec of package to list extensions for') + help='spec of package to list extensions for') def extensions(parser, args): diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py index c1ac2ed48d..35cc23a963 100644 --- a/lib/spack/spack/cmd/fetch.py +++ b/lib/spack/spack/cmd/fetch.py @@ -27,19 +27,19 @@ import argparse import spack import spack.cmd -description = "Fetch archives for packages" +description = "fetch archives for packages" def setup_parser(subparser): subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', - help="Do not check packages against checksum") + help="do not check packages against checksum") subparser.add_argument( '-m', '--missing', action='store_true', - help="Also fetch all missing dependencies") + help="also fetch all missing dependencies") subparser.add_argument( '-D', '--dependencies', action='store_true', - help="Also fetch all dependencies") + help="also fetch all dependencies") subparser.add_argument( 'packages', nargs=argparse.REMAINDER, help="specs of packages to fetch") diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index ecd6ae2822..3a6d8270fb 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -29,7 +29,7 @@ import spack.cmd.common.arguments as arguments from spack.cmd import display_specs -description = "Find installed spack packages" +description = "find installed spack packages" def setup_parser(subparser): @@ -39,56 +39,56 @@ def setup_parser(subparser): dest='mode', const='short', default='short', - help='Show only specs (default)') + help='show only specs (default)') format_group.add_argument('-p', '--paths', action='store_const', dest='mode', const='paths', - help='Show paths to package install directories') + help='show paths to package install directories') format_group.add_argument( '-d', '--deps', action='store_const', dest='mode', const='deps', - help='Show full dependency DAG of installed packages') + help='show full dependency DAG of installed packages') arguments.add_common_arguments(subparser, ['long', 'very_long']) subparser.add_argument('-f', '--show-flags', action='store_true', dest='show_flags', - help='Show spec compiler flags.') + help='show spec compiler flags') implicit_explicit = subparser.add_mutually_exclusive_group() implicit_explicit.add_argument( '-e', '--explicit', action='store_true', - help='Show only specs that were installed explicitly') + help='show only specs that were installed explicitly') implicit_explicit.add_argument( '-E', '--implicit', action='store_true', - help='Show only specs that were installed as dependencies') + help='show only specs that were installed as dependencies') subparser.add_argument( '-u', '--unknown', action='store_true', dest='unknown', - help='Show only specs Spack does not have a package for.') + help='show only specs Spack does not have a package for') subparser.add_argument( '-m', '--missing', action='store_true', dest='missing', - help='Show missing dependencies as well as installed specs.') + help='show missing dependencies as well as installed specs') subparser.add_argument( '-v', '--variants', action='store_true', dest='variants', - help='Show variants in output (can be long)') + help='show variants in output (can be long)') subparser.add_argument('-M', '--only-missing', action='store_true', dest='only_missing', - help='Show only missing dependencies.') + help='show only missing dependencies') subparser.add_argument('-N', '--namespace', action='store_true', - help='Show fully qualified package names.') + help='show fully qualified package names') arguments.add_common_arguments(subparser, ['constraint']) diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index b8e28b0860..5ee68a80df 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -34,7 +34,7 @@ from llnl.util.filesystem import * import spack from spack.util.executable import * -description = "Runs source code style checks on Spack. Requires flake8." +description = "runs source code style checks on Spack. requires flake8" flake8 = None include_untracked = True @@ -138,17 +138,17 @@ def filter_file(source, dest, output=False): def setup_parser(subparser): subparser.add_argument( '-k', '--keep-temp', action='store_true', - help="Do not delete temporary directory where flake8 runs. " - "Use for debugging, to see filtered files.") + help="do not delete temporary directory where flake8 runs. " + "use for debugging, to see filtered files") subparser.add_argument( '-o', '--output', action='store_true', - help="Send filtered files to stdout as well as temp files.") + help="send filtered files to stdout as well as temp files") subparser.add_argument( '-r', '--root-relative', action='store_true', default=False, help="print root-relative paths (default is cwd-relative)") subparser.add_argument( '-U', '--no-untracked', dest='untracked', action='store_false', - default=True, help="Exclude untracked files from checks.") + default=True, help="exclude untracked files from checks") subparser.add_argument( 'files', nargs=argparse.REMAINDER, help="specific files to check") diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py index 6a268e6961..414b6d78ec 100644 --- a/lib/spack/spack/cmd/graph.py +++ b/lib/spack/spack/cmd/graph.py @@ -32,7 +32,7 @@ import spack.store from spack.spec import * from spack.graph import * -description = "Generate graphs of package dependency relationships." +description = "generate graphs of package dependency relationships" def setup_parser(subparser): @@ -41,31 +41,31 @@ def setup_parser(subparser): method = subparser.add_mutually_exclusive_group() method.add_argument( '-a', '--ascii', action='store_true', - help="Draw graph as ascii to stdout (default).") + help="draw graph as ascii to stdout (default)") method.add_argument( '-d', '--dot', action='store_true', - help="Generate graph in dot format and print to stdout.") + help="generate graph in dot format and print to stdout") subparser.add_argument( '-n', '--normalize', action='store_true', - help="Skip concretization; only print normalized spec.") + help="skip concretization; only print normalized spec") subparser.add_argument( '-s', '--static', action='store_true', - help="Use static information from packages, not dynamic spec info.") + help="use static information from packages, not dynamic spec info") subparser.add_argument( '-i', '--installed', action='store_true', - help="Graph all installed specs in dot format (implies --dot).") + help="graph all installed specs in dot format (implies --dot)") subparser.add_argument( '-t', '--deptype', action='store', - help="Comma-separated list of deptypes to traverse. default=%s." + help="comma-separated list of deptypes to traverse. default=%s" % ','.join(alldeps)) subparser.add_argument( 'specs', nargs=argparse.REMAINDER, - help="specs of packages to graph.") + help="specs of packages to graph") def graph(parser, args): diff --git a/lib/spack/spack/cmd/help.py b/lib/spack/spack/cmd/help.py index 5bc8fc3e74..e867ca1295 100644 --- a/lib/spack/spack/cmd/help.py +++ b/lib/spack/spack/cmd/help.py @@ -22,7 +22,7 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -description = "Get help on spack and its commands" +description = "get help on spack and its commands" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 8e7df87a02..1dd0ee4e78 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -27,7 +27,7 @@ from llnl.util.tty.colify import * import spack import spack.fetch_strategy as fs -description = "Get detailed information on a particular package" +description = "get detailed information on a particular package" def padder(str_list, extra=0): @@ -43,7 +43,7 @@ def padder(str_list, extra=0): def setup_parser(subparser): subparser.add_argument( - 'name', metavar="PACKAGE", help="Name of package to get info for.") + 'name', metavar="PACKAGE", help="name of package to get info for") def print_text_info(pkg): diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 3731fe3c81..fb01fc2d5e 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -40,7 +40,7 @@ from spack.build_environment import InstallError from spack.fetch_strategy import FetchError from spack.package import PackageBase -description = "Build and install packages" +description = "build and install packages" def setup_parser(subparser): @@ -49,29 +49,29 @@ def setup_parser(subparser): default='package,dependencies', dest='things_to_install', choices=['package', 'dependencies'], - help="""Select the mode of installation. -The default is to install the package along with all its dependencies. -Alternatively one can decide to install only the package or only -the dependencies.""" + help="""select the mode of installation. +the default is to install the package along with all its dependencies. +alternatively one can decide to install only the package or only +the dependencies""" ) subparser.add_argument( '-j', '--jobs', action='store', type=int, - help="Explicitly set number of make jobs. Default is #cpus.") + help="explicitly set number of make jobs. default is #cpus") subparser.add_argument( '--keep-prefix', action='store_true', dest='keep_prefix', - help="Don't remove the install prefix if installation fails.") + help="don't remove the install prefix if installation fails") subparser.add_argument( '--keep-stage', action='store_true', dest='keep_stage', - help="Don't remove the build stage if installation succeeds.") + 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") + help="do not check packages against checksum") subparser.add_argument( '-v', '--verbose', action='store_true', dest='verbose', - help="Display verbose build output while installing.") + help="display verbose build output while installing") subparser.add_argument( '--fake', action='store_true', dest='fake', - help="Fake install. Just remove prefix and create a fake file.") + help="fake install. just remove prefix and create a fake file") cd_group = subparser.add_mutually_exclusive_group() arguments.add_common_arguments(cd_group, ['clean', 'dirty']) @@ -83,18 +83,18 @@ the dependencies.""" ) subparser.add_argument( '--run-tests', action='store_true', dest='run_tests', - help="Run package level tests during installation." + help="run package level tests during installation" ) subparser.add_argument( '--log-format', default=None, choices=['junit'], - help="Format to be used for log files." + help="format to be used for log files" ) subparser.add_argument( '--log-file', default=None, - help="Filename for the log file. If not passed a default will be used." + help="filename for the log file. if not passed a default will be used" ) diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index e1389df69f..b5b699dccd 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -33,7 +33,7 @@ import llnl.util.tty as tty import spack from llnl.util.tty.colify import colify -description = "Print available spack packages to stdout in different formats" +description = "print available spack packages to stdout in different formats" formatters = {} @@ -47,13 +47,13 @@ def formatter(func): def setup_parser(subparser): subparser.add_argument( 'filter', nargs=argparse.REMAINDER, - help='Optional case-insensitive glob patterns to filter results.') + help='optional case-insensitive glob patterns to filter results') subparser.add_argument( '-d', '--search-description', action='store_true', default=False, - help='Filtering will also search the description for a match.') + help='filtering will also search the description for a match') subparser.add_argument( '--format', default='name_only', choices=formatters, - help='Format to be used to print the output [default: name_only]') + help='format to be used to print the output [default: name_only]') def filter_by_name(pkgs, args): diff --git a/lib/spack/spack/cmd/load.py b/lib/spack/spack/cmd/load.py index 85190a5d0b..cdc3a741ae 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -25,7 +25,7 @@ import argparse import spack.modules -description = "Add package to environment using modules." +description = "add package to environment using modules" def setup_parser(subparser): @@ -33,8 +33,8 @@ def setup_parser(subparser): message with -h. """ subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="Spec of package to load with modules. " - "(If -, read specs from STDIN)") + help="spec of package to load with modules " + "(if -, read specs from STDIN)") def load(parser, args): diff --git a/lib/spack/spack/cmd/location.py b/lib/spack/spack/cmd/location.py index 54f7185707..c82b7072f9 100644 --- a/lib/spack/spack/cmd/location.py +++ b/lib/spack/spack/cmd/location.py @@ -29,7 +29,7 @@ import llnl.util.tty as tty import spack import spack.cmd -description = "Print out locations of various directories used by Spack" +description = "print out locations of various directories used by Spack" def setup_parser(subparser): @@ -38,34 +38,34 @@ def setup_parser(subparser): directories.add_argument( '-m', '--module-dir', action='store_true', - help="Spack python module directory.") + help="spack python module directory") directories.add_argument( '-r', '--spack-root', action='store_true', - help="Spack installation root.") + help="spack installation root") directories.add_argument( '-i', '--install-dir', action='store_true', - help="Install prefix for spec (spec need not be installed).") + help="install prefix for spec (spec need not be installed)") directories.add_argument( '-p', '--package-dir', action='store_true', - help="Directory enclosing a spec's package.py file.") + help="directory enclosing a spec's package.py file") directories.add_argument( '-P', '--packages', action='store_true', - help="Top-level packages directory for Spack.") + help="top-level packages directory for Spack") directories.add_argument( '-s', '--stage-dir', action='store_true', - help="Stage directory for a spec.") + help="stage directory for a spec") directories.add_argument( '-S', '--stages', action='store_true', - help="Top level Stage directory.") + help="top level stage directory") directories.add_argument( '-b', '--build-dir', action='store_true', - help="Checked out or expanded source directory for a spec " - "(requires it to be staged first).") + help="checked out or expanded source directory for a spec " + "(requires it to be staged first)") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="spec of package to fetch directory for.") + help="spec of package to fetch directory for") def location(parser, args): diff --git a/lib/spack/spack/cmd/md5.py b/lib/spack/spack/cmd/md5.py index 2ae279a41e..7940d1327b 100644 --- a/lib/spack/spack/cmd/md5.py +++ b/lib/spack/spack/cmd/md5.py @@ -31,13 +31,13 @@ import llnl.util.tty as tty import spack.util.crypto from spack.stage import Stage, FailedDownloadError -description = "Calculate md5 checksums for files/urls." +description = "calculate md5 checksums for files/urls" def setup_parser(subparser): setup_parser.parser = subparser subparser.add_argument('files', nargs=argparse.REMAINDER, - help="Files/urls to checksum.") + help="files/urls to checksum") def compute_md5_checksum(url): diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index 585faaf524..2db75a0b1f 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -37,13 +37,13 @@ from spack.spec import Spec from spack.error import SpackError from spack.util.spack_yaml import syaml_dict -description = "Manage mirrors." +description = "manage mirrors" def setup_parser(subparser): subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', - help="Do not check fetched packages against checksum") + help="do not check fetched packages against checksum") sp = subparser.add_subparsers( metavar='SUBCOMMAND', dest='mirror_command') @@ -51,30 +51,30 @@ def setup_parser(subparser): # Create create_parser = sp.add_parser('create', help=mirror_create.__doc__) create_parser.add_argument('-d', '--directory', default=None, - help="Directory in which to create mirror.") + help="directory in which to create mirror") create_parser.add_argument( 'specs', nargs=argparse.REMAINDER, - help="Specs of packages to put in mirror") + help="specs of packages to put in mirror") create_parser.add_argument( - '-f', '--file', help="File with specs of packages to put in mirror.") + '-f', '--file', help="file with specs of packages to put in mirror") create_parser.add_argument( '-D', '--dependencies', action='store_true', - help="Also fetch all dependencies") + help="also fetch all dependencies") create_parser.add_argument( '-o', '--one-version-per-spec', action='store_const', const=1, default=0, - help="Only fetch one 'preferred' version per spec, not all known.") + help="only fetch one 'preferred' version per spec, not all known") scopes = spack.config.config_scopes # Add add_parser = sp.add_parser('add', help=mirror_add.__doc__) - add_parser.add_argument('name', help="Mnemonic name for mirror.") + add_parser.add_argument('name', help="mnemonic name for mirror") add_parser.add_argument( - 'url', help="URL of mirror directory from 'spack mirror create'.") + 'url', help="url of mirror directory from 'spack mirror create'") add_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_modify_scope, - help="Configuration scope to modify.") + help="configuration scope to modify") # Remove remove_parser = sp.add_parser('remove', aliases=['rm'], @@ -82,13 +82,13 @@ def setup_parser(subparser): remove_parser.add_argument('name') remove_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_modify_scope, - help="Configuration scope to modify.") + help="configuration scope to modify") # List list_parser = sp.add_parser('list', help=mirror_list.__doc__) list_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_list_scope, - help="Configuration scope to read from.") + help="configuration scope to read from") def mirror_add(args): diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py index b4ee561339..a924c5f912 100644 --- a/lib/spack/spack/cmd/module.py +++ b/lib/spack/spack/cmd/module.py @@ -35,7 +35,7 @@ import spack.cmd import spack.cmd.common.arguments as arguments from spack.modules import module_types -description = "Manipulate module files" +description = "manipulate module files" # Dictionary that will be populated with the list of sub-commands # Each sub-command must be callable and accept 3 arguments : @@ -57,10 +57,10 @@ def setup_parser(subparser): sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='subparser_name') # spack module refresh - refresh_parser = sp.add_parser('refresh', help='Regenerate module files') + refresh_parser = sp.add_parser('refresh', help='regenerate module files') refresh_parser.add_argument( '--delete-tree', - help='Delete the module file tree before refresh', + help='delete the module file tree before refresh', action='store_true' ) arguments.add_common_arguments( @@ -68,11 +68,11 @@ def setup_parser(subparser): ) # spack module find - find_parser = sp.add_parser('find', help='Find module files for packages') + find_parser = sp.add_parser('find', help='find module files for packages') arguments.add_common_arguments(find_parser, ['constraint', 'module_type']) # spack module rm - rm_parser = sp.add_parser('rm', help='Remove module files') + rm_parser = sp.add_parser('rm', help='remove module files') arguments.add_common_arguments( rm_parser, ['constraint', 'module_type', 'yes_to_all'] ) @@ -80,19 +80,19 @@ def setup_parser(subparser): # spack module loads loads_parser = sp.add_parser( 'loads', - help='Prompt the list of modules associated with a constraint' + help='prompt the list of modules associated with a constraint' ) loads_parser.add_argument( '--input-only', action='store_false', dest='shell', - help='Generate input for module command (instead of a shell script)' + help='generate input for module command (instead of a shell script)' ) loads_parser.add_argument( '-p', '--prefix', dest='prefix', default='', - help='Prepend to module names when issuing module load commands' + help='prepend to module names when issuing module load commands' ) loads_parser.add_argument( '-x', '--exclude', dest='exclude', action='append', default=[], - help="Exclude package from output; may be specified multiple times" + help="exclude package from output; may be specified multiple times" ) arguments.add_common_arguments( loads_parser, ['constraint', 'module_type', 'recurse_dependencies'] diff --git a/lib/spack/spack/cmd/patch.py b/lib/spack/spack/cmd/patch.py index 9c72da40b5..2e332554ad 100644 --- a/lib/spack/spack/cmd/patch.py +++ b/lib/spack/spack/cmd/patch.py @@ -29,13 +29,13 @@ import spack.cmd import spack -description = "Patch expanded archive sources in preparation for install" +description = "patch expanded archive sources in preparation for install" def setup_parser(subparser): subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', - help="Do not check downloaded packages against checksum") + help="do not check downloaded packages against checksum") subparser.add_argument( 'packages', nargs=argparse.REMAINDER, help="specs of packages to stage") diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index 7791b93cf5..45104a9ff2 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -31,7 +31,7 @@ from llnl.util.tty.colify import colify import spack from spack.util.executable import * -description = "Query packages associated with particular git revisions." +description = "query packages associated with particular git revisions" def setup_parser(subparser): @@ -40,35 +40,35 @@ def setup_parser(subparser): add_parser = sp.add_parser('add', help=pkg_add.__doc__) add_parser.add_argument('packages', nargs=argparse.REMAINDER, - help="Names of packages to add to git repo.") + help="names of packages to add to git repo") list_parser = sp.add_parser('list', help=pkg_list.__doc__) list_parser.add_argument('rev', default='HEAD', nargs='?', - help="Revision to list packages for.") + help="revision to list packages for") diff_parser = sp.add_parser('diff', help=pkg_diff.__doc__) diff_parser.add_argument( 'rev1', nargs='?', default='HEAD^', - help="Revision to compare against.") + help="revision to compare against") diff_parser.add_argument( 'rev2', nargs='?', default='HEAD', - help="Revision to compare to rev1 (default is HEAD).") + help="revision to compare to rev1 (default is HEAD)") add_parser = sp.add_parser('added', help=pkg_added.__doc__) add_parser.add_argument( 'rev1', nargs='?', default='HEAD^', - help="Revision to compare against.") + help="revision to compare against") add_parser.add_argument( 'rev2', nargs='?', default='HEAD', - help="Revision to compare to rev1 (default is HEAD).") + help="revision to compare to rev1 (default is HEAD)") rm_parser = sp.add_parser('removed', help=pkg_removed.__doc__) rm_parser.add_argument( 'rev1', nargs='?', default='HEAD^', - help="Revision to compare against.") + help="revision to compare against") rm_parser.add_argument( 'rev2', nargs='?', default='HEAD', - help="Revision to compare to rev1 (default is HEAD).") + help="revision to compare to rev1 (default is HEAD)") def get_git(): diff --git a/lib/spack/spack/cmd/providers.py b/lib/spack/spack/cmd/providers.py index 0f4a97cc4a..470e3e5ed2 100644 --- a/lib/spack/spack/cmd/providers.py +++ b/lib/spack/spack/cmd/providers.py @@ -29,13 +29,13 @@ from llnl.util.tty.colify import colify import spack import spack.cmd -description = "List packages that provide a particular virtual package" +description = "list packages that provide a particular virtual package" def setup_parser(subparser): subparser.add_argument( 'vpkg_spec', metavar='VPACKAGE_SPEC', nargs=argparse.REMAINDER, - help='Find packages that provide this virtual package') + help='find packages that provide this virtual package') def providers(parser, args): diff --git a/lib/spack/spack/cmd/purge.py b/lib/spack/spack/cmd/purge.py index 66cfc2af29..56165d5d97 100644 --- a/lib/spack/spack/cmd/purge.py +++ b/lib/spack/spack/cmd/purge.py @@ -25,22 +25,22 @@ import spack import spack.stage as stage -description = "Remove temporary build files and/or downloaded archives" +description = "remove temporary build files and/or downloaded archives" def setup_parser(subparser): subparser.add_argument( '-s', '--stage', action='store_true', default=True, - help="Remove all temporary build stages (default).") + help="remove all temporary build stages (default)") subparser.add_argument( '-d', '--downloads', action='store_true', - help="Remove cached downloads.") + help="remove cached downloads") subparser.add_argument( '-m', '--misc-cache', action='store_true', - help="Remove long-lived caches, like the virtual package index.") + help="remove long-lived caches, like the virtual package index") subparser.add_argument( '-a', '--all', action='store_true', - help="Remove all of the above.") + help="remove all of the above") def purge(parser, args): diff --git a/lib/spack/spack/cmd/python.py b/lib/spack/spack/cmd/python.py index 12727cb599..05af7bc776 100644 --- a/lib/spack/spack/cmd/python.py +++ b/lib/spack/spack/cmd/python.py @@ -31,15 +31,15 @@ import platform import spack +description = "launch an interpreter as spack would launch a command" + + def setup_parser(subparser): subparser.add_argument( - '-c', dest='python_command', help='Command to execute.') + '-c', dest='python_command', help='command to execute') subparser.add_argument( 'python_args', nargs=argparse.REMAINDER, - help="File to run plus arguments.") - - -description = "Launch an interpreter as spack would launch a command" + help="file to run plus arguments") def python(parser, args): diff --git a/lib/spack/spack/cmd/reindex.py b/lib/spack/spack/cmd/reindex.py index 7dddda2ffb..0bbd85069f 100644 --- a/lib/spack/spack/cmd/reindex.py +++ b/lib/spack/spack/cmd/reindex.py @@ -24,7 +24,7 @@ ############################################################################## import spack import spack.store -description = "Rebuild Spack's package database." +description = "rebuild Spack's package database" def reindex(parser, args): diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py index 79df63ce8d..1881654cac 100644 --- a/lib/spack/spack/cmd/repo.py +++ b/lib/spack/spack/cmd/repo.py @@ -30,7 +30,7 @@ import spack.spec import spack.config from spack.repository import * -description = "Manage package source repositories." +description = "manage package source repositories" def setup_parser(subparser): @@ -40,34 +40,34 @@ def setup_parser(subparser): # Create create_parser = sp.add_parser('create', help=repo_create.__doc__) create_parser.add_argument( - 'directory', help="Directory to create the repo in.") + 'directory', help="directory to create the repo in") create_parser.add_argument( - 'namespace', help="Namespace to identify packages in the repository. " - "Defaults to the directory name.", nargs='?') + 'namespace', help="namespace to identify packages in the repository. " + "defaults to the directory name", nargs='?') # List list_parser = sp.add_parser('list', help=repo_list.__doc__) list_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_list_scope, - help="Configuration scope to read from.") + help="configuration scope to read from") # Add add_parser = sp.add_parser('add', help=repo_add.__doc__) add_parser.add_argument( - 'path', help="Path to a Spack package repository directory.") + 'path', help="path to a Spack package repository directory") add_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_modify_scope, - help="Configuration scope to modify.") + help="configuration scope to modify") # Remove remove_parser = sp.add_parser( 'remove', help=repo_remove.__doc__, aliases=['rm']) remove_parser.add_argument( 'path_or_namespace', - help="Path or namespace of a Spack package repository.") + help="path or namespace of a Spack package repository") remove_parser.add_argument( '--scope', choices=scopes, default=spack.cmd.default_modify_scope, - help="Configuration scope to modify.") + help="configuration scope to modify") def repo_create(args): diff --git a/lib/spack/spack/cmd/restage.py b/lib/spack/spack/cmd/restage.py index 969afe09bd..36fee9237b 100644 --- a/lib/spack/spack/cmd/restage.py +++ b/lib/spack/spack/cmd/restage.py @@ -29,7 +29,7 @@ import llnl.util.tty as tty import spack import spack.cmd -description = "Revert checked out package source code." +description = "revert checked out package source code" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/setup.py b/lib/spack/spack/cmd/setup.py index 5d8aaefa72..82d00f4e11 100644 --- a/lib/spack/spack/cmd/setup.py +++ b/lib/spack/spack/cmd/setup.py @@ -38,19 +38,19 @@ from llnl.util.filesystem import set_executable from spack import which from spack.stage import DIYStage -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): subparser.add_argument( '-i', '--ignore-dependencies', action='store_true', dest='ignore_deps', - help="Do not try to install dependencies of requested packages.") + help="do not try to install dependencies of requested packages") subparser.add_argument( '-v', '--verbose', action='store_true', dest='verbose', - help="Display verbose build output while installing.") + help="display verbose build output while installing") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="specs to use for install. Must contain package AND version.") + help="specs to use for install. must contain package AND version") cd_group = subparser.add_mutually_exclusive_group() arguments.add_common_arguments(cd_group, ['clean', 'dirty']) diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index 4ecd4d6e54..9eea404bc7 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -28,29 +28,29 @@ import spack import spack.cmd import spack.cmd.common.arguments as arguments -description = "print out abstract and concrete versions of a spec." +description = "print out abstract and concrete versions of a spec" def setup_parser(subparser): arguments.add_common_arguments(subparser, ['long', 'very_long']) subparser.add_argument( '-y', '--yaml', action='store_true', default=False, - help='Print concrete spec as YAML.') + help='print concrete spec as YAML') subparser.add_argument( '-c', '--cover', action='store', default='nodes', choices=['nodes', 'edges', 'paths'], - help='How extensively to traverse the DAG. (default: nodes).') + help='how extensively to traverse the DAG (default: nodes)') subparser.add_argument( '-N', '--namespaces', action='store_true', default=False, - help='Show fully qualified package names.') + help='show fully qualified package names') subparser.add_argument( '-I', '--install-status', action='store_true', default=False, - help='Show install status of packages. Packages can be: ' + help='show install status of packages. packages can be: ' 'installed [+], missing and needed by an installed package [-], ' - 'or not installed (no annotation).') + 'or not installed (no annotation)') subparser.add_argument( '-t', '--types', action='store_true', default=False, - help='Show dependency types.') + help='show dependency types') subparser.add_argument( 'specs', nargs=argparse.REMAINDER, help="specs of packages") diff --git a/lib/spack/spack/cmd/stage.py b/lib/spack/spack/cmd/stage.py index bfc2e5f456..e0023b7254 100644 --- a/lib/spack/spack/cmd/stage.py +++ b/lib/spack/spack/cmd/stage.py @@ -28,16 +28,16 @@ import llnl.util.tty as tty import spack import spack.cmd -description = "Expand downloaded archive in preparation for install" +description = "expand downloaded archive in preparation for install" def setup_parser(subparser): subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', - help="Do not check downloaded packages against checksum") + help="do not check downloaded packages against checksum") subparser.add_argument( '-p', '--path', dest='path', - help="Path to stage package, does not add to spack tree") + help="path to stage package, does not add to spack tree") subparser.add_argument( 'specs', nargs=argparse.REMAINDER, help="specs of packages to stage") diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py index 9d92037bb6..c569a1bc88 100644 --- a/lib/spack/spack/cmd/test.py +++ b/lib/spack/spack/cmd/test.py @@ -34,24 +34,24 @@ from llnl.util.tty.colify import colify import spack -description = "A thin wrapper around the pytest command." +description = "a thin wrapper around the pytest command" def setup_parser(subparser): subparser.add_argument( '-H', '--pytest-help', action='store_true', default=False, - help="print full pytest help message, showing advanced options.") + help="print full pytest help message, showing advanced options") list_group = subparser.add_mutually_exclusive_group() list_group.add_argument( '-l', '--list', action='store_true', default=False, - help="list basic test names.") + help="list basic test names") list_group.add_argument( '-L', '--long-list', action='store_true', default=False, - help="list the entire hierarchy of tests.") + help="list the entire hierarchy of tests") subparser.add_argument( 'tests', nargs=argparse.REMAINDER, - help="list of tests to run (will be passed to pytest -k).") + help="list of tests to run (will be passed to pytest -k)") def do_list(args, unknown_args): diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index 0fc22ce538..f8b5408ba1 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -32,7 +32,7 @@ import spack.cmd import spack.store import spack.repository -description = "Remove an installed package" +description = "remove an installed package" error_message = """You can either: a) Use a more specific spec, or @@ -50,24 +50,24 @@ display_args = { def setup_parser(subparser): subparser.add_argument( '-f', '--force', action='store_true', dest='force', - help="Remove regardless of whether other packages depend on this one.") + help="remove regardless of whether other packages depend on this one") subparser.add_argument( '-a', '--all', action='store_true', dest='all', - help="USE CAREFULLY. Remove ALL installed packages that match each " + help="USE CAREFULLY. remove ALL installed packages that match each " "supplied spec. i.e., if you say uninstall `libelf`," - " ALL versions of `libelf` are uninstalled. If no spec is " - "supplied all installed software will be uninstalled. This " - "is both useful and dangerous, like rm -r.") + " ALL versions of `libelf` are uninstalled. if no spec is " + "supplied all installed software will be uninstalled. this " + "is both useful and dangerous, like rm -r") subparser.add_argument( '-d', '--dependents', action='store_true', dest='dependents', - help='Also uninstall any packages that depend on the ones given ' - 'via command line.') + help='also uninstall any packages that depend on the ones given ' + 'via command line') subparser.add_argument( '-y', '--yes-to-all', action='store_true', dest='yes_to_all', - help='Assume "yes" is the answer to every confirmation requested') + help='assume "yes" is the answer to every confirmation requested') subparser.add_argument( 'packages', diff --git a/lib/spack/spack/cmd/unload.py b/lib/spack/spack/cmd/unload.py index b52bedb7b4..5da6f5daa5 100644 --- a/lib/spack/spack/cmd/unload.py +++ b/lib/spack/spack/cmd/unload.py @@ -25,7 +25,7 @@ import argparse import spack.modules -description = "Remove package from environment using module." +description = "remove package from environment using module" def setup_parser(subparser): @@ -33,7 +33,7 @@ def setup_parser(subparser): message with -h. """ subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help='Spec of package to unload with modules.') + help='spec of package to unload with modules') def unload(parser, args): diff --git a/lib/spack/spack/cmd/unuse.py b/lib/spack/spack/cmd/unuse.py index 6403cf6162..e479749457 100644 --- a/lib/spack/spack/cmd/unuse.py +++ b/lib/spack/spack/cmd/unuse.py @@ -25,7 +25,7 @@ import argparse import spack.modules -description = "Remove package from environment using dotkit." +description = "remove package from environment using dotkit" def setup_parser(subparser): @@ -33,7 +33,7 @@ def setup_parser(subparser): message with -h. """ subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help='Spec of package to unuse with dotkit.') + help='spec of package to unuse with dotkit') def unuse(parser, args): diff --git a/lib/spack/spack/cmd/url_parse.py b/lib/spack/spack/cmd/url_parse.py index 2af9671459..b33d96299f 100644 --- a/lib/spack/spack/cmd/url_parse.py +++ b/lib/spack/spack/cmd/url_parse.py @@ -28,14 +28,14 @@ import spack import spack.url from spack.util.web import find_versions_of_archive -description = "Show parsing of a URL, optionally spider web for versions." +description = "show parsing of a URL, optionally spider web for versions" def setup_parser(subparser): subparser.add_argument('url', help="url of a package archive") subparser.add_argument( '-s', '--spider', action='store_true', - help="Spider the source page for versions.") + help="spider the source page for versions") def print_name_and_version(url): diff --git a/lib/spack/spack/cmd/urls.py b/lib/spack/spack/cmd/urls.py index f151581d7d..4ff23e69c1 100644 --- a/lib/spack/spack/cmd/urls.py +++ b/lib/spack/spack/cmd/urls.py @@ -25,18 +25,18 @@ import spack import spack.url -description = "Inspect urls used by packages in spack." +description = "inspect urls used by packages in spack" def setup_parser(subparser): subparser.add_argument( '-c', '--color', action='store_true', - help="Color the parsed version and name in the urls shown. " - "Version will be cyan, name red.") + help="color the parsed version and name in the urls shown. " + "version will be cyan, name red") subparser.add_argument( '-e', '--extrapolation', action='store_true', - help="Color the versions used for extrapolation as well." - "Additional versions are green, names magenta.") + help="color the versions used for extrapolation as well. " + "additional versions are green, names magenta") def urls(parser, args): diff --git a/lib/spack/spack/cmd/use.py b/lib/spack/spack/cmd/use.py index e3612ace48..c9714d9de0 100644 --- a/lib/spack/spack/cmd/use.py +++ b/lib/spack/spack/cmd/use.py @@ -25,7 +25,7 @@ import argparse import spack.modules -description = "Add package to environment using dotkit." +description = "add package to environment using dotkit" def setup_parser(subparser): @@ -33,7 +33,7 @@ def setup_parser(subparser): message with -h. """ subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help='Spec of package to use with dotkit.') + help='spec of package to use with dotkit') def use(parser, args): diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py index 1e95225ab8..dacca2489b 100644 --- a/lib/spack/spack/cmd/versions.py +++ b/lib/spack/spack/cmd/versions.py @@ -26,12 +26,12 @@ from llnl.util.tty.colify import colify import llnl.util.tty as tty import spack -description = "List available versions of a package" +description = "list available versions of a package" def setup_parser(subparser): subparser.add_argument('package', metavar='PACKAGE', - help='Package to list versions for') + help='package to list versions for') def versions(parser, args): diff --git a/lib/spack/spack/cmd/view.py b/lib/spack/spack/cmd/view.py index 869a58f15c..72e139d123 100644 --- a/lib/spack/spack/cmd/view.py +++ b/lib/spack/spack/cmd/view.py @@ -69,7 +69,7 @@ import spack import spack.cmd import llnl.util.tty as tty -description = "Produce a single-rooted directory view of a spec." +description = "produce a single-rooted directory view of a spec" def setup_parser(sp): @@ -77,40 +77,40 @@ def setup_parser(sp): sp.add_argument( '-v', '--verbose', action='store_true', default=False, - help="Display verbose output.") + help="display verbose output") sp.add_argument( '-e', '--exclude', action='append', default=[], - help="Exclude packages with names matching the given regex pattern.") + help="exclude packages with names matching the given regex pattern") sp.add_argument( '-d', '--dependencies', choices=['true', 'false', 'yes', 'no'], default='true', - help="Follow dependencies.") + help="follow dependencies") ssp = sp.add_subparsers(metavar='ACTION', dest='action') specs_opts = dict(metavar='spec', nargs='+', - help="Seed specs of the packages to view.") + help="seed specs of the packages to view") # The action parameterizes the command but in keeping with Spack # patterns we make it a subcommand. file_system_view_actions = [ ssp.add_parser( 'symlink', aliases=['add', 'soft'], - help='Add package files to a filesystem view via symbolic links.'), + help='add package files to a filesystem view via symbolic links'), ssp.add_parser( 'hardlink', aliases=['hard'], - help='Add packages files to a filesystem via via hard links.'), + help='add packages files to a filesystem via via hard links'), ssp.add_parser( 'remove', aliases=['rm'], - help='Remove packages from a filesystem view.'), + help='remove packages from a filesystem view'), ssp.add_parser( 'statlink', aliases=['status', 'check'], - help='Check status of packages in a filesystem view.') + help='check status of packages in a filesystem view') ] # All these options and arguments are common to every action. for act in file_system_view_actions: act.add_argument('path', nargs=1, - help="Path to file system view directory.") + help="path to file system view directory") act.add_argument('specs', **specs_opts) return -- cgit v1.2.3-70-g09d2 From 58a4c5c14d386c862ccf5150b5ab07b57ff2b9b2 Mon Sep 17 00:00:00 2001 From: becker33 Date: Fri, 27 Jan 2017 11:37:21 -0800 Subject: Fix ambiguous hash message generation. (#2940) * Fix ambiguous hash message generation. Engineering fix --- lib/spack/spack/spec.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 059653a72a..07e3221ed7 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2796,7 +2796,7 @@ class SpecParser(spack.parse.Parser): if len(matches) != 1: raise AmbiguousHashError( - "Multiple packages specify hash beginning %s." + "Multiple packages specify hash beginning '%s'." % self.token.value, *matches) return matches[0] @@ -3151,9 +3151,9 @@ class UnsatisfiableDependencySpecError(UnsatisfiableSpecError): class AmbiguousHashError(SpecError): def __init__(self, msg, *specs): - super(AmbiguousHashError, self).__init__(msg) - for spec in specs: - print(' ', spec.format('$.$@$%@+$+$=$#')) + specs_str = '\n ' + '\n '.join(spec.format('$.$@$%@+$+$=$#') + for spec in specs) + super(AmbiguousHashError, self).__init__(msg + specs_str) class InvalidHashError(SpecError): -- cgit v1.2.3-70-g09d2 From 0c0a1fdedc036c1a7bbd420780d48215a9488819 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 31 Jan 2017 08:54:34 -0600 Subject: Add several new R packages (#2952) * Add several new R packages * Add a few more R packages * Update more versions * Convert Package to RPackage * Add a few more packages * Add missing dependencies --- lib/spack/spack/cmd/create.py | 1 + .../repos/builtin/packages/r-adabag/package.py | 39 ++++++++++++++++ .../repos/builtin/packages/r-assertthat/package.py | 3 +- .../builtin/packages/r-biocinstaller/package.py | 37 +++++++++++++++ var/spack/repos/builtin/packages/r-car/package.py | 13 +++--- .../repos/builtin/packages/r-caret/package.py | 20 ++++---- .../repos/builtin/packages/r-checkpoint/package.py | 41 ++++++++++++++++ .../repos/builtin/packages/r-cluster/package.py | 3 +- .../repos/builtin/packages/r-codetools/package.py | 3 +- var/spack/repos/builtin/packages/r-coin/package.py | 44 ++++++++++++++++++ .../repos/builtin/packages/r-colorspace/package.py | 3 +- .../repos/builtin/packages/r-corrplot/package.py | 36 +++++++++++++++ .../repos/builtin/packages/r-cubist/package.py | 38 +++++++++++++++ var/spack/repos/builtin/packages/r-curl/package.py | 6 ++- .../repos/builtin/packages/r-data-table/package.py | 41 ++++++++++++++++ .../repos/builtin/packages/r-datatable/package.py | 40 ---------------- .../repos/builtin/packages/r-devtools/package.py | 13 ++++-- .../repos/builtin/packages/r-digest/package.py | 8 +++- var/spack/repos/builtin/packages/r-domc/package.py | 41 ++++++++++++++++ .../repos/builtin/packages/r-ellipse/package.py | 38 +++++++++++++++ .../repos/builtin/packages/r-evaluate/package.py | 7 ++- .../repos/builtin/packages/r-ggplot2/package.py | 13 ++++-- .../repos/builtin/packages/r-git2r/package.py | 5 +- .../repos/builtin/packages/r-httpuv/package.py | 4 +- var/spack/repos/builtin/packages/r-httr/package.py | 7 ++- .../repos/builtin/packages/r-ipred/package.py | 46 ++++++++++++++++++ .../repos/builtin/packages/r-irlba/package.py | 3 +- .../repos/builtin/packages/r-jsonlite/package.py | 3 +- .../repos/builtin/packages/r-kernlab/package.py | 40 ++++++++++++++++ .../repos/builtin/packages/r-kernsmooth/package.py | 37 +++++++++++++++ var/spack/repos/builtin/packages/r-kknn/package.py | 41 ++++++++++++++++ var/spack/repos/builtin/packages/r-lava/package.py | 40 ++++++++++++++++ .../repos/builtin/packages/r-matrix/package.py | 3 +- var/spack/repos/builtin/packages/r-mda/package.py | 40 ++++++++++++++++ var/spack/repos/builtin/packages/r-mgcv/package.py | 3 +- .../repos/builtin/packages/r-mlbench/package.py | 40 ++++++++++++++++ .../builtin/packages/r-modelmetrics/package.py | 40 ++++++++++++++++ .../repos/builtin/packages/r-modeltools/package.py | 35 ++++++++++++++ .../repos/builtin/packages/r-multcomp/package.py | 8 ++-- var/spack/repos/builtin/packages/r-nlme/package.py | 3 +- .../repos/builtin/packages/r-numderiv/package.py | 38 +++++++++++++++ .../repos/builtin/packages/r-openssl/package.py | 5 +- .../repos/builtin/packages/r-pacman/package.py | 42 +++++++++++++++++ .../repos/builtin/packages/r-party/package.py | 45 ++++++++++++++++++ .../repos/builtin/packages/r-pbkrtest/package.py | 7 ++- .../repos/builtin/packages/r-plotrix/package.py | 3 +- var/spack/repos/builtin/packages/r-pls/package.py | 39 ++++++++++++++++ .../repos/builtin/packages/r-prodlim/package.py | 44 ++++++++++++++++++ .../repos/builtin/packages/r-quantreg/package.py | 3 +- var/spack/repos/builtin/packages/r-r6/package.py | 5 +- var/spack/repos/builtin/packages/r-rcpp/package.py | 3 +- .../repos/builtin/packages/r-rcppeigen/package.py | 3 +- .../repos/builtin/packages/r-reshape2/package.py | 3 +- .../repos/builtin/packages/r-rminer/package.py | 54 ++++++++++++++++++++++ .../repos/builtin/packages/r-rpart-plot/package.py | 38 +++++++++++++++ .../repos/builtin/packages/r-rpart/package.py | 38 +++++++++++++++ .../repos/builtin/packages/r-sandwich/package.py | 2 + .../repos/builtin/packages/r-scales/package.py | 3 +- .../repos/builtin/packages/r-sparsem/package.py | 5 +- .../repos/builtin/packages/r-stringi/package.py | 3 +- .../repos/builtin/packages/r-stringr/package.py | 3 +- .../builtin/packages/r-strucchange/package.py | 41 ++++++++++++++++ .../repos/builtin/packages/r-survival/package.py | 3 +- .../repos/builtin/packages/r-th-data/package.py | 39 ++++++++++++++++ .../repos/builtin/packages/r-thdata/package.py | 38 --------------- .../repos/builtin/packages/r-tibble/package.py | 7 ++- .../repos/builtin/packages/r-withr/package.py | 5 +- .../repos/builtin/packages/r-xgboost/package.py | 15 ++++-- var/spack/repos/builtin/packages/r-zoo/package.py | 3 +- 69 files changed, 1275 insertions(+), 148 deletions(-) create mode 100644 var/spack/repos/builtin/packages/r-adabag/package.py create mode 100644 var/spack/repos/builtin/packages/r-biocinstaller/package.py create mode 100644 var/spack/repos/builtin/packages/r-checkpoint/package.py create mode 100644 var/spack/repos/builtin/packages/r-coin/package.py create mode 100644 var/spack/repos/builtin/packages/r-corrplot/package.py create mode 100644 var/spack/repos/builtin/packages/r-cubist/package.py create mode 100644 var/spack/repos/builtin/packages/r-data-table/package.py delete mode 100644 var/spack/repos/builtin/packages/r-datatable/package.py create mode 100644 var/spack/repos/builtin/packages/r-domc/package.py create mode 100644 var/spack/repos/builtin/packages/r-ellipse/package.py create mode 100644 var/spack/repos/builtin/packages/r-ipred/package.py create mode 100644 var/spack/repos/builtin/packages/r-kernlab/package.py create mode 100644 var/spack/repos/builtin/packages/r-kernsmooth/package.py create mode 100644 var/spack/repos/builtin/packages/r-kknn/package.py create mode 100644 var/spack/repos/builtin/packages/r-lava/package.py create mode 100644 var/spack/repos/builtin/packages/r-mda/package.py create mode 100644 var/spack/repos/builtin/packages/r-mlbench/package.py create mode 100644 var/spack/repos/builtin/packages/r-modelmetrics/package.py create mode 100644 var/spack/repos/builtin/packages/r-modeltools/package.py create mode 100644 var/spack/repos/builtin/packages/r-numderiv/package.py create mode 100644 var/spack/repos/builtin/packages/r-pacman/package.py create mode 100644 var/spack/repos/builtin/packages/r-party/package.py create mode 100644 var/spack/repos/builtin/packages/r-pls/package.py create mode 100644 var/spack/repos/builtin/packages/r-prodlim/package.py create mode 100644 var/spack/repos/builtin/packages/r-rminer/package.py create mode 100644 var/spack/repos/builtin/packages/r-rpart-plot/package.py create mode 100644 var/spack/repos/builtin/packages/r-rpart/package.py create mode 100644 var/spack/repos/builtin/packages/r-strucchange/package.py create mode 100644 var/spack/repos/builtin/packages/r-th-data/package.py delete mode 100644 var/spack/repos/builtin/packages/r-thdata/package.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index aa3f82a331..2901dcfa63 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -249,6 +249,7 @@ class PythonPackageTemplate(PackageTemplate): class RPackageTemplate(PackageTemplate): """Provides appropriate overrides for R extensions""" + base_class_name = 'RPackage' dependencies = """\ # FIXME: Add dependencies if required. diff --git a/var/spack/repos/builtin/packages/r-adabag/package.py b/var/spack/repos/builtin/packages/r-adabag/package.py new file mode 100644 index 0000000000..aa16047856 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-adabag/package.py @@ -0,0 +1,39 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RAdabag(RPackage): + """Applies Multiclass AdaBoost.M1, SAMME and Bagging.""" + + homepage = "https://cran.r-project.org/package=adabag" + url = "https://cran.r-project.org/src/contrib/adabag_4.1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/adabag" + + version('4.1', '2e019f053d49f62ebb3b1697bbb50afa') + + depends_on('r-rpart', type=('build', 'run')) + depends_on('r-mlbench', type=('build', 'run')) + depends_on('r-caret', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-assertthat/package.py b/var/spack/repos/builtin/packages/r-assertthat/package.py index 97c29b4a99..b8ab7d7a0c 100644 --- a/var/spack/repos/builtin/packages/r-assertthat/package.py +++ b/var/spack/repos/builtin/packages/r-assertthat/package.py @@ -31,7 +31,8 @@ class RAssertthat(RPackage): producing friendly error messages so that your users know what they've done wrong.""" - homepage = "https://cran.r-project.org/web/packages/assertthat/index.html" + homepage = "https://cran.r-project.org/package=assertthat" url = "https://cran.r-project.org/src/contrib/assertthat_0.1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/assertthat" version('0.1', '59f9d7f7c00077ea54d763b78eeb5798') diff --git a/var/spack/repos/builtin/packages/r-biocinstaller/package.py b/var/spack/repos/builtin/packages/r-biocinstaller/package.py new file mode 100644 index 0000000000..c145de688c --- /dev/null +++ b/var/spack/repos/builtin/packages/r-biocinstaller/package.py @@ -0,0 +1,37 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RBiocinstaller(RPackage): + """This package is used to install and update Bioconductor, CRAN, + and (some) github packages.""" + + homepage = "http://bioconductor.org/packages/devel/bioc/html/BiocInstaller.html" + url = "http://bioconductor.org/packages/devel/bioc/src/contrib/BiocInstaller_1.25.3.tar.gz" + + version('1.25.3', '6214770455a5122dca5544861f52c91d') + + depends_on('r@3.4.0:') diff --git a/var/spack/repos/builtin/packages/r-car/package.py b/var/spack/repos/builtin/packages/r-car/package.py index 80a0206a8a..56c87c27a6 100644 --- a/var/spack/repos/builtin/packages/r-car/package.py +++ b/var/spack/repos/builtin/packages/r-car/package.py @@ -30,13 +30,14 @@ class RCar(RPackage): Companion to Applied Regression, Second Edition, Sage, 2011.""" homepage = "https://r-forge.r-project.org/projects/car/" - url = "https://cran.r-project.org/src/contrib/car_2.1-2.tar.gz" + url = "https://cran.r-project.org/src/contrib/car_2.1-4.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/car" + version('2.1-4', 'a66c307e8ccf0c336ed197c0f1799565') version('2.1-2', '0f78ad74ef7130126d319acec23951a0') - depends_on('r-mass', type=('build','run')) - depends_on('r-mgcv', type=('build','run')) - depends_on('r-nnet', type=('build','run')) - depends_on('r-pbkrtest', type=('build','run')) - depends_on('r-quantreg', type=('build','run')) + depends_on('r-mass', type=('build', 'run')) + depends_on('r-mgcv', type=('build', 'run')) + depends_on('r-nnet', type=('build', 'run')) + depends_on('r-pbkrtest', type=('build', 'run')) + depends_on('r-quantreg', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-caret/package.py b/var/spack/repos/builtin/packages/r-caret/package.py index d795cfa204..277fdc7143 100644 --- a/var/spack/repos/builtin/packages/r-caret/package.py +++ b/var/spack/repos/builtin/packages/r-caret/package.py @@ -30,15 +30,19 @@ class RCaret(RPackage): models.""" homepage = "https://github.com/topepo/caret/" - url = "https://cran.r-project.org/src/contrib/caret_6.0-70.tar.gz" + url = "https://cran.r-project.org/src/contrib/caret_6.0-73.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/caret" + version('6.0-73', 'ca869e3357b5358f028fb926eb62eb70') version('6.0-70', '202d7abb6a679af716ea69fb2573f108') - depends_on('r-lattice', type=('build','run')) - depends_on('r-ggplot2', type=('build','run')) - depends_on('r-car', type=('build','run')) - depends_on('r-foreach', type=('build','run')) - depends_on('r-plyr', type=('build','run')) - depends_on('r-nlme', type=('build','run')) - depends_on('r-reshape2', type=('build','run')) + depends_on('r@2.10:') + + depends_on('r-lattice@0.20:', type=('build', 'run')) + depends_on('r-ggplot2', type=('build', 'run')) + depends_on('r-car', type=('build', 'run')) + depends_on('r-foreach', type=('build', 'run')) + depends_on('r-plyr', type=('build', 'run')) + depends_on('r-modelmetrics@1.1.0:', type=('build', 'run')) + depends_on('r-nlme', type=('build', 'run')) + depends_on('r-reshape2', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-checkpoint/package.py b/var/spack/repos/builtin/packages/r-checkpoint/package.py new file mode 100644 index 0000000000..5fd862fa46 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-checkpoint/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RCheckpoint(RPackage): + """The goal of checkpoint is to solve the problem of package + reproducibility in R. Specifically, checkpoint allows you to + install packages as they existed on CRAN on a specific snapshot + date as if you had a CRAN time machine.""" + + homepage = "https://cran.r-project.org/package=checkpoint" + url = "https://cran.r-project.org/src/contrib/checkpoint_0.3.18.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/checkpoint" + + version('0.3.18', '021d7faeb72c36167951e103b2b065ea') + version('0.3.15', 'a4aa8320338f1434a330d984e97981ea') + + depends_on('r@3.0.0:') diff --git a/var/spack/repos/builtin/packages/r-cluster/package.py b/var/spack/repos/builtin/packages/r-cluster/package.py index 29e16c2271..caa96a380a 100644 --- a/var/spack/repos/builtin/packages/r-cluster/package.py +++ b/var/spack/repos/builtin/packages/r-cluster/package.py @@ -31,7 +31,8 @@ class RCluster(RPackage): (1990) "Finding Groups in Data".""" homepage = "https://cran.r-project.org/web/packages/cluster/index.html" - url = "https://cran.r-project.org/src/contrib/cluster_2.0.4.tar.gz" + url = "https://cran.r-project.org/src/contrib/cluster_2.0.5.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/cluster" + version('2.0.5', '7330f209ebce960bdee1a6d6679cb85a') version('2.0.4', 'bb4deceaafb1c42bb1278d5d0dc11e59') diff --git a/var/spack/repos/builtin/packages/r-codetools/package.py b/var/spack/repos/builtin/packages/r-codetools/package.py index 39186bf54a..60b8fc2cc8 100644 --- a/var/spack/repos/builtin/packages/r-codetools/package.py +++ b/var/spack/repos/builtin/packages/r-codetools/package.py @@ -29,7 +29,8 @@ class RCodetools(RPackage): """Code analysis tools for R.""" homepage = "https://cran.r-project.org/web/packages/codetools/index.html" - url = "https://cran.r-project.org/src/contrib/codetools_0.2-14.tar.gz" + url = "https://cran.r-project.org/src/contrib/codetools_0.2-15.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/codetools" + version('0.2-15', '37419cbc3de81984cf6d9b207d4f62d4') version('0.2-14', '7ec41d4f8bd6ba85facc8c5e6adc1f4d') diff --git a/var/spack/repos/builtin/packages/r-coin/package.py b/var/spack/repos/builtin/packages/r-coin/package.py new file mode 100644 index 0000000000..51b61a6164 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-coin/package.py @@ -0,0 +1,44 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RCoin(RPackage): + """Conditional inference procedures for the general independence problem + including two-sample, K-sample (non-parametric ANOVA), correlation, + censored, ordered and multivariate problems.""" + + homepage = "https://cran.r-project.org/package=coin" + url = "https://cran.r-project.org/src/contrib/coin_1.1-3.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/coin" + + version('1.1-3', '97d3d21f1e4a5762e36dd718dd2d0661') + + depends_on('r@2.14.0:') + + depends_on('r-survival', type=('build', 'run')) + depends_on('r-modeltools@0.2-9:', type=('build', 'run')) + depends_on('r-mvtnorm@1.0-5:', type=('build', 'run')) + depends_on('r-multcomp', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-colorspace/package.py b/var/spack/repos/builtin/packages/r-colorspace/package.py index b7561ea360..af2895acbf 100644 --- a/var/spack/repos/builtin/packages/r-colorspace/package.py +++ b/var/spack/repos/builtin/packages/r-colorspace/package.py @@ -32,7 +32,8 @@ class RColorspace(RPackage): are provided.""" homepage = "https://cran.r-project.org/web/packages/colorspace/index.html" - url = "https://cran.r-project.org/src/contrib/colorspace_1.2-6.tar.gz" + url = "https://cran.r-project.org/src/contrib/colorspace_1.3-2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/colorspace" + version('1.3-2', '63000bab81d995ff167df76fb97b2984') version('1.2-6', 'a30191e9caf66f77ff4e99c062e9dce1') diff --git a/var/spack/repos/builtin/packages/r-corrplot/package.py b/var/spack/repos/builtin/packages/r-corrplot/package.py new file mode 100644 index 0000000000..ccae3bf913 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-corrplot/package.py @@ -0,0 +1,36 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RCorrplot(RPackage): + """A graphical display of a correlation matrix or general matrix. + It also contains some algorithms to do matrix reordering.""" + + homepage = "https://cran.r-project.org/package=corrplot" + url = "https://cran.r-project.org/src/contrib/corrplot_0.77.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/corrplot" + + version('0.77', '2a5d54fd5c65618b9afba1a32f6b4542') diff --git a/var/spack/repos/builtin/packages/r-cubist/package.py b/var/spack/repos/builtin/packages/r-cubist/package.py new file mode 100644 index 0000000000..acc0261383 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-cubist/package.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RCubist(RPackage): + """Regression modeling using rules with added instance-based corrections""" + + homepage = "https://cran.r-project.org/package=Cubist" + url = "https://cran.r-project.org/src/contrib/Cubist_0.0.19.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/Cubist" + + version('0.0.19', 'bf9364f655536ec03717fd2ad6223a47') + + depends_on('r-lattice', type=('build', 'run')) + depends_on('r-reshape2', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-curl/package.py b/var/spack/repos/builtin/packages/r-curl/package.py index 7b62d1be60..ae9ccf3f5e 100644 --- a/var/spack/repos/builtin/packages/r-curl/package.py +++ b/var/spack/repos/builtin/packages/r-curl/package.py @@ -37,10 +37,12 @@ class RCurl(RPackage): package with http specific tools and logic.""" homepage = "https://github.com/jeroenooms/curl" - url = "https://cran.r-project.org/src/contrib/curl_0.9.7.tar.gz" + url = "https://cran.r-project.org/src/contrib/curl_2.3.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/curl" - version('1.0', '93d34926d6071e1fba7e728b482f0dd9') + version('2.3', '7250ee8caed98ba76906ab4d32da60f8') + version('1.0', '93d34926d6071e1fba7e728b482f0dd9') version('0.9.7', 'a101f7de948cb828fef571c730f39217') + depends_on('r@3.0.0:') depends_on('curl') diff --git a/var/spack/repos/builtin/packages/r-data-table/package.py b/var/spack/repos/builtin/packages/r-data-table/package.py new file mode 100644 index 0000000000..4381d1e0f8 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-data-table/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RDataTable(RPackage): + """Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, + fast add/modify/delete of columns by group using no copies at all, list + columns and a fast file reader (fread). Offers a natural and flexible + syntax, for faster development.""" + + homepage = "https://github.com/Rdatatable/data.table/wiki" + url = "https://cran.r-project.org/src/contrib/data.table_1.10.0.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/data.table" + + version('1.10.0', 'f0e08dd5ba1b3f46c59dd1574fe497c1') + version('1.9.6', 'b1c0c7cce490bdf42ab288541cc55372') + + depends_on('r@3.0.0:') diff --git a/var/spack/repos/builtin/packages/r-datatable/package.py b/var/spack/repos/builtin/packages/r-datatable/package.py deleted file mode 100644 index 23802524e8..0000000000 --- a/var/spack/repos/builtin/packages/r-datatable/package.py +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RDatatable(RPackage): - """Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, - fast add/modify/delete of columns by group using no copies at all, list - columns and a fast file reader (fread). Offers a natural and flexible - syntax, for faster development.""" - - homepage = "https://github.com/Rdatatable/data.table/wiki" - url = "https://cran.r-project.org/src/contrib/data.table_1.9.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/data.table" - - version('1.9.6', 'b1c0c7cce490bdf42ab288541cc55372') - - depends_on('r-chron', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-devtools/package.py b/var/spack/repos/builtin/packages/r-devtools/package.py index 9895a3b390..c994f557c8 100644 --- a/var/spack/repos/builtin/packages/r-devtools/package.py +++ b/var/spack/repos/builtin/packages/r-devtools/package.py @@ -29,16 +29,19 @@ class RDevtools(RPackage): """Collection of package development tools.""" homepage = "https://github.com/hadley/devtools" - url = "https://cran.r-project.org/src/contrib/devtools_1.11.1.tar.gz" + url = "https://cran.r-project.org/src/contrib/devtools_1.12.0.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/devtools" + version('1.12.0', '73b46c446273566e5b21c9f5f72aeca3') version('1.11.1', '242672ee27d24dddcbdaac88c586b6c2') - depends_on('r-httr', type=('build', 'run')) - depends_on('r-memoise', type=('build', 'run')) + depends_on('r@3.0.2:') + + depends_on('r-httr@0.4:', type=('build', 'run')) + depends_on('r-memoise@1.0.0:', type=('build', 'run')) depends_on('r-whisker', type=('build', 'run')) depends_on('r-digest', type=('build', 'run')) - depends_on('r-rstudioapi', type=('build', 'run')) + depends_on('r-rstudioapi@0.2.0:', type=('build', 'run')) depends_on('r-jsonlite', type=('build', 'run')) - depends_on('r-git2r', type=('build', 'run')) + depends_on('r-git2r@0.11.0:', type=('build', 'run')) depends_on('r-withr', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-digest/package.py b/var/spack/repos/builtin/packages/r-digest/package.py index 7e077442f9..08f5af0aca 100644 --- a/var/spack/repos/builtin/packages/r-digest/package.py +++ b/var/spack/repos/builtin/packages/r-digest/package.py @@ -44,7 +44,11 @@ class RDigest(RPackage): used.""" homepage = "http://dirk.eddelbuettel.com/code/digest.html" - url = "https://cran.r-project.org/src/contrib/digest_0.6.9.tar.gz" + url = "https://cran.r-project.org/src/contrib/digest_0.6.12.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/digest" - version('0.6.9', '48048ce6c466bdb124716e45ba4a0e83') + version('0.6.12', '738efd4d9a37c5a4001ae66e954ce07e') + version('0.6.11', '52a864f55846b48b3cab0b5d0304a82a') + version('0.6.9', '48048ce6c466bdb124716e45ba4a0e83') + + depends_on('r@2.4.1:') diff --git a/var/spack/repos/builtin/packages/r-domc/package.py b/var/spack/repos/builtin/packages/r-domc/package.py new file mode 100644 index 0000000000..1a44aa537d --- /dev/null +++ b/var/spack/repos/builtin/packages/r-domc/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RDomc(RPackage): + """Provides a parallel backend for the %dopar% function using + the multicore functionality of the parallel package.""" + + homepage = "https://cran.r-project.org/package=doMC" + url = "https://cran.r-project.org/src/contrib/doMC_1.3.4.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/doMC" + + version('1.3.4', 'f965b09add9056e84f99a831dc3af7d1') + + depends_on('r@2.14.0:') + + depends_on('r-foreach@1.2.0:', type=('build', 'run')) + depends_on('r-iterators@1.0.0:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-ellipse/package.py b/var/spack/repos/builtin/packages/r-ellipse/package.py new file mode 100644 index 0000000000..1f6144285e --- /dev/null +++ b/var/spack/repos/builtin/packages/r-ellipse/package.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 REllipse(RPackage): + """This package contains various routines for drawing ellipses and + ellipse-like confidence regions.""" + + homepage = "https://cran.r-project.org/package=ellipse" + url = "https://cran.r-project.org/src/contrib/ellipse_0.3-8.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/ellipse" + + version('0.3-8', '385f5ec5e49bcda4317ca9dffd33f771') + + depends_on('r@2.0.0:') diff --git a/var/spack/repos/builtin/packages/r-evaluate/package.py b/var/spack/repos/builtin/packages/r-evaluate/package.py index cf6c72dc62..004048e985 100644 --- a/var/spack/repos/builtin/packages/r-evaluate/package.py +++ b/var/spack/repos/builtin/packages/r-evaluate/package.py @@ -35,6 +35,9 @@ class REvaluate(RPackage): url = "https://cran.rstudio.com/src/contrib/evaluate_0.9.tar.gz" list_url = "https://cran.rstudio.com/src/contrib/Archive/evaluate" - version('0.9', '877d89ce8a9ef7f403b1089ca1021775') + version('0.10', 'c49326babf984a8b36e7e276da370ad2') + version('0.9', '877d89ce8a9ef7f403b1089ca1021775') - depends_on('r-stringr', type=('build', 'run')) + depends_on('r@3.0.2:') + + depends_on('r-stringr@0.6.2:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-ggplot2/package.py b/var/spack/repos/builtin/packages/r-ggplot2/package.py index 3b4c437f0c..e5c80e4b79 100644 --- a/var/spack/repos/builtin/packages/r-ggplot2/package.py +++ b/var/spack/repos/builtin/packages/r-ggplot2/package.py @@ -35,14 +35,19 @@ class RGgplot2(RPackage): documentation and examples.""" homepage = "http://ggplot2.org/" - url = "https://cran.r-project.org/src/contrib/ggplot2_2.1.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/ggplot2_2.2.1.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/ggplot2" + version('2.2.1', '14c5a3507bc123c6e7e9ad3bef7cee5c') version('2.1.0', '771928cfb97c649c720423deb3ec7fd3') + depends_on('r@3.1:') + depends_on('r-digest', type=('build', 'run')) - depends_on('r-gtable', type=('build', 'run')) + depends_on('r-gtable@0.1.1:', type=('build', 'run')) depends_on('r-mass', type=('build', 'run')) - depends_on('r-plyr', type=('build', 'run')) + depends_on('r-plyr@1.7.1:', type=('build', 'run')) depends_on('r-reshape2', type=('build', 'run')) - depends_on('r-scales', type=('build', 'run')) + depends_on('r-scales@0.4.1', type=('build', 'run')) + depends_on('r-tibble', type=('build', 'run')) + depends_on('r-lazyeval', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-git2r/package.py b/var/spack/repos/builtin/packages/r-git2r/package.py index 7c4ff3144b..a0df2d9b23 100644 --- a/var/spack/repos/builtin/packages/r-git2r/package.py +++ b/var/spack/repos/builtin/packages/r-git2r/package.py @@ -31,10 +31,13 @@ class RGit2r(RPackage): data and running some basic 'Git' commands.""" homepage = "https://github.com/ropensci/git2r" - url = "https://cran.r-project.org/src/contrib/git2r_0.15.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/git2r_0.18.0.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/git2r" + version('0.18.0', 'fb5741eb490c3d6e23a751a72336f24d') version('0.15.0', '57658b3298f9b9aadc0dd77b4ef6a1e1') + depends_on('r@3.0.2:') + depends_on('zlib') depends_on('openssl') diff --git a/var/spack/repos/builtin/packages/r-httpuv/package.py b/var/spack/repos/builtin/packages/r-httpuv/package.py index e4b60893b6..a81e3c3fb1 100644 --- a/var/spack/repos/builtin/packages/r-httpuv/package.py +++ b/var/spack/repos/builtin/packages/r-httpuv/package.py @@ -40,4 +40,6 @@ class RHttpuv(RPackage): version('1.3.3', 'c78ae068cf59e949b9791be987bb4489') - depends_on('r-rcpp', type=('build', 'run')) + depends_on('r@2.15.1:') + + depends_on('r-rcpp@0.11.0:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-httr/package.py b/var/spack/repos/builtin/packages/r-httr/package.py index 55a5b0efab..b27bee4fbb 100644 --- a/var/spack/repos/builtin/packages/r-httr/package.py +++ b/var/spack/repos/builtin/packages/r-httr/package.py @@ -31,13 +31,16 @@ class RHttr(RPackage): request components (authenticate(), add_headers() and so on).""" homepage = "https://github.com/hadley/httr" - url = "https://cran.r-project.org/src/contrib/httr_1.1.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/httr_1.2.1.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/httr" + version('1.2.1', 'c469948dedac9ab3926f23cf484b33d9') version('1.1.0', '5ffbbc5c2529e49f00aaa521a2b35600') + depends_on('r@3.0.0:') + depends_on('r-jsonlite', type=('build', 'run')) depends_on('r-mime', type=('build', 'run')) - depends_on('r-curl', type=('build', 'run')) + depends_on('r-curl@0.9.1:', type=('build', 'run')) depends_on('r-openssl', type=('build', 'run')) depends_on('r-r6', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-ipred/package.py b/var/spack/repos/builtin/packages/r-ipred/package.py new file mode 100644 index 0000000000..37accb6ee2 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-ipred/package.py @@ -0,0 +1,46 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RIpred(RPackage): + """Improved predictive models by indirect classification and bagging for + classification, regression and survival problems as well as resampling + based estimators of prediction error.""" + + homepage = "https://cran.r-project.org/package=ipred" + url = "https://cran.r-project.org/src/contrib/ipred_0.9-5.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/ipred" + + version('0.9-5', 'ce8768547a7aa9554ad3650b18ea3cbd') + + depends_on('r@2.10:') + + depends_on('r-rpart@3.1-8:', type=('build', 'run')) + depends_on('r-mass', type=('build', 'run')) + depends_on('r-survival', type=('build', 'run')) + depends_on('r-nnet', type=('build', 'run')) + depends_on('r-class', type=('build', 'run')) + depends_on('r-prodlim', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-irlba/package.py b/var/spack/repos/builtin/packages/r-irlba/package.py index e0d1b32565..ad383492ff 100644 --- a/var/spack/repos/builtin/packages/r-irlba/package.py +++ b/var/spack/repos/builtin/packages/r-irlba/package.py @@ -31,9 +31,10 @@ class RIrlba(RPackage): matrices.""" homepage = "https://cran.r-project.org/web/packages/irlba/index.html" - url = "https://cran.r-project.org/src/contrib/irlba_2.0.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/irlba_2.1.2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/irlba" + version('2.1.2', '290940abf6662ed10c0c5a8db1bc6e88') version('2.0.0', '557674cf8b68fea5b9f231058c324d26') depends_on('r-matrix', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-jsonlite/package.py b/var/spack/repos/builtin/packages/r-jsonlite/package.py index 7368187af5..4a690d475a 100644 --- a/var/spack/repos/builtin/packages/r-jsonlite/package.py +++ b/var/spack/repos/builtin/packages/r-jsonlite/package.py @@ -38,8 +38,9 @@ class RJsonlite(RPackage): use with dynamic data in systems and applications.""" homepage = "https://github.com/jeroenooms/jsonlite" - url = "https://cran.r-project.org/src/contrib/jsonlite_1.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/jsonlite_1.2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/jsonlite" + version('1.2', '80cd2678ae77254be470f5931db71c51') version('1.0', 'c8524e086de22ab39b8ac8000220cc87') version('0.9.21', '4fc382747f88a79ff0718a0d06bed45d') diff --git a/var/spack/repos/builtin/packages/r-kernlab/package.py b/var/spack/repos/builtin/packages/r-kernlab/package.py new file mode 100644 index 0000000000..67159297ab --- /dev/null +++ b/var/spack/repos/builtin/packages/r-kernlab/package.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RKernlab(RPackage): + """Kernel-based machine learning methods for classification, regression, + clustering, novelty detection, quantile regression and dimensionality + reduction. Among other methods 'kernlab' includes Support Vector Machines, + Spectral Clustering, Kernel PCA, Gaussian Processes and a QP solver.""" + + homepage = "https://cran.r-project.org/package=kernlab" + url = "https://cran.r-project.org/src/contrib/kernlab_0.9-25.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/kernlab" + + version('0.9-25', '1182a2a336a79fd2cf70b4bc5a35353f') + + depends_on('r@2.10:') diff --git a/var/spack/repos/builtin/packages/r-kernsmooth/package.py b/var/spack/repos/builtin/packages/r-kernsmooth/package.py new file mode 100644 index 0000000000..14e58072dc --- /dev/null +++ b/var/spack/repos/builtin/packages/r-kernsmooth/package.py @@ -0,0 +1,37 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RKernsmooth(RPackage): + """Functions for kernel smoothing (and density estimation).""" + + homepage = "https://cran.r-project.org/package=KernSmooth" + url = "https://cran.r-project.org/src/contrib/KernSmooth_2.23-15.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/KernSmooth" + + version('2.23-15', '746cdf26dec72004cf19978e87dcc982') + + depends_on('r@2.5.0:') diff --git a/var/spack/repos/builtin/packages/r-kknn/package.py b/var/spack/repos/builtin/packages/r-kknn/package.py new file mode 100644 index 0000000000..bd5d688b14 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-kknn/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RKknn(RPackage): + """Weighted k-Nearest Neighbors for Classification, Regression and + Clustering.""" + + homepage = "https://cran.r-project.org/package=kknn" + url = "https://cran.r-project.org/src/contrib/kknn_1.3.1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/kknn" + + version('1.3.1', '372cd84f618cd5005f8c4c5721755117') + + depends_on('r@2.10:') + + depends_on('r-igraph@1.0:', type=('build', 'run')) + depends_on('r-matrix', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-lava/package.py b/var/spack/repos/builtin/packages/r-lava/package.py new file mode 100644 index 0000000000..c38f9003ea --- /dev/null +++ b/var/spack/repos/builtin/packages/r-lava/package.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RLava(RPackage): + """Estimation and simulation of latent variable models.""" + + homepage = "https://cran.r-project.org/package=lava" + url = "https://cran.r-project.org/src/contrib/lava_1.4.6.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/lava" + + version('1.4.7', '28039248a7039ba9281d172e4dbf9543') + + depends_on('r@3.0:') + + depends_on('r-numderiv', type=('build', 'run')) + depends_on('r-survival', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-matrix/package.py b/var/spack/repos/builtin/packages/r-matrix/package.py index 07c2eaf9da..ba1323a737 100644 --- a/var/spack/repos/builtin/packages/r-matrix/package.py +++ b/var/spack/repos/builtin/packages/r-matrix/package.py @@ -30,9 +30,10 @@ class RMatrix(RPackage): using 'LAPACK' and 'SuiteSparse'.""" homepage = "http://matrix.r-forge.r-project.org/" - url = "https://cran.r-project.org/src/contrib/Matrix_1.2-6.tar.gz" + url = "https://cran.r-project.org/src/contrib/Matrix_1.2-8.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/Matrix" + version('1.2-8', '4a6406666bf97d3ec6b698eea5d9c0f5') version('1.2-6', 'f545307fb1284861e9266c4e9712c55e') depends_on('r-lattice', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-mda/package.py b/var/spack/repos/builtin/packages/r-mda/package.py new file mode 100644 index 0000000000..4a3325abec --- /dev/null +++ b/var/spack/repos/builtin/packages/r-mda/package.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RMda(RPackage): + """Mixture and flexible discriminant analysis, multivariate adaptive + regression splines (MARS), BRUTO.""" + + homepage = "https://cran.r-project.org/package=mda" + url = "https://cran.r-project.org/src/contrib/mda_0.4-9.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/mda" + + version('0.4-9', '2ce1446c4a013e0ebcc1099a00269ad9') + + depends_on('r@1.9.0:') + + depends_on('r-class', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-mgcv/package.py b/var/spack/repos/builtin/packages/r-mgcv/package.py index c8cb067275..611abfd47c 100644 --- a/var/spack/repos/builtin/packages/r-mgcv/package.py +++ b/var/spack/repos/builtin/packages/r-mgcv/package.py @@ -32,9 +32,10 @@ class RMgcv(RPackage): beyond the exponential family.""" homepage = "https://cran.r-project.org/package=mgcv" - url = "https://cran.r-project.org/src/contrib/mgcv_1.8-13.tar.gz" + url = "https://cran.r-project.org/src/contrib/mgcv_1.8-16.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/mgcv" + version('1.8-16', '4c1d85e0f80b017bccb4b63395842911') version('1.8-13', '30607be3aaf44b13bd8c81fc32e8c984') depends_on('r-nlme', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-mlbench/package.py b/var/spack/repos/builtin/packages/r-mlbench/package.py new file mode 100644 index 0000000000..ec7957d5f7 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-mlbench/package.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RMlbench(RPackage): + """A collection of artificial and real-world machine learning benchmark + problems, including, e.g., several data sets from the UCI repository.""" + + homepage = "https://cran.r-project.org/web/packages/mlbench/index.html" + url = "https://cran.r-project.org/src/contrib/mlbench_2.1-1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/mlbench" + + version('2.1-1', '9f06848b8e137b8a37417c92d8e57f3b') + + depends_on('r@2.10:') + + depends_on('r-lattice', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-modelmetrics/package.py b/var/spack/repos/builtin/packages/r-modelmetrics/package.py new file mode 100644 index 0000000000..99644ef190 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-modelmetrics/package.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RModelmetrics(RPackage): + """Collection of metrics for evaluating models written in C++ using + 'Rcpp'.""" + + homepage = "https://cran.r-project.org/package=ModelMetrics" + url = "https://cran.r-project.org/src/contrib/ModelMetrics_1.1.0.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/ModelMetrics" + + version('1.1.0', 'd43175001f0531b8810d2802d76b7b44') + + depends_on('r@3.2.2:') + + depends_on('r-rcpp', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-modeltools/package.py b/var/spack/repos/builtin/packages/r-modeltools/package.py new file mode 100644 index 0000000000..97c3cf0682 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-modeltools/package.py @@ -0,0 +1,35 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RModeltools(RPackage): + """A collection of tools to deal with statistical models.""" + + homepage = "https://cran.r-project.org/package=modeltools" + url = "https://cran.r-project.org/src/contrib/modeltools_0.2-21.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/modeltools" + + version('0.2-21', '3bf56b2e7bf78981444385d87eeccdd7') diff --git a/var/spack/repos/builtin/packages/r-multcomp/package.py b/var/spack/repos/builtin/packages/r-multcomp/package.py index 70704a9c61..0dbfb14ea0 100644 --- a/var/spack/repos/builtin/packages/r-multcomp/package.py +++ b/var/spack/repos/builtin/packages/r-multcomp/package.py @@ -38,8 +38,8 @@ class RMultcomp(RPackage): version('1.4-6', 'f1353ede2ed78b23859a7f1f1f9ebe88') - depends_on('r-mvtnorm', type=('build', 'run')) - depends_on('r-survival', type=('build', 'run')) - depends_on('r-thdata', type=('build', 'run')) - depends_on('r-sandwich', type=('build', 'run')) + depends_on('r-mvtnorm@1.0-3:', type=('build', 'run')) + depends_on('r-survival@2.39-4:', type=('build', 'run')) + depends_on('r-th-data@1.0-2:', type=('build', 'run')) + depends_on('r-sandwich@2.3-0:', type=('build', 'run')) depends_on('r-codetools', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-nlme/package.py b/var/spack/repos/builtin/packages/r-nlme/package.py index 869e03ab51..32fa484f60 100644 --- a/var/spack/repos/builtin/packages/r-nlme/package.py +++ b/var/spack/repos/builtin/packages/r-nlme/package.py @@ -29,9 +29,10 @@ class RNlme(RPackage): """Fit and compare Gaussian linear and nonlinear mixed-effects models.""" homepage = "https://cran.r-project.org/package=nlme" - url = "https://cran.r-project.org/src/contrib/nlme_3.1-128.tar.gz" + url = "https://cran.r-project.org/src/contrib/nlme_3.1-130.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/nlme" + version('3.1-130', '1935d6e308a8018ed8e45d25c8731288') version('3.1-128', '3d75ae7380bf123761b95a073eb55008') depends_on('r-lattice', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-numderiv/package.py b/var/spack/repos/builtin/packages/r-numderiv/package.py new file mode 100644 index 0000000000..135c4f4141 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-numderiv/package.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RNumderiv(RPackage): + """Methods for calculating (usually) accurate numerical first and + second order derivatives.""" + + homepage = "https://cran.r-project.org/package=numDeriv" + url = "https://cran.r-project.org/src/contrib/numDeriv_2016.8-1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/numDeriv" + + version('2016.8-1', '30e486298d5126d86560095be8e8aac1') + + depends_on('r@2.11.1:') diff --git a/var/spack/repos/builtin/packages/r-openssl/package.py b/var/spack/repos/builtin/packages/r-openssl/package.py index bf9f38be72..8b20482c32 100644 --- a/var/spack/repos/builtin/packages/r-openssl/package.py +++ b/var/spack/repos/builtin/packages/r-openssl/package.py @@ -38,9 +38,10 @@ class ROpenssl(RPackage): calculations on large multibyte integers.""" homepage = "https://github.com/jeroenooms/openssl#readme" - url = "https://cran.r-project.org/src/contrib/openssl_0.9.4.tar.gz" + url = "https://cran.r-project.org/src/contrib/openssl_0.9.6.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/openssl" + version('0.9.6', '7ef137929d9dd07db690d35db242ba4b') version('0.9.4', '82a890e71ed0e74499878bedacfb8ccb') - depends_on('openssl') + depends_on('openssl@1.0.1:') diff --git a/var/spack/repos/builtin/packages/r-pacman/package.py b/var/spack/repos/builtin/packages/r-pacman/package.py new file mode 100644 index 0000000000..a51633fbb4 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-pacman/package.py @@ -0,0 +1,42 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RPacman(RPackage): + """Tools to more conveniently perform tasks associated with add-on + packages. pacman conveniently wraps library and package related functions + and names them in an intuitive and consistent fashion. It seeks to combine + functionality from lower level functions which can speed up workflow.""" + + homepage = "https://cran.r-project.org/package=pacman" + url = "https://cran.r-project.org/src/contrib/pacman_0.4.1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/pacman" + + version('0.4.1', 'bf18fe6d1407d31e00b337d9b07fb648') + + depends_on('r@3.0.2:') + + depends_on('r-devtools', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-party/package.py b/var/spack/repos/builtin/packages/r-party/package.py new file mode 100644 index 0000000000..23f66ca4a4 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-party/package.py @@ -0,0 +1,45 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RParty(RPackage): + """A computational toolbox for recursive partitioning.""" + + homepage = "https://cran.r-project.org/web/packages/party/index.html" + url = "https://cran.r-project.org/src/contrib/party_1.1-2.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/party" + + version('1.1-2', '40a00336cf8418042d2ab616675c8ddf') + + depends_on('r@2.14.0:') + + depends_on('r-mvtnorm@1.0-2:', type=('build', 'run')) + depends_on('r-modeltools@0.1-21:', type=('build', 'run')) + depends_on('r-strucchange', type=('build', 'run')) + depends_on('r-survival@2.37-7:', type=('build', 'run')) + depends_on('r-coin@1.1-0:', type=('build', 'run')) + depends_on('r-zoo', type=('build', 'run')) + depends_on('r-sandwich@1.1-1:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-pbkrtest/package.py b/var/spack/repos/builtin/packages/r-pbkrtest/package.py index 2d51d2b958..2a2edc50ce 100644 --- a/var/spack/repos/builtin/packages/r-pbkrtest/package.py +++ b/var/spack/repos/builtin/packages/r-pbkrtest/package.py @@ -37,7 +37,10 @@ class RPbkrtest(RPackage): list_url = "https://cran.r-project.org/src/contrib/Archive/pbkrtest" version('0.4-6', '0a7d9ff83b8d131af9b2335f35781ef9') + version('0.4-4', '5e54b1b1b35413dd1d24ef15735ec645') - depends_on('r-lme4', type=('build', 'run')) - depends_on('r-matrix', type=('build', 'run')) + depends_on('r@3.2.3:') + + depends_on('r-lme4@1.1.10:', type=('build', 'run')) + depends_on('r-matrix@1.2.3:', type=('build', 'run')) depends_on('r-mass', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-plotrix/package.py b/var/spack/repos/builtin/packages/r-plotrix/package.py index 8a17c72f91..0cd3423f73 100644 --- a/var/spack/repos/builtin/packages/r-plotrix/package.py +++ b/var/spack/repos/builtin/packages/r-plotrix/package.py @@ -29,7 +29,8 @@ class RPlotrix(RPackage): """Lots of plots, various labeling, axis and color scaling functions.""" homepage = "https://cran.r-project.org/package=plotrix" - url = "https://cran.r-project.org/src/contrib/plotrix_3.6-3.tar.gz" + url = "https://cran.r-project.org/src/contrib/plotrix_3.6-4.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/plotrix" + version('3.6-4', 'efe9b9b093d8903228a9b56c46d943fa') version('3.6-3', '23e3e022a13a596e9b77b40afcb4a2ef') diff --git a/var/spack/repos/builtin/packages/r-pls/package.py b/var/spack/repos/builtin/packages/r-pls/package.py new file mode 100644 index 0000000000..ddb18ff42e --- /dev/null +++ b/var/spack/repos/builtin/packages/r-pls/package.py @@ -0,0 +1,39 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RPls(RPackage): + """Multivariate regression methods Partial Least Squares Regression (PLSR), + Principal Component Regression (PCR) and Canonical Powered Partial Least + Squares (CPPLS).""" + + homepage = "https://cran.r-project.org/package=pls" + url = "https://cran.r-project.org/src/contrib/pls_2.6-0.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/pls" + + version('2.6-0', '04e02e8e46d983c5ed53c1f952b329df') + + depends_on('r@2.10:') diff --git a/var/spack/repos/builtin/packages/r-prodlim/package.py b/var/spack/repos/builtin/packages/r-prodlim/package.py new file mode 100644 index 0000000000..5219578d94 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-prodlim/package.py @@ -0,0 +1,44 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RProdlim(RPackage): + """Product-Limit Estimation for Censored Event History Analysis. Fast and + user friendly implementation of nonparametric estimators for censored event + history (survival) analysis. Kaplan-Meier and Aalen-Johansen method.""" + + homepage = "https://cran.r-project.org/package=prodlim" + url = "https://cran.r-project.org/src/contrib/prodlim_1.5.9.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/prodlim" + + version('1.5.9', 'e0843053c9270e41b657a733d6675dc9') + + depends_on('r@2.9.0:') + + depends_on('r-rcpp@0.11.5:', type=('build', 'run')) + depends_on('r-survival', type=('build', 'run')) + depends_on('r-kernsmooth', type=('build', 'run')) + depends_on('r-lava', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-quantreg/package.py b/var/spack/repos/builtin/packages/r-quantreg/package.py index 2d5091ccaf..c9bdaefa44 100644 --- a/var/spack/repos/builtin/packages/r-quantreg/package.py +++ b/var/spack/repos/builtin/packages/r-quantreg/package.py @@ -34,9 +34,10 @@ class RQuantreg(RPackage): included.""" homepage = "https://cran.r-project.org/package=quantreg" - url = "https://cran.r-project.org/src/contrib/quantreg_5.26.tar.gz" + url = "https://cran.r-project.org/src/contrib/quantreg_5.29.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/quantreg" + version('5.29', '643ca728200d13f8c2e62365204e9907') version('5.26', '1d89ed932fb4d67ae2d5da0eb8c2989f') depends_on('r-sparsem', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-r6/package.py b/var/spack/repos/builtin/packages/r-r6/package.py index e64a8a6532..700771f40f 100644 --- a/var/spack/repos/builtin/packages/r-r6/package.py +++ b/var/spack/repos/builtin/packages/r-r6/package.py @@ -34,7 +34,10 @@ class RR6(RPackage): classes are defined in different packages.""" homepage = "https://github.com/wch/R6/" - url = "https://cran.r-project.org/src/contrib/R6_2.1.2.tar.gz" + url = "https://cran.r-project.org/src/contrib/R6_2.2.0.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/R6" + version('2.2.0', '659d83b2d3f7a308a48332b4cfbdab49') version('2.1.2', 'b6afb9430e48707be87638675390e457') + + depends_on('r@3.0:') diff --git a/var/spack/repos/builtin/packages/r-rcpp/package.py b/var/spack/repos/builtin/packages/r-rcpp/package.py index b447dea8bd..5b89324970 100644 --- a/var/spack/repos/builtin/packages/r-rcpp/package.py +++ b/var/spack/repos/builtin/packages/r-rcpp/package.py @@ -37,8 +37,9 @@ class RRcpp(RPackage): last two.""" homepage = "http://dirk.eddelbuettel.com/code/rcpp.html" - url = "https://cran.r-project.org/src/contrib/Rcpp_0.12.6.tar.gz" + url = "https://cran.r-project.org/src/contrib/Rcpp_0.12.9.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/Rcpp" + version('0.12.9', '691c49b12794507288b728ede03668a5') version('0.12.6', 'db4280fb0a79cd19be73a662c33b0a8b') version('0.12.5', 'f03ec05b4e391cc46e7ce330e82ff5e2') diff --git a/var/spack/repos/builtin/packages/r-rcppeigen/package.py b/var/spack/repos/builtin/packages/r-rcppeigen/package.py index 23ec0bc27b..b33e938d5b 100644 --- a/var/spack/repos/builtin/packages/r-rcppeigen/package.py +++ b/var/spack/repos/builtin/packages/r-rcppeigen/package.py @@ -41,9 +41,10 @@ class RRcppeigen(RPackage): GNU GPL version 2 or later, as is the rest of 'Rcpp'.""" homepage = "http://eigen.tuxfamily.org/" - url = "https://cran.r-project.org/src/contrib/RcppEigen_0.3.2.8.1.tar.gz" + url = "https://cran.r-project.org/src/contrib/RcppEigen_0.3.2.9.0.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/RcppEigen" + version('0.3.2.9.0', '14a7786882a5d9862d53c4b2217df318') version('0.3.2.8.1', '4146e06e4fdf7f4d08db7839069d479f') depends_on('r-matrix', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-reshape2/package.py b/var/spack/repos/builtin/packages/r-reshape2/package.py index d27231e139..ca65e006dc 100644 --- a/var/spack/repos/builtin/packages/r-reshape2/package.py +++ b/var/spack/repos/builtin/packages/r-reshape2/package.py @@ -30,9 +30,10 @@ class RReshape2(RPackage): and dcast (or acast).""" homepage = "https://github.com/hadley/reshape" - url = "https://cran.r-project.org/src/contrib/reshape2_1.4.1.tar.gz" + url = "https://cran.r-project.org/src/contrib/reshape2_1.4.2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/reshape2" + version('1.4.2', 'c851a0312191b8c5bab956445df7cf5f') version('1.4.1', '41e9dffdf5c6fa830321ac9c8ebffe00') depends_on('r-plyr', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-rminer/package.py b/var/spack/repos/builtin/packages/r-rminer/package.py new file mode 100644 index 0000000000..b22612a238 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-rminer/package.py @@ -0,0 +1,54 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RRminer(RPackage): + """Facilitates the use of data mining algorithms in classification and + regression (including time series forecasting) tasks by presenting a short + and coherent set of functions.""" + + homepage = "http://www3.dsi.uminho.pt/pcortez/rminer.html" + url = "https://cran.r-project.org/src/contrib/rminer_1.4.2.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/rminer" + + version('1.4.2', '7d5d90f4ae030cf647d67aa962412c05') + + depends_on('r-plotrix', type=('build', 'run')) + depends_on('r-lattice', type=('build', 'run')) + depends_on('r-nnet', type=('build', 'run')) + depends_on('r-kknn', type=('build', 'run')) + depends_on('r-pls', type=('build', 'run')) + depends_on('r-mass', type=('build', 'run')) + depends_on('r-mda', type=('build', 'run')) + depends_on('r-rpart', type=('build', 'run')) + depends_on('r-randomforest', type=('build', 'run')) + depends_on('r-adabag', type=('build', 'run')) + depends_on('r-party', type=('build', 'run')) + depends_on('r-cubist', type=('build', 'run')) + depends_on('r-kernlab', type=('build', 'run')) + depends_on('r-e1071', type=('build', 'run')) + depends_on('r-glmnet', type=('build', 'run')) + depends_on('r-xgboost', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-rpart-plot/package.py b/var/spack/repos/builtin/packages/r-rpart-plot/package.py new file mode 100644 index 0000000000..d7d40f2154 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-rpart-plot/package.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RRpartPlot(RPackage): + """Plot 'rpart' models. Extends plot.rpart() and text.rpart() in the + 'rpart' package.""" + + homepage = "https://cran.r-project.org/package=rpart.plot" + url = "https://cran.r-project.org/src/contrib/rpart.plot_2.1.0.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/rpart.plot" + + version('2.1.0', 'fb0f8edfe22c464683ee82aa429136f9') + + depends_on('r-rpart@4.1-0:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-rpart/package.py b/var/spack/repos/builtin/packages/r-rpart/package.py new file mode 100644 index 0000000000..a81c9d7d91 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-rpart/package.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RRpart(RPackage): + """Recursive partitioning for classification, regression and + survival trees.""" + + homepage = "https://cran.r-project.org/package=rpart" + url = "https://cran.r-project.org/src/contrib/rpart_4.1-10.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/rpart" + + version('4.1-10', '15873cded4feb3ef44d63580ba3ca46e') + + depends_on('r@2.15.0:') diff --git a/var/spack/repos/builtin/packages/r-sandwich/package.py b/var/spack/repos/builtin/packages/r-sandwich/package.py index 62bd2880e5..bae8e82d68 100644 --- a/var/spack/repos/builtin/packages/r-sandwich/package.py +++ b/var/spack/repos/builtin/packages/r-sandwich/package.py @@ -35,4 +35,6 @@ class RSandwich(RPackage): version('2.3-4', 'a621dbd8a57b6e1e036496642aadc2e5') + depends_on('r@2.0.0:') + depends_on('r-zoo', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-scales/package.py b/var/spack/repos/builtin/packages/r-scales/package.py index e3832f78e0..e88ef144cf 100644 --- a/var/spack/repos/builtin/packages/r-scales/package.py +++ b/var/spack/repos/builtin/packages/r-scales/package.py @@ -30,9 +30,10 @@ class RScales(RPackage): automatically determining breaks and labels for axes and legends.""" homepage = "https://github.com/hadley/scales" - url = "https://cran.r-project.org/src/contrib/scales_0.4.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/scales_0.4.1.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/scales" + version('0.4.1', '3fb2218866a7fe4c1f6e66790876f85a') version('0.4.0', '7b5602d9c55595901192248bca25c099') depends_on('r-rcolorbrewer', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-sparsem/package.py b/var/spack/repos/builtin/packages/r-sparsem/package.py index 370497e395..bcd11a5c1f 100644 --- a/var/spack/repos/builtin/packages/r-sparsem/package.py +++ b/var/spack/repos/builtin/packages/r-sparsem/package.py @@ -31,7 +31,8 @@ class RSparsem(RPackage): subsetting and Kronecker products.""" homepage = "http://www.econ.uiuc.edu/~roger/research/sparse/sparse.html" - url = "https://cran.r-project.org/src/contrib/SparseM_1.7.tar.gz" + url = "https://cran.r-project.org/src/contrib/SparseM_1.74.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/SparseM" - version('1.7', '7b5b0ab166a0929ef6dcfe1d97643601') + version('1.74', 'a16c9b7db172dfd2b7b6508c48e81a5d') + version('1.7', '7b5b0ab166a0929ef6dcfe1d97643601') diff --git a/var/spack/repos/builtin/packages/r-stringi/package.py b/var/spack/repos/builtin/packages/r-stringi/package.py index d89238f3d7..b116c328f5 100644 --- a/var/spack/repos/builtin/packages/r-stringi/package.py +++ b/var/spack/repos/builtin/packages/r-stringi/package.py @@ -37,9 +37,10 @@ class RStringi(RPackage): etc.""" homepage = "http://www.gagolewski.com/software/stringi/" - url = "https://cran.r-project.org/src/contrib/stringi_1.1.1.tar.gz" + url = "https://cran.r-project.org/src/contrib/stringi_1.1.2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/stringi" + version('1.1.2', '0ec2faa62643e1900734c0eaf5096648') version('1.1.1', '32b919ee3fa8474530c4942962a6d8d9') depends_on('icu4c') diff --git a/var/spack/repos/builtin/packages/r-stringr/package.py b/var/spack/repos/builtin/packages/r-stringr/package.py index de8d83b500..4accd04e51 100644 --- a/var/spack/repos/builtin/packages/r-stringr/package.py +++ b/var/spack/repos/builtin/packages/r-stringr/package.py @@ -33,9 +33,10 @@ class RStringr(RPackage): into the input of another.""" homepage = "https://cran.r-project.org/web/packages/stringr/index.html" - url = "https://cran.r-project.org/src/contrib/stringr_1.0.0.tar.gz" + url = "https://cran.r-project.org/src/contrib/stringr_1.1.0.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/stringr" + version('1.1.0', '47973a33944c6d5db9524b1e835b8a5d') version('1.0.0', '5ca977c90351f78b1b888b379114a7b4') depends_on('r-stringi', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-strucchange/package.py b/var/spack/repos/builtin/packages/r-strucchange/package.py new file mode 100644 index 0000000000..6d00d31402 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-strucchange/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RStrucchange(RPackage): + """Testing, monitoring and dating structural changes in (linear) + regression models.""" + + homepage = "https://cran.r-project.org/package=strucchange" + url = "https://cran.r-project.org/src/contrib/strucchange_1.5-1.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/strucchange" + + version('1.5-1', 'fc751fc011df9c8df82d577298cb8395') + + depends_on('r@2.10.0:') + + depends_on('r-zoo', type=('build', 'run')) + depends_on('r-sandwich', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-survival/package.py b/var/spack/repos/builtin/packages/r-survival/package.py index 1df00f0c93..067cdcfd6b 100644 --- a/var/spack/repos/builtin/packages/r-survival/package.py +++ b/var/spack/repos/builtin/packages/r-survival/package.py @@ -31,9 +31,10 @@ class RSurvival(RPackage): models, and parametric accelerated failure time models.""" homepage = "https://cran.r-project.org/package=survival" - url = "https://cran.r-project.org/src/contrib/survival_2.39-5.tar.gz" + url = "https://cran.r-project.org/src/contrib/survival_2.40-1.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/survival" + version('2.40-1', 'a2474b656cd723791268e3114481b8a7') version('2.39-5', 'a3cc6b5762e8c5c0bb9e64a276710be2') depends_on('r-matrix', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-th-data/package.py b/var/spack/repos/builtin/packages/r-th-data/package.py new file mode 100644 index 0000000000..b9c5fab0d0 --- /dev/null +++ b/var/spack/repos/builtin/packages/r-th-data/package.py @@ -0,0 +1,39 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RThData(RPackage): + """Contains data sets used in other packages Torsten Hothorn maintains.""" + + homepage = "https://cran.r-project.org/package=TH.data" + url = "https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz" + list_url = "https://cran.r-project.org/src/contrib/Archive/TH.data" + + version('1.0-8', '2cc20acc8b470dff1202749b4bea55c4') + version('1.0-7', '3e8b6b1a4699544f175215aed7039a94') + + depends_on('r-survival', type=('build', 'run')) + depends_on('r-mass', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-thdata/package.py b/var/spack/repos/builtin/packages/r-thdata/package.py deleted file mode 100644 index cf2b01e6e8..0000000000 --- a/var/spack/repos/builtin/packages/r-thdata/package.py +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 RThdata(RPackage): - """Contains data sets used in other packages Torsten Hothorn maintains.""" - - homepage = "https://cran.r-project.org/package=TH.data" - url = "https://cran.r-project.org/src/contrib/TH.data_1.0-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/TH.data" - - version('1.0-7', '3e8b6b1a4699544f175215aed7039a94') - - depends_on('r-survival', type=('build', 'run')) - depends_on('r-mass', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-tibble/package.py b/var/spack/repos/builtin/packages/r-tibble/package.py index 39dfc3893b..a06b33e7f2 100644 --- a/var/spack/repos/builtin/packages/r-tibble/package.py +++ b/var/spack/repos/builtin/packages/r-tibble/package.py @@ -30,11 +30,14 @@ class RTibble(RPackage): capabilities than traditional data frames.""" homepage = "https://github.com/hadley/tibble" - url = "https://cran.r-project.org/src/contrib/tibble_1.1.tar.gz" + url = "https://cran.r-project.org/src/contrib/tibble_1.2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/tibble" + version('1.2', 'bdbc3d67aa16860741add6d6ec20ea13') version('1.1', '2fe9f806109d0b7fadafb1ffafea4cb8') + depends_on('r@3.1.2:') + depends_on('r-assertthat', type=('build', 'run')) - depends_on('r-lazyeval', type=('build', 'run')) + depends_on('r-lazyeval@0.1.10:', type=('build', 'run')) depends_on('r-rcpp', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-withr/package.py b/var/spack/repos/builtin/packages/r-withr/package.py index 785050ed87..082b94e2a6 100644 --- a/var/spack/repos/builtin/packages/r-withr/package.py +++ b/var/spack/repos/builtin/packages/r-withr/package.py @@ -32,7 +32,10 @@ class RWithr(RPackage): dependencies to provide access to these functions.""" homepage = "http://github.com/jimhester/withr" - url = "https://cran.r-project.org/src/contrib/withr_1.0.1.tar.gz" + url = "https://cran.r-project.org/src/contrib/withr_1.0.2.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/withr" + version('1.0.2', 'ca52b729af9bbaa14fc8b7bafe38663c') version('1.0.1', 'ac38af2c6f74027c9592dd8f0acb7598') + + depends_on('r@3.0.2:') diff --git a/var/spack/repos/builtin/packages/r-xgboost/package.py b/var/spack/repos/builtin/packages/r-xgboost/package.py index 766191dcc1..4246d73e49 100644 --- a/var/spack/repos/builtin/packages/r-xgboost/package.py +++ b/var/spack/repos/builtin/packages/r-xgboost/package.py @@ -37,12 +37,19 @@ class RXgboost(RPackage): users are also allowed to define their own objectives easily.""" homepage = "https://github.com/dmlc/xgboost" - url = "https://cran.r-project.org/src/contrib/xgboost_0.4-4.tar.gz" + url = "https://cran.r-project.org/src/contrib/xgboost_0.6-4.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/xgboost" + version('0.6-4', '86e517e3ce39f8a01de796920f6b425e') version('0.4-4', 'c24d3076058101a71de4b8af8806697c') - depends_on('r-matrix', type=('build', 'run')) - depends_on('r-datatable', type=('build', 'run')) - depends_on('r-magrittr', type=('build', 'run')) + depends_on('r@3.3.0:') + + depends_on('r-matrix@1.1-0:', type=('build', 'run')) + depends_on('r-data-table@1.9.6:', type=('build', 'run')) + depends_on('r-magrittr@1.5:', type=('build', 'run')) + depends_on('r-stringi@0.5.2:', type=('build', 'run')) + + # This is not listed as required, but installation fails without it + # ERROR: dependency 'stringr' is not available for package 'xgboost' depends_on('r-stringr', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-zoo/package.py b/var/spack/repos/builtin/packages/r-zoo/package.py index 230c78a61a..7418d36a64 100644 --- a/var/spack/repos/builtin/packages/r-zoo/package.py +++ b/var/spack/repos/builtin/packages/r-zoo/package.py @@ -33,9 +33,10 @@ class RZoo(RPackage): methods to extend standard generics.""" homepage = "http://zoo.r-forge.r-project.org/" - url = "https://cran.r-project.org/src/contrib/zoo_1.7-13.tar.gz" + url = "https://cran.r-project.org/src/contrib/zoo_1.7-14.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/zoo" + version('1.7-14', '8c577a7c1e535c899ab14177b1039c32') version('1.7-13', '99521dfa4c668e692720cefcc5a1bf30') depends_on('r-lattice', type=('build', 'run')) -- cgit v1.2.3-70-g09d2 From 2babe4e4ff0a3c684193daa7722c30140214610d Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 31 Jan 2017 16:48:57 +0100 Subject: removed call syntax from property fixes #2944 (#2945) --- lib/spack/spack/build_systems/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 60a850d356..d2ee72925d 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -112,7 +112,7 @@ class PythonPackage(PackageBase): def setup_py(self, *args): setup = self.setup_file() - with working_dir(self.build_directory()): + with working_dir(self.build_directory): self.python(setup, '--no-user-cfg', *args) # The following phases and their descriptions come from: -- cgit v1.2.3-70-g09d2 From 123f057089547d79d6f308bc47698be936aa1cb5 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 31 Jan 2017 10:14:52 -0600 Subject: Refactor Spack's URL parsing commands (#2938) * Replace `spack urls` and `spack url-parse` with `spack url` * Allow spack url list to only list incorrect parsings * Add spack url test reporting * Add unit tests for new URL commands --- lib/spack/docs/developer_guide.rst | 102 ++++++++++++ lib/spack/docs/packaging_guide.rst | 197 ++++++++++++----------- lib/spack/spack/cmd/url.py | 319 +++++++++++++++++++++++++++++++++++++ lib/spack/spack/cmd/url_parse.py | 79 --------- lib/spack/spack/cmd/urls.py | 59 ------- lib/spack/spack/test/cmd/url.py | 116 ++++++++++++++ lib/spack/spack/url.py | 237 ++++++++++++++++++--------- 7 files changed, 797 insertions(+), 312 deletions(-) create mode 100644 lib/spack/spack/cmd/url.py delete mode 100644 lib/spack/spack/cmd/url_parse.py delete mode 100644 lib/spack/spack/cmd/urls.py create mode 100644 lib/spack/spack/test/cmd/url.py (limited to 'lib') diff --git a/lib/spack/docs/developer_guide.rst b/lib/spack/docs/developer_guide.rst index 5ddbaf2478..dbb9a670b4 100644 --- a/lib/spack/docs/developer_guide.rst +++ b/lib/spack/docs/developer_guide.rst @@ -300,6 +300,42 @@ Stage objects Writing commands ---------------- +Adding a new command to Spack is easy. Simply add a ``.py`` file to +``lib/spack/spack/cmd/``, where ```` is the name of the subcommand. +At the bare minimum, two functions are required in this file: + +^^^^^^^^^^^^^^^^^^ +``setup_parser()`` +^^^^^^^^^^^^^^^^^^ + +Unless your command doesn't accept any arguments, a ``setup_parser()`` +function is required to define what arguments and flags your command takes. +See the `Argparse documentation `_ +for more details on how to add arguments. + +Some commands have a set of subcommands, like ``spack compiler find`` or +``spack module refresh``. You can add subparsers to your parser to handle +this. Check out ``spack edit --command compiler`` for an example of this. + +A lot of commands take the same arguments and flags. These arguments should +be defined in ``lib/spack/spack/cmd/common/arguments.py`` so that they don't +need to be redefined in multiple commands. + +^^^^^^^^^^^^ +``()`` +^^^^^^^^^^^^ + +In order to run your command, Spack searches for a function with the same +name as your command in ``.py``. This is the main method for your +command, and can call other helper methods to handle common tasks. + +Remember, before adding a new command, think to yourself whether or not this +new command is actually necessary. Sometimes, the functionality you desire +can be added to an existing command. Also remember to add unit tests for +your command. If it isn't used very frequently, changes to the rest of +Spack can cause your command to break without sufficient unit tests to +prevent this from happening. + ---------- Unit tests ---------- @@ -312,14 +348,80 @@ Unit testing Developer commands ------------------ +.. _cmd-spack-doc: + ^^^^^^^^^^^^^ ``spack doc`` ^^^^^^^^^^^^^ +.. _cmd-spack-test: + ^^^^^^^^^^^^^^ ``spack test`` ^^^^^^^^^^^^^^ +.. _cmd-spack-url: + +^^^^^^^^^^^^^ +``spack url`` +^^^^^^^^^^^^^ + +A package containing a single URL can be used to download several different +versions of the package. If you've ever wondered how this works, all of the +magic is in :mod:`spack.url`. This module contains methods for extracting +the name and version of a package from its URL. The name is used by +``spack create`` to guess the name of the package. By determining the version +from the URL, Spack can replace it with other versions to determine where to +download them from. + +The regular expressions in ``parse_name_offset`` and ``parse_version_offset`` +are used to extract the name and version, but they aren't perfect. In order +to debug Spack's URL parsing support, the ``spack url`` command can be used. + +""""""""""""""""""" +``spack url parse`` +""""""""""""""""""" + +If you need to debug a single URL, you can use the following command: + +.. command-output:: spack url parse http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.0.tar.gz + +You'll notice that the name and version of this URL are correctly detected, +and you can even see which regular expressions it was matched to. However, +you'll notice that when it substitutes the version number in, it doesn't +replace the ``2.2`` with ``9.9`` where we would expect ``9.9.9b`` to live. +This particular package may require a ``list_url`` or ``url_for_version`` +function. + +This command also accepts a ``--spider`` flag. If provided, Spack searches +for other versions of the package and prints the matching URLs. + +"""""""""""""""""" +``spack url list`` +"""""""""""""""""" + +This command lists every URL in every package in Spack. If given the +``--color`` and ``--extrapolation`` flags, it also colors the part of +the string that it detected to be the name and version. The +``--incorrect-name`` and ``--incorrect-version`` flags can be used to +print URLs that were not being parsed correctly. + +"""""""""""""""""" +``spack url test`` +"""""""""""""""""" + +This command attempts to parse every URL for every package in Spack +and prints a summary of how many of them are being correctly parsed. +It also prints a histogram showing which regular expressions are being +matched and how frequently: + +.. command-output:: spack url test + +This command is essential for anyone adding or changing the regular +expressions that parse names and versions. By running this command +before and after the change, you can make sure that your regular +expression fixes more packages than it breaks. + --------- Profiling --------- diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 75546d943e..41d4289636 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -712,8 +712,8 @@ is at ``http://example.com/downloads/foo-1.0.tar.gz``, Spack will look in ``http://example.com/downloads/`` for links to additional versions. If you need to search another path for download links, you can supply some extra attributes that control how your package finds new -versions. See the documentation on `attribute_list_url`_ and -`attribute_list_depth`_. +versions. See the documentation on :ref:`attribute_list_url` and +:ref:`attribute_list_depth`. .. note:: @@ -728,6 +728,102 @@ versions. See the documentation on `attribute_list_url`_ and syntax errors, or the ``import`` will fail. Use this once you've got your package in working order. +-------------------- +Finding new versions +-------------------- + +You've already seen the ``homepage`` and ``url`` package attributes: + +.. code-block:: python + :linenos: + + from spack import * + + + class Mpich(Package): + """MPICH is a high performance and widely portable implementation of + the Message Passing Interface (MPI) standard.""" + homepage = "http://www.mpich.org" + url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" + +These are class-level attributes used by Spack to show users +information about the package, and to determine where to download its +source code. + +Spack uses the tarball URL to extrapolate where to find other tarballs +of the same package (e.g. in :ref:`cmd-spack-checksum`, but +this does not always work. This section covers ways you can tell +Spack to find tarballs elsewhere. + +.. _attribute_list_url: + +^^^^^^^^^^^^ +``list_url`` +^^^^^^^^^^^^ + +When spack tries to find available versions of packages (e.g. with +:ref:`cmd-spack-checksum`), it spiders the parent directory +of the tarball in the ``url`` attribute. For example, for libelf, the +url is: + +.. code-block:: python + + url = "http://www.mr511.de/software/libelf-0.8.13.tar.gz" + +Here, Spack spiders ``http://www.mr511.de/software/`` to find similar +tarball links and ultimately to make a list of available versions of +``libelf``. + +For many packages, the tarball's parent directory may be unlistable, +or it may not contain any links to source code archives. In fact, +many times additional package downloads aren't even available in the +same directory as the download URL. + +For these, you can specify a separate ``list_url`` indicating the page +to search for tarballs. For example, ``libdwarf`` has the homepage as +the ``list_url``, because that is where links to old versions are: + +.. code-block:: python + :linenos: + + class Libdwarf(Package): + homepage = "http://www.prevanders.net/dwarf.html" + url = "http://www.prevanders.net/libdwarf-20130729.tar.gz" + list_url = homepage + +.. _attribute_list_depth: + +^^^^^^^^^^^^^^ +``list_depth`` +^^^^^^^^^^^^^^ + +``libdwarf`` and many other packages have a listing of available +versions on a single webpage, but not all do. For example, ``mpich`` +has a tarball URL that looks like this: + +.. code-block:: python + + url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" + +But its downloads are in many different subdirectories of +``http://www.mpich.org/static/downloads/``. So, we need to add a +``list_url`` *and* a ``list_depth`` attribute: + +.. code-block:: python + :linenos: + + class Mpich(Package): + homepage = "http://www.mpich.org" + url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" + list_url = "http://www.mpich.org/static/downloads/" + list_depth = 2 + +By default, Spack only looks at the top-level page available at +``list_url``. ``list_depth`` tells it to follow up to 2 levels of +links from the top-level page. Note that here, this implies two +levels of subdirectories, as the ``mpich`` website is structured much +like a filesystem. But ``list_depth`` really refers to link depth +when spidering the page. .. _vcs-fetch: @@ -1241,103 +1337,6 @@ RPATHs in Spack are handled in one of three ways: links. You can see this how this is used in the :ref:`PySide example ` above. --------------------- -Finding new versions --------------------- - -You've already seen the ``homepage`` and ``url`` package attributes: - -.. code-block:: python - :linenos: - - from spack import * - - - class Mpich(Package): - """MPICH is a high performance and widely portable implementation of - the Message Passing Interface (MPI) standard.""" - homepage = "http://www.mpich.org" - url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" - -These are class-level attributes used by Spack to show users -information about the package, and to determine where to download its -source code. - -Spack uses the tarball URL to extrapolate where to find other tarballs -of the same package (e.g. in :ref:`cmd-spack-checksum`, but -this does not always work. This section covers ways you can tell -Spack to find tarballs elsewhere. - -.. _attribute_list_url: - -^^^^^^^^^^^^ -``list_url`` -^^^^^^^^^^^^ - -When spack tries to find available versions of packages (e.g. with -:ref:`cmd-spack-checksum`), it spiders the parent directory -of the tarball in the ``url`` attribute. For example, for libelf, the -url is: - -.. code-block:: python - - url = "http://www.mr511.de/software/libelf-0.8.13.tar.gz" - -Here, Spack spiders ``http://www.mr511.de/software/`` to find similar -tarball links and ultimately to make a list of available versions of -``libelf``. - -For many packages, the tarball's parent directory may be unlistable, -or it may not contain any links to source code archives. In fact, -many times additional package downloads aren't even available in the -same directory as the download URL. - -For these, you can specify a separate ``list_url`` indicating the page -to search for tarballs. For example, ``libdwarf`` has the homepage as -the ``list_url``, because that is where links to old versions are: - -.. code-block:: python - :linenos: - - class Libdwarf(Package): - homepage = "http://www.prevanders.net/dwarf.html" - url = "http://www.prevanders.net/libdwarf-20130729.tar.gz" - list_url = homepage - -.. _attribute_list_depth: - -^^^^^^^^^^^^^^ -``list_depth`` -^^^^^^^^^^^^^^ - -``libdwarf`` and many other packages have a listing of available -versions on a single webpage, but not all do. For example, ``mpich`` -has a tarball URL that looks like this: - -.. code-block:: python - - url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" - -But its downloads are in many different subdirectories of -``http://www.mpich.org/static/downloads/``. So, we need to add a -``list_url`` *and* a ``list_depth`` attribute: - -.. code-block:: python - :linenos: - - class Mpich(Package): - homepage = "http://www.mpich.org" - url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" - list_url = "http://www.mpich.org/static/downloads/" - list_depth = 2 - -By default, Spack only looks at the top-level page available at -``list_url``. ``list_depth`` tells it to follow up to 2 levels of -links from the top-level page. Note that here, this implies two -levels of subdirectories, as the ``mpich`` website is structured much -like a filesystem. But ``list_depth`` really refers to link depth -when spidering the page. - .. _attribute_parallel: --------------- diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py new file mode 100644 index 0000000000..6823f0febd --- /dev/null +++ b/lib/spack/spack/cmd/url.py @@ -0,0 +1,319 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 __future__ import division, print_function + +from collections import defaultdict + +import spack + +from llnl.util import tty +from spack.url import * +from spack.util.web import find_versions_of_archive + +description = "debugging tool for url parsing" + + +def setup_parser(subparser): + sp = subparser.add_subparsers(metavar='SUBCOMMAND', dest='subcommand') + + # Parse + parse_parser = sp.add_parser('parse', help='attempt to parse a url') + + parse_parser.add_argument( + 'url', + help='url to parse') + parse_parser.add_argument( + '-s', '--spider', action='store_true', + help='spider the source page for versions') + + # List + list_parser = sp.add_parser('list', help='list urls in all packages') + + list_parser.add_argument( + '-c', '--color', action='store_true', + help='color the parsed version and name in the urls shown ' + '(versions will be cyan, name red)') + list_parser.add_argument( + '-e', '--extrapolation', action='store_true', + help='color the versions used for extrapolation as well ' + '(additional versions will be green, names magenta)') + + excl_args = list_parser.add_mutually_exclusive_group() + + excl_args.add_argument( + '-n', '--incorrect-name', action='store_true', + help='only list urls for which the name was incorrectly parsed') + excl_args.add_argument( + '-v', '--incorrect-version', action='store_true', + help='only list urls for which the version was incorrectly parsed') + + # Test + sp.add_parser( + 'test', help='print a summary of how well we are parsing package urls') + + +def url(parser, args): + action = { + 'parse': url_parse, + 'list': url_list, + 'test': url_test + } + + action[args.subcommand](args) + + +def url_parse(args): + url = args.url + + tty.msg('Parsing URL: {0}'.format(url)) + print() + + ver, vs, vl, vi, vregex = parse_version_offset(url) + tty.msg('Matched version regex {0:>2}: r{1!r}'.format(vi, vregex)) + + name, ns, nl, ni, nregex = parse_name_offset(url, ver) + tty.msg('Matched name regex {0:>2}: r{1!r}'.format(ni, nregex)) + + print() + tty.msg('Detected:') + try: + print_name_and_version(url) + except UrlParseError as e: + tty.error(str(e)) + + print(' name: {0}'.format(name)) + print(' version: {0}'.format(ver)) + print() + + tty.msg('Substituting version 9.9.9b:') + newurl = substitute_version(url, '9.9.9b') + print_name_and_version(newurl) + + if args.spider: + print() + tty.msg('Spidering for versions:') + versions = find_versions_of_archive(url) + + max_len = max(len(str(v)) for v in versions) + + for v in sorted(versions): + print('{0:{1}} {2}'.format(v, max_len, versions[v])) + + +def url_list(args): + urls = set() + + # Gather set of URLs from all packages + for pkg in spack.repo.all_packages(): + url = getattr(pkg.__class__, 'url', None) + urls = url_list_parsing(args, urls, url, pkg) + + for params in pkg.versions.values(): + url = params.get('url', None) + urls = url_list_parsing(args, urls, url, pkg) + + # Print URLs + for url in sorted(urls): + if args.color or args.extrapolation: + print(color_url(url, subs=args.extrapolation, errors=True)) + else: + print(url) + + # Return the number of URLs that were printed, only for testing purposes + return len(urls) + + +def url_test(args): + # Collect statistics on how many URLs were correctly parsed + total_urls = 0 + correct_names = 0 + correct_versions = 0 + + # Collect statistics on which regexes were matched and how often + name_regex_dict = dict() + name_count_dict = defaultdict(int) + version_regex_dict = dict() + version_count_dict = defaultdict(int) + + tty.msg('Generating a summary of URL parsing in Spack...') + + # Loop through all packages + for pkg in spack.repo.all_packages(): + urls = set() + + url = getattr(pkg.__class__, 'url', None) + if url: + urls.add(url) + + for params in pkg.versions.values(): + url = params.get('url', None) + if url: + urls.add(url) + + # Calculate statistics + for url in urls: + total_urls += 1 + + # Parse versions + version = None + try: + version, vs, vl, vi, vregex = parse_version_offset(url) + version_regex_dict[vi] = vregex + version_count_dict[vi] += 1 + if version_parsed_correctly(pkg, version): + correct_versions += 1 + except UndetectableVersionError: + pass + + # Parse names + try: + name, ns, nl, ni, nregex = parse_name_offset(url, version) + name_regex_dict[ni] = nregex + name_count_dict[ni] += 1 + if name_parsed_correctly(pkg, name): + correct_names += 1 + except UndetectableNameError: + pass + + print() + print(' Total URLs found: {0}'.format(total_urls)) + print(' Names correctly parsed: {0:>4}/{1:>4} ({2:>6.2%})'.format( + correct_names, total_urls, correct_names / total_urls)) + print(' Versions correctly parsed: {0:>4}/{1:>4} ({2:>6.2%})'.format( + correct_versions, total_urls, correct_versions / total_urls)) + print() + + tty.msg('Statistics on name regular expresions:') + + print() + print(' Index Count Regular Expresion') + for ni in name_regex_dict: + print(' {0:>3}: {1:>6} r{2!r}'.format( + ni, name_count_dict[ni], name_regex_dict[ni])) + print() + + tty.msg('Statistics on version regular expresions:') + + print() + print(' Index Count Regular Expresion') + for vi in version_regex_dict: + print(' {0:>3}: {1:>6} r{2!r}'.format( + vi, version_count_dict[vi], version_regex_dict[vi])) + print() + + # Return statistics, only for testing purposes + return (total_urls, correct_names, correct_versions, + name_count_dict, version_count_dict) + + +def print_name_and_version(url): + """Prints a URL. Underlines the detected name with dashes and + the detected version with tildes. + + :param str url: The url to parse + """ + name, ns, nl, ntup, ver, vs, vl, vtup = substitution_offsets(url) + underlines = [' '] * max(ns + nl, vs + vl) + for i in range(ns, ns + nl): + underlines[i] = '-' + for i in range(vs, vs + vl): + underlines[i] = '~' + + print(' {0}'.format(url)) + print(' {0}'.format(''.join(underlines))) + + +def url_list_parsing(args, urls, url, pkg): + """Helper function for :func:`url_list`. + + :param argparse.Namespace args: The arguments given to ``spack url list`` + :param set urls: List of URLs that have already been added + :param url: A URL to potentially add to ``urls`` depending on ``args`` + :type url: str or None + :param spack.package.PackageBase pkg: The Spack package + :returns: The updated ``urls`` list + :rtype: set + """ + if url: + if args.incorrect_name: + # Only add URLs whose name was incorrectly parsed + try: + name = parse_name(url) + if not name_parsed_correctly(pkg, name): + urls.add(url) + except UndetectableNameError: + urls.add(url) + elif args.incorrect_version: + # Only add URLs whose version was incorrectly parsed + try: + version = parse_version(url) + if not version_parsed_correctly(pkg, version): + urls.add(url) + except UndetectableVersionError: + urls.add(url) + else: + urls.add(url) + + return urls + + +def name_parsed_correctly(pkg, name): + """Determine if the name of a package was correctly parsed. + + :param spack.package.PackageBase pkg: The Spack package + :param str name: The name that was extracted from the URL + :returns: True if the name was correctly parsed, else False + :rtype: bool + """ + pkg_name = pkg.name + + # After determining a name, `spack create` determines a build system. + # Some build systems prepend a special string to the front of the name. + # Since this can't be guessed from the URL, it would be unfair to say + # that these names are incorrectly parsed, so we remove them. + if pkg_name.startswith('r-'): + pkg_name = pkg_name[2:] + elif pkg_name.startswith('py-'): + pkg_name = pkg_name[3:] + elif pkg_name.startswith('octave-'): + pkg_name = pkg_name[7:] + + return name == pkg_name + + +def version_parsed_correctly(pkg, version): + """Determine if the version of a package was correctly parsed. + + :param spack.package.PackageBase pkg: The Spack package + :param str version: The version that was extracted from the URL + :returns: True if the name was correctly parsed, else False + :rtype: bool + """ + # If the version parsed from the URL is listed in a version() + # directive, we assume it was correctly parsed + for pkg_version in pkg.versions: + if str(pkg_version) == str(version): + return True + return False diff --git a/lib/spack/spack/cmd/url_parse.py b/lib/spack/spack/cmd/url_parse.py deleted file mode 100644 index b33d96299f..0000000000 --- a/lib/spack/spack/cmd/url_parse.py +++ /dev/null @@ -1,79 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -############################################################################## -import llnl.util.tty as tty - -import spack -import spack.url -from spack.util.web import find_versions_of_archive - -description = "show parsing of a URL, optionally spider web for versions" - - -def setup_parser(subparser): - subparser.add_argument('url', help="url of a package archive") - subparser.add_argument( - '-s', '--spider', action='store_true', - help="spider the source page for versions") - - -def print_name_and_version(url): - name, ns, nl, ntup, ver, vs, vl, vtup = spack.url.substitution_offsets(url) - underlines = [" "] * max(ns + nl, vs + vl) - for i in range(ns, ns + nl): - underlines[i] = '-' - for i in range(vs, vs + vl): - underlines[i] = '~' - - print " %s" % url - print " %s" % ''.join(underlines) - - -def url_parse(parser, args): - url = args.url - - ver, vs, vl = spack.url.parse_version_offset(url, debug=True) - name, ns, nl = spack.url.parse_name_offset(url, ver, debug=True) - print - - tty.msg("Detected:") - try: - print_name_and_version(url) - except spack.url.UrlParseError as e: - tty.error(str(e)) - - print ' name: %s' % name - print ' version: %s' % ver - - print - tty.msg("Substituting version 9.9.9b:") - newurl = spack.url.substitute_version(url, '9.9.9b') - print_name_and_version(newurl) - - if args.spider: - print - tty.msg("Spidering for versions:") - versions = find_versions_of_archive(url) - for v in sorted(versions): - print "%-20s%s" % (v, versions[v]) diff --git a/lib/spack/spack/cmd/urls.py b/lib/spack/spack/cmd/urls.py deleted file mode 100644 index 4ff23e69c1..0000000000 --- a/lib/spack/spack/cmd/urls.py +++ /dev/null @@ -1,59 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -############################################################################## -import spack -import spack.url - -description = "inspect urls used by packages in spack" - - -def setup_parser(subparser): - subparser.add_argument( - '-c', '--color', action='store_true', - help="color the parsed version and name in the urls shown. " - "version will be cyan, name red") - subparser.add_argument( - '-e', '--extrapolation', action='store_true', - help="color the versions used for extrapolation as well. " - "additional versions are green, names magenta") - - -def urls(parser, args): - urls = set() - for pkg in spack.repo.all_packages(): - url = getattr(pkg.__class__, 'url', None) - if url: - urls.add(url) - - for params in pkg.versions.values(): - url = params.get('url', None) - if url: - urls.add(url) - - for url in sorted(urls): - if args.color or args.extrapolation: - print spack.url.color_url( - url, subs=args.extrapolation, errors=True) - else: - print url diff --git a/lib/spack/spack/test/cmd/url.py b/lib/spack/spack/test/cmd/url.py new file mode 100644 index 0000000000..4c60d814ce --- /dev/null +++ b/lib/spack/spack/test/cmd/url.py @@ -0,0 +1,116 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import argparse +import pytest + +from spack.cmd.url import * + + +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the ``url`` command""" + parser = argparse.ArgumentParser() + setup_parser(parser) + return parser + + +class MyPackage: + def __init__(self, name, versions): + self.name = name + self.versions = versions + + +def test_name_parsed_correctly(): + # Expected True + assert name_parsed_correctly(MyPackage('netcdf', []), 'netcdf') + assert name_parsed_correctly(MyPackage('r-devtools', []), 'devtools') + assert name_parsed_correctly(MyPackage('py-numpy', []), 'numpy') + assert name_parsed_correctly(MyPackage('octave-splines', []), 'splines') + + # Expected False + assert not name_parsed_correctly(MyPackage('', []), 'hdf5') + assert not name_parsed_correctly(MyPackage('hdf5', []), '') + assert not name_parsed_correctly(MyPackage('imagemagick', []), 'ImageMagick') # noqa + assert not name_parsed_correctly(MyPackage('yaml-cpp', []), 'yamlcpp') + assert not name_parsed_correctly(MyPackage('yamlcpp', []), 'yaml-cpp') + assert not name_parsed_correctly(MyPackage('r-py-parser', []), 'parser') + assert not name_parsed_correctly(MyPackage('oce', []), 'oce-0.18.0') # noqa + + +def test_version_parsed_correctly(): + # Expected True + assert version_parsed_correctly(MyPackage('', ['1.2.3']), '1.2.3') + assert version_parsed_correctly(MyPackage('', ['5.4a', '5.4b']), '5.4a') + assert version_parsed_correctly(MyPackage('', ['5.4a', '5.4b']), '5.4b') + + # Expected False + assert not version_parsed_correctly(MyPackage('', []), '1.2.3') + assert not version_parsed_correctly(MyPackage('', ['1.2.3']), '') + assert not version_parsed_correctly(MyPackage('', ['1.2.3']), '1.2.4') + assert not version_parsed_correctly(MyPackage('', ['3.4a']), '3.4') + assert not version_parsed_correctly(MyPackage('', ['3.4']), '3.4b') + assert not version_parsed_correctly(MyPackage('', ['0.18.0']), 'oce-0.18.0') # noqa + + +def test_url_parse(parser): + args = parser.parse_args(['parse', 'http://zlib.net/fossils/zlib-1.2.10.tar.gz']) + url(parser, args) + + +@pytest.mark.xfail +def test_url_parse_xfail(parser): + # No version in URL + args = parser.parse_args(['parse', 'http://www.netlib.org/voronoi/triangle.zip']) + url(parser, args) + + +def test_url_list(parser): + args = parser.parse_args(['list']) + total_urls = url_list(args) + + # The following two options should not change the number of URLs printed. + args = parser.parse_args(['list', '--color', '--extrapolation']) + colored_urls = url_list(args) + assert colored_urls == total_urls + + # The following two options should print fewer URLs than the default. + # If they print the same number of URLs, something is horribly broken. + # If they say we missed 0 URLs, something is probably broken too. + args = parser.parse_args(['list', '--incorrect-name']) + incorrect_name_urls = url_list(args) + assert 0 < incorrect_name_urls < total_urls + + args = parser.parse_args(['list', '--incorrect-version']) + incorrect_version_urls = url_list(args) + assert 0 < incorrect_version_urls < total_urls + + +def test_url_test(parser): + args = parser.parse_args(['test']) + (total_urls, correct_names, correct_versions, + name_count_dict, version_count_dict) = url_test(args) + + assert 0 < correct_names <= sum(name_count_dict.values()) <= total_urls # noqa + assert 0 < correct_versions <= sum(version_count_dict.values()) <= total_urls # noqa diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 93c443fde8..65f8e12e58 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -28,17 +28,17 @@ The idea is to allow package creators to supply nothing more than the download location of the package, and figure out version and name information from there. -Example: when spack is given the following URL: +**Example:** when spack is given the following URL: - ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz + https://www.hdfgroup.org/ftp/HDF/releases/HDF4.2.12/src/hdf-4.2.12.tar.gz -It can figure out that the package name is ruby, and that it is at version -1.9.1-p243. This is useful for making the creation of packages simple: a user +It can figure out that the package name is ``hdf``, and that it is at version +``4.2.12``. This is useful for making the creation of packages simple: a user just supplies a URL and skeleton code is generated automatically. -Spack can also figure out that it can most likely download 1.8.1 at this URL: +Spack can also figure out that it can most likely download 4.2.6 at this URL: - ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.8.1.tar.gz + https://www.hdfgroup.org/ftp/HDF/releases/HDF4.2.6/src/hdf-4.2.6.tar.gz This is useful if a user asks for a package at a particular version number; spack doesn't need anyone to tell it where to get the tarball even though @@ -104,24 +104,23 @@ def strip_query_and_fragment(path): def split_url_extension(path): """Some URLs have a query string, e.g.: - 1. https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true - 2. http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz - 3. https://gitlab.kitware.com/vtk/vtk/repository/archive.tar.bz2?ref=v7.0.0 + 1. https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true + 2. http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz + 3. https://gitlab.kitware.com/vtk/vtk/repository/archive.tar.bz2?ref=v7.0.0 - In (1), the query string needs to be stripped to get at the - extension, but in (2) & (3), the filename is IN a single final query - argument. + In (1), the query string needs to be stripped to get at the + extension, but in (2) & (3), the filename is IN a single final query + argument. - This strips the URL into three pieces: prefix, ext, and suffix. - The suffix contains anything that was stripped off the URL to - get at the file extension. In (1), it will be '?raw=true', but - in (2), it will be empty. In (3) the suffix is a parameter that follows - after the file extension, e.g.: + This strips the URL into three pieces: ``prefix``, ``ext``, and ``suffix``. + The suffix contains anything that was stripped off the URL to + get at the file extension. In (1), it will be ``'?raw=true'``, but + in (2), it will be empty. In (3) the suffix is a parameter that follows + after the file extension, e.g.: - 1. ('https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7', '.tgz', '?raw=true') - 2. ('http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin', - '.tar.gz', None) - 3. ('https://gitlab.kitware.com/vtk/vtk/repository/archive', '.tar.bz2', '?ref=v7.0.0') + 1. ``('https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7', '.tgz', '?raw=true')`` + 2. ``('http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin', '.tar.gz', None)`` + 3. ``('https://gitlab.kitware.com/vtk/vtk/repository/archive', '.tar.bz2', '?ref=v7.0.0')`` """ prefix, ext, suffix = path, '', '' @@ -149,7 +148,7 @@ def determine_url_file_extension(path): """This returns the type of archive a URL refers to. This is sometimes confusing because of URLs like: - (1) https://github.com/petdance/ack/tarball/1.93_02 + (1) https://github.com/petdance/ack/tarball/1.93_02 Where the URL doesn't actually contain the filename. We need to know what type it is so that we can appropriately name files @@ -166,19 +165,44 @@ def determine_url_file_extension(path): return ext -def parse_version_offset(path, debug=False): - """Try to extract a version string from a filename or URL. This is taken - largely from Homebrew's Version class.""" +def parse_version_offset(path): + """Try to extract a version string from a filename or URL. + + :param str path: The filename or URL for the package + + :return: A tuple containing: + version of the package, + first index of version, + length of version string, + the index of the matching regex + the matching regex + + :rtype: tuple + + :raises UndetectableVersionError: If the URL does not match any regexes + """ original_path = path + # path: The prefix of the URL, everything before the ext and suffix + # ext: The file extension + # suffix: Any kind of query string that begins with a '?' path, ext, suffix = split_url_extension(path) - # Allow matches against the basename, to avoid including parent - # dirs in version name Remember the offset of the stem in the path + # stem: Everything from path after the final '/' stem = os.path.basename(path) offset = len(path) - len(stem) - version_types = [ + # List of the following format: + # + # [ + # (regex, string), + # ... + # ] + # + # The first regex that matches string will be used to determine + # the version of the package. Thefore, hyperspecific regexes should + # come first while generic, catch-all regexes should come last. + version_regexes = [ # GitHub tarballs, e.g. v1.2.3 (r'github.com/.+/(?:zip|tar)ball/v?((\d+\.)+\d+)$', path), @@ -258,16 +282,13 @@ def parse_version_offset(path, debug=False): (r'\/(\d\.\d+)\/', path), # e.g. http://www.ijg.org/files/jpegsrc.v8d.tar.gz - (r'\.v(\d+[a-z]?)', stem)] + (r'\.v(\d+[a-z]?)', stem) + ] - for i, vtype in enumerate(version_types): - regex, match_string = vtype + for i, version_regex in enumerate(version_regexes): + regex, match_string = version_regex match = re.search(regex, match_string) if match and match.group(1) is not None: - if debug: - tty.msg("Parsing URL: %s" % path, - " Matched regex %d: r'%s'" % (i, regex)) - version = match.group(1) start = match.start(1) @@ -275,30 +296,74 @@ def parse_version_offset(path, debug=False): if match_string is stem: start += offset - return version, start, len(version) + return version, start, len(version), i, regex raise UndetectableVersionError(original_path) -def parse_version(path, debug=False): - """Given a URL or archive name, extract a version from it and return - a version object. +def parse_version(path): + """Try to extract a version string from a filename or URL. + + :param str path: The filename or URL for the package + + :return: The version of the package + :rtype: spack.version.Version + + :raises UndetectableVersionError: If the URL does not match any regexes """ - ver, start, l = parse_version_offset(path, debug=debug) - return Version(ver) + version, start, length, i, regex = parse_version_offset(path) + return Version(version) -def parse_name_offset(path, v=None, debug=False): - if v is None: - v = parse_version(path, debug=debug) +def parse_name_offset(path, v=None): + """Try to determine the name of a package from its filename or URL. + + :param str path: The filename or URL for the package + :param str v: The version of the package + + :return: A tuple containing: + name of the package, + first index of name, + length of name, + the index of the matching regex + the matching regex + + :rtype: tuple + + :raises UndetectableNameError: If the URL does not match any regexes + """ + original_path = path + # We really need to know the version of the package + # This helps us prevent collisions between the name and version + if v is None: + try: + v = parse_version(path) + except UndetectableVersionError: + # Not all URLs contain a version. We still want to be able + # to determine a name if possible. + v = '' + + # path: The prefix of the URL, everything before the ext and suffix + # ext: The file extension + # suffix: Any kind of query string that begins with a '?' path, ext, suffix = split_url_extension(path) - # Allow matching with either path or stem, as with the version. + # stem: Everything from path after the final '/' stem = os.path.basename(path) offset = len(path) - len(stem) - name_types = [ + # List of the following format: + # + # [ + # (regex, string), + # ... + # ] + # + # The first regex that matches string will be used to determine + # the name of the package. Thefore, hyperspecific regexes should + # come first while generic, catch-all regexes should come last. + name_regexes = [ (r'/sourceforge/([^/]+)/', path), (r'github.com/[^/]+/[^/]+/releases/download/%s/(.*)-%s$' % (v, v), path), @@ -316,10 +381,11 @@ def parse_name_offset(path, v=None, debug=False): (r'/([^/]+)%s' % v, path), (r'^([^/]+)[_.-]v?%s' % v, path), - (r'^([^/]+)%s' % v, path)] + (r'^([^/]+)%s' % v, path) + ] - for i, name_type in enumerate(name_types): - regex, match_string = name_type + for i, name_regex in enumerate(name_regexes): + regex, match_string = name_regex match = re.search(regex, match_string) if match: name = match.group(1) @@ -333,17 +399,38 @@ def parse_name_offset(path, v=None, debug=False): name = name.lower() name = re.sub('[_.]', '-', name) - return name, start, len(name) + return name, start, len(name), i, regex - raise UndetectableNameError(path) + raise UndetectableNameError(original_path) def parse_name(path, ver=None): - name, start, l = parse_name_offset(path, ver) + """Try to determine the name of a package from its filename or URL. + + :param str path: The filename or URL for the package + :param str ver: The version of the package + + :return: The name of the package + :rtype: str + + :raises UndetectableNameError: If the URL does not match any regexes + """ + name, start, length, i, regex = parse_name_offset(path, ver) return name def parse_name_and_version(path): + """Try to determine the name of a package and extract its version + from its filename or URL. + + :param str path: The filename or URL for the package + + :return: A tuple containing: + The name of the package + The version of the package + + :rtype: tuple + """ ver = parse_version(path) name = parse_name(path, ver) return (name, ver) @@ -371,12 +458,12 @@ def cumsum(elts, init=0, fn=lambda x: x): def substitution_offsets(path): """This returns offsets for substituting versions and names in the - provided path. It is a helper for substitute_version(). + provided path. It is a helper for :func:`substitute_version`. """ # Get name and version offsets try: - ver, vs, vl = parse_version_offset(path) - name, ns, nl = parse_name_offset(path, ver) + ver, vs, vl, vi, vregex = parse_version_offset(path) + name, ns, nl, ni, nregex = parse_name_offset(path, ver) except UndetectableNameError: return (None, -1, -1, (), ver, vs, vl, (vs,)) except UndetectableVersionError: @@ -444,21 +531,22 @@ def wildcard_version(path): def substitute_version(path, new_version): """Given a URL or archive name, find the version in the path and - substitute the new version for it. Replace all occurrences of - the version *if* they don't overlap with the package name. + substitute the new version for it. Replace all occurrences of + the version *if* they don't overlap with the package name. - Simple example:: - substitute_version('http://www.mr511.de/software/libelf-0.8.13.tar.gz', '2.9.3') - ->'http://www.mr511.de/software/libelf-2.9.3.tar.gz' + Simple example: - Complex examples:: - substitute_version('http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.0.tar.gz', 2.1) - -> 'http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.1.tar.gz' + .. code-block:: python - # In this string, the "2" in mvapich2 is NOT replaced. - substitute_version('http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.tar.gz', 2.1) - -> 'http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.1.tar.gz' + substitute_version('http://www.mr511.de/software/libelf-0.8.13.tar.gz', '2.9.3') + >>> 'http://www.mr511.de/software/libelf-2.9.3.tar.gz' + Complex example: + + .. code-block:: python + + substitute_version('https://www.hdfgroup.org/ftp/HDF/releases/HDF4.2.12/src/hdf-4.2.12.tar.gz', '2.3') + >>> 'https://www.hdfgroup.org/ftp/HDF/releases/HDF2.3/src/hdf-2.3.tar.gz' """ (name, ns, nl, noffs, ver, vs, vl, voffs) = substitution_offsets(path) @@ -477,17 +565,16 @@ def substitute_version(path, new_version): def color_url(path, **kwargs): """Color the parts of the url according to Spack's parsing. - Colors are: - Cyan: The version found by parse_version_offset(). - Red: The name found by parse_name_offset(). - - Green: Instances of version string from substitute_version(). - Magenta: Instances of the name (protected from substitution). + Colors are: + | Cyan: The version found by :func:`parse_version_offset`. + | Red: The name found by :func:`parse_name_offset`. - Optional args: - errors=True Append parse errors at end of string. - subs=True Color substitutions as well as parsed name/version. + | Green: Instances of version string from :func:`substitute_version`. + | Magenta: Instances of the name (protected from substitution). + :param str path: The filename or URL for the package + :keyword bool errors: Append parse errors at end of string. + :keyword bool subs: Color substitutions as well as parsed name/version. """ errors = kwargs.get('errors', False) subs = kwargs.get('subs', False) -- cgit v1.2.3-70-g09d2 From 6e729bc333f1e54f98bbe92804996747e3015d5c Mon Sep 17 00:00:00 2001 From: Henrik Bengtsson Date: Tue, 31 Jan 2017 08:26:19 -0800 Subject: DOCS: Examplify what file types are automatically extracted (#2955) --- lib/spack/docs/packaging_guide.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 41d4289636..211e72158c 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -535,9 +535,9 @@ These links currently redirect back to `pypi.python.org Skipping the expand step ^^^^^^^^^^^^^^^^^^^^^^^^ -Spack normally expands archives automatically after downloading -them. If you want to skip this step (e.g., for self-extracting -executables and other custom archive types), you can add +Spack normally expands archives (e.g. `*.tar.gz` and `*.zip`) automatically +after downloading them. If you want to skip this step (e.g., for +self-extracting executables and other custom archive types), you can add ``expand=False`` to a ``version`` directive. .. code-block:: python -- cgit v1.2.3-70-g09d2 From 41c77d7429debad4df86a0bc5382a94173b46700 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 31 Jan 2017 13:35:38 -0600 Subject: Add installcheck phase to AutotoolsPackage (#2863) * Add installcheck phase to AutotoolsPackage * Update installcheck phase with new callbacks API * build_directory has been converted to a property --- lib/spack/spack/build_systems/autotools.py | 12 ++++++++++++ lib/spack/spack/package.py | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index af6f5507b2..f0f57b1232 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -84,6 +84,9 @@ class AutotoolsPackage(PackageBase): #: Callback names for build-time test build_time_test_callbacks = ['check'] + #: Callback names for install-time test + install_time_test_callbacks = ['installcheck'] + #: Set to true to force the autoreconf step even if configure is present force_autoreconf = False #: Options to be passed to autoreconf when using the default implementation @@ -288,5 +291,14 @@ class AutotoolsPackage(PackageBase): self._if_make_target_execute('test') self._if_make_target_execute('check') + run_after('install')(PackageBase._run_default_install_time_test_callbacks) + + def installcheck(self): + """Searches the Makefile for an ``installcheck`` target + and runs it if found. + """ + with working_dir(self.build_directory): + self._if_make_target_execute('installcheck') + # Check that self.prefix is there after installation run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 797ae1ff5d..e5ea8c56ad 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1733,6 +1733,27 @@ class PackageBase(object): msg = 'RUN-TESTS: method not implemented [{0}]' tty.warn(msg.format(name)) + install_time_test_callbacks = None + + @on_package_attributes(run_tests=True) + def _run_default_install_time_test_callbacks(self): + """Tries to call all the methods that are listed in the attribute + ``install_time_test_callbacks`` if ``self.run_tests is True``. + + If ``install_time_test_callbacks is None`` returns immediately. + """ + if self.install_time_test_callbacks is None: + return + + for name in self.install_time_test_callbacks: + try: + fn = getattr(self, name) + tty.msg('RUN-TESTS: install-time tests [{0}]'.format(name)) + fn() + except AttributeError: + msg = 'RUN-TESTS: method not implemented [{0}]' + tty.warn(msg.format(name)) + class Package(PackageBase): """General purpose class with a single ``install`` -- cgit v1.2.3-70-g09d2 From 8275b4471556c3b55bbac75cea748c0496007eb4 Mon Sep 17 00:00:00 2001 From: serbanmaerean Date: Tue, 31 Jan 2017 14:51:05 -0500 Subject: Change default fflags for XL compiler to only "-qzerosize" (#2966) --- lib/spack/spack/compilers/xl.py | 8 +------- lib/spack/spack/compilers/xl_r.py | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py index 77a5ed7acd..686807ae33 100644 --- a/lib/spack/spack/compilers/xl.py +++ b/lib/spack/spack/compilers/xl.py @@ -67,13 +67,7 @@ class Xl(Compiler): # compilers and allows the use of zero size objects. # For Fortran 90 and beyond, it is set by default and has not impact. # Its use has no negative side effects. - # The -qstrict flag allows the Fortran 90+ compilers to parse the - # source files using fixed form rule. As a result, if -qfixed is in - # effect, free form files (that are not also fixed form files) will - # fail to compile regardless of the compiler invocation command. - # Use the -qfree flag in the packages' configuration file to undo the - # -qfixed flag, as the last one wins. - return "-qzerosize -qfixed" + return "-qzerosize" @classmethod def default_version(cls, comp): diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py index ca76f219ce..d08e700f42 100644 --- a/lib/spack/spack/compilers/xl_r.py +++ b/lib/spack/spack/compilers/xl_r.py @@ -68,13 +68,7 @@ class XlR(Compiler): # compilers and allows the use of zero size objects. # For Fortran 90 and beyond, it is set by default and has not impact. # Its use has no negative side effects. - # The -qstrict flag allows the Fortran 90+ compilers to parse the - # source files using fixed form rule. As a result, if -qfixed is in - # effect, free form files (that are not also fixed form files) will - # fail to compile regardless of the compiler invocation command. - # Use the -qfree flag in the packages' configuration file to undo the - # -qfixed flag, as the last one wins. - return "-qzerosize -qfixed" + return "-qzerosize" @classmethod def default_version(self, comp): -- cgit v1.2.3-70-g09d2 From 5a836fd06eb5a0042ce4b245a858a77129703d38 Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Fri, 3 Feb 2017 15:42:46 -0800 Subject: Blacklist implicit packages for modulefile generation (#2603) Add the ability to the modules generation process to blacklist packages that were installed implicitly. One can still whitelist modules that were installed implicitly. This changes adds a `blacklist_implicts` boolean as a peer to the `whitelist` and `blacklist` arrays, e.g.: ``` modules: enable:: - lmod lmod: whitelist: - 'lua' - 'py-setuptools' blacklist: - '%gcc@4.8.3' blacklist_implicits: True ``` It adds a small helper in `spec.py` and then touches up the package filtering code in `modules.py`. --- lib/spack/spack/modules.py | 12 +++++++++++- lib/spack/spack/spec.py | 10 ++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py index 5e2a840e14..ba220291a0 100644 --- a/lib/spack/spack/modules.py +++ b/lib/spack/spack/modules.py @@ -327,6 +327,10 @@ class EnvModule(object): blacklist_matches = [x for x in configuration.get('blacklist', []) if self.spec.satisfies(x)] + blacklist_implicits = configuration.get('blacklist_implicits') + installed_implicitly = not self.spec._installed_explicitly() + blacklisted_as_implicit = blacklist_implicits and installed_implicitly + if whitelist_matches: message = '\tWHITELIST : %s [matches : ' % self.spec.cshort_spec for rule in whitelist_matches: @@ -341,7 +345,13 @@ class EnvModule(object): message += ' ]' tty.debug(message) - if not whitelist_matches and blacklist_matches: + if blacklisted_as_implicit: + message = '\tBLACKLISTED_AS_IMPLICIT : %s' % \ + self.spec.cshort_spec + tty.debug(message) + + is_blacklisted = blacklist_matches or blacklisted_as_implicit + if not whitelist_matches and is_blacklisted: return True return False diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 07e3221ed7..36806b757d 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2596,6 +2596,16 @@ class Spec(object): except KeyError: return None + def _installed_explicitly(self): + """Helper for tree to print DB install status.""" + if not self.concrete: + return None + try: + record = spack.store.db.get_record(self) + return record.explicit + except KeyError: + return None + def tree(self, **kwargs): """Prints out this spec and its dependencies, tree-formatted with indentation.""" -- cgit v1.2.3-70-g09d2 From c456dfb60fdcd24448140278f29f0e9d1de95800 Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Fri, 3 Feb 2017 15:53:30 -0800 Subject: Make module autoload warnings configurable (#2763) Modules generated by the module creation machinery currently print out a notice that warnts the user that things are being autoloaded. In some situations those warnings are problematic. See #2754 for discussion. This is a first cut at optionally disabling the warning messages: - adds a helper tothe EnvModule base class that encapsulates the config file variable; - adds a method to the base class that provides a default (empty) code fragment for generating a warning message; - passes the warning fragment into the bit that formats the autoload string; - adds specialized autload_warner() methods in the tcl and lmod subclasses;; and finally - touches up the autoload_format strings in the specialized classes. --- lib/spack/spack/modules.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py index ba220291a0..885f2197ef 100644 --- a/lib/spack/spack/modules.py +++ b/lib/spack/spack/modules.py @@ -438,13 +438,20 @@ class EnvModule(object): def module_specific_content(self, configuration): return tuple() + # Subclasses can return a fragment of module code that prints out + # a warning that modules are being autoloaded. + def autoload_warner(self): + return '' + def autoload(self, spec): if not isinstance(spec, str): m = type(self)(spec) module_file = m.use_name else: module_file = spec - return self.autoload_format.format(module_file=module_file) + return self.autoload_format.format( + module_file=module_file, + warner=self.autoload_warner().format(module_file=module_file)) def prerequisite(self, spec): m = type(self)(spec) @@ -486,6 +493,10 @@ class EnvModule(object): # removedirs throws OSError on first non-empty directory found pass + def verbose_autoload(self): + configuration = _module_config.get(self.name, {}) + return configuration.get('verbose_autoload', True) + class Dotkit(EnvModule): name = 'dotkit' @@ -537,8 +548,13 @@ class TclModule(EnvModule): path = canonicalize_path( _roots.get(name, join_path(spack.share_path, 'modules'))) + def autoload_warner(self): + if self.verbose_autoload(): + return 'puts stderr "Autoloading {module_file}"\n' + return '' + autoload_format = ('if ![ is-loaded {module_file} ] {{\n' - ' puts stderr "Autoloading {module_file}"\n' + ' {warner}' ' module load {module_file}\n' '}}\n\n') @@ -665,8 +681,13 @@ class LmodModule(EnvModule): UnsetEnv: 'unsetenv("{name}")\n' } + def autoload_warner(self): + if self.verbose_autoload(): + return 'LmodMessage("Autoloading {module_file}")\n' + return '' + autoload_format = ('if not isloaded("{module_file}") then\n' - ' LmodMessage("Autoloading {module_file}")\n' + ' {warner}' ' load("{module_file}")\n' 'end\n\n') -- cgit v1.2.3-70-g09d2 From 968199de7d15fa6150c26f94100c19f4202f139b Mon Sep 17 00:00:00 2001 From: becker33 Date: Fri, 3 Feb 2017 18:27:34 -0800 Subject: Fix spec hash printing (#2941) - Fix format printing to match command line for hashes and full name formats - Update spack graph to use new format - Changed format string signifier for hashes from `$#` to `$/` --- lib/spack/spack/cmd/dependents.py | 2 +- lib/spack/spack/cmd/uninstall.py | 2 +- lib/spack/spack/database.py | 2 +- lib/spack/spack/graph.py | 2 +- lib/spack/spack/spec.py | 16 ++++++++-------- lib/spack/spack/test/graph.py | 12 ++++++------ 6 files changed, 18 insertions(+), 18 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 8c533561e3..42181b5502 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -45,7 +45,7 @@ def dependents(parser, args): tty.die("spack dependents takes only one spec.") spec = spack.cmd.disambiguate_spec(specs[0]) - tty.msg("Dependents of %s" % spec.format('$_$@$%@$#', color=True)) + tty.msg("Dependents of %s" % spec.format('$_$@$%@$/', color=True)) deps = spack.store.db.installed_dependents(spec) if deps: spack.cmd.display_specs(deps) diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index f8b5408ba1..fb9094f1b4 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -177,7 +177,7 @@ def get_uninstall_list(args): if dependent_list and not args.dependents and not args.force: for spec, lst in dependent_list.items(): tty.error("Will not uninstall %s" % - spec.format("$_$@$%@$#", color=True)) + spec.format("$_$@$%@$/", color=True)) print('') print("The following packages depend on it:") spack.cmd.display_specs(lst, **display_args) diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index ff55223351..d3fc03fb40 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -239,7 +239,7 @@ class Database(object): if dhash not in data: tty.warn("Missing dependency not in database: ", "%s needs %s-%s" % ( - spec.format('$_$#'), dname, dhash[:7])) + spec.format('$_$/'), dname, dhash[:7])) continue child = data[dhash].spec diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py index 7cc2046b9d..91230263f1 100644 --- a/lib/spack/spack/graph.py +++ b/lib/spack/spack/graph.py @@ -571,7 +571,7 @@ def graph_dot(specs, deptype=None, static=False, out=None): else: def key_label(s): - return s.dag_hash(), "%s-%s" % (s.name, s.dag_hash(7)) + return s.dag_hash(), "%s/%s" % (s.name, s.dag_hash(7)) for s in spec.traverse(deptype=deptype): skey, slabel = key_label(s) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 36806b757d..0df0ff71ea 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1145,13 +1145,13 @@ class Spec(object): def short_spec(self): """Returns a version of the spec with the dependencies hashed instead of completely enumerated.""" - return self.format('$_$@$%@$+$=$#') + return self.format('$_$@$%@$+$=$/') @property def cshort_spec(self): """Returns a version of the spec with the dependencies hashed instead of completely enumerated.""" - return self.format('$_$@$%@$+$=$#', color=True) + return self.format('$_$@$%@$+$=$/', color=True) @property def prefix(self): @@ -2374,7 +2374,7 @@ class Spec(object): prefixes as above $+ Options $= Architecture prefixed by 'arch=' - $# 7-char prefix of DAG hash with '-' prefix + $/ 7-char prefix of DAG hash with '-' prefix $$ $ You can also use full-string versions, which elide the prefixes:: @@ -2408,7 +2408,7 @@ class Spec(object): of the package, but no dependencies, arch, or compiler. TODO: allow, e.g., ``$6#`` to customize short hash length - TODO: allow, e.g., ``$##`` for full hash. + TODO: allow, e.g., ``$//`` for full hash. """ color = kwargs.get('color', False) length = len(format_string) @@ -2455,8 +2455,8 @@ class Spec(object): if self.architecture and str(self.architecture): a_str = ' arch' + c + str(self.architecture) + ' ' write(fmt % (a_str), c) - elif c == '#': - out.write('-' + fmt % (self.dag_hash(7))) + elif c == '/': + out.write('/' + fmt % (self.dag_hash(7))) elif c == '$': if fmt != '%s': raise ValueError("Can't use format width with $$.") @@ -2529,7 +2529,7 @@ class Spec(object): hashlen = int(hashlen) else: hashlen = None - out.write(fmt % (self.dag_hash(hashlen))) + out.write('/' + fmt % (self.dag_hash(hashlen))) named = False @@ -3161,7 +3161,7 @@ class UnsatisfiableDependencySpecError(UnsatisfiableSpecError): class AmbiguousHashError(SpecError): def __init__(self, msg, *specs): - specs_str = '\n ' + '\n '.join(spec.format('$.$@$%@+$+$=$#') + specs_str = '\n ' + '\n '.join(spec.format('$.$@$%@+$+$=$/') for spec in specs) super(AmbiguousHashError, self).__init__(msg + specs_str) diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py index 09dbcd0548..ce7b07ed86 100644 --- a/lib/spack/spack/test/graph.py +++ b/lib/spack/spack/test/graph.py @@ -84,16 +84,16 @@ def test_dynamic_dot_graph_mpileaks(builtin_mock): dot = stream.getvalue() - mpileaks_hash, mpileaks_lbl = s.dag_hash(), s.format('$_$#') - mpi_hash, mpi_lbl = s['mpi'].dag_hash(), s['mpi'].format('$_$#') + mpileaks_hash, mpileaks_lbl = s.dag_hash(), s.format('$_$/') + mpi_hash, mpi_lbl = s['mpi'].dag_hash(), s['mpi'].format('$_$/') callpath_hash, callpath_lbl = ( - s['callpath'].dag_hash(), s['callpath'].format('$_$#')) + s['callpath'].dag_hash(), s['callpath'].format('$_$/')) dyninst_hash, dyninst_lbl = ( - s['dyninst'].dag_hash(), s['dyninst'].format('$_$#')) + s['dyninst'].dag_hash(), s['dyninst'].format('$_$/')) libdwarf_hash, libdwarf_lbl = ( - s['libdwarf'].dag_hash(), s['libdwarf'].format('$_$#')) + s['libdwarf'].dag_hash(), s['libdwarf'].format('$_$/')) libelf_hash, libelf_lbl = ( - s['libelf'].dag_hash(), s['libelf'].format('$_$#')) + s['libelf'].dag_hash(), s['libelf'].format('$_$/')) assert ' "%s" [label="%s"]\n' % (mpileaks_hash, mpileaks_lbl) in dot assert ' "%s" [label="%s"]\n' % (callpath_hash, callpath_lbl) in dot -- cgit v1.2.3-70-g09d2 From 79c1f7885a7d249eb03b259f1c885a6de90222ce Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 8 Feb 2017 03:28:01 +0100 Subject: db and concretization of modified packages: fixes #2911 (#2920) --- lib/spack/spack/database.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index d3fc03fb40..01d545de6d 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -340,6 +340,7 @@ class Database(object): # cached prematurely. for hash_key, rec in data.items(): rec.spec._mark_concrete() + rec.spec.package.spec._mark_concrete() self._data = data -- cgit v1.2.3-70-g09d2 From b192011addad8e62ea1fdbdc4039887d0df6db4d Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Wed, 8 Feb 2017 13:12:10 -0800 Subject: Revert "db and concretization of packages modified after installation: fixes #2911" (#3078) --- lib/spack/spack/database.py | 1 - 1 file changed, 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 01d545de6d..d3fc03fb40 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -340,7 +340,6 @@ class Database(object): # cached prematurely. for hash_key, rec in data.items(): rec.spec._mark_concrete() - rec.spec.package.spec._mark_concrete() self._data = data -- cgit v1.2.3-70-g09d2 From b1eb921f2815309eecd5fd89c92e322b91ae46dd Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Thu, 9 Feb 2017 22:55:18 +0100 Subject: make svn fetch quiet (#3070) --- lib/spack/spack/fetch_strategy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 23f3b9a41e..eadcef85f3 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -719,7 +719,7 @@ class SvnFetchStrategy(VCSFetchStrategy): tty.msg("Trying to check out svn repository: %s" % self.url) - args = ['checkout', '--force'] + args = ['checkout', '--force', '--quiet'] if self.revision: args += ['-r', self.revision] args.append(self.url) -- cgit v1.2.3-70-g09d2 From f9e3b58d7ec2190cdb517ff89ca82019b8eb78da Mon Sep 17 00:00:00 2001 From: becker33 Date: Fri, 10 Feb 2017 10:23:04 -0800 Subject: Make distro more robust to unreadable files (#3110) * Make distro more robust to unreadable files. Will upstream * Comment for clarify --- lib/spack/external/distro.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/external/distro.py b/lib/spack/external/distro.py index ca25339ec9..c4905c25a5 100644 --- a/lib/spack/external/distro.py +++ b/lib/spack/external/distro.py @@ -993,13 +993,18 @@ class LinuxDistribution(object): continue match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) if match: - filepath = os.path.join(_UNIXCONFDIR, basename) - distro_info = self._parse_distro_release_file(filepath) - if 'name' in distro_info: - # The name is always present if the pattern matches - self.distro_release_file = filepath - distro_info['id'] = match.group(1) - return distro_info + try: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + return distro_info + except IOError: + # We found a file we do not have permission to read + # Continue checking candidate files for distro file. + continue return {} def _parse_distro_release_file(self, filepath): -- cgit v1.2.3-70-g09d2 From e24fdb49ea92fe310d5a39e610821bf0e51be8b1 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Sat, 11 Feb 2017 01:09:43 +0100 Subject: fix: don't call setup_environment when not needed (#3060) * Don't call setup_environment when not needed. fixes #3059 * setup_environment and modules: added unit tests --- lib/spack/spack/modules.py | 1 - lib/spack/spack/package.py | 2 +- lib/spack/spack/test/modules.py | 15 +++++++++++++++ var/spack/repos/builtin.mock/packages/callpath/package.py | 3 +++ var/spack/repos/builtin.mock/packages/mpileaks/package.py | 3 +++ 5 files changed, 22 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py index 885f2197ef..a6ffded935 100644 --- a/lib/spack/spack/modules.py +++ b/lib/spack/spack/modules.py @@ -389,7 +389,6 @@ class EnvModule(object): for mod in modules: set_module_variables_for_package(package, mod) set_module_variables_for_package(package, package.module) - package.setup_environment(spack_env, env) package.setup_dependent_package(self.pkg.module, self.spec) package.setup_dependent_environment(spack_env, env, self.spec) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index e5ea8c56ad..361691379e 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1452,7 +1452,7 @@ class PackageBase(object): This is useful if there are some common steps to installing all extensions for a certain package. """ - self.setup_environment(spack_env, run_env) + pass def setup_dependent_package(self, module, dependent_spec): """Set up Python module-scope variables for dependent packages. diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py index 4f35df1982..bb1b0006f8 100644 --- a/lib/spack/spack/test/modules.py +++ b/lib/spack/spack/test/modules.py @@ -357,6 +357,21 @@ class TestTcl(object): generator = tcl_factory(spec) assert 'bar' in generator.use_name + def test_setup_environment(self, tcl_factory): + spec = spack.spec.Spec('mpileaks') + spec.concretize() + content = get_modulefile_content(tcl_factory, spec) + assert len([x for x in content if 'setenv FOOBAR' in x]) == 1 + assert len( + [x for x in content if 'setenv FOOBAR "mpileaks"' in x] + ) == 1 + + content = get_modulefile_content(tcl_factory, spec['callpath']) + assert len([x for x in content if 'setenv FOOBAR' in x]) == 1 + assert len( + [x for x in content if 'setenv FOOBAR "callpath"' in x] + ) == 1 + @pytest.mark.usefixtures('config', 'builtin_mock', 'stringio_open') class TestLmod(object): diff --git a/var/spack/repos/builtin.mock/packages/callpath/package.py b/var/spack/repos/builtin.mock/packages/callpath/package.py index 56b969df98..c00f408866 100644 --- a/var/spack/repos/builtin.mock/packages/callpath/package.py +++ b/var/spack/repos/builtin.mock/packages/callpath/package.py @@ -40,3 +40,6 @@ class Callpath(Package): configure("--prefix=%s" % prefix) make() make("install") + + def setup_environment(self, senv, renv): + renv.set('FOOBAR', self.name) diff --git a/var/spack/repos/builtin.mock/packages/mpileaks/package.py b/var/spack/repos/builtin.mock/packages/mpileaks/package.py index 10fbf3845e..749fcc601a 100644 --- a/var/spack/repos/builtin.mock/packages/mpileaks/package.py +++ b/var/spack/repos/builtin.mock/packages/mpileaks/package.py @@ -44,3 +44,6 @@ class Mpileaks(Package): def install(self, spec, prefix): pass + + def setup_environment(self, senv, renv): + renv.set('FOOBAR', self.name) -- cgit v1.2.3-70-g09d2 From a9cf99b3e2b490f02c87c40072312983d657069e Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 17 Feb 2017 13:49:55 -0600 Subject: Fix typos in External Packages documentation (#3168) --- lib/spack/docs/build_settings.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/build_settings.rst b/lib/spack/docs/build_settings.rst index 60ff26f26f..0f935aa1ce 100644 --- a/lib/spack/docs/build_settings.rst +++ b/lib/spack/docs/build_settings.rst @@ -71,9 +71,9 @@ package lacks a spec component, such as missing a compiler or package version, then Spack will guess the missing component based on its most-favored packages, and it may guess incorrectly. -Each package version and compilers listed in an external should +Each package version and compiler listed in an external should have entries in Spack's packages and compiler configuration, even -though the package and compiler may not every be built. +though the package and compiler may not ever be built. The packages configuration can tell Spack to use an external location for certain package versions, but it does not restrict Spack to using -- cgit v1.2.3-70-g09d2 From 682d5cf1649b2f6304887aac6e5428308f65906a Mon Sep 17 00:00:00 2001 From: Elizabeth Fischer Date: Fri, 17 Feb 2017 14:55:22 -0500 Subject: py-git2: New Package (#1971) --- lib/spack/spack/spec.py | 3 +- .../repos/builtin/packages/libgit2/package.py | 41 ++++++++++++++++++ .../repos/builtin/packages/libssh2/package.py | 48 +++++++++++++++++++++ .../repos/builtin/packages/py-git2/package.py | 50 ++++++++++++++++++++++ 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 var/spack/repos/builtin/packages/libgit2/package.py create mode 100644 var/spack/repos/builtin/packages/libssh2/package.py create mode 100644 var/spack/repos/builtin/packages/py-git2/package.py (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 0df0ff71ea..5c7acfcd95 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2955,7 +2955,8 @@ class SpecParser(spack.parse.Parser): if not id: id = self.token.value if '.' in id: - self.last_token_error("Identifier cannot contain '.'") + self.last_token_error( + "{0}: Identifier cannot contain '.'".format(id)) def parse(string): diff --git a/var/spack/repos/builtin/packages/libgit2/package.py b/var/spack/repos/builtin/packages/libgit2/package.py new file mode 100644 index 0000000000..d3163e3923 --- /dev/null +++ b/var/spack/repos/builtin/packages/libgit2/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Libgit2(CMakePackage): + """libgit2 is a portable, pure C implementation of the Git core + methods provided as a re-entrant linkable library with a solid + API, allowing you to write native speed custom Git applications in + any language which supports C bindings. + """ + + homepage = "https://libgit2.github.com/" + url = "https://github.com/libgit2/libgit2/archive/v0.24.2.tar.gz" + + version('0.24.2', '735661b5b73e3c120d13e2bae21e49b3') + + depends_on('cmake@2.8:', type='build') + depends_on('libssh2') diff --git a/var/spack/repos/builtin/packages/libssh2/package.py b/var/spack/repos/builtin/packages/libssh2/package.py new file mode 100644 index 0000000000..2c582b477e --- /dev/null +++ b/var/spack/repos/builtin/packages/libssh2/package.py @@ -0,0 +1,48 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Libssh2(CMakePackage): + """libssh2 is a client-side C library implementing the SSH2 protocol""" + + homepage = "https://www.libssh2.org/" + url = "https://www.libssh2.org/download/libssh2-1.7.0.tar.gz" + + version('1.7.0', 'b01662a210e94cccf2f76094db7dac5c') + version('1.4.3', '071004c60c5d6f90354ad1b701013a0b') # CentOS7 + + variant('shared', default=True, + description="Build shared libraries") + + depends_on('cmake@2.8.11:', type='build') + depends_on('openssl') + depends_on('zlib') + depends_on('xz') + + def cmake_args(self): + spec = self.spec + return [ + '-DBUILD_SHARED_LIBS=%s' % ('YES' if '+shared' in spec else 'NO')] diff --git a/var/spack/repos/builtin/packages/py-git2/package.py b/var/spack/repos/builtin/packages/py-git2/package.py new file mode 100644 index 0000000000..a750ecae0e --- /dev/null +++ b/var/spack/repos/builtin/packages/py-git2/package.py @@ -0,0 +1,50 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 PyGit2(PythonPackage): + """Pygit2 is a set of Python bindings to the libgit2 shared library, + libgit2 implements the core of Git. + """ + + homepage = "http://www.pygit2.org/" + + version('0.24.1', 'dd98b6a9fded731e36ca5a40484c8545', + url="https://pypi.python.org/packages/aa/56/84dcce942a48d4b7b970cfb7a779b8db1d904e5ec5f71e7a67a63a23a4e2/pygit2-0.24.1.tar.gz") + + extends('python') + depends_on('py-setuptools', type='build') + # Version must match with libgit2 + # See: http://www.pygit2.org/install.html + depends_on('libgit2@0.24:', when='@0.24:') + depends_on('py-six', type=('build', 'run')) + depends_on('py-cffi', type=('build', 'run')) + + def setup_environment(self, spack_env, run_env): + spec = self.spec + # http://www.pygit2.org/install.html + spack_env.set('LIBGIT2', spec['libgit2'].prefix) + spack_env.set('LIBGIT2_LIB', spec['libgit2'].prefix.lib) -- cgit v1.2.3-70-g09d2 From 38dd01f6b5c8275fbf386910fa7fe3a0b62d8cd2 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 17 Feb 2017 14:02:48 -0600 Subject: Fix missing space in error message output (#3169) --- lib/spack/spack/concretize.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 36e8b30196..bc3675ad84 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -473,8 +473,8 @@ class UnavailableCompilerVersionError(spack.error.SpackError): def __init__(self, compiler_spec, operating_system, target): super(UnavailableCompilerVersionError, self).__init__( - "No available compiler version matches '%s' on operating_system %s" - "for target %s" + "No available compiler version matches '%s' on operating_system " + "'%s' for target '%s'" % (compiler_spec, operating_system, target), "Run 'spack compilers' to see available compiler Options.") -- cgit v1.2.3-70-g09d2 From 29d070e50c3756bae4251865a5feed6ec4cb95a1 Mon Sep 17 00:00:00 2001 From: Elizabeth Fischer Date: Fri, 17 Feb 2017 15:08:17 -0500 Subject: On uninstall, change shortcut flag for --dependents to -R, as per Spack convention. (-r = --dependencies, -R = --dependents). (#1917) --- lib/spack/spack/cmd/uninstall.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index fb9094f1b4..5c33a4d648 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -61,7 +61,7 @@ def setup_parser(subparser): "is both useful and dangerous, like rm -r") subparser.add_argument( - '-d', '--dependents', action='store_true', dest='dependents', + '-R', '--dependents', action='store_true', dest='dependents', help='also uninstall any packages that depend on the ones given ' 'via command line') -- cgit v1.2.3-70-g09d2 From e492aff4f708524a56f60f5ca200c8a97e2d3b4c Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 17 Feb 2017 15:45:02 -0600 Subject: More consistent yes/no prompts (#3174) * More consistent yes/no prompts * Add ==> prefix to yes/no and number prompts --- lib/spack/docs/tutorial_sc16_modules.rst | 6 ++--- lib/spack/docs/tutorial_sc16_spack_basics.rst | 9 +++---- lib/spack/llnl/util/tty/__init__.py | 16 ++++++++---- lib/spack/spack/cmd/__init__.py | 11 --------- lib/spack/spack/cmd/module.py | 28 ++++++++++++--------- lib/spack/spack/cmd/uninstall.py | 35 +++++++++++++++------------ 6 files changed, 51 insertions(+), 54 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/tutorial_sc16_modules.rst b/lib/spack/docs/tutorial_sc16_modules.rst index 0a79d943f9..00b42251db 100644 --- a/lib/spack/docs/tutorial_sc16_modules.rst +++ b/lib/spack/docs/tutorial_sc16_modules.rst @@ -178,8 +178,7 @@ Next you should regenerate all the module files: ... - ==> Do you want to proceed ? [y/n] - y + ==> Do you want to proceed? [y/n] y ==> Regenerating tcl module files If you take a look now at the module for ``gcc`` you'll see that the unwanted @@ -242,8 +241,7 @@ and regenerate the module files: 3cfh3hi gmp@6.1.1 3k4ykbe libxml2@2.9.4 7tb426s ncurses@6.0 djdthlh nettle@3.2 i3rpk4e py-numpy@1.11.1 t5lk6in xz@5.2.2 3ostwel hwloc@1.11.4 cagoem4 lz4@131 mirer2l netlib-lapack@3.6.1 js33umc openblas@0.2.19 e6uljfi py-scipy@0.18.1 asydrba zlib@1.2.8 - ==> Do you want to proceed ? [y/n] - y + ==> Do you want to proceed? [y/n] y $ module avail diff --git a/lib/spack/docs/tutorial_sc16_spack_basics.rst b/lib/spack/docs/tutorial_sc16_spack_basics.rst index 9511907ceb..ed58c7c5cf 100644 --- a/lib/spack/docs/tutorial_sc16_spack_basics.rst +++ b/lib/spack/docs/tutorial_sc16_spack_basics.rst @@ -1006,8 +1006,7 @@ We can uninstall packages by spec using the same syntax as install. w33hrej libelf@0.8.13%intel - ==> Do you want to proceed ? [y/n] - y + ==> Do you want to proceed? [y/n] y ==> Successfully uninstalled libelf@0.8.13%intel@15.0.4 arch=linux-redhat6-x86_64-w33hrej @@ -1054,8 +1053,7 @@ remove packages that are required by another installed package. 4blbe3q libelf@0.8.12%intel - ==> Do you want to proceed ? [y/n] - y + ==> Do you want to proceed? [y/n] y ==> Successfully uninstalled libdwarf@20160507%intel@16.0.3 arch=linux-redhat6-x86_64-csruprg ==> Successfully uninstalled libelf@0.8.12%intel@16.0.3 arch=linux-redhat6-x86_64-4blbe3q @@ -1088,8 +1086,7 @@ packages at once. ffwrpxn trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist - ==> Do you want to proceed ? [y/n] - y + ==> Do you want to proceed? [y/n] y ==> Successfully uninstalled trilinos@12.8.1%gcc@4.4.7+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist arch=linux-redhat6-x86_64-ffwrpxn ----------------------------- diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index 1381bb2f7d..f73d96a4e4 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -59,7 +59,7 @@ def set_debug(flag): def set_verbose(flag): global _verbose _verbose = flag - + def set_stacktrace(flag): global _stacktrace @@ -83,11 +83,15 @@ def process_stacktrace(countback): return st_text -def msg(message, *args): +def msg(message, *args, **kwargs): + newline = kwargs.get('newline', True) st_text = "" if _stacktrace: st_text = process_stacktrace(2) - cprint("@*b{%s==>} %s" % (st_text, cescape(message))) + if newline: + cprint("@*b{%s==>} %s" % (st_text, cescape(message))) + else: + cwrite("@*b{%s==>} %s" % (st_text, cescape(message))) for arg in args: print indent + str(arg) @@ -159,7 +163,8 @@ def get_number(prompt, **kwargs): number = None while number is None: - ans = raw_input(prompt) + msg(prompt, newline=False) + ans = raw_input() if ans == str(abort): return None @@ -191,7 +196,8 @@ def get_yes_or_no(prompt, **kwargs): result = None while result is None: - ans = raw_input(prompt).lower() + msg(prompt, newline=False) + ans = raw_input().lower() if not ans: result = default_value if result is None: diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index 764b6fffcf..3a42510245 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -159,17 +159,6 @@ def disambiguate_spec(spec): return matching_specs[0] -def ask_for_confirmation(message): - while True: - tty.msg(message + '[y/n]') - choice = raw_input().lower() - if choice == 'y': - break - elif choice == 'n': - raise SystemExit('Operation aborted') - tty.warn('Please reply either "y" or "n"') - - def gray_hash(spec, length): return colorize('@K{%s}' % spec.dag_hash(length)) diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py index a924c5f912..37c79a358b 100644 --- a/lib/spack/spack/cmd/module.py +++ b/lib/spack/spack/cmd/module.py @@ -29,10 +29,10 @@ import os import shutil import sys -import llnl.util.filesystem as filesystem -import llnl.util.tty as tty import spack.cmd -import spack.cmd.common.arguments as arguments + +from llnl.util import filesystem, tty +from spack.cmd.common import arguments from spack.modules import module_types description = "manipulate module files" @@ -168,7 +168,7 @@ def find(mtype, specs, args): spec = specs.pop() mod = module_types[mtype](spec) if not os.path.isfile(mod.file_name): - tty.die("No %s module is installed for %s" % (mtype, spec)) + tty.die('No {0} module is installed for {1}'.format(mtype, spec)) print(mod.use_name) @@ -191,7 +191,9 @@ def rm(mtype, specs, args): .format(mtype)) spack.cmd.display_specs(specs_with_modules, long=True) print('') - spack.cmd.ask_for_confirmation('Do you want to proceed ? ') + answer = tty.get_yes_or_no('Do you want to proceed?') + if not answer: + tty.die('Will not remove any module files') # Remove the module files for s in modules: @@ -212,7 +214,9 @@ def refresh(mtype, specs, args): .format(name=mtype)) spack.cmd.display_specs(specs, long=True) print('') - spack.cmd.ask_for_confirmation('Do you want to proceed ? ') + answer = tty.get_yes_or_no('Do you want to proceed?') + if not answer: + tty.die('Will not regenerate any module files') cls = module_types[mtype] @@ -227,9 +231,9 @@ def refresh(mtype, specs, args): message = 'Name clashes detected in module files:\n' for filename, writer_list in file2writer.items(): if len(writer_list) > 1: - message += '\nfile : {0}\n'.format(filename) + message += '\nfile: {0}\n'.format(filename) for x in writer_list: - message += 'spec : {0}\n'.format(x.spec.format(color=True)) + message += 'spec: {0}\n'.format(x.spec.format(color=True)) tty.error(message) tty.error('Operation aborted') raise SystemExit(1) @@ -258,13 +262,13 @@ def module(parser, args): try: callbacks[args.subparser_name](module_type, specs, args) except MultipleMatches: - message = ('the constraint \'{query}\' matches multiple packages, ' - 'and this is not allowed in this context') + message = ("the constraint '{query}' matches multiple packages, " + "and this is not allowed in this context") tty.error(message.format(query=constraint)) for s in specs: sys.stderr.write(s.format(color=True) + '\n') raise SystemExit(1) except NoMatch: - message = ('the constraint \'{query}\' match no package, ' - 'and this is not allowed in this context') + message = ("the constraint '{query}' matches no package, " + "and this is not allowed in this context") tty.die(message.format(query=constraint)) diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index 5c33a4d648..e0b40e0627 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -26,17 +26,18 @@ from __future__ import print_function import argparse -import llnl.util.tty as tty import spack import spack.cmd import spack.store import spack.repository +from llnl.util import tty + description = "remove an installed package" error_message = """You can either: - a) Use a more specific spec, or - b) use spack uninstall -a to uninstall ALL matching specs. + a) use a more specific spec, or + b) use `spack uninstall --all` to uninstall ALL matching specs. """ # Arguments for display_specs when we find ambiguity @@ -94,7 +95,7 @@ def concretize_specs(specs, allow_multiple_matches=False, force=False): # For each spec provided, make sure it refers to only one package. # Fail and ask user to be unambiguous if it doesn't if not allow_multiple_matches and len(matching) > 1: - tty.error("%s matches multiple packages:" % spec) + tty.error('{0} matches multiple packages:'.format(spec)) print() spack.cmd.display_specs(matching, **display_args) print() @@ -102,7 +103,8 @@ def concretize_specs(specs, allow_multiple_matches=False, force=False): # No installed package matches the query if len(matching) == 0 and spec is not any: - tty.error("%s does not match any installed packages." % spec) + tty.error('{0} does not match any installed packages.'.format( + spec)) has_errors = True specs_from_cli.extend(matching) @@ -176,10 +178,10 @@ def get_uninstall_list(args): has_error = False if dependent_list and not args.dependents and not args.force: for spec, lst in dependent_list.items(): - tty.error("Will not uninstall %s" % - spec.format("$_$@$%@$/", color=True)) + tty.error('Will not uninstall {0}'.format( + spec.format("$_$@$%@$/", color=True))) print('') - print("The following packages depend on it:") + print('The following packages depend on it:') spack.cmd.display_specs(lst, **display_args) print('') has_error = True @@ -188,28 +190,29 @@ def get_uninstall_list(args): uninstall_list.extend(lst) uninstall_list = list(set(uninstall_list)) if has_error: - tty.die('You can use spack uninstall --dependents ' - 'to uninstall these dependencies as well') + tty.die('Use `spack uninstall --dependents` ' + 'to uninstall these dependencies as well.') return uninstall_list def uninstall(parser, args): if not args.packages and not args.all: - tty.die("uninstall requires at least one package argument.") + tty.die('uninstall requires at least one package argument.', + ' Use `spack uninstall --all` to uninstall ALL packages.') uninstall_list = get_uninstall_list(args) if not uninstall_list: - tty.msg("There are no package to uninstall.") + tty.warn('There are no package to uninstall.') return if not args.yes_to_all: - tty.msg("The following packages will be uninstalled : ") - print('') + tty.msg('The following packages will be uninstalled:\n') spack.cmd.display_specs(uninstall_list, **display_args) - print('') - spack.cmd.ask_for_confirmation('Do you want to proceed ? ') + answer = tty.get_yes_or_no('Do you want to proceed?', default=False) + if not answer: + tty.die('Will not uninstall any packages.') # Uninstall everything on the list do_uninstall(uninstall_list, args.force) -- cgit v1.2.3-70-g09d2 From 524303db06797c87dfedea4d043b1f13132496d2 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 17 Feb 2017 15:46:31 -0600 Subject: Set default module type based on modules.yaml (#3173) --- lib/spack/spack/cmd/common/arguments.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index b527c7f138..6fc3b5d3cf 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -79,8 +79,10 @@ _arguments['constraint'] = Args( help='constraint to select a subset of installed packages') _arguments['module_type'] = Args( - '-m', '--module-type', help='type of module files', - default='tcl', choices=spack.modules.module_types) + '-m', '--module-type', + choices=spack.modules.module_types.keys(), + default=spack.modules.module_types.keys()[0], + help='type of module files [default: %(default)s]') _arguments['yes_to_all'] = Args( '-y', '--yes-to-all', action='store_true', dest='yes_to_all', -- cgit v1.2.3-70-g09d2 From 6d3f649382dc9e5407aba8e1557dc777076d320e Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 17 Feb 2017 17:58:06 -0600 Subject: Fix readline support in `spack python` (#3132) * Fix readline support in `spack python` * Add documentation on `spack python` * Add unit tests for `spack python` --- lib/spack/docs/developer_guide.rst | 41 ++++++++++++++++++++++++++++++++++++ lib/spack/spack/cmd/python.py | 3 +++ lib/spack/spack/test/cmd/python.py | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 lib/spack/spack/test/cmd/python.py (limited to 'lib') diff --git a/lib/spack/docs/developer_guide.rst b/lib/spack/docs/developer_guide.rst index dbb9a670b4..0ce4029950 100644 --- a/lib/spack/docs/developer_guide.rst +++ b/lib/spack/docs/developer_guide.rst @@ -360,6 +360,47 @@ Developer commands ``spack test`` ^^^^^^^^^^^^^^ +.. _cmd-spack-python: + +^^^^^^^^^^^^^^^^ +``spack python`` +^^^^^^^^^^^^^^^^ + +``spack python`` is a command that lets you import and debug things as if +you were in a Spack interactive shell. Without any arguments, it is similar +to a normal interactive Python shell, except you can import spack and any +other Spack modules: + +.. code-block:: console + + $ spack python + Spack version 0.10.0 + Python 2.7.13, Linux x86_64 + >>> from spack.version import Version + >>> a = Version('1.2.3') + >>> b = Version('1_2_3') + >>> a == b + True + >>> c = Version('1.2.3b') + >>> c > a + True + >>> + +You can also run a single command: + +.. code-block:: console + + $ spack python -c 'import distro; distro.linux_distribution()' + ('Fedora', '25', 'Workstation Edition') + +or a file: + +.. code-block:: console + + $ spack python ~/test_fetching.py + +just like you would with the normal ``python`` command. + .. _cmd-spack-url: ^^^^^^^^^^^^^ diff --git a/lib/spack/spack/cmd/python.py b/lib/spack/spack/cmd/python.py index 05af7bc776..6df9507580 100644 --- a/lib/spack/spack/cmd/python.py +++ b/lib/spack/spack/cmd/python.py @@ -62,6 +62,9 @@ def python(parser, args): with open(python_args[0]) as file: console.runsource(file.read(), python_args[0], 'exec') else: + # Provides readline support, allowing user to use arrow keys + console.push('import readline') + console.interact("Spack version %s\nPython %s, %s %s""" % (spack.spack_version, platform.python_version(), platform.system(), platform.machine())) diff --git a/lib/spack/spack/test/cmd/python.py b/lib/spack/spack/test/cmd/python.py new file mode 100644 index 0000000000..5dc82bd90e --- /dev/null +++ b/lib/spack/spack/test/cmd/python.py @@ -0,0 +1,43 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import argparse +import pytest + +from spack.cmd.python import * + + +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the ``python`` command""" + parser = argparse.ArgumentParser() + setup_parser(parser) + return parser + + +def test_python(parser): + args = parser.parse_args([ + '-c', 'import spack; print(spack.spack_version)' + ]) + python(parser, args) -- cgit v1.2.3-70-g09d2 From d49cb2734f21f064f6abe563726ae7fdeb1dcf62 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 21 Feb 2017 15:04:32 +0100 Subject: Fixing issue wheh overwriting build_args in PythonPackage (#3200) --- lib/spack/spack/cmd/create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 2901dcfa63..14b213a756 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -231,7 +231,7 @@ class PythonPackageTemplate(PackageTemplate): # depends_on('py-foo', type=('build', 'run'))""" body = """\ - def build_args(self): + def build_args(self, spec, prefix): # FIXME: Add arguments other than --prefix # FIXME: If not needed delete the function args = [] -- cgit v1.2.3-70-g09d2 From 5ce926d2d16d7ecd5aae72f586caba74cf07862d Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 2 Mar 2017 18:29:23 +0100 Subject: test/packages: fixed test suite (#3236) It seems the tests in `packages.py` were running just because we had a specific order of execution. This should fix the problem, and make the test_suite more resilient to running order. --- lib/spack/spack/test/packages.py | 205 +++++++++++++++++++-------------------- 1 file changed, 99 insertions(+), 106 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index bc1f438e44..8ae2effc38 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -23,115 +23,108 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import spack +import pytest + from llnl.util.filesystem import join_path from spack.repository import Repo from spack.util.naming import mod_to_class from spack.spec import * -def test_load_package(builtin_mock): - spack.repo.get('mpich') - - -def test_package_name(builtin_mock): - pkg = spack.repo.get('mpich') - assert pkg.name == 'mpich' - - -def test_package_filename(builtin_mock): - repo = Repo(spack.mock_packages_path) - filename = repo.filename_for_package_name('mpich') - assert filename == join_path( - spack.mock_packages_path, - 'packages', - 'mpich', - 'package.py' - ) - - -def test_nonexisting_package_filename(): - repo = Repo(spack.mock_packages_path) - filename = repo.filename_for_package_name('some-nonexisting-package') - assert filename == join_path( - spack.mock_packages_path, - 'packages', - 'some-nonexisting-package', - 'package.py' - ) - - -def test_package_class_names(): - assert 'Mpich' == mod_to_class('mpich') - assert 'PmgrCollective' == mod_to_class('pmgr_collective') - assert 'PmgrCollective' == mod_to_class('pmgr-collective') - assert 'Pmgrcollective' == mod_to_class('PmgrCollective') - assert '_3db' == mod_to_class('3db') - - -# Below tests target direct imports of spack packages from the -# spack.pkg namespace -def test_import_package(builtin_mock): - import spack.pkg.builtin.mock.mpich # noqa - - -def test_import_package_as(builtin_mock): - import spack.pkg.builtin.mock.mpich as mp # noqa - - import spack.pkg.builtin.mock # noqa - import spack.pkg.builtin.mock as m # noqa - from spack.pkg.builtin import mock # noqa - - -def test_inheritance_of_diretives(): - p = spack.repo.get('simple-inheritance') - - # Check dictionaries that should have been filled by directives - assert len(p.dependencies) == 3 - assert 'cmake' in p.dependencies - assert 'openblas' in p.dependencies - assert 'mpi' in p.dependencies - assert len(p.provided) == 2 - - # Check that Spec instantiation behaves as we expect - s = Spec('simple-inheritance') - s.concretize() - assert '^cmake' in s - assert '^openblas' in s - assert '+openblas' in s - assert 'mpi' in s - - s = Spec('simple-inheritance~openblas') - s.concretize() - assert '^cmake' in s - assert '^openblas' not in s - assert '~openblas' in s - assert 'mpi' in s - - -def test_dependency_extensions(): - s = Spec('extension2') - s.concretize() - deps = set(x.name for x in s.package.dependency_activations()) - assert deps == set(['extension1']) - - -def test_import_class_from_package(builtin_mock): - from spack.pkg.builtin.mock.mpich import Mpich # noqa - - -def test_import_module_from_package(builtin_mock): - from spack.pkg.builtin.mock import mpich # noqa - - -def test_import_namespace_container_modules(builtin_mock): - import spack.pkg # noqa - import spack.pkg as p # noqa - from spack import pkg # noqa - - import spack.pkg.builtin # noqa - import spack.pkg.builtin as b # noqa - from spack.pkg import builtin # noqa - - import spack.pkg.builtin.mock # noqa - import spack.pkg.builtin.mock as m # noqa - from spack.pkg.builtin import mock # noqa +@pytest.mark.usefixtures('config', 'builtin_mock') +class TestPackage(object): + def test_load_package(self): + spack.repo.get('mpich') + + def test_package_name(self): + pkg = spack.repo.get('mpich') + assert pkg.name == 'mpich' + + def test_package_filename(self): + repo = Repo(spack.mock_packages_path) + filename = repo.filename_for_package_name('mpich') + assert filename == join_path( + spack.mock_packages_path, + 'packages', + 'mpich', + 'package.py' + ) + + def test_nonexisting_package_filename(self): + repo = Repo(spack.mock_packages_path) + filename = repo.filename_for_package_name('some-nonexisting-package') + assert filename == join_path( + spack.mock_packages_path, + 'packages', + 'some-nonexisting-package', + 'package.py' + ) + + def test_package_class_names(self): + assert 'Mpich' == mod_to_class('mpich') + assert 'PmgrCollective' == mod_to_class('pmgr_collective') + assert 'PmgrCollective' == mod_to_class('pmgr-collective') + assert 'Pmgrcollective' == mod_to_class('PmgrCollective') + assert '_3db' == mod_to_class('3db') + + # Below tests target direct imports of spack packages from the + # spack.pkg namespace + def test_import_package(self): + import spack.pkg.builtin.mock.mpich # noqa + + def test_import_package_as(self): + import spack.pkg.builtin.mock.mpich as mp # noqa + + import spack.pkg.builtin.mock # noqa + import spack.pkg.builtin.mock as m # noqa + from spack.pkg.builtin import mock # noqa + + def test_inheritance_of_diretives(self): + p = spack.repo.get('simple-inheritance') + + # Check dictionaries that should have been filled by directives + assert len(p.dependencies) == 3 + assert 'cmake' in p.dependencies + assert 'openblas' in p.dependencies + assert 'mpi' in p.dependencies + assert len(p.provided) == 2 + + # Check that Spec instantiation behaves as we expect + s = Spec('simple-inheritance') + s.concretize() + assert '^cmake' in s + assert '^openblas' in s + assert '+openblas' in s + assert 'mpi' in s + + s = Spec('simple-inheritance~openblas') + s.concretize() + assert '^cmake' in s + assert '^openblas' not in s + assert '~openblas' in s + assert 'mpi' in s + + def test_dependency_extensions(self): + s = Spec('extension2') + s.concretize() + deps = set(x.name for x in s.package.dependency_activations()) + assert deps == set(['extension1']) + + def test_import_class_from_package(self): + from spack.pkg.builtin.mock.mpich import Mpich # noqa + + def test_import_module_from_package(self): + from spack.pkg.builtin.mock import mpich # noqa + + def test_import_namespace_container_modules(self): + import spack.pkg # noqa + import spack.pkg as p # noqa + from spack import pkg # noqa + + import spack.pkg.builtin # noqa + import spack.pkg.builtin as b # noqa + from spack.pkg import builtin # noqa + + import spack.pkg.builtin.mock # noqa + import spack.pkg.builtin.mock as m # noqa + from spack.pkg.builtin import mock # noqa -- cgit v1.2.3-70-g09d2 From ed582cef68585b6090866fb0bb3aa2cc72dbe2ed Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 2 Mar 2017 19:01:29 +0100 Subject: New interface for passing build information among specs (#1875) - Added a new interface for Specs to pass build information - Calls forwarded from Spec to Package are now explicit - Added descriptor within Spec to manage forwarding - Added state in Spec to maintain query information - Modified a few packages (the one involved in spack install pexsi) to showcase changes - This uses an object wrapper to `spec` to implement the `libs` sub-calls. - wrapper is returned from `__getitem__` only if spec is concrete - allows packagers to access build information easily --- lib/spack/llnl/util/lang.py | 14 ++ lib/spack/spack/package.py | 6 +- lib/spack/spack/spec.py | 246 ++++++++++++++++++--- lib/spack/spack/test/database.py | 12 + lib/spack/spack/test/spec_dag.py | 47 +++- .../builtin.mock/packages/mpileaks/package.py | 3 + var/spack/repos/builtin/packages/abinit/package.py | 6 +- .../repos/builtin/packages/armadillo/package.py | 4 +- .../repos/builtin/packages/arpack-ng/package.py | 8 +- var/spack/repos/builtin/packages/atlas/package.py | 9 +- .../repos/builtin/packages/atompaw/package.py | 2 +- .../repos/builtin/packages/cantera/package.py | 2 +- var/spack/repos/builtin/packages/cp2k/package.py | 14 +- var/spack/repos/builtin/packages/dealii/package.py | 2 +- var/spack/repos/builtin/packages/elk/package.py | 4 +- var/spack/repos/builtin/packages/elpa/package.py | 8 +- var/spack/repos/builtin/packages/gmsh/package.py | 2 +- var/spack/repos/builtin/packages/hpl/package.py | 2 +- var/spack/repos/builtin/packages/hypre/package.py | 4 +- .../repos/builtin/packages/intel-mkl/package.py | 2 +- .../packages/intel-parallel-studio/package.py | 2 +- var/spack/repos/builtin/packages/ipopt/package.py | 4 +- var/spack/repos/builtin/packages/mfem/package.py | 2 +- var/spack/repos/builtin/packages/mumps/package.py | 6 +- .../builtin/packages/netlib-lapack/package.py | 2 +- .../builtin/packages/netlib-scalapack/package.py | 4 +- var/spack/repos/builtin/packages/nwchem/package.py | 6 +- var/spack/repos/builtin/packages/octave/package.py | 4 +- .../repos/builtin/packages/octopus/package.py | 8 +- .../repos/builtin/packages/openblas/package.py | 25 +-- .../repos/builtin/packages/openmpi/package.py | 12 + var/spack/repos/builtin/packages/opium/package.py | 2 +- var/spack/repos/builtin/packages/petsc/package.py | 2 +- var/spack/repos/builtin/packages/pexsi/make.inc | 2 +- var/spack/repos/builtin/packages/pexsi/package.py | 7 +- var/spack/repos/builtin/packages/psi4/package.py | 4 +- .../repos/builtin/packages/py-numpy/package.py | 4 +- .../repos/builtin/packages/suite-sparse/package.py | 4 +- .../repos/builtin/packages/sundials/package.py | 4 +- .../repos/builtin/packages/superlu-dist/package.py | 12 +- .../repos/builtin/packages/superlu-mt/package.py | 2 +- .../repos/builtin/packages/superlu/package.py | 4 +- .../repos/builtin/packages/trilinos/package.py | 4 +- .../repos/builtin/packages/veclibfort/package.py | 9 +- .../repos/builtin/packages/wannier90/package.py | 4 +- 45 files changed, 389 insertions(+), 147 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 331cf2b3c5..d9fef42e53 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -374,3 +374,17 @@ def duplicate_stream(original): :rtype: file like object """ return os.fdopen(os.dup(original.fileno())) + + +class ObjectWrapper(object): + """Base class that wraps an object. Derived classes can add new behavior + while staying undercover. + + This class is modeled after the stackoverflow answer: + - http://stackoverflow.com/a/1445289/771663 + """ + def __init__(self, wrapped_object): + wrapped_cls = type(wrapped_object) + wrapped_name = wrapped_cls.__name__ + self.__class__ = type(wrapped_name, (type(self), wrapped_cls), {}) + self.__dict__ = wrapped_object.__dict__ diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 361691379e..3be3bffc70 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -42,7 +42,6 @@ import re import sys import textwrap import time -from StringIO import StringIO import llnl.util.lock import llnl.util.tty as tty @@ -57,6 +56,7 @@ import spack.mirror import spack.repository import spack.url import spack.util.web +from StringIO import StringIO from llnl.util.filesystem import * from llnl.util.lang import * from llnl.util.link_tree import LinkTree @@ -1053,6 +1053,10 @@ class PackageBase(object): touch(join_path(self.prefix.bin, 'fake')) mkdirp(self.prefix.include) mkdirp(self.prefix.lib) + library_name = 'lib' + self.name + dso_suffix = 'dylib' if sys.platform == 'darwin' else 'so' + touch(join_path(self.prefix.lib, library_name + dso_suffix)) + touch(join_path(self.prefix.lib, library_name + '.a')) mkdirp(self.prefix.man1) def _if_make_target_execute(self, target): diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 5c7acfcd95..c0ee8486db 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -96,32 +96,35 @@ specs to avoid ambiguity. Both are provided because ~ can cause shell expansion when it is the first character in an id typed on the command line. """ import base64 -import hashlib +import collections +import csv import ctypes -from StringIO import StringIO +import hashlib +import itertools from operator import attrgetter -from yaml.error import MarkedYAMLError - +import cStringIO import llnl.util.tty as tty -from llnl.util.lang import * -from llnl.util.tty.color import * - import spack import spack.architecture -import spack.store import spack.compilers as compilers import spack.error import spack.parse +import spack.store +import spack.util.spack_json as sjson +import spack.util.spack_yaml as syaml +from cStringIO import StringIO +from llnl.util.filesystem import find_libraries +from llnl.util.lang import * +from llnl.util.tty.color import * from spack.build_environment import get_path_from_module, load_module +from spack.provider_index import ProviderIndex +from spack.util.crypto import prefix_bits from spack.util.prefix import Prefix -from spack.util.string import * -import spack.util.spack_yaml as syaml -import spack.util.spack_json as sjson from spack.util.spack_yaml import syaml_dict -from spack.util.crypto import prefix_bits +from spack.util.string import * from spack.version import * -from spack.provider_index import ProviderIndex +from yaml.error import MarkedYAMLError __all__ = [ 'Spec', @@ -750,6 +753,161 @@ class DependencyMap(HashableMap): return "{deps: %s}" % ', '.join(str(d) for d in sorted(self.values())) +def _libs_default_handler(descriptor, spec, cls): + """Default handler when looking for 'libs' attribute. The default + tries to search for 'lib{spec.name}' recursively starting from + `spec.prefix`. + + :param ForwardQueryToPackage descriptor: descriptor that triggered + the call + :param Spec spec: spec that is being queried + :param type(spec) cls: type of spec, to match the signature of the + descriptor `__get__` method + """ + name = 'lib' + spec.name + shared = '+shared' in spec + return find_libraries( + [name], root=spec.prefix, shared=shared, recurse=True + ) + + +def _cppflags_default_handler(descriptor, spec, cls): + """Default handler when looking for cppflags attribute. The default + just returns '-I{spec.prefix.include}'. + + :param ForwardQueryToPackage descriptor: descriptor that triggered + the call + :param Spec spec: spec that is being queried + :param type(spec) cls: type of spec, to match the signature of the + descriptor `__get__` method + """ + return '-I' + spec.prefix.include + + +class ForwardQueryToPackage(object): + """Descriptor used to forward queries from Spec to Package""" + + def __init__(self, attribute_name, default_handler=None): + """Initializes the instance of the descriptor + + :param str attribute_name: name of the attribute to be + searched for in the Package instance + :param callable default_handler: [optional] default function + to be called if the attribute was not found in the Package + instance + """ + self.attribute_name = attribute_name + # Turn the default handler into a function with the right + # signature that always returns None + if default_handler is None: + default_handler = lambda descriptor, spec, cls: None + self.default = default_handler + + def __get__(self, instance, cls): + """Retrieves the property from Package using a well defined chain + of responsibility. + + The order of call is : + + 1. if the query was through the name of a virtual package try to + search for the attribute `{virtual_name}_{attribute_name}` + in Package + + 2. try to search for attribute `{attribute_name}` in Package + + 3. try to call the default handler + + The first call that produces a value will stop the chain. + + If no call can handle the request or a None value is produced, + then AttributeError is raised. + """ + pkg = instance.package + try: + query = instance.last_query + except AttributeError: + # There has been no query yet: this means + # a spec is trying to access its own attributes + _ = instance[instance.name] # NOQA: ignore=F841 + query = instance.last_query + + callbacks_chain = [] + # First in the chain : specialized attribute for virtual packages + if query.isvirtual: + specialized_name = '{0}_{1}'.format( + query.name, self.attribute_name + ) + callbacks_chain.append(lambda: getattr(pkg, specialized_name)) + # Try to get the generic method from Package + callbacks_chain.append(lambda: getattr(pkg, self.attribute_name)) + # Final resort : default callback + callbacks_chain.append(lambda: self.default(self, instance, cls)) + + # Trigger the callbacks in order, the first one producing a + # value wins + value = None + for f in callbacks_chain: + try: + value = f() + break + except AttributeError: + pass + # 'None' value raises AttributeError : this permits to 'disable' + # the call in a particular package by returning None from the + # queried attribute, or will trigger an exception if things + # searched for were not found + if value is None: + fmt = '\'{name}\' package has no relevant attribute \'{query}\'\n' # NOQA: ignore=E501 + fmt += '\tspec : \'{spec}\'\n' + fmt += '\tqueried as : \'{spec.last_query.name}\'\n' + fmt += '\textra parameters : \'{spec.last_query.extra_parameters}\'\n' # NOQA: ignore=E501 + message = fmt.format( + name=pkg.name, + query=self.attribute_name, + spec=instance + ) + raise AttributeError(message) + + return value + + def __set__(self, instance, value): + cls_name = type(instance).__name__ + msg = "'{0}' object attribute '{1}' is read-only" + raise AttributeError(msg.format(cls_name, self.attribute_name)) + + +class SpecBuildInterface(ObjectWrapper): + + libs = ForwardQueryToPackage( + 'libs', + default_handler=_libs_default_handler + ) + + cppflags = ForwardQueryToPackage( + 'cppflags', + default_handler=_cppflags_default_handler + ) + + def __init__(self, spec, name, query_parameters): + super(SpecBuildInterface, self).__init__(spec) + + # Represents a query state in a BuildInterface object + QueryState = collections.namedtuple( + 'QueryState', ['name', 'extra_parameters', 'isvirtual'] + ) + + is_virtual = Spec.is_virtual(name) + self._query_to_package = QueryState( + name=name, + extra_parameters=query_parameters, + isvirtual=is_virtual + ) + + @property + def last_query(self): + return self._query_to_package + + @key_ordering class Spec(object): @@ -818,14 +976,6 @@ class Spec(object): self._add_dependency(spec, deptypes) deptypes = () - def __getattr__(self, item): - """Delegate to self.package if the attribute is not in the spec""" - # This line is to avoid infinite recursion in case package is - # not present among self attributes - if item.endswith('libs'): - return getattr(self.package, item) - raise AttributeError(item) - def get_dependency(self, name): dep = self._dependencies.get(name) if dep is not None: @@ -2239,22 +2389,46 @@ class Spec(object): return self.versions[0] def __getitem__(self, name): - """Get a dependency from the spec by its name.""" - for spec in self.traverse(): - if spec.name == name: - return spec - - if Spec.is_virtual(name): - # TODO: this is a kind of kludgy way to find providers - # TODO: should we just keep virtual deps in the DAG instead of - # TODO: removing them on concretize? - for spec in self.traverse(): - if spec.virtual: - continue - if spec.package.provides(name): - return spec + """Get a dependency from the spec by its name. This call implicitly + sets a query state in the package being retrieved. The behavior of + packages may be influenced by additional query parameters that are + passed after a colon symbol. + + Note that if a virtual package is queried a copy of the Spec is + returned while for non-virtual a reference is returned. + """ + query_parameters = name.split(':') + if len(query_parameters) > 2: + msg = 'key has more than one \':\' symbol.' + msg += ' At most one is admitted.' + raise KeyError(msg) + + name, query_parameters = query_parameters[0], query_parameters[1:] + if query_parameters: + # We have extra query parameters, which are comma separated + # values + f = cStringIO.StringIO(query_parameters.pop()) + try: + query_parameters = next(csv.reader(f, skipinitialspace=True)) + except StopIteration: + query_parameters = [''] + + try: + value = next( + itertools.chain( + # Regular specs + (x for x in self.traverse() if x.name == name), + (x for x in self.traverse() + if (not x.virtual) and x.package.provides(name)) + ) + ) + except StopIteration: + raise KeyError("No spec with name %s in %s" % (name, self)) + + if self._concrete: + return SpecBuildInterface(value, name, query_parameters) - raise KeyError("No spec with name %s in %s" % (name, self)) + return value def __contains__(self, spec): """True if this spec satisfies the provided spec, or if any dependency diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index bbaa88b91d..0d7999cd36 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -103,6 +103,18 @@ def _mock_remove(spec): spec.package.do_uninstall(spec) +def test_default_queries(database): + install_db = database.mock.db + rec = install_db.get_record('zmpi') + + spec = rec.spec + libraries = spec['zmpi'].libs + assert len(libraries) == 1 + + cppflags_expected = '-I' + spec.prefix.include + assert spec['zmpi'].cppflags == cppflags_expected + + def test_005_db_exists(database): """Make sure db cache file exists after creating.""" install_path = database.mock.path diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index 1578bcacbe..2c414bd0c0 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -24,9 +24,6 @@ ############################################################################## """ These tests check Spec DAG operations using dummy packages. -You can find the dummy packages here:: - - spack/lib/spack/spack/test/mock_packages """ import pytest import spack @@ -690,3 +687,47 @@ class TestSpecDag(object): s4 = s3.copy() self.check_diamond_deptypes(s4) + + def test_getitem_query(self): + s = Spec('mpileaks') + s.concretize() + + # Check a query to a non-virtual package + a = s['callpath'] + + query = a.last_query + assert query.name == 'callpath' + assert len(query.extra_parameters) == 0 + assert not query.isvirtual + + # Check a query to a virtual package + a = s['mpi'] + + query = a.last_query + assert query.name == 'mpi' + assert len(query.extra_parameters) == 0 + assert query.isvirtual + + # Check a query to a virtual package with + # extra parameters after query + a = s['mpi:cxx,fortran'] + + query = a.last_query + assert query.name == 'mpi' + assert len(query.extra_parameters) == 2 + assert 'cxx' in query.extra_parameters + assert 'fortran' in query.extra_parameters + assert query.isvirtual + + def test_getitem_exceptional_paths(self): + s = Spec('mpileaks') + s.concretize() + # Needed to get a proxy object + q = s['mpileaks'] + + # Test that the attribute is read-only + with pytest.raises(AttributeError): + q.libs = 'foo' + + with pytest.raises(AttributeError): + q.libs diff --git a/var/spack/repos/builtin.mock/packages/mpileaks/package.py b/var/spack/repos/builtin.mock/packages/mpileaks/package.py index 749fcc601a..c84fdf2238 100644 --- a/var/spack/repos/builtin.mock/packages/mpileaks/package.py +++ b/var/spack/repos/builtin.mock/packages/mpileaks/package.py @@ -42,6 +42,9 @@ class Mpileaks(Package): depends_on("mpi") depends_on("callpath") + # Will be used to try raising an exception + libs = None + def install(self, spec, prefix): pass diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py index ff27f69723..1798059ee7 100644 --- a/var/spack/repos/builtin/packages/abinit/package.py +++ b/var/spack/repos/builtin/packages/abinit/package.py @@ -127,13 +127,13 @@ class Abinit(Package): # BLAS/LAPACK if '+scalapack' in spec: oapp("--with-linalg-flavor=custom+scalapack") - linalg = (spec['scalapack'].scalapack_libs + - spec['lapack'].lapack_libs + spec['blas'].blas_libs) + linalg = (spec['scalapack'].libs + + spec['lapack'].libs + spec['blas'].libs) # elif '+elpa' in spec: else: oapp("--with-linalg-flavor=custom") - linalg = spec['lapack'].lapack_libs + spec['blas'].blas_libs + linalg = spec['lapack'].libs + spec['blas'].libs oapp("--with-linalg-libs=%s" % linalg.ld_flags) diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py index 2336da4520..9ab1b66880 100644 --- a/var/spack/repos/builtin/packages/armadillo/package.py +++ b/var/spack/repos/builtin/packages/armadillo/package.py @@ -55,9 +55,9 @@ class Armadillo(Package): # ARPACK support '-DARPACK_LIBRARY={0}'.format(arpack.joined()), # BLAS support - '-DBLAS_LIBRARY={0}'.format(spec['blas'].blas_libs.joined()), + '-DBLAS_LIBRARY={0}'.format(spec['blas'].libs.joined()), # LAPACK support - '-DLAPACK_LIBRARY={0}'.format(spec['lapack'].lapack_libs.joined()), + '-DLAPACK_LIBRARY={0}'.format(spec['lapack'].libs.joined()), # SuperLU support '-DSuperLU_INCLUDE_DIR={0}'.format(spec['superlu'].prefix.include), '-DSuperLU_LIBRARY={0}'.format(superlu.joined()), diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py index a1c18d8086..1168d4623c 100644 --- a/var/spack/repos/builtin/packages/arpack-ng/package.py +++ b/var/spack/repos/builtin/packages/arpack-ng/package.py @@ -88,8 +88,8 @@ class ArpackNg(Package): options.append('-DCMAKE_INSTALL_NAME_DIR:PATH=%s/lib' % prefix) # Make sure we use Spack's blas/lapack: - lapack_libs = spec['lapack'].lapack_libs.joined(';') - blas_libs = spec['blas'].blas_libs.joined(';') + lapack_libs = spec['lapack'].libs.joined(';') + blas_libs = spec['blas'].libs.joined(';') options.extend([ '-DLAPACK_FOUND=true', @@ -129,8 +129,8 @@ class ArpackNg(Package): ]) options.extend([ - '--with-blas={0}'.format(spec['blas'].blas_libs.ld_flags), - '--with-lapack={0}'.format(spec['lapack'].lapack_libs.ld_flags) + '--with-blas={0}'.format(spec['blas'].libs.ld_flags), + '--with-lapack={0}'.format(spec['lapack'].libs.ld_flags) ]) if '+shared' not in spec: options.append('--enable-shared=no') diff --git a/var/spack/repos/builtin/packages/atlas/package.py b/var/spack/repos/builtin/packages/atlas/package.py index 51f0fced2b..b62d39dde8 100644 --- a/var/spack/repos/builtin/packages/atlas/package.py +++ b/var/spack/repos/builtin/packages/atlas/package.py @@ -112,8 +112,7 @@ class Atlas(Package): make("install") self.install_test() - @property - def blas_libs(self): + def libs(self): # libsatlas.[so,dylib,dll ] contains all serial APIs (serial lapack, # serial BLAS), and all ATLAS symbols needed to support them. Whereas # libtatlas.[so,dylib,dll ] is parallel (multithreaded) version. @@ -135,10 +134,6 @@ class Atlas(Package): to_find, root=self.prefix, shared=shared, recurse=True ) - @property - def lapack_libs(self): - return self.blas_libs - def install_test(self): source_file = join_path(os.path.dirname(self.module.__file__), 'test_cblas_dgemm.c') @@ -146,7 +141,7 @@ class Atlas(Package): 'test_cblas_dgemm.output') include_flags = ["-I%s" % self.spec.prefix.include] - link_flags = self.lapack_libs.ld_flags.split() + link_flags = self.libs.ld_flags.split() output = compile_c_and_execute(source_file, include_flags, link_flags) compare_output_file(output, blessed_file) diff --git a/var/spack/repos/builtin/packages/atompaw/package.py b/var/spack/repos/builtin/packages/atompaw/package.py index 17d0ef8209..987eb86e30 100644 --- a/var/spack/repos/builtin/packages/atompaw/package.py +++ b/var/spack/repos/builtin/packages/atompaw/package.py @@ -49,7 +49,7 @@ class Atompaw(Package): def install(self, spec, prefix): options = ['--prefix=%s' % prefix] - linalg = spec['lapack'].lapack_libs + spec['blas'].blas_libs + linalg = spec['lapack'].libs + spec['blas'].libs options.extend([ "--with-linalg-libs=%s" % linalg.ld_flags, "--enable-libxc", diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py index 5cd9fcdd17..fece11380d 100644 --- a/var/spack/repos/builtin/packages/cantera/package.py +++ b/var/spack/repos/builtin/packages/cantera/package.py @@ -85,7 +85,7 @@ class Cantera(Package): # BLAS/LAPACK support if '+lapack' in spec: - lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs + lapack_blas = spec['lapack'].libs + spec['blas'].libs options.extend([ 'blas_lapack_libs={0}'.format(','.join(lapack_blas.names)), 'blas_lapack_dir={0}'.format(spec['lapack'].prefix.lib) diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 3a175ea1a2..9bf7a5bc6b 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -88,12 +88,10 @@ class Cp2k(Package): cppflags = [ '-D__FFTW3', '-D__LIBINT', - '-I' + spec['fftw'].prefix.include + spec['fftw'].cppflags ] fcflags = copy.deepcopy(optflags[self.spec.compiler.name]) - fcflags.extend([ - '-I' + spec['fftw'].prefix.include - ]) + fcflags.append(spec['fftw'].cppflags) fftw = find_libraries(['libfftw3'], root=spec['fftw'].prefix.lib) ldflags = [fftw.search_flags] libs = [ @@ -154,15 +152,17 @@ class Cp2k(Package): '-D__SCALAPACK' ]) fcflags.extend([ + # spec['elpa:fortran'].cppflags '-I' + join_path( spec['elpa'].prefix, 'include', 'elpa-{0}'.format(str(spec['elpa'].version)), 'modules' ), + # spec[pexsi:fortran].cppflags '-I' + join_path(spec['pexsi'].prefix, 'fortran') ]) - scalapack = spec['scalapack'].scalapack_libs + scalapack = spec['scalapack'].libs ldflags.append(scalapack.search_flags) libs.extend([ join_path(spec['elpa'].prefix.lib, @@ -184,8 +184,8 @@ class Cp2k(Package): libs.extend(self.spec['mpi'].mpicxx_shared_libs) libs.extend(self.compiler.stdcxx_libs) # LAPACK / BLAS - lapack = spec['lapack'].lapack_libs - blas = spec['blas'].blas_libs + lapack = spec['lapack'].libs + blas = spec['blas'].libs ldflags.append((lapack + blas).search_flags) libs.extend([str(x) for x in (fftw, lapack, blas)]) diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index 22fb168e65..61dae81a3d 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -145,7 +145,7 @@ class Dealii(CMakePackage): options = [] cxx_flags = [] - lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs + lapack_blas = spec['lapack'].libs + spec['blas'].libs options.extend([ '-DDEAL_II_COMPONENT_EXAMPLES=ON', '-DDEAL_II_WITH_THREADS:BOOL=ON', diff --git a/var/spack/repos/builtin/packages/elk/package.py b/var/spack/repos/builtin/packages/elk/package.py index acaf863935..148fbd999a 100644 --- a/var/spack/repos/builtin/packages/elk/package.py +++ b/var/spack/repos/builtin/packages/elk/package.py @@ -90,9 +90,9 @@ class Elk(Package): blas = 'blas.a' lapack = 'lapack.a' if '+blas' in spec: - blas = spec['blas'].blas_libs.joined() + blas = spec['blas'].libs.joined() if '+lapack' in spec: - lapack = spec['lapack'].lapack_libs.joined() + lapack = spec['lapack'].libs.joined() # lapack must come before blas config['LIB_LPK'] = ' '.join([lapack, blas]) diff --git a/var/spack/repos/builtin/packages/elpa/package.py b/var/spack/repos/builtin/packages/elpa/package.py index b433bf40b0..fe249269c7 100644 --- a/var/spack/repos/builtin/packages/elpa/package.py +++ b/var/spack/repos/builtin/packages/elpa/package.py @@ -59,16 +59,16 @@ class Elpa(Package): 'FC={0}'.format(self.spec['mpi'].mpifc), 'CXX={0}'.format(self.spec['mpi'].mpicxx), 'FCFLAGS={0}'.format( - spec['lapack'].lapack_libs.joined() + spec['lapack'].libs.joined() ), 'LDFLAGS={0}'.format( - spec['lapack'].lapack_libs.joined() + spec['lapack'].libs.joined() ), 'SCALAPACK_FCFLAGS={0}'.format( - spec['scalapack'].scalapack_libs.joined() + spec['scalapack'].libs.joined() ), 'SCALAPACK_LDFLAGS={0}'.format( - spec['scalapack'].scalapack_libs.joined() + spec['scalapack'].libs.joined() ), '--prefix={0}'.format(self.prefix) ] diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py index 5c42fcf39f..54ff17e387 100644 --- a/var/spack/repos/builtin/packages/gmsh/package.py +++ b/var/spack/repos/builtin/packages/gmsh/package.py @@ -88,7 +88,7 @@ class Gmsh(CMakePackage): options.append('-DENABLE_OS_SPECIFIC_INSTALL=OFF') # Make sure GMSH picks up correct BlasLapack by providing linker flags - blas_lapack = spec['lapack'].lapack_libs + spec['blas'].blas_libs + blas_lapack = spec['lapack'].libs + spec['blas'].libs options.append( '-DBLAS_LAPACK_LIBRARIES={0}'.format(blas_lapack.ld_flags)) diff --git a/var/spack/repos/builtin/packages/hpl/package.py b/var/spack/repos/builtin/packages/hpl/package.py index fa0013de17..a171408a26 100644 --- a/var/spack/repos/builtin/packages/hpl/package.py +++ b/var/spack/repos/builtin/packages/hpl/package.py @@ -78,7 +78,7 @@ class Hpl(Package): 'MPlib = -L{0}'.format(spec['mpi'].prefix.lib), # Linear Algebra library (BLAS or VSIPL) 'LAinc = {0}'.format(spec['blas'].prefix.include), - 'LAlib = {0}'.format(spec['blas'].blas_libs.joined()), + 'LAlib = {0}'.format(spec['blas'].libs.joined()), # F77 / C interface 'F2CDEFS = -DAdd_ -DF77_INTEGER=int -DStringSunStyle', # HPL includes / libraries / specifics diff --git a/var/spack/repos/builtin/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py index 14a2a5cc0c..0c6ee732b7 100644 --- a/var/spack/repos/builtin/packages/hypre/package.py +++ b/var/spack/repos/builtin/packages/hypre/package.py @@ -62,8 +62,8 @@ class Hypre(Package): os.environ['F77'] = spec['mpi'].mpif77 # Note: --with-(lapack|blas)_libs= needs space separated list of names - lapack = spec['lapack'].lapack_libs - blas = spec['blas'].blas_libs + lapack = spec['lapack'].libs + blas = spec['blas'].libs configure_args = [ '--prefix=%s' % prefix, diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index eb3ce37c37..6bd4689bc1 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -83,7 +83,7 @@ class IntelMkl(IntelInstaller): @property def lapack_libs(self): - return self.blas_libs + return self.libs @property def scalapack_libs(self): diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py index 287f2bb76e..afaed8b5ed 100644 --- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py +++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py @@ -127,7 +127,7 @@ class IntelParallelStudio(IntelInstaller): @property def lapack_libs(self): - return self.blas_libs + return self.libs @property def scalapack_libs(self): diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py index bd1e5f36ef..1aa8e807c4 100644 --- a/var/spack/repos/builtin/packages/ipopt/package.py +++ b/var/spack/repos/builtin/packages/ipopt/package.py @@ -53,8 +53,8 @@ class Ipopt(Package): mumps_flags = "-ldmumps -lmumps_common -lpord -lmpiseq" mumps_libcmd = "-L%s " % mumps_dir.lib + mumps_flags - blas_lib = spec['blas'].blas_libs.ld_flags - lapack_lib = spec['lapack'].lapack_libs.ld_flags + blas_lib = spec['blas'].libs.ld_flags + lapack_lib = spec['lapack'].libs.ld_flags configure_args = [ "--prefix=%s" % prefix, diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index 45f64cef65..a25583e164 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -102,7 +102,7 @@ class Mfem(Package): options = ['PREFIX=%s' % prefix] if '+lapack' in spec: - lapack_lib = (spec['lapack'].lapack_libs + spec['blas'].blas_libs).ld_flags # NOQA: ignore=E501 + lapack_lib = (spec['lapack'].libs + spec['blas'].libs).ld_flags # NOQA: ignore=E501 options.extend([ 'MFEM_USE_LAPACK=YES', 'LAPACK_OPT=-I%s' % spec['lapack'].prefix.include, diff --git a/var/spack/repos/builtin/packages/mumps/package.py b/var/spack/repos/builtin/packages/mumps/package.py index 9fd5b5f36b..01469b1f0f 100644 --- a/var/spack/repos/builtin/packages/mumps/package.py +++ b/var/spack/repos/builtin/packages/mumps/package.py @@ -82,8 +82,8 @@ class Mumps(Package): raise RuntimeError( 'You cannot use the variants parmetis or ptscotch without mpi') - lapack_blas = (self.spec['lapack'].lapack_libs + - self.spec['blas'].blas_libs) + lapack_blas = (self.spec['lapack'].libs + + self.spec['blas'].libs) makefile_conf = ["LIBBLAS = %s" % lapack_blas.ld_flags] orderings = ['-Dpord'] @@ -156,7 +156,7 @@ class Mumps(Package): 'OPTC = %s -O ' % fpic]) if '+mpi' in self.spec: - scalapack = self.spec['scalapack'].scalapack_libs + scalapack = self.spec['scalapack'].libs makefile_conf.extend( ['CC = {0}'.format(self.spec['mpi'].mpicc), 'FC = {0}'.format(self.spec['mpi'].mpifc), diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py index ee011e7d1b..9d0ebae371 100644 --- a/var/spack/repos/builtin/packages/netlib-lapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py @@ -113,7 +113,7 @@ class NetlibLapack(Package): if '+external-blas' in spec: cmake_args.extend([ '-DUSE_OPTIMIZED_BLAS:BOOL=ON', - '-DBLAS_LIBRARIES:PATH=%s' % spec['blas'].blas_libs.joined(';') + '-DBLAS_LIBRARIES:PATH=%s' % spec['blas'].libs.joined(';') ]) cmake_args.extend(std_cmake_args) diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py index 578d2d8988..7d8b803abf 100644 --- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py @@ -74,8 +74,8 @@ class NetlibScalapack(Package): ] # Make sure we use Spack's Lapack: - blas = spec['blas'].blas_libs - lapack = spec['lapack'].lapack_libs + blas = spec['blas'].libs + lapack = spec['lapack'].libs options.extend([ '-DLAPACK_FOUND=true', '-DLAPACK_INCLUDE_DIRS=%s' % spec['lapack'].prefix.include, diff --git a/var/spack/repos/builtin/packages/nwchem/package.py b/var/spack/repos/builtin/packages/nwchem/package.py index 556dba34c2..f39d8ad0c7 100644 --- a/var/spack/repos/builtin/packages/nwchem/package.py +++ b/var/spack/repos/builtin/packages/nwchem/package.py @@ -73,9 +73,9 @@ class Nwchem(Package): patch(url, when=condition, level=0, md5=md5) def install(self, spec, prefix): - scalapack = spec['scalapack'].scalapack_libs - lapack = spec['lapack'].lapack_libs - blas = spec['blas'].blas_libs + scalapack = spec['scalapack'].libs + lapack = spec['lapack'].libs + blas = spec['blas'].libs # see http://www.nwchem-sw.org/index.php/Compiling_NWChem args = [] args.extend([ diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py index 731e2a630f..fe6ea8ce68 100644 --- a/var/spack/repos/builtin/packages/octave/package.py +++ b/var/spack/repos/builtin/packages/octave/package.py @@ -108,8 +108,8 @@ class Octave(AutotoolsPackage): # Required dependencies config_args.extend([ - "--with-blas=%s" % spec['blas'].blas_libs.ld_flags, - "--with-lapack=%s" % spec['lapack'].lapack_libs.ld_flags + "--with-blas=%s" % spec['blas'].libs.ld_flags, + "--with-lapack=%s" % spec['lapack'].libs.ld_flags ]) # Strongly recommended dependencies diff --git a/var/spack/repos/builtin/packages/octopus/package.py b/var/spack/repos/builtin/packages/octopus/package.py index b74befbe35..81e4543745 100644 --- a/var/spack/repos/builtin/packages/octopus/package.py +++ b/var/spack/repos/builtin/packages/octopus/package.py @@ -71,8 +71,8 @@ class Octopus(Package): def install(self, spec, prefix): arpack = find_libraries(['libarpack'], root=spec[ 'arpack-ng'].prefix.lib, shared=True) - lapack = spec['lapack'].lapack_libs - blas = spec['blas'].blas_libs + lapack = spec['lapack'].libs + blas = spec['blas'].libs args = [] args.extend([ '--prefix=%s' % prefix, @@ -105,8 +105,8 @@ class Octopus(Package): ]) if '+scalapack' in spec: args.extend([ - '--with-blacs=%s' % spec['scalapack'].scalapack_libs, - '--with-scalapack=%s' % spec['scalapack'].scalapack_libs, + '--with-blacs=%s' % spec['scalapack'].libs, + '--with-scalapack=%s' % spec['scalapack'].libs, ]) # --with-etsf-io-prefix= # --with-sparskit=${prefix}/lib/libskit.a diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index 3909744dc8..5648e58b02 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -59,17 +59,6 @@ class Openblas(MakefilePackage): parallel = False - @property - def blas_libs(self): - shared = True if '+shared' in self.spec else False - return find_libraries( - ['libopenblas'], root=self.prefix, shared=shared, recurse=True - ) - - @property - def lapack_libs(self): - return self.blas_libs - @run_before('edit') def check_compilers(self): # As of 06/2016 there is no mechanism to specify that packages which @@ -151,13 +140,15 @@ class Openblas(MakefilePackage): blessed_file = join_path(os.path.dirname(self.module.__file__), 'test_cblas_dgemm.output') - include_flags = ["-I%s" % join_path(spec.prefix, "include")] - link_flags = self.lapack_libs.ld_flags.split() + include_flags = spec.cppflags + link_flags = spec.libs.ld_flags if self.compiler.name == 'intel': - link_flags.extend(["-lifcore"]) - link_flags.extend(["-lpthread"]) + link_flags += ' -lifcore' + link_flags += ' -lpthread' if '+openmp' in spec: - link_flags.extend([self.compiler.openmp_flag]) + link_flags += ' ' + self.compiler.openmp_flag - output = compile_c_and_execute(source_file, include_flags, link_flags) + output = compile_c_and_execute( + source_file, [include_flags], link_flags.split() + ) compare_output_file(output, blessed_file) diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 562ef22a09..4d09676fac 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -116,6 +116,18 @@ class Openmpi(AutotoolsPackage): return "http://www.open-mpi.org/software/ompi/v%s/downloads/openmpi-%s.tar.bz2" % ( version.up_to(2), version) + @property + def libs(self): + query_parameters = self.spec.last_query.extra_parameters + libraries = ['libmpi'] + + if 'cxx' in query_parameters: + libraries = ['libmpi_cxx'] + libraries + + return find_libraries( + libraries, root=self.prefix, shared=True, recurse=True + ) + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): spack_env.set('MPICC', join_path(self.prefix.bin, 'mpicc')) spack_env.set('MPICXX', join_path(self.prefix.bin, 'mpic++')) diff --git a/var/spack/repos/builtin/packages/opium/package.py b/var/spack/repos/builtin/packages/opium/package.py index 521f917230..4c50bcfaf2 100644 --- a/var/spack/repos/builtin/packages/opium/package.py +++ b/var/spack/repos/builtin/packages/opium/package.py @@ -37,7 +37,7 @@ class Opium(Package): depends_on('lapack') def install(self, spec, prefix): - libs = spec['lapack'].lapack_libs + spec['blas'].blas_libs + libs = spec['lapack'].libs + spec['blas'].libs options = ['LDFLAGS=%s' % libs.ld_flags] configure(*options) diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py index a9d4ff6065..3e670cba63 100644 --- a/var/spack/repos/builtin/packages/petsc/package.py +++ b/var/spack/repos/builtin/packages/petsc/package.py @@ -161,7 +161,7 @@ class Petsc(Package): ]) # Make sure we use exactly the same Blas/Lapack libraries # across the DAG. To that end list them explicitly - lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs + lapack_blas = spec['lapack'].libs + spec['blas'].libs options.extend([ '--with-blas-lapack-lib=%s' % lapack_blas.joined() ]) diff --git a/var/spack/repos/builtin/packages/pexsi/make.inc b/var/spack/repos/builtin/packages/pexsi/make.inc index a8020fb370..c97b09b424 100644 --- a/var/spack/repos/builtin/packages/pexsi/make.inc +++ b/var/spack/repos/builtin/packages/pexsi/make.inc @@ -36,7 +36,7 @@ DSUPERLU_INCLUDE = -I${DSUPERLU_DIR}/include INCLUDES = ${PEXSI_INCLUDE} ${DSUPERLU_INCLUDE} # Libraries -CPP_LIB = @STDCXX_LIB @MPICXX_LIB +CPP_LIB = @MPICXX_LIB @STDCXX_LIB #GFORTRAN_LIB = /usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.a LAPACK_LIB = @LAPACK_LIBS BLAS_LIB = @BLAS_LIBS diff --git a/var/spack/repos/builtin/packages/pexsi/package.py b/var/spack/repos/builtin/packages/pexsi/package.py index 9fc71d4c52..989e2ebf6e 100644 --- a/var/spack/repos/builtin/packages/pexsi/package.py +++ b/var/spack/repos/builtin/packages/pexsi/package.py @@ -59,7 +59,7 @@ class Pexsi(Package): '@MPICC': self.spec['mpi'].mpicc, '@MPICXX': self.spec['mpi'].mpicxx, '@MPIFC': self.spec['mpi'].mpifc, - '@MPICXX_LIB': ' '.join(self.spec['mpi'].mpicxx_shared_libs), + '@MPICXX_LIB': self.spec['mpi:cxx'].libs.joined(), '@RANLIB': 'ranlib', '@PEXSI_STAGE': self.stage.source_path, '@SUPERLU_PREFIX': self.spec['superlu-dist'].prefix, @@ -67,8 +67,9 @@ class Pexsi(Package): '@PARMETIS_PREFIX': self.spec['parmetis'].prefix, '@LAPACK_PREFIX': self.spec['lapack'].prefix, '@BLAS_PREFIX': self.spec['blas'].prefix, - '@LAPACK_LIBS': self.spec['lapack'].lapack_libs.joined(), - '@BLAS_LIBS': self.spec['lapack'].blas_libs.joined(), + '@LAPACK_LIBS': self.spec['lapack'].libs.joined(), + '@BLAS_LIBS': self.spec['blas'].libs.joined(), + # FIXME : what to do with compiler provided libraries ? '@STDCXX_LIB': ' '.join(self.compiler.stdcxx_libs) } diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py index 4248c24646..d14aff363b 100644 --- a/var/spack/repos/builtin/packages/psi4/package.py +++ b/var/spack/repos/builtin/packages/psi4/package.py @@ -62,10 +62,10 @@ class Psi4(Package): def install(self, spec, prefix): cmake_args = [ '-DBLAS_TYPE={0}'.format(spec['blas'].name.upper()), - '-DBLAS_LIBRARIES={0}'.format(spec['blas'].blas_libs.joined()), + '-DBLAS_LIBRARIES={0}'.format(spec['blas'].libs.joined()), '-DLAPACK_TYPE={0}'.format(spec['lapack'].name.upper()), '-DLAPACK_LIBRARIES={0}'.format( - spec['lapack'].lapack_libs.joined()), + spec['lapack'].libs.joined()), '-DBOOST_INCLUDEDIR={0}'.format(spec['boost'].prefix.include), '-DBOOST_LIBRARYDIR={0}'.format(spec['boost'].prefix.lib), '-DENABLE_CHEMPS2=OFF' diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index a1aedb730c..11f6ebb1a5 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -70,10 +70,10 @@ class PyNumpy(PythonPackage): # for build notes see http://www.scipy.org/scipylib/building/linux.html lapackblas = LibraryList('') if '+lapack' in spec: - lapackblas += spec['lapack'].lapack_libs + lapackblas += spec['lapack'].libs if '+blas' in spec: - lapackblas += spec['blas'].blas_libs + lapackblas += spec['blas'].libs if '+blas' in spec or '+lapack' in spec: # note that one should not use [blas_opt] and [lapack_opt], see diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py index 740e490b5a..122032e131 100644 --- a/var/spack/repos/builtin/packages/suite-sparse/package.py +++ b/var/spack/repos/builtin/packages/suite-sparse/package.py @@ -101,8 +101,8 @@ class SuiteSparse(Package): # Make sure Spack's Blas/Lapack is used. Otherwise System's # Blas/Lapack might be picked up. - blas = spec['blas'].blas_libs.ld_flags - lapack = spec['lapack'].lapack_libs.ld_flags + blas = spec['blas'].libs.ld_flags + lapack = spec['lapack'].libs.ld_flags if '@4.5.1' in spec: # adding -lstdc++ is clearly an ugly way to do this, but it follows # with the TCOV path of SparseSuite 4.5.1's Suitesparse_config.mk diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py index 6ee247b7ea..cb12a410f4 100644 --- a/var/spack/repos/builtin/packages/sundials/package.py +++ b/var/spack/repos/builtin/packages/sundials/package.py @@ -80,8 +80,8 @@ class Sundials(Package): cmake_args.extend([ '-DLAPACK_ENABLE=ON', '-DLAPACK_LIBRARIES={0}'.format( - (spec['lapack'].lapack_libs + - spec['blas'].blas_libs).joined(';') + (spec['lapack'].libs + + spec['blas'].libs).joined(';') ) ]) else: diff --git a/var/spack/repos/builtin/packages/superlu-dist/package.py b/var/spack/repos/builtin/packages/superlu-dist/package.py index f076358e90..802c7abc37 100644 --- a/var/spack/repos/builtin/packages/superlu-dist/package.py +++ b/var/spack/repos/builtin/packages/superlu-dist/package.py @@ -53,7 +53,7 @@ class SuperluDist(Package): depends_on('metis@5:') def install(self, spec, prefix): - lapack_blas = spec['lapack'].lapack_libs + spec['blas'].blas_libs + lapack_blas = spec['lapack'].libs + spec['blas'].libs makefile_inc = [] makefile_inc.extend([ 'PLAT = _mac_x', @@ -61,17 +61,17 @@ class SuperluDist(Package): 'DSUPERLULIB = $(DSuperLUroot)/lib/libsuperlu_dist.a', 'BLASDEF = -DUSE_VENDOR_BLAS', 'BLASLIB = %s' % lapack_blas.ld_flags, - 'METISLIB = -L%s -lmetis' % spec['metis'].prefix.lib, - 'PARMETISLIB = -L%s -lparmetis' % spec['parmetis'].prefix.lib, + 'METISLIB = %s' % spec['metis'].libs.ld_flags, + 'PARMETISLIB = %s' % spec['parmetis'].libs.ld_flags, 'FLIBS =', 'LIBS = $(DSUPERLULIB) $(BLASLIB) $(PARMETISLIB) $(METISLIB)', # noqa 'ARCH = ar', 'ARCHFLAGS = cr', 'RANLIB = true', 'CC = {0}'.format(self.spec['mpi'].mpicc), - 'CFLAGS = -fPIC -std=c99 -O2 -I%s -I%s %s' % ( - spec['parmetis'].prefix.include, - spec['metis'].prefix.include, + 'CFLAGS = -fPIC -std=c99 -O2 %s %s %s' % ( + spec['parmetis'].cppflags, + spec['metis'].cppflags, '-D_LONGINT' if '+int64' in spec else ''), 'NOOPTS = -fPIC -std=c99', 'FORTRAN = {0}'.format(self.spec['mpi'].mpif77), diff --git a/var/spack/repos/builtin/packages/superlu-mt/package.py b/var/spack/repos/builtin/packages/superlu-mt/package.py index ea94c2d4c5..fd6091a0f0 100644 --- a/var/spack/repos/builtin/packages/superlu-mt/package.py +++ b/var/spack/repos/builtin/packages/superlu-mt/package.py @@ -86,7 +86,7 @@ class SuperluMt(Package): if '+blas' in spec: config.extend([ 'BLASDEF = -DUSE_VENDOR_BLAS', - 'BLASLIB = {0}'.format(spec['blas'].blas_libs.ld_flags) + 'BLASLIB = {0}'.format(spec['blas'].libs.ld_flags) ]) else: config.append('BLASLIB = ../lib/libblas$(PLAT).a') diff --git a/var/spack/repos/builtin/packages/superlu/package.py b/var/spack/repos/builtin/packages/superlu/package.py index 829949e504..13c11b66b9 100644 --- a/var/spack/repos/builtin/packages/superlu/package.py +++ b/var/spack/repos/builtin/packages/superlu/package.py @@ -48,7 +48,7 @@ class Superlu(Package): def install(self, spec, prefix): cmake_args = [ '-Denable_blaslib=OFF', - '-DBLAS_blas_LIBRARY={0}'.format(spec['blas'].blas_libs.joined()) + '-DBLAS_blas_LIBRARY={0}'.format(spec['blas'].libs.joined()) ] if '+fpic' in spec: @@ -76,7 +76,7 @@ class Superlu(Package): 'SUPERLULIB = $(SuperLUroot)/lib/libsuperlu_{0}.a' \ .format(self.spec.version), 'BLASDEF = -DUSE_VENDOR_BLAS', - 'BLASLIB = {0}'.format(spec['blas'].blas_libs.ld_flags), + 'BLASLIB = {0}'.format(spec['blas'].libs.ld_flags), # or BLASLIB = -L/usr/lib64 -lblas 'TMGLIB = libtmglib.a', 'LIBS = $(SUPERLULIB) $(BLASLIB)', diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index a4d97a6bc7..6cf1032f83 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -147,8 +147,8 @@ class Trilinos(CMakePackage): mpi_bin = spec['mpi'].prefix.bin # Note: -DXYZ_LIBRARY_NAMES= needs semicolon separated list of names - blas = spec['blas'].blas_libs - lapack = spec['lapack'].lapack_libs + blas = spec['blas'].libs + lapack = spec['lapack'].libs options.extend([ '-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON', '-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=ON', diff --git a/var/spack/repos/builtin/packages/veclibfort/package.py b/var/spack/repos/builtin/packages/veclibfort/package.py index b906d4f9c9..fa99acfa97 100644 --- a/var/spack/repos/builtin/packages/veclibfort/package.py +++ b/var/spack/repos/builtin/packages/veclibfort/package.py @@ -44,17 +44,12 @@ class Veclibfort(Package): provides('blas') provides('lapack') - @property - def blas_libs(self): + def libs(self): shared = True if '+shared' in self.spec else False return find_libraries( ['libvecLibFort'], root=self.prefix, shared=shared, recurse=True ) - @property - def lapack_libs(self): - return self.blas_libs - def install(self, spec, prefix): if sys.platform != 'darwin': raise InstallError('vecLibFort can be installed on macOS only') @@ -65,6 +60,6 @@ class Veclibfort(Package): # test fc = which('fc') flags = ['-o', 'tester', '-O', 'tester.f90'] - flags.extend(self.lapack_libs.ld_flags.split()) + flags.extend(spec.libs.ld_flags.split()) fc(*flags) Executable('./tester')() diff --git a/var/spack/repos/builtin/packages/wannier90/package.py b/var/spack/repos/builtin/packages/wannier90/package.py index 119d2cf769..ad61860d73 100644 --- a/var/spack/repos/builtin/packages/wannier90/package.py +++ b/var/spack/repos/builtin/packages/wannier90/package.py @@ -47,8 +47,8 @@ class Wannier90(Package): def install(self, spec, prefix): - lapack = self.spec['lapack'].lapack_libs - blas = self.spec['blas'].blas_libs + lapack = self.spec['lapack'].libs + blas = self.spec['blas'].libs substitutions = { '@F90': spack_fc, '@MPIF90': self.spec['mpi'].mpifc, -- cgit v1.2.3-70-g09d2 From 7ef95767eef03a8498ed1a24659b9e5b52856f01 Mon Sep 17 00:00:00 2001 From: Joschka Lingemann Date: Fri, 3 Mar 2017 23:30:32 +0100 Subject: Fix error raised for multiple virtual packages. (#3306) --- lib/spack/spack/package_prefs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 190647bb81..63f90d9b50 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -43,7 +43,8 @@ def get_packages_config(): if virtuals: errors = ["%s: %s" % (line_info, name) for name, line_info in virtuals] raise VirtualInPackagesYAMLError( - "packages.yaml entries cannot be virtual packages:", *errors) + "packages.yaml entries cannot be virtual packages:", + '\n'.join(errors)) return config -- cgit v1.2.3-70-g09d2 From a2d70a45fbc2ee07160c3ee750dbffe9d4fd5b1b Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 4 Mar 2017 11:23:57 -0600 Subject: Allow find_libraries to accept lists or strings (#3363) * Allow find_libraries to accept lists or strings * Convert one more example from list to string --- lib/spack/llnl/util/filesystem.py | 28 ++++++++++++---------- lib/spack/spack/spec.py | 2 +- .../repos/builtin/packages/armadillo/package.py | 4 ++-- var/spack/repos/builtin/packages/cp2k/package.py | 2 +- .../repos/builtin/packages/elemental/package.py | 2 +- .../builtin/packages/netlib-lapack/package.py | 4 ++-- .../builtin/packages/netlib-scalapack/package.py | 2 +- .../repos/builtin/packages/octopus/package.py | 8 +++---- .../builtin/packages/openspeedshop/package.py | 6 ++--- .../repos/builtin/packages/veclibfort/package.py | 2 +- 10 files changed, 31 insertions(+), 29 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 79f15f9a21..7f6773266d 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -568,20 +568,22 @@ def find_libraries(args, root, shared=True, recurse=False): """Returns an iterable object containing a list of full paths to libraries if found. - Args: - args: iterable object containing a list of library names to \ - search for (e.g. 'libhdf5') - root: root folder where to start searching - shared: if True searches for shared libraries, otherwise for static - recurse: if False search only root folder, if True descends top-down \ - from the root - - Returns: - list of full paths to the libraries that have been found + :param args: Library name(s) to search for + :type args: str or collections.Sequence + :param str root: The root directory to start searching from + :param bool shared: if True searches for shared libraries, + otherwise for static + :param bool recurse: if False search only root folder, + if True descends top-down from the root + + :returns: The libraries that have been found + :rtype: LibraryList """ - if not isinstance(args, collections.Sequence) or isinstance(args, str): - message = '{0} expects a sequence of strings as first argument' - message += ' [got {1} instead]' + if isinstance(args, str): + args = [args] + elif not isinstance(args, collections.Sequence): + message = '{0} expects a string or sequence of strings as the ' + message += 'first argument [got {1} instead]' raise TypeError(message.format(find_libraries.__name__, type(args))) # Construct the right suffix for the library diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index c0ee8486db..9fc2c99e4a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -767,7 +767,7 @@ def _libs_default_handler(descriptor, spec, cls): name = 'lib' + spec.name shared = '+shared' in spec return find_libraries( - [name], root=spec.prefix, shared=shared, recurse=True + name, root=spec.prefix, shared=shared, recurse=True ) diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py index 9ab1b66880..7bf28efc0d 100644 --- a/var/spack/repos/builtin/packages/armadillo/package.py +++ b/var/spack/repos/builtin/packages/armadillo/package.py @@ -47,9 +47,9 @@ class Armadillo(Package): depends_on('hdf5', when='+hdf5') def install(self, spec, prefix): - arpack = find_libraries(['libarpack'], root=spec[ + arpack = find_libraries('libarpack', root=spec[ 'arpack-ng'].prefix.lib, shared=True) - superlu = find_libraries(['libsuperlu'], root=spec[ + superlu = find_libraries('libsuperlu', root=spec[ 'superlu'].prefix, shared=False, recurse=True) cmake_args = [ # ARPACK support diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 9bf7a5bc6b..0909d8cb81 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -92,7 +92,7 @@ class Cp2k(Package): ] fcflags = copy.deepcopy(optflags[self.spec.compiler.name]) fcflags.append(spec['fftw'].cppflags) - fftw = find_libraries(['libfftw3'], root=spec['fftw'].prefix.lib) + fftw = find_libraries('libfftw3', root=spec['fftw'].prefix.lib) ldflags = [fftw.search_flags] libs = [ join_path(spec['libint'].prefix.lib, 'libint.so'), diff --git a/var/spack/repos/builtin/packages/elemental/package.py b/var/spack/repos/builtin/packages/elemental/package.py index dd4ae291ec..ccc55092d0 100644 --- a/var/spack/repos/builtin/packages/elemental/package.py +++ b/var/spack/repos/builtin/packages/elemental/package.py @@ -82,7 +82,7 @@ class Elemental(CMakePackage): def elemental_libs(self): shared = True if '+shared' in self.spec else False return find_libraries( - ['libEl'], root=self.prefix, shared=shared, recurse=True + 'libEl', root=self.prefix, shared=shared, recurse=True ) def build_type(self): diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py index 9d0ebae371..fa11ae6367 100644 --- a/var/spack/repos/builtin/packages/netlib-lapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py @@ -74,14 +74,14 @@ class NetlibLapack(Package): def blas_libs(self): shared = True if '+shared' in self.spec else False return find_libraries( - ['libblas'], root=self.prefix, shared=shared, recurse=True + 'libblas', root=self.prefix, shared=shared, recurse=True ) @property def lapack_libs(self): shared = True if '+shared' in self.spec else False return find_libraries( - ['liblapack'], root=self.prefix, shared=shared, recurse=True + 'liblapack', root=self.prefix, shared=shared, recurse=True ) def install_one(self, spec, prefix, shared): diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py index 7d8b803abf..6a97180328 100644 --- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py @@ -62,7 +62,7 @@ class NetlibScalapack(Package): def scalapack_libs(self): shared = True if '+shared' in self.spec else False return find_libraries( - ['libscalapack'], root=self.prefix, shared=shared, recurse=True + 'libscalapack', root=self.prefix, shared=shared, recurse=True ) def install(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/octopus/package.py b/var/spack/repos/builtin/packages/octopus/package.py index 81e4543745..88350f50bc 100644 --- a/var/spack/repos/builtin/packages/octopus/package.py +++ b/var/spack/repos/builtin/packages/octopus/package.py @@ -38,7 +38,7 @@ class Octopus(Package): # Sample url is: # "http://www.tddft.org/programs/octopus/down.php?file=5.0.1/octopus-5.0.1.tar.gz" def url_for_version(self, version): - return '{0}/{1}/octopus-{1}.tar.gz'.format(Octopus.base_url, + return '{0}/{1}/octopus-{1}.tar.gz'.format(Octopus.base_url, version.dotted) variant('scalapack', default=False, @@ -69,7 +69,7 @@ class Octopus(Package): # feast, libfm, pfft, isf, pnfft def install(self, spec, prefix): - arpack = find_libraries(['libarpack'], root=spec[ + arpack = find_libraries('libarpack', root=spec[ 'arpack-ng'].prefix.lib, shared=True) lapack = spec['lapack'].libs blas = spec['blas'].libs @@ -96,12 +96,12 @@ class Octopus(Package): if '+netcdf' in spec: args.extend([ '--with-netcdf-prefix=%s' % spec['netcdf-fortran'].prefix, - '--with-netcdf-include=%s' % + '--with-netcdf-include=%s' % spec['netcdf-fortran'].prefix.include, ]) if '+arpack-ng' in spec: args.extend([ - '--with-arpack={0}'.format(arpack.joined()), + '--with-arpack={0}'.format(arpack.joined()), ]) if '+scalapack' in spec: args.extend([ diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index 2e908b4099..ae2655735a 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -60,7 +60,7 @@ class Openspeedshop(Package): """ homepage = "http://www.openspeedshop.org" - url = "https://github.com/OpenSpeedShop" + url = "https://github.com/OpenSpeedShop" version('2.2', '16cb051179c2038de4e8a845edf1d573') # Use when the git repository is available version('2.3', branch='master', @@ -230,7 +230,7 @@ class Openspeedshop(Package): # set the DYNINSTAPI_RT_LIB library which is # required for OpenSpeedShop to find loop level # performance information - dyninst_libdir = find_libraries(['libdyninstAPI_RT'], + dyninst_libdir = find_libraries('libdyninstAPI_RT', root=self.spec['dyninst'].prefix, shared=True, recurse=True) @@ -238,7 +238,7 @@ class Openspeedshop(Package): run_env.set('DYNINSTAPI_RT_LIB', dyninst_libdir) # Find openspeedshop library path - oss_libdir = find_libraries(['libopenss-framework'], + oss_libdir = find_libraries('libopenss-framework', root=self.spec['openspeedshop'].prefix, shared=True, recurse=True) run_env.prepend_path('LD_LIBRARY_PATH', diff --git a/var/spack/repos/builtin/packages/veclibfort/package.py b/var/spack/repos/builtin/packages/veclibfort/package.py index fa99acfa97..26e64248bb 100644 --- a/var/spack/repos/builtin/packages/veclibfort/package.py +++ b/var/spack/repos/builtin/packages/veclibfort/package.py @@ -47,7 +47,7 @@ class Veclibfort(Package): def libs(self): shared = True if '+shared' in self.spec else False return find_libraries( - ['libvecLibFort'], root=self.prefix, shared=shared, recurse=True + 'libvecLibFort', root=self.prefix, shared=shared, recurse=True ) def install(self, spec, prefix): -- cgit v1.2.3-70-g09d2 From c6d9a45f18cedd810cdee891d462199f86dc6a7c Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 7 Mar 2017 16:03:12 +0100 Subject: test/environment.py: ported to pytest, added a test on separators (#3375) --- lib/spack/spack/test/environment.py | 406 +++++++++++++++++++++--------------- 1 file changed, 235 insertions(+), 171 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index e9f0a5182f..0da137c192 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -22,182 +22,246 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import unittest import os +import pytest from spack import spack_root -from llnl.util.filesystem import join_path from spack.environment import EnvironmentModifications -from spack.environment import SetEnv, UnsetEnv from spack.environment import RemovePath, PrependPath, AppendPath +from spack.environment import SetEnv, UnsetEnv from spack.util.environment import filter_system_paths, filter_system_bin_paths -class EnvironmentTest(unittest.TestCase): - - def setUp(self): - os.environ['UNSET_ME'] = 'foo' - os.environ['EMPTY_PATH_LIST'] = '' - os.environ['PATH_LIST'] = '/path/second:/path/third' - os.environ['REMOVE_PATH_LIST'] = \ - '/a/b:/duplicate:/a/c:/remove/this:/a/d:/duplicate/:/f/g' - - def tearDown(self): - pass - - def test_set(self): - env = EnvironmentModifications() - env.set('A', 'dummy value') - env.set('B', 3) - env.apply_modifications() - self.assertEqual('dummy value', os.environ['A']) - self.assertEqual(str(3), os.environ['B']) - - def test_unset(self): - env = EnvironmentModifications() - self.assertEqual('foo', os.environ['UNSET_ME']) - env.unset('UNSET_ME') - env.apply_modifications() - self.assertRaises(KeyError, os.environ.__getitem__, 'UNSET_ME') - - def test_filter_system_paths(self): - filtered = filter_system_paths([ - '/usr/local/Cellar/gcc/5.3.0/lib', - '/usr/local/lib', - '/usr/local', - '/usr/local/include', - '/usr/local/lib64', - '/usr/local/opt/some-package/lib', - '/usr/opt/lib', - '/lib', - '/', - '/usr', - '/lib64', - '/include', - '/opt/some-package/include', - ]) - self.assertEqual(filtered, - ['/usr/local/Cellar/gcc/5.3.0/lib', - '/usr/local/opt/some-package/lib', - '/usr/opt/lib', - '/opt/some-package/include']) - - filtered = filter_system_bin_paths([ - '/usr/local/Cellar/gcc/5.3.0/bin', - '/usr/local/bin', - '/usr/local/opt/some-package/bin', - '/usr/opt/bin', - '/bin', - '/opt/some-package/bin', - ]) - self.assertEqual(filtered, - ['/usr/local/bin', - '/bin', - '/usr/local/Cellar/gcc/5.3.0/bin', - '/usr/local/opt/some-package/bin', - '/usr/opt/bin', - '/opt/some-package/bin']) - - def test_set_path(self): - env = EnvironmentModifications() - env.set_path('A', ['foo', 'bar', 'baz']) - env.apply_modifications() - self.assertEqual('foo:bar:baz', os.environ['A']) - - def test_path_manipulation(self): - env = EnvironmentModifications() - - env.append_path('PATH_LIST', '/path/last') - env.prepend_path('PATH_LIST', '/path/first') - - env.append_path('EMPTY_PATH_LIST', '/path/middle') - env.append_path('EMPTY_PATH_LIST', '/path/last') - env.prepend_path('EMPTY_PATH_LIST', '/path/first') - - env.append_path('NEWLY_CREATED_PATH_LIST', '/path/middle') - env.append_path('NEWLY_CREATED_PATH_LIST', '/path/last') - env.prepend_path('NEWLY_CREATED_PATH_LIST', '/path/first') - - env.remove_path('REMOVE_PATH_LIST', '/remove/this') - env.remove_path('REMOVE_PATH_LIST', '/duplicate/') - - env.apply_modifications() - self.assertEqual( - '/path/first:/path/second:/path/third:/path/last', - os.environ['PATH_LIST'] - ) - self.assertEqual( - '/path/first:/path/middle:/path/last', - os.environ['EMPTY_PATH_LIST'] - ) - self.assertEqual( - '/path/first:/path/middle:/path/last', - os.environ['NEWLY_CREATED_PATH_LIST'] - ) - self.assertEqual('/a/b:/a/c:/a/d:/f/g', os.environ['REMOVE_PATH_LIST']) - - def test_extra_arguments(self): - env = EnvironmentModifications() - env.set('A', 'dummy value', who='Pkg1') - for x in env: - assert 'who' in x.args - env.apply_modifications() - self.assertEqual('dummy value', os.environ['A']) - - def test_extend(self): - env = EnvironmentModifications() - env.set('A', 'dummy value') - env.set('B', 3) - copy_construct = EnvironmentModifications(env) - self.assertEqual(len(copy_construct), 2) - for x, y in zip(env, copy_construct): - assert x is y - - def test_source_files(self): - datadir = join_path(spack_root, 'lib', 'spack', - 'spack', 'test', 'data') - files = [ - join_path(datadir, 'sourceme_first.sh'), - join_path(datadir, 'sourceme_second.sh'), - join_path(datadir, 'sourceme_parameters.sh intel64') - ] - env = EnvironmentModifications.from_sourcing_files(*files) - modifications = env.group_by_name() - - # This is sensitive to the user's environment; can include - # spurious entries for things like PS1 - # - # TODO: figure out how to make a bit more robust. - self.assertTrue(len(modifications) >= 4) - - # Set new variables - self.assertEqual(len(modifications['NEW_VAR']), 1) - self.assertTrue(isinstance(modifications['NEW_VAR'][0], SetEnv)) - self.assertEqual(modifications['NEW_VAR'][0].value, 'new') - - self.assertEqual(len(modifications['FOO']), 1) - self.assertTrue(isinstance(modifications['FOO'][0], SetEnv)) - self.assertEqual(modifications['FOO'][0].value, 'intel64') - - # Unset variables - self.assertEqual(len(modifications['EMPTY_PATH_LIST']), 1) - self.assertTrue(isinstance( - modifications['EMPTY_PATH_LIST'][0], UnsetEnv)) - # Modified variables - self.assertEqual(len(modifications['UNSET_ME']), 1) - self.assertTrue(isinstance(modifications['UNSET_ME'][0], SetEnv)) - self.assertEqual(modifications['UNSET_ME'][0].value, 'overridden') - - self.assertEqual(len(modifications['PATH_LIST']), 3) - self.assertTrue( - isinstance(modifications['PATH_LIST'][0], RemovePath) - ) - self.assertEqual(modifications['PATH_LIST'][0].value, '/path/third') - self.assertTrue( - isinstance(modifications['PATH_LIST'][1], AppendPath) - ) - self.assertEqual(modifications['PATH_LIST'][1].value, '/path/fourth') - self.assertTrue( - isinstance(modifications['PATH_LIST'][2], PrependPath) - ) - self.assertEqual(modifications['PATH_LIST'][2].value, '/path/first') +@pytest.fixture() +def prepare_environment_for_tests(): + """Sets a few dummy variables in the current environment, that will be + useful for the tests below. + """ + os.environ['UNSET_ME'] = 'foo' + os.environ['EMPTY_PATH_LIST'] = '' + os.environ['PATH_LIST'] = '/path/second:/path/third' + os.environ['REMOVE_PATH_LIST'] = '/a/b:/duplicate:/a/c:/remove/this:/a/d:/duplicate/:/f/g' # NOQA: ignore=E501 + yield + for x in ('UNSET_ME', 'EMPTY_PATH_LIST', 'PATH_LIST', 'REMOVE_PATH_LIST'): + if x in os.environ: + del os.environ[x] + + +@pytest.fixture +def env(prepare_environment_for_tests): + """Returns an empty EnvironmentModifications object.""" + return EnvironmentModifications() + + +@pytest.fixture +def miscellaneous_paths(): + """Returns a list of paths, including system ones.""" + return [ + '/usr/local/Cellar/gcc/5.3.0/lib', + '/usr/local/lib', + '/usr/local', + '/usr/local/include', + '/usr/local/lib64', + '/usr/local/opt/some-package/lib', + '/usr/opt/lib', + '/lib', + '/', + '/usr', + '/lib64', + '/include', + '/opt/some-package/include', + ] + + +@pytest.fixture +def bin_paths(): + """Returns a list of bin paths, including system ones.""" + return [ + '/usr/local/Cellar/gcc/5.3.0/bin', + '/usr/local/bin', + '/usr/local/opt/some-package/bin', + '/usr/opt/bin', + '/bin', + '/opt/some-package/bin', + ] + + +@pytest.fixture +def files_to_be_sourced(): + """Returns a list of files to be sourced""" + datadir = os.path.join( + spack_root, 'lib', 'spack', 'spack', 'test', 'data' + ) + + files = [ + os.path.join(datadir, 'sourceme_first.sh'), + os.path.join(datadir, 'sourceme_second.sh'), + os.path.join(datadir, 'sourceme_parameters.sh intel64') + ] + + return files + + +def test_set(env): + """Tests setting values in the environment.""" + + # Here we are storing the commands to set a couple of variables + env.set('A', 'dummy value') + env.set('B', 3) + + # ...and then we are executing them + env.apply_modifications() + + assert 'dummy value' == os.environ['A'] + assert str(3) == os.environ['B'] + + +def test_unset(env): + """Tests unsetting values in the environment.""" + + # Assert that the target variable is there and unset it + assert 'foo' == os.environ['UNSET_ME'] + env.unset('UNSET_ME') + env.apply_modifications() + + # Trying to retrieve is after deletion should cause a KeyError + with pytest.raises(KeyError): + os.environ['UNSET_ME'] + + +def test_filter_system_paths(miscellaneous_paths): + """Tests that the filtering of system paths works as expected.""" + filtered = filter_system_paths(miscellaneous_paths) + expected = [ + '/usr/local/Cellar/gcc/5.3.0/lib', + '/usr/local/opt/some-package/lib', + '/usr/opt/lib', + '/opt/some-package/include' + ] + assert filtered == expected + + +def test_filter_system_bin_paths(bin_paths): + """Tests that the filtering of system bin paths works as expected.""" + filtered = filter_system_bin_paths(bin_paths) + expected = [ + '/usr/local/bin', + '/bin', + '/usr/local/Cellar/gcc/5.3.0/bin', + '/usr/local/opt/some-package/bin', + '/usr/opt/bin', + '/opt/some-package/bin' + ] + assert filtered == expected + + +def test_set_path(env): + """Tests setting paths in an environment variable.""" + + # Check setting paths with the default separator + env.set_path('A', ['foo', 'bar', 'baz']) + env.apply_modifications() + + assert 'foo:bar:baz' == os.environ['A'] + + env.set_path('B', ['foo', 'bar', 'baz'], separator=';') + env.apply_modifications() + + assert 'foo;bar;baz' == os.environ['B'] + + +def test_path_manipulation(env): + """Tests manipulating list of paths in the environment.""" + + env.append_path('PATH_LIST', '/path/last') + env.prepend_path('PATH_LIST', '/path/first') + + env.append_path('EMPTY_PATH_LIST', '/path/middle') + env.append_path('EMPTY_PATH_LIST', '/path/last') + env.prepend_path('EMPTY_PATH_LIST', '/path/first') + + env.append_path('NEWLY_CREATED_PATH_LIST', '/path/middle') + env.append_path('NEWLY_CREATED_PATH_LIST', '/path/last') + env.prepend_path('NEWLY_CREATED_PATH_LIST', '/path/first') + + env.remove_path('REMOVE_PATH_LIST', '/remove/this') + env.remove_path('REMOVE_PATH_LIST', '/duplicate/') + + env.apply_modifications() + + expected = '/path/first:/path/second:/path/third:/path/last' + assert os.environ['PATH_LIST'] == expected + + expected = '/path/first:/path/middle:/path/last' + assert os.environ['EMPTY_PATH_LIST'] == expected + + expected = '/path/first:/path/middle:/path/last' + assert os.environ['NEWLY_CREATED_PATH_LIST'] == expected + + assert os.environ['REMOVE_PATH_LIST'] == '/a/b:/a/c:/a/d:/f/g' + + +def test_extra_arguments(env): + """Tests that we can attach extra arguments to any command.""" + env.set('A', 'dummy value', who='Pkg1') + for x in env: + assert 'who' in x.args + + env.apply_modifications() + assert 'dummy value' == os.environ['A'] + + +def test_extend(env): + """Tests that we can construct a list of environment modifications + starting from another list. + """ + env.set('A', 'dummy value') + env.set('B', 3) + copy_construct = EnvironmentModifications(env) + + assert len(copy_construct) == 2 + + for x, y in zip(env, copy_construct): + assert x is y + + +@pytest.mark.usefixtures('prepare_environment_for_tests') +def test_source_files(files_to_be_sourced): + """Tests the construction of a list of environment modifications that are + the result of sourcing a file. + """ + + env = EnvironmentModifications.from_sourcing_files(*files_to_be_sourced) + modifications = env.group_by_name() + + # This is sensitive to the user's environment; can include + # spurious entries for things like PS1 + # + # TODO: figure out how to make a bit more robust. + assert len(modifications) >= 4 + + # Set new variables + assert len(modifications['NEW_VAR']) == 1 + assert isinstance(modifications['NEW_VAR'][0], SetEnv) + assert modifications['NEW_VAR'][0].value == 'new' + + assert len(modifications['FOO']) == 1 + assert isinstance(modifications['FOO'][0], SetEnv) + assert modifications['FOO'][0].value == 'intel64' + + # Unset variables + assert len(modifications['EMPTY_PATH_LIST']) == 1 + assert isinstance(modifications['EMPTY_PATH_LIST'][0], UnsetEnv) + + # Modified variables + assert len(modifications['UNSET_ME']) == 1 + assert isinstance(modifications['UNSET_ME'][0], SetEnv) + assert modifications['UNSET_ME'][0].value == 'overridden' + + assert len(modifications['PATH_LIST']) == 3 + assert isinstance(modifications['PATH_LIST'][0], RemovePath) + assert modifications['PATH_LIST'][0].value == '/path/third' + assert isinstance(modifications['PATH_LIST'][1], AppendPath) + assert modifications['PATH_LIST'][1].value == '/path/fourth' + assert isinstance(modifications['PATH_LIST'][2], PrependPath) + assert modifications['PATH_LIST'][2].value == '/path/first' -- cgit v1.2.3-70-g09d2 From f1d66467e33e26c5d4e73cf94858c6222a8ca00b Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 7 Mar 2017 16:05:45 +0100 Subject: package.py: packages dump build dependencies in prefix (#3373) Modifications: - `dump_packages` copies build dependencies into `$prefix/.spack`, as well as the link/run dependencies that we already copied there. - fake installs copy dependency packages into `$prefix/.spack` as well --- lib/spack/spack/package.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 3be3bffc70..8889de7576 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1058,6 +1058,8 @@ class PackageBase(object): touch(join_path(self.prefix.lib, library_name + dso_suffix)) touch(join_path(self.prefix.lib, library_name + '.a')) mkdirp(self.prefix.man1) + packages_dir = spack.store.layout.build_packages_path(self.spec) + dump_packages(self.spec, packages_dir) def _if_make_target_execute(self, target): try: @@ -1816,7 +1818,7 @@ def dump_packages(spec, path): # Note that we copy them in as they are in the *install* directory # NOT as they are in the repository, because we want a snapshot of # how *this* particular build was done. - for node in spec.traverse(): + for node in spec.traverse(deptype=spack.alldeps): if node is not spec: # Locate the dependency package in the install tree and find # its provenance information. -- cgit v1.2.3-70-g09d2 From 604b75c1f9d53e0f094a22d1167558aa4df566af Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 9 Mar 2017 10:36:32 -0800 Subject: created elf virtual package and updated dependent packages (#3317) * created elf virtual package and updated dependent packages * added `hide_files` context manager to handle moving files. --- lib/spack/llnl/util/filesystem.py | 13 +++++ .../repos/builtin/packages/callpath/package.py | 7 ++- .../repos/builtin/packages/dyninst/package.py | 13 ++--- .../repos/builtin/packages/elfutils/package.py | 2 +- var/spack/repos/builtin/packages/extrae/package.py | 21 ++++++- .../repos/builtin/packages/launchmon/package.py | 3 + .../repos/builtin/packages/libdwarf/package.py | 65 ++++++++++++++-------- var/spack/repos/builtin/packages/libelf/package.py | 2 +- .../builtin/packages/openspeedshop/package.py | 4 +- var/spack/repos/builtin/packages/stat/package.py | 5 +- 10 files changed, 91 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 7f6773266d..f456a5edf1 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -50,6 +50,7 @@ __all__ = [ 'fix_darwin_install_name', 'force_remove', 'force_symlink', + 'hide_files', 'install', 'install_tree', 'is_exe', @@ -257,6 +258,18 @@ def working_dir(dirname, **kwargs): os.chdir(orig_dir) +@contextmanager +def hide_files(*file_list): + try: + baks = ['%s.bak' % f for f in file_list] + for f, bak in zip(file_list, baks): + shutil.move(f, bak) + yield + finally: + for f, bak in zip(file_list, baks): + shutil.move(bak, f) + + def touch(path): """Creates an empty file at the specified path.""" with open(path, 'a'): diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py index f8227fa49e..27a04393f5 100644 --- a/var/spack/repos/builtin/packages/callpath/package.py +++ b/var/spack/repos/builtin/packages/callpath/package.py @@ -35,7 +35,7 @@ class Callpath(Package): version('1.0.2', 'b1994d5ee7c7db9d27586fc2dcf8f373') version('1.0.1', '0047983d2a52c5c335f8ba7f5bab2325') - depends_on("libelf") + depends_on("elf", type="link") depends_on("libdwarf") depends_on("dyninst") depends_on("adept-utils") @@ -44,6 +44,9 @@ class Callpath(Package): def install(self, spec, prefix): # TODO: offer options for the walker used. - cmake('.', "-DCALLPATH_WALKER=dyninst", *std_cmake_args) + cmake_args = std_cmake_args + if spec.satisfies("^dyninst@9.3.0:"): + cmake_args.append("-DCMAKE_CXX_FLAGS='-std=c++11 -fpermissive'") + cmake('.', "-DCALLPATH_WALKER=dyninst", *cmake_args) make() make("install") diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py index 420ab0fc68..8f9a2ffb4a 100644 --- a/var/spack/repos/builtin/packages/dyninst/package.py +++ b/var/spack/repos/builtin/packages/dyninst/package.py @@ -33,13 +33,7 @@ class Dyninst(Package): url = "https://github.com/dyninst/dyninst/archive/v9.2.0.tar.gz" list_url = "http://www.dyninst.org/downloads/dyninst-8.x" - # version 9.2.1b was the latest git commit when trying to port to a - # ppc64le system to get fixes in computeAddrWidth independent of - # endianness. This version can be removed if the next release includes - # this change. The actual commit was - # b8596ad4023ec40ac07e669ff8ea3ec06e262703 - version('9.2.1b', git='https://github.com/dyninst/dyninst.git', - commit='859cb778e20b619443c943c96dd1851da763142b') + version('9.3.0', 'edde7847dc673ca69bd59412af572450') version('9.2.0', 'ad023f85e8e57837ed9de073b59d6bab', url="https://github.com/dyninst/dyninst/archive/v9.2.0.tar.gz") version('9.1.0', '5c64b77521457199db44bec82e4988ac', @@ -54,7 +48,8 @@ class Dyninst(Package): variant('stat_dysect', default=False, description="patch for STAT's DySectAPI") - depends_on("libelf") + depends_on("elf@0", type='link', when='@:9.2.99') + depends_on("elf@1", type='link', when='@9.3.0:') depends_on("libdwarf") depends_on("boost@1.42:") depends_on('cmake', type='build') @@ -70,7 +65,7 @@ class Dyninst(Package): make("install") return - libelf = spec['libelf'].prefix + libelf = spec['elf'].prefix libdwarf = spec['libdwarf'].prefix with working_dir('spack-build', create=True): diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index 4a91c7db30..15ae077bea 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -43,7 +43,7 @@ class Elfutils(AutotoolsPackage): git='git://git.fedorahosted.org/git/elfutils.git', tag='elfutils-0.163') - provides('elf') + provides('elf@1') def configure_args(self): return ['--enable-maintainer-mode'] diff --git a/var/spack/repos/builtin/packages/extrae/package.py b/var/spack/repos/builtin/packages/extrae/package.py index 2a2b4df5bf..5a596ab9f7 100644 --- a/var/spack/repos/builtin/packages/extrae/package.py +++ b/var/spack/repos/builtin/packages/extrae/package.py @@ -62,8 +62,12 @@ class Extrae(Package): depends_on("boost") depends_on("libdwarf") depends_on("papi") - depends_on("libelf") + depends_on("elf", type="link") depends_on("libxml2") + + # gettext dependency added to find -lintl + # https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined + depends_on("gettext") depends_on("binutils+libiberty") def install(self, spec, prefix): @@ -74,6 +78,16 @@ class Extrae(Package): elif 'mvapich2' in spec: mpi = spec['mvapich2'] + extra_config_args = [] + + # This was added due to configure failure + # https://www.gnu.org/software/gettext/FAQ.html#integrating_undefined + extra_config_args.append('LDFLAGS=-lintl') + + if spec.satisfies("^dyninst@9.3.0:"): + make.add_default_arg('CXXFLAGS=-std=c++11') + extra_config_args.append('CXXFLAGS=-std=c++11') + configure("--prefix=%s" % prefix, "--with-mpi=%s" % mpi.prefix, "--with-unwind=%s" % spec['libunwind'].prefix, @@ -83,10 +97,11 @@ class Extrae(Package): "--with-papi=%s" % spec['papi'].prefix, "--with-dyninst-headers=%s" % spec[ 'dyninst'].prefix.include, - "--with-elf=%s" % spec['libelf'].prefix, + "--with-elf=%s" % spec['elf'].prefix, "--with-xml-prefix=%s" % spec['libxml2'].prefix, "--with-binutils=%s" % spec['binutils'].prefix, - "--with-dyninst-libs=%s" % spec['dyninst'].prefix.lib) + "--with-dyninst-libs=%s" % spec['dyninst'].prefix.lib, + *extra_config_args) make() make("install", parallel=False) diff --git a/var/spack/repos/builtin/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py index c2b289da4f..c7b44e35df 100644 --- a/var/spack/repos/builtin/packages/launchmon/package.py +++ b/var/spack/repos/builtin/packages/launchmon/package.py @@ -38,6 +38,9 @@ class Launchmon(Package): depends_on('libtool', type='build') depends_on('libgcrypt') depends_on('libgpg-error') + depends_on("elf", type='link') + depends_on("boost") + depends_on("spectrum-mpi", when='arch=ppc64le') def install(self, spec, prefix): configure( diff --git a/var/spack/repos/builtin/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py index 594271f655..fe131a842c 100644 --- a/var/spack/repos/builtin/packages/libdwarf/package.py +++ b/var/spack/repos/builtin/packages/libdwarf/package.py @@ -48,37 +48,54 @@ class Libdwarf(Package): version('20130729', '4cc5e48693f7b93b7aa0261e63c0e21d') version('20130207', '64b42692e947d5180e162e46c689dfbf') version('20130126', 'ded74a5e90edb5a12aac3c29d260c5db') - depends_on("libelf") + depends_on("elf", type='link') parallel = False def install(self, spec, prefix): - # dwarf build does not set arguments for ar properly - make.add_default_arg('ARFLAGS=rcs') - # Dwarf doesn't provide an install, so we have to do it. - mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1) + # elfutils contains a dwarf.h that conflicts with libdwarf's + # TODO: we should remove this when we can modify the include order + hide_list = [] + if spec.satisfies('^elfutils'): + dwarf_h = join_path(spec['elfutils'].prefix, 'include/dwarf.h') + hide_list.append(dwarf_h) + with hide_files(*hide_list): + # dwarf build does not set arguments for ar properly + make.add_default_arg('ARFLAGS=rcs') - with working_dir('libdwarf'): - configure("--prefix=" + prefix, "--enable-shared") - make() + # Dwarf doesn't provide an install, so we have to do it. + mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1) - install('libdwarf.a', prefix.lib) - install('libdwarf.so', prefix.lib) - install('libdwarf.h', prefix.include) - install('dwarf.h', prefix.include) + with working_dir('libdwarf'): + extra_config_args = [] - if spec.satisfies('@20130126:20130729'): - dwarfdump_dir = 'dwarfdump2' - else: - dwarfdump_dir = 'dwarfdump' - with working_dir(dwarfdump_dir): - configure("--prefix=" + prefix) + # this is to prevent picking up system /usr/include/libelf.h + if spec.satisfies('^libelf'): + libelf_inc_dir = join_path(spec['libelf'].prefix, + 'include/libelf') + extra_config_args.append('CFLAGS=-I{0}'.format( + libelf_inc_dir)) + configure("--prefix=" + prefix, "--enable-shared", + *extra_config_args) + make() - # This makefile has strings of copy commands that - # cause a race in parallel - make(parallel=False) + install('libdwarf.a', prefix.lib) + install('libdwarf.so', prefix.lib) + install('libdwarf.h', prefix.include) + install('dwarf.h', prefix.include) - install('dwarfdump', prefix.bin) - install('dwarfdump.conf', prefix.lib) - install('dwarfdump.1', prefix.man1) + if spec.satisfies('@20130126:20130729'): + dwarfdump_dir = 'dwarfdump2' + else: + dwarfdump_dir = 'dwarfdump' + with working_dir(dwarfdump_dir): + configure("--prefix=" + prefix) + + # This makefile has strings of copy commands that + # cause a race in parallel + make(parallel=False) + + install('dwarfdump', prefix.bin) + install('dwarfdump.conf', prefix.lib) + install('dwarfdump.1', prefix.man1) diff --git a/var/spack/repos/builtin/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py index 5af4ab705d..68db7b99c2 100644 --- a/var/spack/repos/builtin/packages/libelf/package.py +++ b/var/spack/repos/builtin/packages/libelf/package.py @@ -37,7 +37,7 @@ class Libelf(AutotoolsPackage): version('0.8.13', '4136d7b4c04df68b686570afa26988ac') version('0.8.12', 'e21f8273d9f5f6d43a59878dc274fec7') - provides('elf') + provides('elf@0') def configure_args(self): args = ["--enable-shared", diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index ae2655735a..c4b150f56c 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -60,7 +60,7 @@ class Openspeedshop(Package): """ homepage = "http://www.openspeedshop.org" - url = "https://github.com/OpenSpeedShop" + url = "https://github.com/OpenSpeedShop" version('2.2', '16cb051179c2038de4e8a845edf1d573') # Use when the git repository is available version('2.3', branch='master', @@ -115,6 +115,8 @@ class Openspeedshop(Package): depends_on("bison", type='build') depends_on("flex", type='build') depends_on("binutils@2.24+krellpatch", type='build') + # TODO: when using dyninst@9.3.0:, we will need to use elf + # depends_on("elf", type="link") depends_on("libelf") depends_on("libdwarf") depends_on("sqlite") diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py index c511fcee70..aacebfd8c8 100644 --- a/var/spack/repos/builtin/packages/stat/package.py +++ b/var/spack/repos/builtin/packages/stat/package.py @@ -31,11 +31,11 @@ class Stat(Package): homepage = "http://paradyn.org/STAT/STAT.html" url = "https://github.com/lee218llnl/stat/archive/v2.0.0.tar.gz" + version('3.0.0', 'a97cb235c266371c4a26329112de48a2', + url='https://github.com/LLNL/STAT/releases/download/v3.0.0/STAT-3.0.0.tar.gz') version('2.2.0', '26bd69dd57a15afdd5d0ebdb0b7fb6fc') version('2.1.0', 'ece26beaf057aa9134d62adcdda1ba91') version('2.0.0', 'c7494210b0ba26b577171b92838e1a9b') - version('3.0.0', 'a97cb235c266371c4a26329112de48a2', - url='https://github.com/LLNL/STAT/releases/download/v3.0.0/STAT-3.0.0.tar.gz') # TODO: dysect requires Dyninst patch for version 3.0.0b variant('dysect', default=False, description="enable DySectAPI") @@ -44,7 +44,6 @@ class Stat(Package): depends_on('autoconf', type='build') depends_on('automake', type='build') depends_on('libtool', type='build') - depends_on('libelf') depends_on('libdwarf') depends_on('dyninst', when='~dysect') depends_on('dyninst@8.2.1+stat_dysect', when='+dysect') -- cgit v1.2.3-70-g09d2 From e727f56d89ccd2aa9aabc14cf4efb471f32341dc Mon Sep 17 00:00:00 2001 From: scheibelp Date: Fri, 10 Mar 2017 13:58:48 -0800 Subject: Features/compiler config consistency (#2999) * default scope for config command is made consistent with cmd/__init__ default * dont specify a scope when looking for compilers with a matching spec (since compiler concretization is scope-independent) * config edit should default to platform-specific file only for compilers * when duplicate compiler specs are detected, the exception raised now points the user to the files where the duplicates appear * updated error message to emphasize that a spec is duplicated (since multiple specs can reference the same compiler) * 'spack compilers' is now also broken down into sections by os and target * Added tests for new compiler methods --- lib/spack/spack/cmd/compiler.py | 17 +-- lib/spack/spack/cmd/config.py | 5 +- lib/spack/spack/compilers/__init__.py | 173 +++++++++++++++++--------- lib/spack/spack/concretize.py | 2 +- lib/spack/spack/test/cmd/test_compiler_cmd.py | 6 +- lib/spack/spack/test/compilers.py | 48 +++++++ 6 files changed, 181 insertions(+), 70 deletions(-) create mode 100644 lib/spack/spack/test/compilers.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index c609794185..444e658a92 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -96,8 +96,7 @@ def compiler_find(args): for c in compilers: arch_spec = ArchSpec(None, c.operating_system, c.target) same_specs = spack.compilers.compilers_for_spec(c.spec, - arch_spec, - args.scope) + arch_spec) if not same_specs: new_compilers.append(c) @@ -165,14 +164,18 @@ def compiler_info(args): def compiler_list(args): tty.msg("Available compilers") - index = index_by(spack.compilers.all_compilers(scope=args.scope), 'name') - for i, (name, compilers) in enumerate(index.items()): + index = index_by(spack.compilers.all_compilers(scope=args.scope), + lambda c: (c.spec.name, c.operating_system, c.target)) + for i, (key, compilers) in enumerate(index.items()): if i >= 1: print - - cname = "%s{%s}" % (spack.spec.compiler_color, name) + name, os, target = key + os_str = os + if target: + os_str += "-%s" % target + cname = "%s{%s} %s" % (spack.spec.compiler_color, name, os_str) tty.hline(colorize(cname), char='-') - colify(reversed(sorted(compilers))) + colify(reversed(sorted(c.spec for c in compilers))) def compiler(parser, args): diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index 1a9e44a8b9..a647e3ed6e 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -55,7 +55,10 @@ def config_get(args): def config_edit(args): if not args.scope: - args.scope = 'user' + if args.section == 'compilers': + args.scope = spack.cmd.default_modify_scope + else: + args.scope = 'user' if not args.section: args.section = None config_file = spack.config.get_config_filename(args.scope, args.section) diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 731acaf9c2..be19841539 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -164,7 +164,7 @@ def all_compilers_config(scope=None, init_config=True): return _cache_config_file -def all_compilers(scope=None, init_config=True): +def all_compiler_specs(scope=None, init_config=True): # Return compiler specs from the merged config. return [spack.spec.CompilerSpec(s['compiler']['spec']) for s in all_compilers_config(scope, init_config)] @@ -203,72 +203,93 @@ def supported(compiler_spec): def find(compiler_spec, scope=None): """Return specs of available compilers that match the supplied compiler spec. Return an empty list if nothing found.""" - return [c for c in all_compilers(scope) if c.satisfies(compiler_spec)] + return [c for c in all_compiler_specs(scope) if c.satisfies(compiler_spec)] + + +def all_compilers(scope=None): + config = get_compiler_config(scope) + compilers = list() + for items in config: + items = items['compiler'] + compilers.append(compiler_from_config_entry(items)) + return compilers @_auto_compiler_spec -def compilers_for_spec(compiler_spec, arch_spec=None, scope=None): +def compilers_for_spec(compiler_spec, arch_spec=None, scope=None, + use_cache=True): """This gets all compilers that satisfy the supplied CompilerSpec. Returns an empty list if none are found. """ - config = all_compilers_config(scope) - - def get_compilers(cspec): - compilers = [] - - for items in config: - items = items['compiler'] - if items['spec'] != str(cspec): - continue - - # If an arch spec is given, confirm that this compiler - # is for the given operating system - os = items.get('operating_system', None) - if arch_spec and os != arch_spec.platform_os: - continue - - # If an arch spec is given, confirm that this compiler - # is for the given target. If the target is 'any', match - # any given arch spec. If the compiler has no assigned - # target this is an old compiler config file, skip this logic. - target = items.get('target', None) - if arch_spec and target and (target != arch_spec.target and - target != 'any'): - continue - - if not ('paths' in items and - all(n in items['paths'] for n in _path_instance_vars)): - raise InvalidCompilerConfigurationError(cspec) - - cls = class_for_compiler_name(cspec.name) - - compiler_paths = [] - for c in _path_instance_vars: - compiler_path = items['paths'][c] - if compiler_path != 'None': - compiler_paths.append(compiler_path) - else: - compiler_paths.append(None) - - mods = items.get('modules') - if mods == 'None': - mods = [] - - alias = items.get('alias', None) - compiler_flags = items.get('flags', {}) - environment = items.get('environment', {}) - extra_rpaths = items.get('extra_rpaths', []) - - compilers.append( - cls(cspec, os, target, compiler_paths, mods, alias, - environment, extra_rpaths, **compiler_flags)) - - return compilers + if use_cache: + config = all_compilers_config(scope) + else: + config = get_compiler_config(scope) matches = set(find(compiler_spec, scope)) compilers = [] for cspec in matches: - compilers.extend(get_compilers(cspec)) + compilers.extend(get_compilers(cspec, config, arch_spec)) + return compilers + + +def compiler_from_config_entry(items): + cspec = spack.spec.CompilerSpec(items['spec']) + os = items.get('operating_system', None) + target = items.get('target', None) + + if not ('paths' in items and + all(n in items['paths'] for n in _path_instance_vars)): + raise InvalidCompilerConfigurationError(cspec) + + cls = class_for_compiler_name(cspec.name) + + compiler_paths = [] + for c in _path_instance_vars: + compiler_path = items['paths'][c] + if compiler_path != 'None': + compiler_paths.append(compiler_path) + else: + compiler_paths.append(None) + + mods = items.get('modules') + if mods == 'None': + mods = [] + + alias = items.get('alias', None) + compiler_flags = items.get('flags', {}) + environment = items.get('environment', {}) + extra_rpaths = items.get('extra_rpaths', []) + + return cls(cspec, os, target, compiler_paths, mods, alias, + environment, extra_rpaths, **compiler_flags) + + +def get_compilers(cspec, config, arch_spec=None): + compilers = [] + + for items in config: + items = items['compiler'] + if items['spec'] != str(cspec): + continue + + # If an arch spec is given, confirm that this compiler + # is for the given operating system + os = items.get('operating_system', None) + if arch_spec and os != arch_spec.platform_os: + continue + + # If an arch spec is given, confirm that this compiler + # is for the given target. If the target is 'any', match + # any given arch spec. If the compiler has no assigned + # target this is an old compiler config file, skip this logic. + target = items.get('target', None) + if arch_spec and target and (target != arch_spec.target and + target != 'any'): + continue + + compilers.append(compiler_from_config_entry(items)) + return compilers @@ -283,10 +304,28 @@ def compiler_for_spec(compiler_spec, arch_spec): if len(compilers) < 1: raise NoCompilerForSpecError(compiler_spec, arch_spec.platform_os) if len(compilers) > 1: - raise CompilerSpecInsufficientlySpecificError(compiler_spec) + raise CompilerDuplicateError(compiler_spec, arch_spec) return compilers[0] +@_auto_compiler_spec +def get_compiler_duplicates(compiler_spec, arch_spec): + config_scopes = spack.config.config_scopes + scope_to_compilers = dict() + for scope in config_scopes: + compilers = compilers_for_spec(compiler_spec, arch_spec=arch_spec, + scope=scope, use_cache=False) + if compilers: + scope_to_compilers[scope] = compilers + + cfg_file_to_duplicates = dict() + for scope, compilers in scope_to_compilers.iteritems(): + config_file = config_scopes[scope].get_section_filename('compilers') + cfg_file_to_duplicates[config_file] = compilers + + return cfg_file_to_duplicates + + def class_for_compiler_name(compiler_name): """Given a compiler module name, get the corresponding Compiler class.""" assert(supported(compiler_name)) @@ -341,6 +380,24 @@ class NoCompilerForSpecError(spack.error.SpackError): % (target, compiler_spec)) +class CompilerDuplicateError(spack.error.SpackError): + def __init__(self, compiler_spec, arch_spec): + config_file_to_duplicates = get_compiler_duplicates( + compiler_spec, arch_spec) + duplicate_table = list( + (x, len(y)) for x, y in config_file_to_duplicates.iteritems()) + descriptor = lambda num: 'time' if num == 1 else 'times' + duplicate_msg = ( + lambda cfgfile, count: "{0}: {1} {2}".format( + cfgfile, str(count), descriptor(count))) + msg = ( + "Compiler configuration contains entries with duplicate" + + " specification ({0}, {1})".format(compiler_spec, arch_spec) + + " in the following files:\n\t" + + '\n\t'.join(duplicate_msg(x, y) for x, y in duplicate_table)) + super(CompilerDuplicateError, self).__init__(msg) + + class CompilerSpecInsufficientlySpecificError(spack.error.SpackError): def __init__(self, compiler_spec): super(CompilerSpecInsufficientlySpecificError, self).__init__( diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index bc3675ad84..1be0a7a81e 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -315,7 +315,7 @@ class DefaultConcretizer(object): def _proper_compiler_style(cspec, aspec): return spack.compilers.compilers_for_spec(cspec, arch_spec=aspec) - all_compilers = spack.compilers.all_compilers() + all_compilers = spack.compilers.all_compiler_specs() if (spec.compiler and spec.compiler.concrete and diff --git a/lib/spack/spack/test/cmd/test_compiler_cmd.py b/lib/spack/spack/test/cmd/test_compiler_cmd.py index 647404e6da..f0160e274a 100644 --- a/lib/spack/spack/test/cmd/test_compiler_cmd.py +++ b/lib/spack/spack/test/cmd/test_compiler_cmd.py @@ -71,12 +71,12 @@ class TestCompilerCommand(object): all=True, compiler_spec='gcc@4.5.0', add_paths=[], scope=None ) spack.cmd.compiler.compiler_remove(args) - compilers = spack.compilers.all_compilers() + compilers = spack.compilers.all_compiler_specs() assert spack.spec.CompilerSpec("gcc@4.5.0") not in compilers def test_compiler_add(self, mock_compiler_dir): # Compilers available by default. - old_compilers = set(spack.compilers.all_compilers()) + old_compilers = set(spack.compilers.all_compiler_specs()) args = spack.util.pattern.Bunch( all=None, @@ -87,7 +87,7 @@ class TestCompilerCommand(object): spack.cmd.compiler.compiler_find(args) # Ensure new compiler is in there - new_compilers = set(spack.compilers.all_compilers()) + new_compilers = set(spack.compilers.all_compiler_specs()) new_compiler = new_compilers - old_compilers assert new_compiler c = new_compiler.pop() diff --git a/lib/spack/spack/test/compilers.py b/lib/spack/spack/test/compilers.py new file mode 100644 index 0000000000..d0fc506f40 --- /dev/null +++ b/lib/spack/spack/test/compilers.py @@ -0,0 +1,48 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import pytest + +import spack.spec +import spack.compilers as compilers + + +@pytest.mark.usefixtures('config') +class TestCompilers(object): + + def test_get_compiler_duplicates(self): + # In this case there is only one instance of the specified compiler in + # the test configuration (so it is not actually a duplicate), but the + # method behaves the same. + cfg_file_to_duplicates = compilers.get_compiler_duplicates( + 'gcc@4.5.0', spack.spec.ArchSpec('cray-CNL-xeon')) + assert len(cfg_file_to_duplicates) == 1 + cfg_file, duplicates = cfg_file_to_duplicates.iteritems().next() + assert len(duplicates) == 1 + + def test_all_compilers(self): + all_compilers = compilers.all_compilers() + filtered = list(x for x in all_compilers if str(x.spec) == 'clang@3.3') + filtered = list(x for x in filtered if x.operating_system == 'SuSE11') + assert len(filtered) == 1 -- cgit v1.2.3-70-g09d2 From e3101808ae077a3d352d8740cc39d877ed355b86 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 11 Mar 2017 05:48:36 -0800 Subject: Make multimethods work with inheritance. (#3411) Previously, this would fail with a NoSuchMethodError: class Package(object): # this is the default implementation def some_method(self): ... class Foo(Package): @when('platform=cray') def some_method(self): ... @when('platform=linux') def some_method(self): ... This fixes the implementation of `@when` so that the superclass method will be invoked when no subclass method matches. Adds tests to ensure this works, as well. --- lib/spack/spack/multimethod.py | 12 +++++-- lib/spack/spack/test/multimethod.py | 8 +++++ .../packages/multimethod-base/package.py | 40 ++++++++++++++++++++++ .../builtin.mock/packages/multimethod/package.py | 12 ++++++- 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/multimethod-base/package.py (limited to 'lib') diff --git a/lib/spack/spack/multimethod.py b/lib/spack/spack/multimethod.py index 4e2fb3bdaa..67737c8bed 100644 --- a/lib/spack/spack/multimethod.py +++ b/lib/spack/spack/multimethod.py @@ -128,10 +128,16 @@ class SpecMultiMethod(object): if self.default: return self.default(package_self, *args, **kwargs) + else: - raise NoSuchMethodError( - type(package_self), self.__name__, spec, - [m[0] for m in self.method_list]) + superclass = super(package_self.__class__, package_self) + superclass_fn = getattr(superclass, self.__name__, None) + if callable(superclass_fn): + return superclass_fn(*args, **kwargs) + else: + raise NoSuchMethodError( + type(package_self), self.__name__, spec, + [m[0] for m in self.method_list]) def __str__(self): return "SpecMultiMethod {\n\tdefault: %s,\n\tspecs: %s\n}" % ( diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py index 90948f010c..fbcc70afe8 100644 --- a/lib/spack/spack/test/multimethod.py +++ b/lib/spack/spack/test/multimethod.py @@ -118,3 +118,11 @@ def test_virtual_dep_match(builtin_mock): pkg = spack.repo.get('multimethod^mpich@1.0') assert pkg.different_by_virtual_dep() == 1 + + +def test_multimethod_with_base_class(builtin_mock): + pkg = spack.repo.get('multimethod@3') + assert pkg.base_method() == "subclass_method" + + pkg = spack.repo.get('multimethod@1') + assert pkg.base_method() == "base_method" diff --git a/var/spack/repos/builtin.mock/packages/multimethod-base/package.py b/var/spack/repos/builtin.mock/packages/multimethod-base/package.py new file mode 100644 index 0000000000..bd3b29c5ee --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/multimethod-base/package.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 MultimethodBase(Package): + """This is a base class for the Multimethod test case. + + It tests whether mutlimethod properly invokes methods in a base + class when subclass multi-methods do not match. + + """ + + homepage = 'http://www.example.com/' + url = 'http://www.example.com/example-1.0.tar.gz' + + def base_method(self): + return "base_method" diff --git a/var/spack/repos/builtin.mock/packages/multimethod/package.py b/var/spack/repos/builtin.mock/packages/multimethod/package.py index fa3f815135..9e18d65cbb 100644 --- a/var/spack/repos/builtin.mock/packages/multimethod/package.py +++ b/var/spack/repos/builtin.mock/packages/multimethod/package.py @@ -25,8 +25,10 @@ from spack import * import spack.architecture +from spack.pkg.builtin.mock.multimethod_base import MultimethodBase -class Multimethod(Package): + +class Multimethod(MultimethodBase): """This package is designed for use with Spack's multimethod test. It has a bunch of test cases for the @when decorator that the test uses. @@ -132,3 +134,11 @@ class Multimethod(Package): @when('^mpi@2:') def different_by_virtual_dep(self): return 2 + + # + # Make sure methods with a default implementation in a superclass + # will invoke that method when none in the subclass match. + # + @when("@2:") + def base_method(self): + return "subclass_method" -- cgit v1.2.3-70-g09d2 From 63a8f79980628a3fea62f660b4fc6edecb9e7507 Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Sat, 11 Mar 2017 13:52:08 -0500 Subject: Correct inconsistency in comment (#3414) --- lib/spack/env/cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/env/cc b/lib/spack/env/cc index c0e97f3416..d7212bf89c 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -58,7 +58,7 @@ parameters=( # The default compiler flags are passed from these variables: # SPACK_CFLAGS, SPACK_CXXFLAGS, SPACK_FCFLAGS, SPACK_FFLAGS, # SPACK_LDFLAGS, SPACK_LDLIBS -# Debug env var is optional; set to true for debug logging: +# Debug env var is optional; set to "TRUE" for debug logging: # SPACK_DEBUG # Test command is used to unit test the compiler script. # SPACK_TEST_COMMAND -- cgit v1.2.3-70-g09d2 From d11e262b366eba85c51585c5352b1df129ecbdd9 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 13 Mar 2017 15:52:36 -0700 Subject: Fix from_sourcing_files(): decode json input as utf-8 (#3433) --- lib/spack/spack/environment.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index de30a9c7be..da69979ae1 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -310,8 +310,10 @@ class EnvironmentModifications(object): raise RuntimeError('sourcing files returned a non-zero exit code') output = ''.join([line for line in proc.stdout]) # Construct a dictionary with all the variables in the new environment - after_source_env = dict(json.loads(output)) - this_environment = dict(os.environ) + after_source_env = dict( + (k, v.decode('utf8')) for k, v in json.loads(output).items()) + this_environment = dict( + (k, v.decode('utf8')) for k, v in os.environ.items()) # Filter variables that are not related to sourcing a file to_be_filtered = 'SHLVL', '_', 'PWD', 'OLDPWD' -- cgit v1.2.3-70-g09d2 From 8c3edfd36ffe668e4e82c8e01b0a6e7918707266 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 14 Mar 2017 17:07:04 +0100 Subject: test/file_cache.py: ported to pytest (#3429) --- lib/spack/spack/test/file_cache.py | 80 +++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 44 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/file_cache.py b/lib/spack/spack/test/file_cache.py index cc66beda2e..af52380e34 100644 --- a/lib/spack/spack/test/file_cache.py +++ b/lib/spack/spack/test/file_cache.py @@ -22,62 +22,54 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -""" -Test Spack's FileCache. -""" +"""Test Spack's FileCache.""" import os -import shutil -import tempfile -import unittest +import pytest from spack.file_cache import FileCache -class FileCacheTest(unittest.TestCase): - """Ensure that a file cache can properly write to a file and recover its - contents.""" +@pytest.fixture() +def file_cache(tmpdir): + """Returns a properly initialized FileCache instance""" + return FileCache(str(tmpdir)) - def setUp(self): - self.scratch_dir = tempfile.mkdtemp() - self.cache = FileCache(self.scratch_dir) - def tearDown(self): - shutil.rmtree(self.scratch_dir) +def test_write_and_read_cache_file(file_cache): + """Test writing then reading a cached file.""" + with file_cache.write_transaction('test.yaml') as (old, new): + assert old is None + assert new is not None + new.write("foobar\n") - def test_write_and_read_cache_file(self): - """Test writing then reading a cached file.""" - with self.cache.write_transaction('test.yaml') as (old, new): - self.assertTrue(old is None) - self.assertTrue(new is not None) - new.write("foobar\n") + with file_cache.read_transaction('test.yaml') as stream: + text = stream.read() + assert text == "foobar\n" - with self.cache.read_transaction('test.yaml') as stream: - text = stream.read() - self.assertEqual("foobar\n", text) - def test_remove(self): - """Test removing an entry from the cache.""" - self.test_write_and_write_cache_file() +def test_write_and_remove_cache_file(file_cache): + """Test two write transactions on a cached file. Then try to remove an + entry from it. + """ - self.cache.remove('test.yaml') + with file_cache.write_transaction('test.yaml') as (old, new): + assert old is None + assert new is not None + new.write("foobar\n") - self.assertFalse(os.path.exists(self.cache.cache_path('test.yaml'))) - self.assertFalse(os.path.exists(self.cache._lock_path('test.yaml'))) + with file_cache.write_transaction('test.yaml') as (old, new): + assert old is not None + text = old.read() + assert text == "foobar\n" + assert new is not None + new.write("barbaz\n") - def test_write_and_write_cache_file(self): - """Test two write transactions on a cached file.""" - with self.cache.write_transaction('test.yaml') as (old, new): - self.assertTrue(old is None) - self.assertTrue(new is not None) - new.write("foobar\n") + with file_cache.read_transaction('test.yaml') as stream: + text = stream.read() + assert text == "barbaz\n" - with self.cache.write_transaction('test.yaml') as (old, new): - self.assertTrue(old is not None) - text = old.read() - self.assertEqual("foobar\n", text) - self.assertTrue(new is not None) - new.write("barbaz\n") + file_cache.remove('test.yaml') - with self.cache.read_transaction('test.yaml') as stream: - text = stream.read() - self.assertEqual("barbaz\n", text) + # After removal both the file and the lock file should not exist + assert not os.path.exists(file_cache.cache_path('test.yaml')) + assert not os.path.exists(file_cache._lock_path('test.yaml')) -- cgit v1.2.3-70-g09d2 From 560d28ac7f138d7390dafc100728fce2640d8a35 Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Tue, 14 Mar 2017 17:48:27 +0100 Subject: fix automatic mixing of clang with gfortran 6.3.0 on macOS (#3427) * fix automatic mixing of clang with gfortran 6.3.0 on macOS * automatically mix any gfortran with any clang on macOS * adjust the unit test --- lib/spack/spack/compilers/clang.py | 15 +++------------ lib/spack/spack/test/cmd/test_compiler_cmd.py | 4 ++-- 2 files changed, 5 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py index 3d68a37c44..f2f0883b20 100644 --- a/lib/spack/spack/compilers/clang.py +++ b/lib/spack/spack/compilers/clang.py @@ -164,19 +164,10 @@ class Clang(Compiler): @classmethod def fc_version(cls, fc): - version = get_compiler_version( - fc, '-dumpversion', - # older gfortran versions don't have simple dumpversion output. - r'(?:GNU Fortran \(GCC\))?(\d+\.\d+(?:\.\d+)?)') - # This is horribly ad hoc, we need to map from gcc/gfortran version - # to clang version, but there could be multiple clang - # versions that work for a single gcc/gfortran version + # We could map from gcc/gfortran version to clang version, but on macOS + # we normally mix any version of gfortran with any version of clang. if sys.platform == 'darwin': - clangversionfromgcc = {'6.2.0': '8.0.0-apple'} - else: - clangversionfromgcc = {} - if version in clangversionfromgcc: - return clangversionfromgcc[version] + return cls.default_version('clang') else: return 'unknown' diff --git a/lib/spack/spack/test/cmd/test_compiler_cmd.py b/lib/spack/spack/test/cmd/test_compiler_cmd.py index f0160e274a..842b64039e 100644 --- a/lib/spack/spack/test/cmd/test_compiler_cmd.py +++ b/lib/spack/spack/test/cmd/test_compiler_cmd.py @@ -90,5 +90,5 @@ class TestCompilerCommand(object): new_compilers = set(spack.compilers.all_compiler_specs()) new_compiler = new_compilers - old_compilers assert new_compiler - c = new_compiler.pop() - assert c.version == Version(test_version) + assert sum(1 for c in new_compiler if + c.version == Version(test_version)) > 0 -- cgit v1.2.3-70-g09d2 From dca4d2b15e6e78058d1ebdb244877470241f8f9c Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 15 Mar 2017 00:26:44 -0500 Subject: Consistent docs and usage of env mod methods (#3351) --- lib/spack/docs/packaging_guide.rst | 29 +++--- lib/spack/spack/package.py | 113 +++++++++------------ var/spack/repos/builtin/packages/bazel/package.py | 8 +- var/spack/repos/builtin/packages/dealii/package.py | 4 +- .../repos/builtin/packages/docbook-xml/package.py | 2 +- .../repos/builtin/packages/docbook-xsl/package.py | 2 +- .../builtin/packages/everytrace-example/package.py | 4 +- .../repos/builtin/packages/everytrace/package.py | 4 +- var/spack/repos/builtin/packages/fastqc/package.py | 4 +- .../repos/builtin/packages/go-bootstrap/package.py | 2 +- var/spack/repos/builtin/packages/go/package.py | 8 +- .../repos/builtin/packages/intel-mkl/package.py | 4 +- var/spack/repos/builtin/packages/lua/package.py | 10 +- var/spack/repos/builtin/packages/mpich/package.py | 2 +- .../repos/builtin/packages/mvapich2/package.py | 4 +- var/spack/repos/builtin/packages/octave/package.py | 4 +- .../repos/builtin/packages/openmpi/package.py | 2 +- var/spack/repos/builtin/packages/plumed/package.py | 2 +- .../repos/builtin/packages/py-numpy/package.py | 2 +- var/spack/repos/builtin/packages/python/package.py | 20 ++-- var/spack/repos/builtin/packages/qt/package.py | 4 +- var/spack/repos/builtin/packages/r/package.py | 16 +-- var/spack/repos/builtin/packages/root/package.py | 2 +- var/spack/repos/builtin/packages/ruby/package.py | 8 +- var/spack/repos/builtin/packages/rust/package.py | 2 +- var/spack/repos/builtin/packages/tcl/package.py | 6 +- 26 files changed, 124 insertions(+), 144 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 211e72158c..b794bb2581 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -1523,23 +1523,23 @@ properties to be used by dependents. The function declaration should look like this: -.. code-block:: python - - class Qt(Package): - ... - def setup_dependent_environment(self, module, spec, dep_spec): - """Dependencies of Qt find it using the QTDIR environment variable.""" - os.environ['QTDIR'] = self.prefix +.. literalinclude:: ../../../var/spack/repos/builtin/packages/qt/package.py + :pyobject: Qt.setup_dependent_environment + :linenos: Here, the Qt package sets the ``QTDIR`` environment variable so that packages that depend on a particular Qt installation will find it. The arguments to this function are: -* **module**: the module of the dependent package, where global - properties can be assigned. -* **spec**: the spec of the *dependency package* (the one the function is called on). -* **dep_spec**: the spec of the dependent package (i.e. dep_spec depends on spec). +* **spack_env**: List of environment modifications to be applied when + the dependent package is built within Spack. +* **run_env**: List of environment modifications to be applied when + the dependent package is run outside of Spack. These are added to the + resulting module file. +* **dependent_spec**: The spec of the dependent package about to be + built. This allows the extendee (self) to query the dependent's state. + Note that *this* package's spec is available as ``self.spec``. A good example of using these is in the Python package: @@ -2805,11 +2805,8 @@ the one passed to install, only the MPI implementations all set some additional properties on it to help you out. E.g., in mvapich2, you'll find this: -.. code-block:: python - - def setup_dependent_package(self, module, dep_spec): - self.spec.mpicc = join_path(self.prefix.bin, 'mpicc') - # … etc … +.. literalinclude:: ../../../var/spack/repos/builtin/packages/mvapich2/package.py + :pyobject: Mvapich2.setup_dependent_package That code allows the mvapich2 package to associate an ``mpicc`` property with the ``mvapich2`` node in the DAG, so that dependents can access it. diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 8889de7576..80d65bd739 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1393,32 +1393,29 @@ class PackageBase(object): def setup_environment(self, spack_env, run_env): """Set up the compile and runtime environments for a package. - `spack_env` and `run_env` are `EnvironmentModifications` - objects. Package authors can call methods on them to alter + ``spack_env`` and ``run_env`` are ``EnvironmentModifications`` + objects. Package authors can call methods on them to alter the environment within Spack and at runtime. - Both `spack_env` and `run_env` are applied within the build - process, before this package's `install()` method is called. + Both ``spack_env`` and ``run_env`` are applied within the build + process, before this package's ``install()`` method is called. - Modifications in `run_env` will *also* be added to the + Modifications in ``run_env`` will *also* be added to the generated environment modules for this package. Default implementation does nothing, but this can be overridden if the package needs a particular environment. - Examples: - - 1. Qt extensions need `QTDIR` set. - - Args: - spack_env (EnvironmentModifications): list of - modifications to be applied when this package is built - within Spack. + Example: - run_env (EnvironmentModifications): list of environment - changes to be applied when this package is run outside - of Spack. + 1. Qt extensions need ``QTDIR`` set. + :param EnvironmentModifications spack_env: List of environment + modifications to be applied when this package is built + within Spack. + :param EnvironmentModifications run_env: List of environment + modifications to be applied when this package is run outside + of Spack. These are added to the resulting module file. """ pass @@ -1431,32 +1428,26 @@ class PackageBase(object): others that follow the extension model a way to implement common environment or compile-time settings for dependencies. - By default, this delegates to ``self.setup_environment()`` + This is useful if there are some common steps to installing + all extensions for a certain package. Example: - 1. Installing python modules generally requires - `PYTHONPATH` to point to the lib/pythonX.Y/site-packages - directory in the module's install prefix. This could - set that variable. - - Args: - - spack_env (EnvironmentModifications): list of - modifications to be applied when the dependent package - is bulit within Spack. - - run_env (EnvironmentModifications): list of environment - changes to be applied when the dependent package is - run outside of Spack. - - dependent_spec (Spec): The spec of the dependent package - about to be built. This allows the extendee (self) to - query the dependent's state. Note that *this* - package's spec is available as `self.spec`. - - This is useful if there are some common steps to installing - all extensions for a certain package. + 1. Installing python modules generally requires ``PYTHONPATH`` to point + to the ``lib/pythonX.Y/site-packages`` directory in the module's + install prefix. This method could be used to set that variable. + + :param EnvironmentModifications spack_env: List of environment + modifications to be applied when the dependent package is + built within Spack. + :param EnvironmentModifications run_env: List of environment + modifications to be applied when the dependent package is + run outside of Spack. These are added to the resulting + module file. + :param Spec dependent_spec: The spec of the dependent package + about to be built. This allows the extendee (self) to query + the dependent's state. Note that *this* package's spec is + available as ``self.spec``. """ pass @@ -1470,37 +1461,29 @@ class PackageBase(object): its extensions. This is useful if there are some common steps to installing all extensions for a certain package. - Example : - - 1. Extensions often need to invoke the `python` - interpreter from the Python installation being - extended. This routine can put a 'python' Executable - object in the module scope for the extension package to - simplify extension installs. - - 2. MPI compilers could set some variables in the - dependent's scope that point to `mpicc`, `mpicxx`, - etc., allowing them to be called by common names - regardless of which MPI is used. - - 3. BLAS/LAPACK implementations can set some variables - indicating the path to their libraries, since these - paths differ by BLAS/LAPACK implementation. + Examples: - Args: + 1. Extensions often need to invoke the ``python`` interpreter + from the Python installation being extended. This routine + can put a ``python()`` Executable object in the module scope + for the extension package to simplify extension installs. - module (module): The Python `module` object of the - dependent package. Packages can use this to set - module-scope variables for the dependent to use. + 2. MPI compilers could set some variables in the dependent's + scope that point to ``mpicc``, ``mpicxx``, etc., allowing + them to be called by common name regardless of which MPI is used. - dependent_spec (Spec): The spec of the dependent package - about to be built. This allows the extendee (self) to - query the dependent's state. Note that *this* - package's spec is available as `self.spec`. + 3. BLAS/LAPACK implementations can set some variables + indicating the path to their libraries, since these + paths differ by BLAS/LAPACK implementation. - This is useful if there are some common steps to installing - all extensions for a certain package. + :param spack.package.PackageBase.module module: The Python ``module`` + object of the dependent package. Packages can use this to set + module-scope variables for the dependent to use. + :param Spec dependent_spec: The spec of the dependent package + about to be built. This allows the extendee (self) to + query the dependent's state. Note that *this* + package's spec is available as ``self.spec``. """ pass diff --git a/var/spack/repos/builtin/packages/bazel/package.py b/var/spack/repos/builtin/packages/bazel/package.py index 95af1e4cc0..d2e3ee8f8a 100644 --- a/var/spack/repos/builtin/packages/bazel/package.py +++ b/var/spack/repos/builtin/packages/bazel/package.py @@ -53,7 +53,7 @@ class Bazel(Package): mkdir(prefix.bin) install('output/bazel', prefix.bin) - def setup_dependent_package(self, module, dep_spec): + def setup_dependent_package(self, module, dependent_spec): class BazelExecutable(Executable): """Special callable executable object for bazel so the user can specify parallel or not on a per-invocation basis. Using @@ -84,8 +84,8 @@ class Bazel(Package): return super(BazelExecutable, self).__call__(*args, **kwargs) jobs = cpu_count() - if not dep_spec.package.parallel: + if not dependent_spec.package.parallel: jobs = 1 - elif dep_spec.package.make_jobs: - jobs = dep_spec.package.make_jobs + elif dependent_spec.package.make_jobs: + jobs = dependent_spec.package.make_jobs module.bazel = BazelExecutable('bazel', 'build', jobs) diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index 61dae81a3d..de62ea213c 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -287,5 +287,5 @@ class Dealii(CMakePackage): return options - def setup_environment(self, spack_env, env): - env.set('DEAL_II_DIR', self.prefix) + def setup_environment(self, spack_env, run_env): + run_env.set('DEAL_II_DIR', self.prefix) diff --git a/var/spack/repos/builtin/packages/docbook-xml/package.py b/var/spack/repos/builtin/packages/docbook-xml/package.py index f1e1a08c8f..cff971f373 100644 --- a/var/spack/repos/builtin/packages/docbook-xml/package.py +++ b/var/spack/repos/builtin/packages/docbook-xml/package.py @@ -42,7 +42,7 @@ class DocbookXml(Package): else: install(src, dst) - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): catalog = os.path.join(self.spec.prefix, 'catalog.xml') spack_env.set('XML_CATALOG_FILES', catalog, separator=' ') diff --git a/var/spack/repos/builtin/packages/docbook-xsl/package.py b/var/spack/repos/builtin/packages/docbook-xsl/package.py index 5de9cecdbb..2554e4d7bf 100644 --- a/var/spack/repos/builtin/packages/docbook-xsl/package.py +++ b/var/spack/repos/builtin/packages/docbook-xsl/package.py @@ -44,7 +44,7 @@ class DocbookXsl(Package): else: install(src, dst) - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): catalog = os.path.join(self.spec.prefix, 'catalog.xml') spack_env.set('XML_CATALOG_FILES', catalog, separator=' ') diff --git a/var/spack/repos/builtin/packages/everytrace-example/package.py b/var/spack/repos/builtin/packages/everytrace-example/package.py index 76b437a38a..17a7ed8658 100644 --- a/var/spack/repos/builtin/packages/everytrace-example/package.py +++ b/var/spack/repos/builtin/packages/everytrace-example/package.py @@ -38,5 +38,5 @@ class EverytraceExample(CMakePackage): # Currently the only MPI this everytrace works with. depends_on('openmpi') - def setup_environment(self, spack_env, env): - env.prepend_path('PATH', join_path(self.prefix, 'bin')) + def setup_environment(self, spack_env, run_env): + run_env.prepend_path('PATH', join_path(self.prefix, 'bin')) diff --git a/var/spack/repos/builtin/packages/everytrace/package.py b/var/spack/repos/builtin/packages/everytrace/package.py index d884c7b165..11d2a66bf4 100644 --- a/var/spack/repos/builtin/packages/everytrace/package.py +++ b/var/spack/repos/builtin/packages/everytrace/package.py @@ -47,5 +47,5 @@ class Everytrace(CMakePackage): '-DUSE_MPI=%s' % ('YES' if '+mpi' in spec else 'NO'), '-DUSE_FORTRAN=%s' % ('YES' if '+fortran' in spec else 'NO')] - def setup_environment(self, spack_env, env): - env.prepend_path('PATH', join_path(self.prefix, 'bin')) + def setup_environment(self, spack_env, run_env): + run_env.prepend_path('PATH', join_path(self.prefix, 'bin')) diff --git a/var/spack/repos/builtin/packages/fastqc/package.py b/var/spack/repos/builtin/packages/fastqc/package.py index e2a1b54210..a9e352e101 100644 --- a/var/spack/repos/builtin/packages/fastqc/package.py +++ b/var/spack/repos/builtin/packages/fastqc/package.py @@ -53,8 +53,8 @@ class Fastqc(Package): # In theory the 'run' dependency on 'jdk' above should take # care of this for me. In practice, it does not. - def setup_environment(self, spack_env, env): + def setup_environment(self, spack_env, run_env): """Add to the path; the package has a script at the top level. """ - env.prepend_path('PATH', join_path(self.spec['jdk'].prefix, 'bin')) + run_env.prepend_path('PATH', join_path(self.spec['jdk'].prefix, 'bin')) diff --git a/var/spack/repos/builtin/packages/go-bootstrap/package.py b/var/spack/repos/builtin/packages/go-bootstrap/package.py index b497144f2f..8d54486bf5 100644 --- a/var/spack/repos/builtin/packages/go-bootstrap/package.py +++ b/var/spack/repos/builtin/packages/go-bootstrap/package.py @@ -87,7 +87,7 @@ class GoBootstrap(Package): else: shutil.copy2(f, os.path.join(prefix, f)) - def setup_dependent_environment(self, spack_env, run_env, dep_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): spack_env.set('GOROOT_BOOTSTRAP', self.spec.prefix) def setup_environment(self, spack_env, run_env): diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index 3a1ca9f1e8..6559e90496 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -114,7 +114,7 @@ class Go(Package): def setup_environment(self, spack_env, run_env): spack_env.set('GOROOT_FINAL', self.spec.prefix) - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """Called before go modules' install() methods. In most cases, extensions will only need to set GOPATH and use go:: @@ -127,13 +127,13 @@ class Go(Package): # Add a go command/compiler for extensions module.go = Executable(join_path(self.spec.prefix.bin, 'go')) - def setup_dependent_environment(self, spack_env, run_env, ext_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): if os.environ.get('GOROOT', False): tty.warn('GOROOT is set, this is not recommended') path_components = [] # Set GOPATH to include paths of dependencies - for d in ext_spec.traverse(): + for d in dependent_spec.traverse(): if d.package.extends(self.spec): path_components.append(d.prefix) @@ -142,4 +142,4 @@ class Go(Package): # Allow packages to find this when using module or dotkit run_env.prepend_path('GOPATH', ':'.join( - [ext_spec.prefix] + path_components)) + [dependent_spec.prefix] + path_components)) diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index 6bd4689bc1..5e108a0867 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -125,5 +125,5 @@ class IntelMkl(IntelInstaller): # set up MKLROOT for everyone using MKL package spack_env.set('MKLROOT', self.prefix) - def setup_environment(self, spack_env, env): - env.set('MKLROOT', self.prefix) + def setup_environment(self, spack_env, run_env): + run_env.set('MKLROOT', self.prefix) diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py index 357e2cc03a..a76e7c545b 100644 --- a/var/spack/repos/builtin/packages/lua/package.py +++ b/var/spack/repos/builtin/packages/lua/package.py @@ -86,9 +86,9 @@ class Lua(Package): paths.append(os.path.join(path, '?', 'init.lua')) cpaths.append(os.path.join(path, '?.so')) - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): lua_paths = [] - for d in extension_spec.traverse( + for d in dependent_spec.traverse( deptypes=('build', 'run'), deptype_query='run'): if d.package.extends(self.spec): lua_paths.append(os.path.join(d.prefix, self.lua_lib_dir)) @@ -111,9 +111,9 @@ class Lua(Package): # Add LUA to PATH for dependent packages spack_env.prepend_path('PATH', self.prefix.bin) - # For run time environment set only the path for extension_spec and + # For run time environment set only the path for dependent_spec and # prepend it to LUAPATH - if extension_spec.package.extends(self.spec): + if dependent_spec.package.extends(self.spec): run_env.prepend_path('LUA_PATH', ';'.join(lua_patterns), separator=';') run_env.prepend_path('LUA_CPATH', ';'.join(lua_cpatterns), @@ -149,7 +149,7 @@ class Lua(Package): def lua_share_dir(self): return os.path.join('share', 'lua', self.version.up_to(2)) - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """ Called before lua modules's install() methods. diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index 4c34f3e3a0..09fc683874 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -69,7 +69,7 @@ class Mpich(AutotoolsPackage): spack_env.set('MPICH_F90', spack_fc) spack_env.set('MPICH_FC', spack_fc) - def setup_dependent_package(self, module, dep_spec): + def setup_dependent_package(self, module, dependent_spec): if 'platform=cray' in self.spec: self.spec.mpicc = spack_cc self.spec.mpicxx = spack_cxx diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py index 18f2ebe0bb..de809c4fed 100644 --- a/var/spack/repos/builtin/packages/mvapich2/package.py +++ b/var/spack/repos/builtin/packages/mvapich2/package.py @@ -209,7 +209,7 @@ class Mvapich2(Package): self.version > Version('2.0'): run_env.set('SLURM_MPI_TYPE', 'pmi2') - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): spack_env.set('MPICC', join_path(self.prefix.bin, 'mpicc')) spack_env.set('MPICXX', join_path(self.prefix.bin, 'mpicxx')) spack_env.set('MPIF77', join_path(self.prefix.bin, 'mpif77')) @@ -221,7 +221,7 @@ class Mvapich2(Package): spack_env.set('MPICH_F90', spack_fc) spack_env.set('MPICH_FC', spack_fc) - def setup_dependent_package(self, module, dep_spec): + def setup_dependent_package(self, module, dependent_spec): self.spec.mpicc = join_path(self.prefix.bin, 'mpicc') self.spec.mpicxx = join_path(self.prefix.bin, 'mpicxx') self.spec.mpifc = join_path(self.prefix.bin, 'mpif90') diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py index fe6ea8ce68..33ed5c8bc3 100644 --- a/var/spack/repos/builtin/packages/octave/package.py +++ b/var/spack/repos/builtin/packages/octave/package.py @@ -88,7 +88,7 @@ class Octave(AutotoolsPackage): depends_on('gnuplot', when='+gnuplot') depends_on('image-magick', when='+magick') depends_on('hdf5', when='+hdf5') - depends_on('jdk', when='+jdk') # TODO: requires Java 6 ? + depends_on('jdk', when='+jdk') # TODO: requires Java 6 ? depends_on('llvm', when='+llvm') # depends_on('opengl', when='+opengl') # TODO: add package depends_on('qhull', when='+qhull') @@ -225,7 +225,7 @@ class Octave(AutotoolsPackage): # Set up environment to make install easy for Octave extensions. # ======================================================================== - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """Called before Octave modules' install() methods. In most cases, extensions will only need to have one line: diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 4d09676fac..27bde1d7aa 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -139,7 +139,7 @@ class Openmpi(AutotoolsPackage): spack_env.set('OMPI_FC', spack_fc) spack_env.set('OMPI_F77', spack_f77) - def setup_dependent_package(self, module, dep_spec): + def setup_dependent_package(self, module, dependent_spec): self.spec.mpicc = join_path(self.prefix.bin, 'mpicc') self.spec.mpicxx = join_path(self.prefix.bin, 'mpic++') self.spec.mpifc = join_path(self.prefix.bin, 'mpif90') diff --git a/var/spack/repos/builtin/packages/plumed/package.py b/var/spack/repos/builtin/packages/plumed/package.py index 69949b0017..80cc1aa66a 100644 --- a/var/spack/repos/builtin/packages/plumed/package.py +++ b/var/spack/repos/builtin/packages/plumed/package.py @@ -99,7 +99,7 @@ class Plumed(AutotoolsPackage): plumed.stdin.write(choice) plumed.wait() - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): # Make plumed visible from dependent packages module.plumed = Executable(join_path(self.spec.prefix.bin, 'plumed')) diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index 11f6ebb1a5..3571ff1f15 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -53,7 +53,7 @@ class PyNumpy(PythonPackage): depends_on('blas', when='+blas') depends_on('lapack', when='+lapack') - def setup_dependent_package(self, module, dep_spec): + def setup_dependent_package(self, module, dependent_spec): python_version = self.spec['python'].version.up_to(2) arch = '{0}-{1}'.format(platform.system().lower(), platform.machine()) diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index f3e2813ae8..15f7f4f987 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -335,7 +335,7 @@ class Python(Package): def site_packages_dir(self): return join_path(self.python_lib_dir, 'site-packages') - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): """Set PYTHONPATH to include site-packages dir for the extension and any other python extensions it depends on.""" # The python executable for version 3 may be python3 or python @@ -361,7 +361,7 @@ class Python(Package): spack_env.set('PYTHONHOME', prefix.strip('\n')) python_paths = [] - for d in extension_spec.traverse( + for d in dependent_spec.traverse( deptype=('build', 'run'), deptype_query='run'): if d.package.extends(self.spec): python_paths.append(join_path(d.prefix, @@ -371,12 +371,12 @@ class Python(Package): spack_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): + # dependent_spec and prepend it to PYTHONPATH + if dependent_spec.package.extends(self.spec): run_env.prepend_path('PYTHONPATH', join_path( - extension_spec.prefix, self.site_packages_dir)) + dependent_spec.prefix, self.site_packages_dir)) - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """Called before python modules' install() methods. In most cases, extensions will only need to have one line:: @@ -398,15 +398,15 @@ class Python(Package): module.setup_py.add_default_env(key, value) # Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs. - module.python_lib_dir = join_path(ext_spec.prefix, + module.python_lib_dir = join_path(dependent_spec.prefix, self.python_lib_dir) - module.python_include_dir = join_path(ext_spec.prefix, + module.python_include_dir = join_path(dependent_spec.prefix, self.python_include_dir) - module.site_packages_dir = join_path(ext_spec.prefix, + module.site_packages_dir = join_path(dependent_spec.prefix, self.site_packages_dir) # Make the site packages directory for extensions - if ext_spec.package.is_extension: + if dependent_spec.package.is_extension: mkdirp(module.site_packages_dir) # ======================================================================== diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index dfe83888e5..b795cd17ab 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -128,10 +128,10 @@ class Qt(Package): def setup_environment(self, spack_env, run_env): run_env.set('QTDIR', self.prefix) - def setup_dependent_environment(self, spack_env, run_env, dspec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): spack_env.set('QTDIR', self.prefix) - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): module.qmake = Executable(join_path(self.spec.prefix.bin, 'qmake')) def patch(self): diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py index 842affc4cc..f6ec720eb7 100644 --- a/var/spack/repos/builtin/packages/r/package.py +++ b/var/spack/repos/builtin/packages/r/package.py @@ -149,11 +149,11 @@ class R(AutotoolsPackage): def r_lib_dir(self): return join_path('rlib', 'R', 'library') - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): # Set R_LIBS to include the library dir for the # extension and any other R extensions it depends on. r_libs_path = [] - for d in extension_spec.traverse( + for d in dependent_spec.traverse( deptype=('build', 'run'), deptype_query='run'): if d.package.extends(self.spec): r_libs_path.append(join_path(d.prefix, self.r_lib_dir)) @@ -167,11 +167,11 @@ class R(AutotoolsPackage): # determine how many jobs can actually be started. spack_env.set('MAKEFLAGS', '-j{0}'.format(make_jobs)) - # For run time environment set only the path for extension_spec and + # For run time environment set only the path for dependent_spec and # prepend it to R_LIBS - if extension_spec.package.extends(self.spec): + if dependent_spec.package.extends(self.spec): run_env.prepend_path('R_LIBS', join_path( - extension_spec.prefix, self.r_lib_dir)) + dependent_spec.prefix, self.r_lib_dir)) def setup_environment(self, spack_env, run_env): run_env.prepend_path('LIBRARY_PATH', @@ -181,7 +181,7 @@ class R(AutotoolsPackage): run_env.prepend_path('CPATH', join_path(self.prefix, 'rlib', 'R', 'include')) - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """Called before R modules' install() methods. In most cases, extensions will only need to have one line: R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir), @@ -191,9 +191,9 @@ class R(AutotoolsPackage): module.R = Executable(join_path(self.spec.prefix.bin, 'R')) # Add variable for library directry - module.r_lib_dir = join_path(ext_spec.prefix, self.r_lib_dir) + module.r_lib_dir = join_path(dependent_spec.prefix, self.r_lib_dir) # Make the site packages directory for extensions, if it does not exist # already. - if ext_spec.package.is_extension: + if dependent_spec.package.is_extension: mkdirp(module.r_lib_dir) diff --git a/var/spack/repos/builtin/packages/root/package.py b/var/spack/repos/builtin/packages/root/package.py index 0f66dcebaa..a96d7f6bbc 100644 --- a/var/spack/repos/builtin/packages/root/package.py +++ b/var/spack/repos/builtin/packages/root/package.py @@ -79,7 +79,7 @@ class Root(Package): make() make("install") - def setup_dependent_environment(self, spack_env, run_env, dspec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): spack_env.set('ROOTSYS', self.prefix) spack_env.set('ROOT_VERSION', 'v6') spack_env.prepend_path('PYTHONPATH', self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/ruby/package.py b/var/spack/repos/builtin/packages/ruby/package.py index 8dc314c171..728362a18c 100644 --- a/var/spack/repos/builtin/packages/ruby/package.py +++ b/var/spack/repos/builtin/packages/ruby/package.py @@ -52,20 +52,20 @@ class Ruby(Package): make() make("install") - def setup_dependent_environment(self, spack_env, run_env, extension_spec): + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): # TODO: do this only for actual extensions. # Set GEM_PATH to include dependent gem directories ruby_paths = [] - for d in extension_spec.traverse(): + for d in dependent_spec.traverse(): if d.package.extends(self.spec): ruby_paths.append(d.prefix) spack_env.set_path('GEM_PATH', ruby_paths) # The actual installation path for this gem - spack_env.set('GEM_HOME', extension_spec.prefix) + spack_env.set('GEM_HOME', dependent_spec.prefix) - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """Called before ruby modules' install() methods. Sets GEM_HOME and GEM_PATH to values appropriate for the package being built. diff --git a/var/spack/repos/builtin/packages/rust/package.py b/var/spack/repos/builtin/packages/rust/package.py index 8a92fca634..4d0e7f52cf 100644 --- a/var/spack/repos/builtin/packages/rust/package.py +++ b/var/spack/repos/builtin/packages/rust/package.py @@ -71,7 +71,7 @@ class Rust(Package): make() make("install") - def setup_dependent_package(self, module, ext_spec): + def setup_dependent_package(self, module, dependent_spec): """ Called before python modules' install() methods. diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index 31678caac6..22b300408a 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -49,11 +49,11 @@ class Tcl(AutotoolsPackage): base_url = 'http://prdownloads.sourceforge.net/tcl' return '{0}/tcl{1}-src.tar.gz'.format(base_url, version) - def setup_environment(self, spack_env, env): + def setup_environment(self, spack_env, run_env): # When using Tkinter from within spack provided python+tk, python # will not be able to find Tcl/Tk unless TCL_LIBRARY is set. - env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format( - self.spec.version.up_to(2)))) + run_env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format( + self.spec.version.up_to(2)))) @run_after('install') def symlink_tclsh(self): -- cgit v1.2.3-70-g09d2 From 9a27dec8e878debe81bd4ab08dfcf8964c4e9e4a Mon Sep 17 00:00:00 2001 From: scheibelp Date: Thu, 16 Mar 2017 11:24:34 -0700 Subject: Dont auto-init compiler conf for 'compiler find' (#3439) Fixes #3428 Users can run 'spack compiler find' to automatically initialize their compilers.yaml configuration file. It also turns out that Spack will implicitly initialize the compilers configuration file as part of detecting compilers if none are found (so if a user were to attempt to concretize a spec without running 'spack compiler find' it would not fail). However, in this case Spack was overlooking its own implicit initialization of the config files and would report that no new compilers were found. This commit removes implicit initialization when the user calls 'spack compiler find'. This did not surface until #2999 because the 'spack compiler' command defaulted to using a scope 'user/platform' that was not accounted for in get_compiler_config (where the implicit initialization logic predates the addition of this new scope); #2999 removed the scope specification when checking through config files, leading to the implicit initialization. --- lib/spack/spack/cmd/compiler.py | 4 ++-- lib/spack/spack/compilers/__init__.py | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 444e658a92..9601c5ba65 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -95,8 +95,8 @@ def compiler_find(args): new_compilers = [] for c in compilers: arch_spec = ArchSpec(None, c.operating_system, c.target) - same_specs = spack.compilers.compilers_for_spec(c.spec, - arch_spec) + same_specs = spack.compilers.compilers_for_spec( + c.spec, arch_spec, init_config=False) if not same_specs: new_compilers.append(c) diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index be19841539..771c8c0559 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -200,10 +200,11 @@ def supported(compiler_spec): @_auto_compiler_spec -def find(compiler_spec, scope=None): +def find(compiler_spec, scope=None, init_config=True): """Return specs of available compilers that match the supplied compiler spec. Return an empty list if nothing found.""" - return [c for c in all_compiler_specs(scope) if c.satisfies(compiler_spec)] + return [c for c in all_compiler_specs(scope, init_config) + if c.satisfies(compiler_spec)] def all_compilers(scope=None): @@ -217,16 +218,16 @@ def all_compilers(scope=None): @_auto_compiler_spec def compilers_for_spec(compiler_spec, arch_spec=None, scope=None, - use_cache=True): + use_cache=True, init_config=True): """This gets all compilers that satisfy the supplied CompilerSpec. Returns an empty list if none are found. """ if use_cache: - config = all_compilers_config(scope) + config = all_compilers_config(scope, init_config) else: - config = get_compiler_config(scope) + config = get_compiler_config(scope, init_config) - matches = set(find(compiler_spec, scope)) + matches = set(find(compiler_spec, scope, init_config)) compilers = [] for cspec in matches: compilers.extend(get_compilers(cspec, config, arch_spec)) -- cgit v1.2.3-70-g09d2 From 5936ad2ca78566fd13ad11081a75e333697b2065 Mon Sep 17 00:00:00 2001 From: scheibelp Date: Thu, 16 Mar 2017 21:07:35 -0700 Subject: Dont propagate flags between different compilers (#3379) * Dont propagate flags between different compilers Fixes #2786 Previously when a spec had no parents with an equivalent compiler, Spack would default to adding the compiler flags associated with the root of the DAG. This eliminates that default. * added test for compiler flag propagation * simplify compiler flag propagation logic --- lib/spack/spack/concretize.py | 59 ++++++++++++-------------------------- lib/spack/spack/test/concretize.py | 10 +++++++ 2 files changed, 28 insertions(+), 41 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 1be0a7a81e..3d38f22cb6 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -377,41 +377,26 @@ class DefaultConcretizer(object): # running. return True + compiler_match = lambda other: ( + spec.compiler == other.compiler and + spec.architecture == other.architecture) + ret = False for flag in spack.spec.FlagMap.valid_compiler_flags(): + if flag not in spec.compiler_flags: + spec.compiler_flags[flag] = list() try: nearest = next(p for p in spec.traverse(direction='parents') - if ((p.compiler == spec.compiler and - p is not spec) and + if (compiler_match(p) and + (p is not spec) and flag in p.compiler_flags)) - if flag not in spec.compiler_flags or \ - not (sorted(spec.compiler_flags[flag]) >= - sorted(nearest.compiler_flags[flag])): - if flag in spec.compiler_flags: - spec.compiler_flags[flag] = list( - set(spec.compiler_flags[flag]) | - set(nearest.compiler_flags[flag])) - else: - spec.compiler_flags[ - flag] = nearest.compiler_flags[flag] + nearest_flags = set(nearest.compiler_flags.get(flag, [])) + flags = set(spec.compiler_flags.get(flag, [])) + if (nearest_flags - flags): + spec.compiler_flags[flag] = list(nearest_flags | flags) ret = True - except StopIteration: - if (flag in spec.root.compiler_flags and - ((flag not in spec.compiler_flags) or - sorted(spec.compiler_flags[flag]) != - sorted(spec.root.compiler_flags[flag]))): - if flag in spec.compiler_flags: - spec.compiler_flags[flag] = list( - set(spec.compiler_flags[flag]) | - set(spec.root.compiler_flags[flag])) - else: - spec.compiler_flags[ - flag] = spec.root.compiler_flags[flag] - ret = True - else: - if flag not in spec.compiler_flags: - spec.compiler_flags[flag] = [] + pass # Include the compiler flag defaults from the config files # This ensures that spack will detect conflicts that stem from a change @@ -419,19 +404,11 @@ class DefaultConcretizer(object): compiler = spack.compilers.compiler_for_spec( spec.compiler, spec.architecture) for flag in compiler.flags: - if flag not in spec.compiler_flags: - spec.compiler_flags[flag] = compiler.flags[flag] - if compiler.flags[flag] != []: - ret = True - else: - if ((sorted(spec.compiler_flags[flag]) != - sorted(compiler.flags[flag])) and - (not set(spec.compiler_flags[flag]) >= - set(compiler.flags[flag]))): - ret = True - spec.compiler_flags[flag] = list( - set(spec.compiler_flags[flag]) | - set(compiler.flags[flag])) + config_flags = set(compiler.flags.get(flag, [])) + flags = set(spec.compiler_flags.get(flag, [])) + spec.compiler_flags[flag] = list(config_flags | flags) + if (config_flags - flags): + ret = True return ret diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index b7cad503a3..0cb3a34a48 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -175,6 +175,16 @@ class TestConcretize(object): assert Spec('builtin.mock.multi-provider-mpi@1.10.0') in providers assert Spec('builtin.mock.multi-provider-mpi@1.8.8') in providers + def test_different_compilers_get_different_flags(self): + client = Spec('cmake-client %gcc@4.7.2 platform=test os=fe target=fe' + + ' ^cmake %clang@3.5 platform=test os=fe target=fe') + client.concretize() + cmake = client['cmake'] + assert set(client.compiler_flags['cflags']) == set(['-O0']) + assert set(cmake.compiler_flags['cflags']) == set(['-O3']) + assert set(client.compiler_flags['fflags']) == set(['-O0']) + assert not set(cmake.compiler_flags['fflags']) + def concretize_multi_provider(self): s = Spec('mpileaks ^multi-provider-mpi@3.0') s.concretize() -- cgit v1.2.3-70-g09d2 From 0b27a7e13d5138ebf9b2d7510b1c16179e3b803c Mon Sep 17 00:00:00 2001 From: scheibelp Date: Thu, 16 Mar 2017 21:08:13 -0700 Subject: Detect when OS updates affect compiler selection (#3410) Fixes #1476 Concretization uses compilers defined in config files and if those are not available defaults to searching typical paths where the detected operating system would have a compiler. If there is an OS update, the detected OS can change; in this case all compilers defined in the config files would no longer match (because they would be associated with the previous OS version). The error message in this case was too vague. This commit adds logic for detecting when it is likely that the OS has been updated (in particular when that affects compiler concretization) and improves the information provided to the user in the error message. --- lib/spack/spack/compilers/__init__.py | 11 +++-- lib/spack/spack/concretize.py | 77 +++++++++++++++++++++++++++-------- lib/spack/spack/test/concretize.py | 10 +++++ 3 files changed, 77 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 771c8c0559..cb3aab9b97 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -230,10 +230,15 @@ def compilers_for_spec(compiler_spec, arch_spec=None, scope=None, matches = set(find(compiler_spec, scope, init_config)) compilers = [] for cspec in matches: - compilers.extend(get_compilers(cspec, config, arch_spec)) + compilers.extend(get_compilers(config, cspec, arch_spec)) return compilers +def compilers_for_arch(arch_spec, scope=None): + config = all_compilers_config(scope) + return list(get_compilers(config, arch_spec=arch_spec)) + + def compiler_from_config_entry(items): cspec = spack.spec.CompilerSpec(items['spec']) os = items.get('operating_system', None) @@ -266,12 +271,12 @@ def compiler_from_config_entry(items): environment, extra_rpaths, **compiler_flags) -def get_compilers(cspec, config, arch_spec=None): +def get_compilers(config, cspec=None, arch_spec=None): compilers = [] for items in config: items = items['compiler'] - if items['spec'] != str(cspec): + if cspec and items['spec'] != str(cspec): continue # If an arch spec is given, confirm that this compiler diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 3d38f22cb6..126db8b780 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -315,11 +315,16 @@ class DefaultConcretizer(object): def _proper_compiler_style(cspec, aspec): return spack.compilers.compilers_for_spec(cspec, arch_spec=aspec) - all_compilers = spack.compilers.all_compiler_specs() + all_compiler_specs = spack.compilers.all_compiler_specs() + if not all_compiler_specs: + raise spack.compilers.NoCompilersError() if (spec.compiler and spec.compiler.concrete and - spec.compiler in all_compilers): + spec.compiler in all_compiler_specs): + if not _proper_compiler_style(spec.compiler, spec.architecture): + _compiler_concretization_failure( + spec.compiler, spec.architecture) return False # Find the another spec that has a compiler, or the root if none do @@ -332,22 +337,23 @@ class DefaultConcretizer(object): assert(other_spec) # Check if the compiler is already fully specified - if other_compiler in all_compilers: + if other_compiler in all_compiler_specs: spec.compiler = other_compiler.copy() + if not _proper_compiler_style(spec.compiler, spec.architecture): + _compiler_concretization_failure( + spec.compiler, spec.architecture) return True # Filter the compilers into a sorted list based on the compiler_order # from spackconfig - compiler_list = all_compilers if not other_compiler else \ + compiler_list = all_compiler_specs if not other_compiler else \ spack.compilers.find(other_compiler) + if not compiler_list: + # No compiler with a satisfactory spec was found + raise UnavailableCompilerVersionError(other_compiler) cmp_compilers = partial( pkgsort().compiler_compare, other_spec.name) matches = sorted(compiler_list, cmp=cmp_compilers) - if not matches: - arch = spec.architecture - raise UnavailableCompilerVersionError(other_compiler, - arch.platform_os, - arch.target) # copy concrete version into other_compiler try: @@ -355,10 +361,9 @@ class DefaultConcretizer(object): c for c in matches if _proper_compiler_style(c, spec.architecture)).copy() except StopIteration: - raise UnavailableCompilerVersionError( - spec.compiler, spec.architecture.platform_os, - spec.architecture.target - ) + # No compiler with a satisfactory spec has a suitable arch + _compiler_concretization_failure( + other_compiler, spec.architecture) assert(spec.compiler.concrete) return True # things changed. @@ -443,17 +448,53 @@ def find_spec(spec, condition): return None # Nothing matched the condition. +def _compiler_concretization_failure(compiler_spec, arch): + # Distinguish between the case that there are compilers for + # the arch but not with the given compiler spec and the case that + # there are no compilers for the arch at all + if not spack.compilers.compilers_for_arch(arch): + available_os_targets = set( + (c.operating_system, c.target) for c in + spack.compilers.all_compilers()) + raise NoCompilersForArchError(arch, available_os_targets) + else: + raise UnavailableCompilerVersionError(compiler_spec, arch) + + +class NoCompilersForArchError(spack.error.SpackError): + def __init__(self, arch, available_os_targets): + err_msg = ("No compilers found" + " for operating system %s and target %s." + "\nIf previous installations have succeeded, the" + " operating system may have been updated." % + (arch.platform_os, arch.target)) + + available_os_target_strs = list() + for os, t in available_os_targets: + os_target_str = "%s-%s" % (os, t) if t else os + available_os_target_strs.append(os_target_str) + err_msg += ( + "\nCompilers are defined for the following" + " operating systems and targets:\n\t" + + "\n\t".join(available_os_target_strs)) + + super(NoCompilersForArchError, self).__init__( + err_msg, "Run 'spack compiler find' to add compilers.") + + class UnavailableCompilerVersionError(spack.error.SpackError): """Raised when there is no available compiler that satisfies a compiler spec.""" - def __init__(self, compiler_spec, operating_system, target): + def __init__(self, compiler_spec, arch=None): + err_msg = "No compilers with spec %s found" % compiler_spec + if arch: + err_msg += (" for operating system %s and target %s." % + (compiler_spec, arch.platform_os, arch.target)) + super(UnavailableCompilerVersionError, self).__init__( - "No available compiler version matches '%s' on operating_system " - "'%s' for target '%s'" - % (compiler_spec, operating_system, target), - "Run 'spack compilers' to see available compiler Options.") + err_msg, "Run 'spack compiler find' to add compilers.") class NoValidVersionError(spack.error.SpackError): diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 0cb3a34a48..f4021a89ee 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -221,6 +221,16 @@ class TestConcretize(object): with pytest.raises(spack.spec.MultipleProviderError): s.concretize() + def test_no_matching_compiler_specs(self): + s = Spec('a %gcc@0.0.0') + with pytest.raises(spack.concretize.UnavailableCompilerVersionError): + s.concretize() + + def test_no_compilers_for_arch(self): + s = Spec('a arch=linux-rhel0-x86_64') + with pytest.raises(spack.concretize.NoCompilersForArchError): + s.concretize() + def test_virtual_is_fully_expanded_for_callpath(self): # force dependence on fake "zmpi" by asking for MPI 10.0 spec = Spec('callpath ^mpi@10.0') -- cgit v1.2.3-70-g09d2 From 10b767b93f60926ef7e1cb132af364890819c5bc Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 17 Mar 2017 09:55:55 -0500 Subject: Don't use @system in packages.yaml (#3472) --- lib/spack/docs/getting_started.rst | 41 ++++++++++++++------------------------ lib/spack/docs/packaging_guide.rst | 31 ---------------------------- lib/spack/docs/workflows.rst | 20 ++++--------------- 3 files changed, 19 insertions(+), 73 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index efc1965ce9..3c2610beb0 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -85,18 +85,8 @@ Check Installation With Spack installed, you should be able to run some basic Spack commands. For example: -.. code-block:: console +.. command-output:: spack spec netcdf - $ spack spec netcdf - ... - netcdf@4.4.1%gcc@5.3.0~hdf4+mpi arch=linux-SuSE11-x86_64 - ^curl@7.50.1%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^openssl@system%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^zlib@1.2.8%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^hdf5@1.10.0-patch1%gcc@5.3.0+cxx~debug+fortran+mpi+shared~szip~threadsafe arch=linux-SuSE11-x86_64 - ^openmpi@1.10.1%gcc@5.3.0~mxm~pmi~psm~psm2~slurm~sqlite3~thread_multiple~tm+verbs+vt arch=linux-SuSE11-x86_64 - ^m4@1.4.17%gcc@5.3.0+sigsegv arch=linux-SuSE11-x86_64 - ^libsigsegv@2.10%gcc@5.3.0 arch=linux-SuSE11-x86_64 ^^^^^^^^^^^^^^^^^^^^^^^^^^ Optional: Alternate Prefix @@ -225,7 +215,7 @@ If you want to see specifics on a particular compiler, you can run f77 = /usr/local/bin/ifort-15.0.090 fc = /usr/local/bin/ifort-15.0.090 modules = [] - operating system = centos6 + operating_system = centos6 ... This shows which C, C++, and Fortran compilers were detected by Spack. @@ -712,19 +702,22 @@ example: $ curl -O https://github.com/ImageMagick/ImageMagick/archive/7.0.2-7.tar.gz -The recommended way to tell Spack to use the system-supplied OpenSSL is -to add the following to ``packages.yaml``. Note that the ``@system`` -"version" means "I don't care what version it is, just use what is -there." This is reasonable for OpenSSL, which has a stable API. +To tell Spack to use the system-supplied OpenSSL, first determine what +version you have: + +.. code-block:: console + + $ openssl version + OpenSSL 1.0.2g 1 Mar 2016 +Then add the following to ``~/.spack/packages.yaml``: .. code-block:: yaml packages: openssl: paths: - openssl@system: /usr - version: [system] + openssl@1.0.2g: /usr buildable: False @@ -740,8 +733,7 @@ to add the following to ``packages.yaml``: packages: netlib-lapack: paths: - netlib-lapack@system: /usr - version: [system] + netlib-lapack@3.6.1: /usr buildable: False all: providers: @@ -750,11 +742,9 @@ to add the following to ``packages.yaml``: .. note:: - The ``@system`` "version" means "I don't care what version it is, - just use what is there." Above we pretend that the system-provided - Blas/Lapack is ``netlib-lapack`` only because it is the only BLAS / LAPACK - provider which use standard names for libraries (as opposed to, for example, - `libopenblas.so`). + Above we pretend that the system-provided BLAS / LAPACK is ``netlib-lapack`` + only because it is the only BLAS / LAPACK provider which use standard names + for libraries (as opposed to, for example, ``libopenblas.so``). Although we specify external package in ``/usr``, Spack is smart enough not to add ``/usr/lib`` to RPATHs, where it could cause unrelated system @@ -909,7 +899,6 @@ with Spack: tcl: paths: tcl@8.5: /usr - version: [8.5] buildable: False #. Install with: diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index b794bb2581..729ea5d656 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -3156,37 +3156,6 @@ Version Lists Spack packages should list supported versions with the newest first. -^^^^^^^^^^^^^^^^ -Special Versions -^^^^^^^^^^^^^^^^ - -The following *special* version names may be used when building a package: - -""""""""""" -``@system`` -""""""""""" - -Indicates a hook to the OS-installed version of the -package. This is useful, for example, to tell Spack to use the -OS-installed version in ``packages.yaml``: - -.. code-block:: yaml - - openssl: - paths: - openssl@system: /usr - buildable: False - -Certain Spack internals look for the ``@system`` version and do -appropriate things in that case. - -"""""""""" -``@local`` -"""""""""" - -Indicates the version was built manually from some source -tree of unknown provenance (see ``spack setup``). - --------------------------- Packaging workflow commands --------------------------- diff --git a/lib/spack/docs/workflows.rst b/lib/spack/docs/workflows.rst index 11b77c008d..7814ebf3cd 100644 --- a/lib/spack/docs/workflows.rst +++ b/lib/spack/docs/workflows.rst @@ -33,24 +33,12 @@ possible realization of a particular package, out of combinatorially many other realizations. For example, here is a concrete spec instantiated from ``curl``: -.. code-block:: console - - curl@7.50.1%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^openssl@system%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^zlib@1.2.8%gcc@5.3.0 arch=linux-SuSE11-x86_64 +.. command-output:: spack spec curl Spack's core concretization algorithm generates concrete specs by instantiating packages from its repo, based on a set of "hints", including user input and the ``packages.yaml`` file. This algorithm -may be accessed at any time with the ``spack spec`` command. For -example: - -.. code-block:: console - - $ spack spec curl - curl@7.50.1%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^openssl@system%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^zlib@1.2.8%gcc@5.3.0 arch=linux-SuSE11-x86_64 +may be accessed at any time with the ``spack spec`` command. Every time Spack installs a package, that installation corresponds to a concrete spec. Only a vanishingly small fraction of possible @@ -68,7 +56,7 @@ variant, compiler, etc. For example, the following set is consistent: .. code-block:: console curl@7.50.1%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^openssl@system%gcc@5.3.0 arch=linux-SuSE11-x86_64 + ^openssl@1.0.2k%gcc@5.3.0 arch=linux-SuSE11-x86_64 ^zlib@1.2.8%gcc@5.3.0 arch=linux-SuSE11-x86_64 zlib@1.2.8%gcc@5.3.0 arch=linux-SuSE11-x86_64 @@ -77,7 +65,7 @@ The following set is not consistent: .. code-block:: console curl@7.50.1%gcc@5.3.0 arch=linux-SuSE11-x86_64 - ^openssl@system%gcc@5.3.0 arch=linux-SuSE11-x86_64 + ^openssl@1.0.2k%gcc@5.3.0 arch=linux-SuSE11-x86_64 ^zlib@1.2.8%gcc@5.3.0 arch=linux-SuSE11-x86_64 zlib@1.2.7%gcc@5.3.0 arch=linux-SuSE11-x86_64 -- cgit v1.2.3-70-g09d2 From 1297e47463cd1ecaad6637e9f86a92550f3d9a63 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 18 Mar 2017 22:48:20 -0700 Subject: Use byte-encoded UTF-8 for sourced environment in Python 2 (#3489) - Fixes recurring errors on develop with unicode commit characters. - still Python3-proof: python3 will use str instead of bytestrings. --- lib/spack/spack/environment.py | 21 ++++++++++++----- lib/spack/spack/test/data/sourceme_unicode.sh | 34 +++++++++++++++++++++++++++ lib/spack/spack/test/environment.py | 6 ++--- 3 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 lib/spack/spack/test/data/sourceme_unicode.sh (limited to 'lib') diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index da69979ae1..1333054518 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -26,6 +26,7 @@ import collections import inspect import json import os +import sys import os.path import subprocess @@ -268,8 +269,8 @@ class EnvironmentModifications(object): :param \*args: list of files to be sourced :rtype: instance of EnvironmentModifications """ - env = EnvironmentModifications() + # Check if the files are actually there files = [line.split(' ')[0] for line in args] non_existing = [file for file in files if not os.path.isfile(file)] @@ -277,6 +278,7 @@ class EnvironmentModifications(object): message = 'trying to source non-existing files\n' message += '\n'.join(non_existing) raise RuntimeError(message) + # Relevant kwd parameters and formats info = dict(kwargs) info.setdefault('shell', '/bin/bash') @@ -309,11 +311,17 @@ class EnvironmentModifications(object): if proc.returncode != 0: raise RuntimeError('sourcing files returned a non-zero exit code') output = ''.join([line for line in proc.stdout]) - # Construct a dictionary with all the variables in the new environment - after_source_env = dict( - (k, v.decode('utf8')) for k, v in json.loads(output).items()) - this_environment = dict( - (k, v.decode('utf8')) for k, v in os.environ.items()) + + # Construct a dictionaries of the environment before and after + # sourcing the files, so that we can diff them. + this_environment = dict(os.environ) + after_source_env = json.loads(output) + + # If we're in python2, convert to str objects instead of unicode + # like json gives us. We can't put unicode in os.environ anyway. + if sys.version_info[0] < 3: + after_source_env = dict((k.encode('utf-8'), v.encode('utf-8')) + for k, v in after_source_env.items()) # Filter variables that are not related to sourcing a file to_be_filtered = 'SHLVL', '_', 'PWD', 'OLDPWD' @@ -364,6 +372,7 @@ class EnvironmentModifications(object): start = modified_list.index(remaining_list[0]) end = modified_list.index(remaining_list[-1]) search = sep.join(modified_list[start:end + 1]) + if search not in current: # We just need to set the variable to the new value env.set(x, after_source_env[x]) diff --git a/lib/spack/spack/test/data/sourceme_unicode.sh b/lib/spack/spack/test/data/sourceme_unicode.sh new file mode 100644 index 0000000000..f01f6a4927 --- /dev/null +++ b/lib/spack/spack/test/data/sourceme_unicode.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## + +# Set an environment variable with some unicode in it to ensure that +# Spack can decode it. +# +# This has caused squashed commits on develop to break, as some +# committers use unicode in their messages, and Travis sets the +# current commit message in an environment variable. +export UNICODE_VAR='don\xe2\x80\x99t' diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index 0da137c192..dbad2c5e1f 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -96,7 +96,8 @@ def files_to_be_sourced(): files = [ os.path.join(datadir, 'sourceme_first.sh'), os.path.join(datadir, 'sourceme_second.sh'), - os.path.join(datadir, 'sourceme_parameters.sh intel64') + os.path.join(datadir, 'sourceme_parameters.sh intel64'), + os.path.join(datadir, 'sourceme_unicode.sh') ] return files @@ -230,7 +231,6 @@ def test_source_files(files_to_be_sourced): """Tests the construction of a list of environment modifications that are the result of sourcing a file. """ - env = EnvironmentModifications.from_sourcing_files(*files_to_be_sourced) modifications = env.group_by_name() @@ -238,7 +238,7 @@ def test_source_files(files_to_be_sourced): # spurious entries for things like PS1 # # TODO: figure out how to make a bit more robust. - assert len(modifications) >= 4 + assert len(modifications) >= 5 # Set new variables assert len(modifications['NEW_VAR']) == 1 -- cgit v1.2.3-70-g09d2 From 5ac6421f148f43f6f90832978c45a5749f6d154e Mon Sep 17 00:00:00 2001 From: Matthew LeGendre Date: Mon, 20 Mar 2017 12:35:38 -0700 Subject: Fix issue with config.guess patching when the overwritten config.guess did not have write permissions. (#3494) --- lib/spack/spack/build_systems/autotools.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index f0f57b1232..a11a84acd0 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -27,6 +27,8 @@ import inspect import os import os.path import shutil +from os import stat +from stat import * from subprocess import PIPE from subprocess import check_call @@ -131,16 +133,8 @@ class AutotoolsPackage(PackageBase): path = os.path.join(automake_path, 'config.guess') if os.path.exists(path): config_guess = path - if config_guess is not None: - try: - check_call([config_guess], stdout=PIPE, stderr=PIPE) - shutil.copyfile(config_guess, my_config_guess) - return True - except Exception: - pass - # Look for the system's config.guess - if os.path.exists('/usr/share'): + if config_guess is None and os.path.exists('/usr/share'): automake_dir = [s for s in os.listdir('/usr/share') if "automake" in s] if automake_dir: @@ -151,6 +145,8 @@ class AutotoolsPackage(PackageBase): if config_guess is not None: try: check_call([config_guess], stdout=PIPE, stderr=PIPE) + mod = stat(my_config_guess).st_mode & 0777 | S_IWUSR + os.chmod(my_config_guess, mod) shutil.copyfile(config_guess, my_config_guess) return True except Exception: -- cgit v1.2.3-70-g09d2 From 19dca26f3ac3d5ded5ccfc7e561d997cfc4cdd2c Mon Sep 17 00:00:00 2001 From: scheibelp Date: Mon, 20 Mar 2017 12:36:44 -0700 Subject: Improve output for compiler commands (#3480) * Order listed compiler sections "spack compiler list" output compiler sections in an arbitrary order. With this commit compiler sections are ordered primarily by compiler name and then by operating system and target. * Compiler search lists config files with compilers If a compiler entry is already defined in a configuration file that the user does not know about, they may be confused when that compiler is not added by "spack compiler find". This commit adds a message at the end of "spack compiler find" to inform the user of the locations of all config files where compilers are defined. --- lib/spack/spack/cmd/compiler.py | 5 ++++- lib/spack/spack/compilers/__init__.py | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 9601c5ba65..22f3b3f26a 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -112,6 +112,8 @@ def compiler_find(args): colify(reversed(sorted(c.spec for c in new_compilers)), indent=4) else: tty.msg("Found no new compilers") + tty.msg("Compilers are defined in the following files:") + colify(spack.compilers.compiler_config_files(), indent=4) def compiler_remove(args): @@ -166,7 +168,8 @@ def compiler_list(args): tty.msg("Available compilers") index = index_by(spack.compilers.all_compilers(scope=args.scope), lambda c: (c.spec.name, c.operating_system, c.target)) - for i, (key, compilers) in enumerate(index.items()): + ordered_sections = sorted(index.items(), key=lambda (k, v): k) + for i, (key, compilers) in enumerate(ordered_sections): if i >= 1: print name, os, target = key diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index cb3aab9b97..a16caa3a6c 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -110,6 +110,16 @@ def get_compiler_config(scope=None, init_config=True): return [] # Return empty list which we will later append to. +def compiler_config_files(): + config_files = list() + for scope in spack.config.config_scopes: + config = spack.config.get_config('compilers', scope=scope) + if config: + config_files.append(spack.config.config_scopes[scope] + .get_section_filename('compilers')) + return config_files + + def add_compilers_to_config(compilers, scope=None, init_config=True): """Add compilers to the config for the specified architecture. -- cgit v1.2.3-70-g09d2 From 9b5f5fccf0bef308a21cf69005e41904dc896f24 Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Tue, 21 Mar 2017 15:30:38 -0700 Subject: Fix for `find --explicit` #3374 (#3492) This fixes the problem described in #3374, which describes `spack find` ignore explicit/implicit. I believe that this was broken in #2626. This restores the behavior of implicit/explicit for me. I believe that it does not screw anything else up, but .... --- lib/spack/spack/cmd/common/arguments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index 6fc3b5d3cf..a8bdcf692f 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -64,7 +64,7 @@ class ConstraintAction(argparse.Action): # return everything for an empty query. if not qspecs: - return spack.store.db.query() + return spack.store.db.query(**kwargs) # Return only matching stuff otherwise. specs = set() -- cgit v1.2.3-70-g09d2 From 4ecfc39e1e94581001a66f3280d58ae9e29d0acf Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 23 Mar 2017 14:35:11 -0500 Subject: Add Expect package (#3517) * Add Expect package * Ignore patches during flake8 tests for package.py files * Remove controversial changes --- lib/spack/spack/cmd/flake8.py | 3 +- ...ect_tcl_private_header_os_x_mountain_lion.patch | 23 +++++++ var/spack/repos/builtin/packages/expect/package.py | 79 ++++++++++++++++++++++ var/spack/repos/builtin/packages/tcl/package.py | 7 ++ var/spack/repos/builtin/packages/tk/package.py | 6 +- 5 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 var/spack/repos/builtin/packages/expect/expect_detect_tcl_private_header_os_x_mountain_lion.patch create mode 100644 var/spack/repos/builtin/packages/expect/package.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 5ee68a80df..d5ed9adf18 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -59,7 +59,8 @@ exemptions = { r'^\s*version\(.*\)', r'^\s*variant\(.*\)', r'^\s*depends_on\(.*\)', - r'^\s*extends\(.*\)'], + r'^\s*extends\(.*\)', + r'^\s*patch\(.*\)'], # Exempt '@when' decorated functions from redefinition errors. 811: [r'^\s*\@when\(.*\)'], }, diff --git a/var/spack/repos/builtin/packages/expect/expect_detect_tcl_private_header_os_x_mountain_lion.patch b/var/spack/repos/builtin/packages/expect/expect_detect_tcl_private_header_os_x_mountain_lion.patch new file mode 100644 index 0000000000..31720eb743 --- /dev/null +++ b/var/spack/repos/builtin/packages/expect/expect_detect_tcl_private_header_os_x_mountain_lion.patch @@ -0,0 +1,23 @@ +Fix Tcl private header detection on macOS + +https://sourceforge.net/p/expect/patches/17/ + +diff -Naur expect5.45.orig/tclconfig/tcl.m4 expect5.45/tclconfig/tcl.m4 +--- expect5.45.orig/tclconfig/tcl.m4 2010-11-09 11:42:10.000000000 -0800 ++++ expect5.45/tclconfig/tcl.m4 2013-09-23 00:10:00.000000000 -0700 +@@ -3389,9 +3389,12 @@ + # the framework's Headers and PrivateHeaders directories + case ${TCL_DEFS} in + *TCL_FRAMEWORK*) +- if test -d "${TCL_BIN_DIR}/Headers" -a \ +- -d "${TCL_BIN_DIR}/PrivateHeaders"; then +- TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" ++ if test -d "${TCL_BIN_DIR}/Headers"; then ++ if test -d "${TCL_BIN_DIR}/PrivateHeaders"; then ++ TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" ++ elif test -d "${TCL_BIN_DIR}/Headers/tcl-private"; then ++ TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/Headers/tcl-private\" ${TCL_INCLUDES}" ++ fi + else + TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" + fi diff --git a/var/spack/repos/builtin/packages/expect/package.py b/var/spack/repos/builtin/packages/expect/package.py new file mode 100644 index 0000000000..a8ea99a8ae --- /dev/null +++ b/var/spack/repos/builtin/packages/expect/package.py @@ -0,0 +1,79 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 glob +import os + + +class Expect(AutotoolsPackage): + """Expect is a tool for automating interactive applications such as + telnet, ftp, passwd, fsck, rlogin, tip, etc.""" + + homepage = "http://expect.sourceforge.net/" + url = "https://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download" + + version('5.45', '44e1a4f4c877e9ddc5a542dfa7ecc92b') + + depends_on('tcl') + + depends_on('automake', type='build') + depends_on('autoconf', type='build') + depends_on('libtool', type='build') + depends_on('m4', type='build') + + force_autoreconf = True + + patch('expect_detect_tcl_private_header_os_x_mountain_lion.patch', when='@5.45') + + def configure_args(self): + spec = self.spec + + args = [ + # Without this, expect binary and library are not installed + '--exec-prefix={0}'.format(self.prefix), + '--enable-threads', + '--enable-shared', + '--enable-64bit', + '--with-tcl={0}'.format(spec['tcl'].prefix.lib), + '--with-tclinclude={0}'.format(spec['tcl'].prefix.include), + ] + + return args + + @run_after('install') + def symlink_library(self): + """Expect installs libraries into: + + lib/expect5.45/libexpect5.45.so + + Create a symlink so that the library can be found in lib.""" + + target = join_path(self.prefix.lib, 'expect*', 'libexpect*') + target = glob.glob(target)[0] + + link_name = os.path.basename(target) + link_name = join_path(self.prefix.lib, link_name) + + symlink(target, link_name) diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index 22b300408a..79d4bc7544 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -55,6 +55,13 @@ class Tcl(AutotoolsPackage): run_env.set('TCL_LIBRARY', join_path(self.prefix.lib, 'tcl{0}'.format( self.spec.version.up_to(2)))) + def install(self, spec, prefix): + with working_dir(self.build_directory): + make('install') + + # Some applications like Expect require private Tcl headers. + make('install-private-headers') + @run_after('install') def symlink_tclsh(self): with working_dir(self.prefix.bin): diff --git a/var/spack/repos/builtin/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py index 48fc32ebb9..4d9651315a 100644 --- a/var/spack/repos/builtin/packages/tk/package.py +++ b/var/spack/repos/builtin/packages/tk/package.py @@ -38,10 +38,8 @@ class Tk(AutotoolsPackage): version('8.6.5', '11dbbd425c3e0201f20d6a51482ce6c4') version('8.6.3', '85ca4dbf4dcc19777fd456f6ee5d0221') - variant('X', default=False, description='Enable X11 support') - - depends_on("tcl") - depends_on("libx11", when='+X') + depends_on('tcl') + depends_on('libx11') configure_directory = 'unix' -- cgit v1.2.3-70-g09d2 From 61d01a71dd775eca0679c205390229b5d35624d9 Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Sat, 25 Mar 2017 01:37:47 +0100 Subject: make git fetching quite (#3180) also output repo and branch/commit/tag in one line --- lib/spack/spack/fetch_strategy.py | 43 ++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index eadcef85f3..d510db568f 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -597,25 +597,33 @@ class GitFetchStrategy(VCSFetchStrategy): tty.msg("Already fetched %s" % self.stage.source_path) return - args = [] + args = '' if self.commit: - args.append('at commit %s' % self.commit) + args = 'at commit %s' % self.commit elif self.tag: - args.append('at tag %s' % self.tag) + args = 'at tag %s' % self.tag elif self.branch: - args.append('on branch %s' % self.branch) - tty.msg("Trying to clone git repository:", self.url, *args) + args = 'on branch %s' % self.branch + tty.msg("Trying to clone git repository: %s %s" % (self.url, args)) if self.commit: # Need to do a regular clone and check out everything if # they asked for a particular commit. - self.git('clone', self.url) + if spack.debug: + self.git('clone', self.url) + else: + self.git('clone', '--quiet', self.url) self.stage.chdir_to_source() - self.git('checkout', self.commit) + if spack.debug: + self.git('checkout', self.commit) + else: + self.git('checkout', '--quiet', self.commit) else: # Can be more efficient if not checking out a specific commit. args = ['clone'] + if not spack.debug: + args.append('--quiet') # If we want a particular branch ask for it. if self.branch: @@ -652,12 +660,19 @@ class GitFetchStrategy(VCSFetchStrategy): # pull --tags returns a "special" error code of 1 in # older versions that we have to ignore. # see: https://github.com/git/git/commit/19d122b - self.git('pull', '--tags', ignore_errors=1) - self.git('checkout', self.tag) + if spack.debug: + self.git('pull', '--tags', ignore_errors=1) + self.git('checkout', self.tag) + else: + self.git('pull', '--quiet', '--tags', ignore_errors=1) + self.git('checkout', '--quiet', self.tag) # Init submodules if the user asked for them. if self.submodules: - self.git('submodule', 'update', '--init') + if spack.debug: + self.git('submodule', 'update', '--init') + else: + self.git('submodule', '--quiet', 'update', '--init') def archive(self, destination): super(GitFetchStrategy, self).archive(destination, exclude='.git') @@ -665,8 +680,12 @@ class GitFetchStrategy(VCSFetchStrategy): @_needs_stage def reset(self): self.stage.chdir_to_source() - self.git('checkout', '.') - self.git('clean', '-f') + if spack.debug: + self.git('checkout', '.') + self.git('clean', '-f') + else: + self.git('checkout', '--quiet', '.') + self.git('clean', '--quiet', '-f') def __str__(self): return "[git] %s" % self.url -- cgit v1.2.3-70-g09d2 From e549daa8ce1d928032411817bfbafa527d9396c1 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 28 Mar 2017 08:43:15 -0700 Subject: Bugfix: allow deactivating installs that don't have packages anymore. (#3572) - deactivate -a wouldn't work if the installation's package was no longer available. - Fix installed_extensions_for so that it doesn't need to look at the package.py file. --- lib/spack/spack/database.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index d3fc03fb40..c81512d682 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -619,13 +619,12 @@ class Database(object): Return the specs of all packages that extend the given spec """ - for s in self.query(): + for spec in self.query(): try: - if s.package.extends(extendee_spec): - yield s.package - except spack.repository.UnknownPackageError: + spack.store.layout.check_activated(extendee_spec, spec) + yield spec.package + except spack.directory_layout.NoSuchExtensionError: continue - # skips unknown packages # TODO: conditional way to do this instead of catching exceptions def query(self, query_spec=any, known=any, installed=True, explicit=any): -- cgit v1.2.3-70-g09d2 From 782f29bc4b15829adeab2a0432ab2e50a1f1da32 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 28 Mar 2017 08:43:43 -0700 Subject: Fix bug in `spack find` for installations with unknown namespaces. (#3573) - Spack find would fail with "unknown namespace" for some queries when a package from an unknown namespace was installed. - Solve by being conservative: assume unknown packages are NOT providers of virtual dependencies. --- lib/spack/spack/spec.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 9fc2c99e4a..08b92cf705 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2166,7 +2166,13 @@ class Spec(object): # A concrete provider can satisfy a virtual dependency. if not self.virtual and other.virtual: - pkg = spack.repo.get(self.fullname) + try: + pkg = spack.repo.get(self.fullname) + except spack.repository.PackageLoadError: + # If we can't get package info on this spec, don't treat + # it as a provider of this vdep. + return False + if pkg.provides(other.name): for provided, when_specs in pkg.provided.items(): if any(self.satisfies(when_spec, deps=False, strict=strict) -- cgit v1.2.3-70-g09d2 From 9e43ff821c1549d5813eebd5a9ca81a7869786e7 Mon Sep 17 00:00:00 2001 From: Milton Woods Date: Fri, 31 Mar 2017 09:38:58 +1000 Subject: Extendable Perl (#3614) * perl: make extendable and add Module::Build package * perl: allow 'spack create' to identify perl packages from their contents * perl-module-build: fix indenting of package docstring * perl: split install() method for extensions into phases * perl: auto-detect build method (Makefile.PL vs Build.PL) and define a 'check' method * PerlPackage: use import statements similar to those in AutotoolsPackage * PerlModule: fix detection of Build.PL * PerlPackageTemplate: remove extraneous lines to avoid flake8 warnings * PerlPackageTemplate: split into separate templates for Makefile.PL and Build.PL * PerlPackage: add cross-references to docstrings * AutotoolsPackage: fix ambiguous cross-references to avoid errors in doc tests * PerlbuildPackageTemplate: depend on perl-module-build if Build.PL exists --- lib/spack/docs/packaging_guide.rst | 4 + lib/spack/spack/__init__.py | 4 +- lib/spack/spack/build_systems/autotools.py | 8 +- lib/spack/spack/build_systems/perl.py | 117 +++++++++++++++++++++ lib/spack/spack/cmd/build.py | 3 +- lib/spack/spack/cmd/configure.py | 3 +- lib/spack/spack/cmd/create.py | 45 +++++++- lib/spack/spack/test/build_system_guess.py | 2 + .../builtin/packages/perl-module-build/package.py | 41 ++++++++ var/spack/repos/builtin/packages/perl/package.py | 45 +++++++- 10 files changed, 264 insertions(+), 8 deletions(-) create mode 100644 lib/spack/spack/build_systems/perl.py create mode 100644 var/spack/repos/builtin/packages/perl-module-build/package.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 729ea5d656..1a64c7db4a 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2043,6 +2043,10 @@ The classes that are currently provided by Spack are: | :py:class:`.PythonPackage` | Specialized class for | | | :py:class:`.Python` extensions | +------------------------------------+----------------------------------+ + | :py:class:`.PerlPackage` | Specialized class for | + | | :py:class:`.Perl` extensions | + +------------------------------------+----------------------------------+ + diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 6a28fbb2b0..b0f2faed76 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -162,6 +162,7 @@ from spack.build_systems.autotools import AutotoolsPackage from spack.build_systems.cmake import CMakePackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage +from spack.build_systems.perl import PerlPackage __all__ += [ 'run_before', @@ -172,7 +173,8 @@ __all__ += [ 'AutotoolsPackage', 'MakefilePackage', 'PythonPackage', - 'RPackage' + 'RPackage', + 'PerlPackage' ] from spack.version import Version, ver diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index a11a84acd0..76dfd0d16f 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -49,7 +49,8 @@ class AutotoolsPackage(PackageBase): 4. :py:meth:`~.AutotoolsPackage.install` They all have sensible defaults and for many packages the only thing - necessary will be to override the helper method :py:meth:`.configure_args`. + necessary will be to override the helper method + :py:meth:`~.AutotoolsPackage.configure_args`. For a finer tuning you may also override: +-----------------------------------------------+--------------------+ @@ -234,7 +235,7 @@ class AutotoolsPackage(PackageBase): appropriately, otherwise raises an error. :raises RuntimeError: if a configure script is not found in - :py:meth:`~.configure_directory` + :py:meth:`~AutotoolsPackage.configure_directory` """ # Check if a configure script is there. If not raise a RuntimeError. if not os.path.exists(self.configure_abs_path): @@ -255,7 +256,8 @@ class AutotoolsPackage(PackageBase): return [] def configure(self, spec, prefix): - """Runs configure with the arguments specified in :py:meth:`.configure_args` + """Runs configure with the arguments specified in + :py:meth:`~.AutotoolsPackage.configure_args` and an appropriately set prefix. """ options = ['--prefix={0}'.format(prefix)] + self.configure_args() diff --git a/lib/spack/spack/build_systems/perl.py b/lib/spack/spack/build_systems/perl.py new file mode 100644 index 0000000000..78184c85dc --- /dev/null +++ b/lib/spack/spack/build_systems/perl.py @@ -0,0 +1,117 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import inspect +import os + +from llnl.util.filesystem import join_path +from spack.directives import extends +from spack.package import PackageBase, run_after +from spack.util.executable import Executable + + +class PerlPackage(PackageBase): + """Specialized class for packages that are built using Perl. + + This class provides four phases that can be overridden if required: + + 1. :py:meth:`~.PerlPackage.configure` + 2. :py:meth:`~.PerlPackage.build` + 3. :py:meth:`~.PerlPackage.check` + 4. :py:meth:`~.PerlPackage.install` + + The default methods use, in order of preference: + (1) Makefile.PL, + (2) Build.PL. + + Some packages may need to override + :py:meth:`~.PerlPackage.configure_args`, + which produces a list of arguments for + :py:meth:`~.PerlPackage.configure`. + Arguments should not include the installation base directory. + """ + #: Phases of a Perl package + phases = ['configure', 'build', 'install'] + + #: This attribute is used in UI queries that need to know the build + #: system base class + build_system_class = 'PerlPackage' + + #: Callback names for build-time test + build_time_test_callbacks = ['check'] + + extends('perl') + + def configure_args(self): + """Produces a list containing the arguments that must be passed to + :py:meth:`~.PerlPackage.configure`. Arguments should not include + the installation base directory, which is prepended automatically. + + :return: list of arguments for Makefile.PL or Build.PL + """ + return [] + + def configure(self, spec, prefix): + """Runs Makefile.PL or Build.PL with arguments consisting of + an appropriate installation base directory followed by the + list returned by :py:meth:`~.PerlPackage.configure_args`. + + :raise RuntimeError: if neither Makefile.PL or Build.PL exist + """ + if os.path.isfile('Makefile.PL'): + self.build_method = 'Makefile.PL' + self.build_executable = inspect.getmodule(self).make + elif os.path.isfile('Build.PL'): + self.build_method = 'Build.PL' + self.build_executable = Executable( + join_path(self.stage.source_path, 'Build')) + else: + raise RuntimeError('Unknown build_method for perl package') + + if self.build_method == 'Makefile.PL': + options = ['Makefile.PL', 'INSTALL_BASE={0}'.format(prefix)] + elif self.build_method == 'Build.PL': + options = ['Build.PL', '--install_base', prefix] + options += self.configure_args() + + inspect.getmodule(self).perl(*options) + + def build(self, spec, prefix): + """Builds a Perl package.""" + self.build_executable() + + # Ensure that tests run after build (if requested): + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + def check(self): + """Runs built-in tests of a Perl package.""" + self.build_executable('test') + + def install(self, spec, prefix): + """Installs a Perl package.""" + self.build_executable('install') + + # Check that self.prefix is there after installation + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 6a90af907d..90157a85af 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -31,7 +31,8 @@ description = 'stops at build stage when installing a package, if possible' build_system_to_phase = { CMakePackage: 'build', AutotoolsPackage: 'build', - PythonPackage: 'build' + PythonPackage: 'build', + PerlPackage: 'build' } diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 7b1ef04522..b6669f33a2 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -36,7 +36,8 @@ description = 'stops at configuration stage when installing a package, if possib build_system_to_phase = { CMakePackage: 'cmake', - AutotoolsPackage: 'configure' + AutotoolsPackage: 'configure', + PerlPackage: 'configure' } diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 14b213a756..cc90669158 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -268,6 +268,45 @@ class RPackageTemplate(PackageTemplate): super(RPackageTemplate, self).__init__(name, *args) +class PerlmakePackageTemplate(PackageTemplate): + """Provides appropriate overrides for Perl extensions + that come with a Makefile.PL""" + base_class_name = 'PerlPackage' + + dependencies = """\ + # FIXME: Add dependencies if required: + # depends_on('perl-foo') + # depends_on('barbaz', type=('build', 'link', 'run'))""" + + body = """\ + # FIXME: If non-standard arguments are used for configure step: + # def configure_args(self): + # return ['my', 'configure', 'args'] + + # FIXME: in unusual cases, it may be necessary to override methods for + # configure(), build(), check() or install().""" + + def __init__(self, name, *args): + # If the user provided `--name perl-cpp`, don't rename it perl-perl-cpp + if not name.startswith('perl-'): + # Make it more obvious that we are renaming the package + tty.msg("Changing package name from {0} to perl-{0}".format(name)) + name = 'perl-{0}'.format(name) + + super(PerlmakePackageTemplate, self).__init__(name, *args) + + +class PerlbuildPackageTemplate(PerlmakePackageTemplate): + """Provides appropriate overrides for Perl extensions + that come with a Build.PL instead of a Makefile.PL""" + dependencies = """\ + depends_on('perl-module-build', type='build') + + # FIXME: Add additional dependencies if required: + # depends_on('perl-foo') + # depends_on('barbaz', type=('build', 'link', 'run'))""" + + class OctavePackageTemplate(PackageTemplate): """Provides appropriate overrides for octave packages""" @@ -305,6 +344,8 @@ templates = { 'bazel': BazelPackageTemplate, 'python': PythonPackageTemplate, 'r': RPackageTemplate, + 'perlmake': PerlmakePackageTemplate, + 'perlbuild': PerlbuildPackageTemplate, 'octave': OctavePackageTemplate, 'generic': PackageTemplate } @@ -363,7 +404,9 @@ class BuildSystemGuesser: (r'/SConstruct$', 'scons'), (r'/setup.py$', 'python'), (r'/NAMESPACE$', 'r'), - (r'/WORKSPACE$', 'bazel') + (r'/WORKSPACE$', 'bazel'), + (r'/Build.PL$', 'perlbuild'), + (r'/Makefile.PL$', 'perlmake'), ] # Peek inside the compressed file. diff --git a/lib/spack/spack/test/build_system_guess.py b/lib/spack/spack/test/build_system_guess.py index 82bf1964b2..e6fb84b37d 100644 --- a/lib/spack/spack/test/build_system_guess.py +++ b/lib/spack/spack/test/build_system_guess.py @@ -38,6 +38,8 @@ import spack.stage ('setup.py', 'python'), ('NAMESPACE', 'r'), ('WORKSPACE', 'bazel'), + ('Makefile.PL', 'perlmake'), + ('Build.PL', 'perlbuild'), ('foobar', 'generic') ] ) diff --git a/var/spack/repos/builtin/packages/perl-module-build/package.py b/var/spack/repos/builtin/packages/perl-module-build/package.py new file mode 100644 index 0000000000..cccc5d7b5a --- /dev/null +++ b/var/spack/repos/builtin/packages/perl-module-build/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 PerlModuleBuild(PerlPackage): + """Module::Build is a system for building, testing, and installing Perl + modules. It is meant to be an alternative to ExtUtils::MakeMaker. + Developers may alter the behavior of the module through subclassing in a + much more straightforward way than with MakeMaker. It also does not + require a make on your system - most of the Module::Build code is + pure-perl and written in a very cross-platform way. + """ + + homepage = "http://search.cpan.org/perldoc/Module::Build" + url = "http://search.cpan.org/CPAN/authors/id/L/LE/LEONT/Module-Build-0.4220.tar.gz" + + version('0.4220', '9df204e188462a4410d496f316c2c531') diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py index 4bacad427b..b8874c124e 100644 --- a/var/spack/repos/builtin/packages/perl/package.py +++ b/var/spack/repos/builtin/packages/perl/package.py @@ -23,6 +23,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## # +# Author: Milton Woods +# Date: March 22, 2017 # Author: George Hartzell # Date: July 21, 2016 # Author: Justin Too @@ -36,7 +38,7 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package 27 years of development.""" homepage = "http://www.perl.org" # URL must remain http:// so Spack can bootstrap curl - url = "http://www.cpan.org/src/5.0/perl-5.24.1.tar.gz" + url = "http://www.cpan.org/src/5.0/perl-5.24.1.tar.gz" version('5.24.1', '765ef511b5b87a164e2531403ee16b3c') version('5.24.0', 'c5bf7f3285439a2d3b6a488e14503701') @@ -46,6 +48,8 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package # https://rt.perl.org/Public/Bug/Display.html?id=123784 # version('5.18.4' , '1f9334ff730adc05acd3dd7130d295db') + extendable = True + # Installing cpanm alongside the core makes it safe and simple for # people/projects to install their own sets of perl modules. Not # having it in core increases the "energy of activation" for doing @@ -80,3 +84,42 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package perl('Makefile.PL') make() make('install') + + def setup_environment(self, spack_env, run_env): + """Set PERL5LIB to support activation of Perl packages""" + run_env.set('PERL5LIB', join_path(self.prefix, 'lib', 'perl5')) + + def setup_dependent_environment(self, spack_env, run_env, extension_spec): + """Set PATH and PERL5LIB to include the extension and + any other perl extensions it depends on, + assuming they were installed with INSTALL_BASE defined.""" + perl_lib_dirs = [] + perl_bin_dirs = [] + for d in extension_spec.traverse( + deptype=('build', 'run'), deptype_query='run'): + if d.package.extends(self.spec): + perl_lib_dirs.append(join_path(d.prefix, 'lib', 'perl5')) + perl_bin_dirs.append(join_path(d.prefix, 'bin')) + perl_bin_path = ':'.join(perl_bin_dirs) + perl_lib_path = ':'.join(perl_lib_dirs) + spack_env.prepend_path('PATH', perl_bin_path) + spack_env.prepend_path('PERL5LIB', perl_lib_path) + run_env.prepend_path('PATH', perl_bin_path) + run_env.prepend_path('PERL5LIB', perl_lib_path) + + def setup_dependent_package(self, module, ext_spec): + """Called before perl modules' install() methods. + In most cases, extensions will only need to have one line: + perl('Makefile.PL','INSTALL_BASE=%s' % self.prefix) + """ + + # perl extension builds can have a global perl executable function + module.perl = Executable(join_path(self.spec.prefix.bin, 'perl')) + + # Add variables for library directory + module.perl_lib_dir = join_path(ext_spec.prefix, 'lib', 'perl5') + + # Make the site packages directory for extensions, + # if it does not exist already. + if ext_spec.package.is_extension: + mkdirp(module.perl_lib_dir) -- cgit v1.2.3-70-g09d2 From 0d421137f4db203250428c36518a69dec312a2ea Mon Sep 17 00:00:00 2001 From: Michael Kuhn Date: Fri, 31 Mar 2017 20:41:08 +0200 Subject: Fix mxml (#3639) mxml is now hosted on GitHub. --- lib/spack/spack/url.py | 1 + var/spack/repos/builtin/packages/mxml/package.py | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 65f8e12e58..89f4a16dfc 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -370,6 +370,7 @@ def parse_name_offset(path, v=None): (r'/([^/]+)/(tarball|zipball)/', path), (r'/([^/]+)[_.-](bin|dist|stable|src|sources)[_.-]%s' % v, path), (r'github.com/[^/]+/([^/]+)/archive', path), + (r'github.com/[^/]+/([^/]+)/releases', path), (r'[^/]+/([^/]+)/repository/archive', path), # gitlab (r'([^/]+)/download.php', path), diff --git a/var/spack/repos/builtin/packages/mxml/package.py b/var/spack/repos/builtin/packages/mxml/package.py index fcb7959678..cd53c67dff 100644 --- a/var/spack/repos/builtin/packages/mxml/package.py +++ b/var/spack/repos/builtin/packages/mxml/package.py @@ -31,8 +31,8 @@ class Mxml(AutotoolsPackage): non-standard libraries. """ - homepage = "http://www.msweet.org" - url = "http://www.msweet.org/files/project3/mxml-2.9.tar.gz" + homepage = "http://michaelrsweet.github.io/mxml/" + url = "https://github.com/michaelrsweet/mxml/releases/download/release-2.10/mxml-2.10.tar.gz" version('2.10', '8804c961a24500a95690ef287d150abe') version('2.9', 'e21cad0f7aacd18f942aa0568a8dee19') @@ -41,6 +41,9 @@ class Mxml(AutotoolsPackage): version('2.6', '68977789ae64985dddbd1a1a1652642e') version('2.5', 'f706377fba630b39fa02fd63642b17e5') + def url_for_version(self, version): + return "https://github.com/michaelrsweet/mxml/releases/download/release-{0}/mxml-{0}.tar.gz".format(version) + # module swap PrgEnv-intel PrgEnv-$COMP # (Can use whatever compiler you want to use) # Case statement to change CC and CXX flags -- cgit v1.2.3-70-g09d2 From bc404532ea875ecc6982d049dc7c7f041aa74443 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 31 Mar 2017 15:39:07 -0500 Subject: PythonPackage: Let There Be Tests! (#2869) * Run python setup.py test if --run-tests * Attempt to import the Python module after installation * Add testing support to numpy and scipy * Remove duplicated comments * Update to new run-tests callback methodology * Remove unrelated changes for another PR --- lib/spack/spack/build_systems/python.py | 80 ++++++++++++++++++++-- lib/spack/spack/util/executable.py | 2 +- .../repos/builtin/packages/py-nose/package.py | 4 ++ .../repos/builtin/packages/py-numpy/package.py | 35 ++++++++++ .../repos/builtin/packages/py-scipy/package.py | 39 +++++++++++ .../builtin/packages/py-setuptools/package.py | 14 ++++ 6 files changed, 167 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index d2ee72925d..2c8ccebae6 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -24,6 +24,7 @@ ############################################################################## import inspect +import os from spack.directives import extends from spack.package import PackageBase, run_after @@ -91,10 +92,26 @@ class PythonPackage(PackageBase): # Default phases phases = ['build', 'install'] + # Name of modules that the Python package provides + # This is used to test whether or not the installation succeeded + # These names generally come from running: + # + # >>> import setuptools + # >>> setuptools.find_packages() + # + # in the source tarball directory + import_modules = [] + # To be used in UI queries that require to know which # build-system class we are using build_system_class = 'PythonPackage' + #: Callback names for build-time test + build_time_test_callbacks = ['test'] + + #: Callback names for install-time test + install_time_test_callbacks = ['import_module_test'] + extends('python') def setup_file(self): @@ -106,19 +123,38 @@ class PythonPackage(PackageBase): """The directory containing the ``setup.py`` file.""" return self.stage.source_path - def python(self, *args): - inspect.getmodule(self).python(*args) + def python(self, *args, **kwargs): + inspect.getmodule(self).python(*args, **kwargs) - def setup_py(self, *args): + def setup_py(self, *args, **kwargs): setup = self.setup_file() with working_dir(self.build_directory): - self.python(setup, '--no-user-cfg', *args) + self.python(setup, '--no-user-cfg', *args, **kwargs) + + def _setup_command_available(self, command): + """Determines whether or not a setup.py command exists. + + :param str command: The command to look for + :return: True if the command is found, else False + :rtype: bool + """ + kwargs = { + 'output': os.devnull, + 'error': os.devnull, + 'fail_on_error': False + } + + python = inspect.getmodule(self).python + setup = self.setup_file() + + python(setup, '--no-user-cfg', command, '--help', **kwargs) + return python.returncode == 0 # The following phases and their descriptions come from: # $ python setup.py --help-commands - # Only standard commands are included here, but some packages - # define extra commands as well + + # Standard commands def build(self, spec, prefix): """Build everything needed to install.""" @@ -306,5 +342,37 @@ class PythonPackage(PackageBase): """Arguments to pass to check.""" return [] + # Testing + + def test(self): + """Run unit tests after in-place build. + + These tests are only run if the package actually has a 'test' command. + """ + if self._setup_command_available('test'): + args = self.test_args(self.spec, self.prefix) + + self.setup_py('test', *args) + + def test_args(self, spec, prefix): + """Arguments to pass to test.""" + return [] + + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + def import_module_test(self): + """Attempts to import the module that was just installed. + + This test is only run if the package overrides + :py:attr:`import_modules` with a list of module names.""" + + # Make sure we are importing the installed modules, + # not the ones in the current directory + with working_dir('..'): + for module in self.import_modules: + self.python('-c', 'import {0}'.format(module)) + + run_after('install')(PackageBase._run_default_install_time_test_callbacks) + # Check that self.prefix is there after installation run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 63bbbb7c92..7a960e88cb 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -68,7 +68,7 @@ class Executable(object): Raise an exception if the subprocess returns an error. Default is True. When not set, the return code is - avaiale as `exe.returncode`. + available as `exe.returncode`. ignore_errors diff --git a/var/spack/repos/builtin/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py index c78c52647a..2b27ed4f1d 100644 --- a/var/spack/repos/builtin/packages/py-nose/package.py +++ b/var/spack/repos/builtin/packages/py-nose/package.py @@ -34,6 +34,10 @@ class PyNose(PythonPackage): list_url = "https://pypi.python.org/pypi/nose/" list_depth = 2 + import_modules = [ + 'nose', 'nose.ext', 'nose.plugins', 'nose.sphinx', 'nose.tools' + ] + version('1.3.7', '4d3ad0ff07b61373d2cefc89c5d0b20b') version('1.3.6', '0ca546d81ca8309080fc80cb389e7a16') version('1.3.4', '6ed7169887580ddc9a8e16048d38274d') diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index 3ed0d0bdb5..3b590fbd24 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -36,6 +36,18 @@ class PyNumpy(PythonPackage): homepage = "http://www.numpy.org/" url = "https://pypi.io/packages/source/n/numpy/numpy-1.9.1.tar.gz" + install_time_test_callbacks = ['install_test', 'import_module_test'] + + import_modules = [ + 'numpy', 'numpy.compat', 'numpy.core', 'numpy.distutils', 'numpy.doc', + 'numpy.f2py', 'numpy.fft', 'numpy.lib', 'numpy.linalg', 'numpy.ma', + 'numpy.matrixlib', 'numpy.polynomial', 'numpy.random', 'numpy.testing', + 'numpy.distutils.command', 'numpy.distutils.fcompiler' + ] + + # FIXME: numpy._build_utils and numpy.core.code_generators failed to import + # FIXME: Is this expected? + version('1.12.0', '33e5a84579f31829bbbba084fe0a4300', url="https://pypi.io/packages/source/n/numpy/numpy-1.12.0.zip") version('1.11.2', '03bd7927c314c43780271bf1ab795ebc') @@ -53,6 +65,10 @@ class PyNumpy(PythonPackage): depends_on('blas', when='+blas') depends_on('lapack', when='+lapack') + # Tests require: + # TODO: Add a 'test' deptype + # depends_on('py-nose@1.0.0:', type='test') + def setup_dependent_package(self, module, dependent_spec): python_version = self.spec['python'].version.up_to(2) arch = '{0}-{1}'.format(platform.system().lower(), platform.machine()) @@ -132,3 +148,22 @@ class PyNumpy(PythonPackage): args = ['-j', str(make_jobs)] return args + + def test(self): + # `setup.py test` is not supported. Use one of the following + # instead: + # + # - `python runtests.py` (to build and test) + # - `python runtests.py --no-build` (to test installed numpy) + # - `>>> numpy.test()` (run tests for installed numpy + # from within an interpreter) + pass + + def install_test(self): + # Change directories due to the following error: + # + # ImportError: Error importing numpy: you should not try to import + # numpy from its source directory; please exit the numpy + # source tree, and relaunch your python interpreter from there. + with working_dir('..'): + python('-c', 'import numpy; numpy.test("full", verbose=2)') diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py index c506d4747d..c3ca24291f 100644 --- a/var/spack/repos/builtin/packages/py-scipy/package.py +++ b/var/spack/repos/builtin/packages/py-scipy/package.py @@ -33,6 +33,22 @@ class PyScipy(PythonPackage): homepage = "http://www.scipy.org/" url = "https://pypi.io/packages/source/s/scipy/scipy-0.18.1.tar.gz" + install_time_test_callbacks = ['install_test', 'import_module_test'] + + import_modules = [ + 'scipy', 'scipy._build_utils', 'scipy._lib', 'scipy.cluster', + 'scipy.constants', 'scipy.fftpack', 'scipy.integrate', + 'scipy.interpolate', 'scipy.io', 'scipy.linalg', 'scipy.misc', + 'scipy.ndimage', 'scipy.odr', 'scipy.optimize', 'scipy.signal', + 'scipy.sparse', 'scipy.spatial', 'scipy.special', 'scipy.stats', + 'scipy.weave', 'scipy.io.arff', 'scipy.io.harwell_boeing', + 'scipy.io.matlab', 'scipy.optimize._lsq', 'scipy.sparse.csgraph', + 'scipy.sparse.linalg', 'scipy.sparse.linalg.dsolve', + 'scipy.sparse.linalg.eigen', 'scipy.sparse.linalg.isolve', + 'scipy.sparse.linalg.eigen.arpack', 'scipy.sparse.linalg.eigen.lobpcg', + 'scipy.special._precompute' + ] + version('0.19.0', '91b8396231eec780222a57703d3ec550', url="https://pypi.io/packages/source/s/scipy/scipy-0.19.0.zip") version('0.18.1', '5fb5fb7ccb113ab3a039702b6c2f3327') @@ -49,6 +65,10 @@ class PyScipy(PythonPackage): depends_on('blas') depends_on('lapack') + # Tests require: + # TODO: Add a 'test' deptype + # depends_on('py-nose', type='test') + def build_args(self, spec, prefix): args = [] @@ -59,3 +79,22 @@ class PyScipy(PythonPackage): args.extend(['-j', str(make_jobs)]) return args + + def test(self): + # `setup.py test` is not supported. Use one of the following + # instead: + # + # - `python runtests.py` (to build and test) + # - `python runtests.py --no-build` (to test installed scipy) + # - `>>> scipy.test()` (run tests for installed scipy + # from within an interpreter) + pass + + def install_test(self): + # Change directories due to the following error: + # + # ImportError: Error importing scipy: you should not try to import + # scipy from its source directory; please exit the scipy + # source tree, and relaunch your python interpreter from there. + with working_dir('..'): + python('-c', 'import scipy; scipy.test("full", verbose=2)') diff --git a/var/spack/repos/builtin/packages/py-setuptools/package.py b/var/spack/repos/builtin/packages/py-setuptools/package.py index af1ea9bf06..94ee8a7fc4 100644 --- a/var/spack/repos/builtin/packages/py-setuptools/package.py +++ b/var/spack/repos/builtin/packages/py-setuptools/package.py @@ -32,6 +32,12 @@ class PySetuptools(PythonPackage): homepage = "https://pypi.python.org/pypi/setuptools" url = "https://pypi.io/packages/source/s/setuptools/setuptools-25.2.0.tar.gz" + import_modules = [ + 'pkg_resources', 'setuptools', 'pkg_resources.extern', + 'pkg_resources._vendor', 'pkg_resources._vendor.packaging', + 'setuptools.extern', 'setuptools.command' + ] + version('34.2.0', '41b630da4ea6cfa5894d9eb3142922be', url="https://pypi.io/packages/source/s/setuptools/setuptools-34.2.0.zip") version('25.2.0', 'a0dbb65889c46214c691f6c516cf959c') @@ -53,3 +59,11 @@ class PySetuptools(PythonPackage): depends_on('py-packaging@16.8:', when='@34.0.0:', type=('build', 'run')) depends_on('py-six@1.6.0:', when='@34.0.0:', type=('build', 'run')) depends_on('py-appdirs@1.4.0:', when='@34.0.0:', type=('build', 'run')) + + # Tests require: + # TODO: Add a 'test' deptype + # FIXME: All of these depend on setuptools, creating a dependency loop + # FIXME: Is there any way around this problem? + # depends_on('py-pytest-flake8', type='test') + # depends_on('pytest@2.8:', type='test') + # depends_on('py-mock', when='^python@:3.2', type='test') -- cgit v1.2.3-70-g09d2 From 0331b08c64abbc3d7c185d9650007be1de238cfc Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 7 Mar 2017 09:32:43 -0800 Subject: Update externals to work with Python 3 - Update YAML version to support Python 3 - Python 3 support for ordereddict backport - Exclude Python3 YAML from version tests. - Vendor six into Spack. - Make Python version-check tests work with Python 3 - Add ability to add version check exceptions with '# nopyqver' line comments. --- .travis.yml | 1 - bin/spack | 7 + lib/spack/docs/conf.py | 8 +- lib/spack/external/_pytest/pytester.py | 2 +- lib/spack/external/ordereddict_backport.py | 8 +- lib/spack/external/pyqver2.py | 70 +- lib/spack/external/pyqver3.py | 248 ++++ lib/spack/external/six.py | 886 +++++++++++++ lib/spack/external/yaml/README | 2 +- lib/spack/external/yaml/__init__.py | 315 ----- lib/spack/external/yaml/composer.py | 139 --- lib/spack/external/yaml/constructor.py | 678 ---------- lib/spack/external/yaml/dumper.py | 62 - lib/spack/external/yaml/emitter.py | 1140 ----------------- lib/spack/external/yaml/error.py | 75 -- lib/spack/external/yaml/events.py | 86 -- lib/spack/external/yaml/lib/yaml/__init__.py | 315 +++++ lib/spack/external/yaml/lib/yaml/composer.py | 139 +++ lib/spack/external/yaml/lib/yaml/constructor.py | 675 ++++++++++ lib/spack/external/yaml/lib/yaml/cyaml.py | 85 ++ lib/spack/external/yaml/lib/yaml/dumper.py | 62 + lib/spack/external/yaml/lib/yaml/emitter.py | 1140 +++++++++++++++++ lib/spack/external/yaml/lib/yaml/error.py | 75 ++ lib/spack/external/yaml/lib/yaml/events.py | 86 ++ lib/spack/external/yaml/lib/yaml/loader.py | 40 + lib/spack/external/yaml/lib/yaml/nodes.py | 49 + lib/spack/external/yaml/lib/yaml/parser.py | 589 +++++++++ lib/spack/external/yaml/lib/yaml/reader.py | 190 +++ lib/spack/external/yaml/lib/yaml/representer.py | 486 ++++++++ lib/spack/external/yaml/lib/yaml/resolver.py | 227 ++++ lib/spack/external/yaml/lib/yaml/scanner.py | 1453 +++++++++++++++++++++ lib/spack/external/yaml/lib/yaml/serializer.py | 111 ++ lib/spack/external/yaml/lib/yaml/tokens.py | 104 ++ lib/spack/external/yaml/lib3/yaml/__init__.py | 312 +++++ lib/spack/external/yaml/lib3/yaml/composer.py | 139 +++ lib/spack/external/yaml/lib3/yaml/constructor.py | 686 ++++++++++ lib/spack/external/yaml/lib3/yaml/cyaml.py | 85 ++ lib/spack/external/yaml/lib3/yaml/dumper.py | 62 + lib/spack/external/yaml/lib3/yaml/emitter.py | 1137 +++++++++++++++++ lib/spack/external/yaml/lib3/yaml/error.py | 75 ++ lib/spack/external/yaml/lib3/yaml/events.py | 86 ++ lib/spack/external/yaml/lib3/yaml/loader.py | 40 + lib/spack/external/yaml/lib3/yaml/nodes.py | 49 + lib/spack/external/yaml/lib3/yaml/parser.py | 589 +++++++++ lib/spack/external/yaml/lib3/yaml/reader.py | 192 +++ lib/spack/external/yaml/lib3/yaml/representer.py | 387 ++++++ lib/spack/external/yaml/lib3/yaml/resolver.py | 227 ++++ lib/spack/external/yaml/lib3/yaml/scanner.py | 1444 +++++++++++++++++++++ lib/spack/external/yaml/lib3/yaml/serializer.py | 111 ++ lib/spack/external/yaml/lib3/yaml/tokens.py | 104 ++ lib/spack/external/yaml/loader.py | 40 - lib/spack/external/yaml/nodes.py | 49 - lib/spack/external/yaml/parser.py | 589 --------- lib/spack/external/yaml/reader.py | 189 --- lib/spack/external/yaml/representer.py | 484 ------- lib/spack/external/yaml/resolver.py | 224 ---- lib/spack/external/yaml/scanner.py | 1457 ---------------------- lib/spack/external/yaml/serializer.py | 111 -- lib/spack/external/yaml/tokens.py | 104 -- lib/spack/spack/test/python_version.py | 128 +- 60 files changed, 12795 insertions(+), 5858 deletions(-) create mode 100755 lib/spack/external/pyqver3.py create mode 100644 lib/spack/external/six.py delete mode 100644 lib/spack/external/yaml/__init__.py delete mode 100644 lib/spack/external/yaml/composer.py delete mode 100644 lib/spack/external/yaml/constructor.py delete mode 100644 lib/spack/external/yaml/dumper.py delete mode 100644 lib/spack/external/yaml/emitter.py delete mode 100644 lib/spack/external/yaml/error.py delete mode 100644 lib/spack/external/yaml/events.py create mode 100644 lib/spack/external/yaml/lib/yaml/__init__.py create mode 100644 lib/spack/external/yaml/lib/yaml/composer.py create mode 100644 lib/spack/external/yaml/lib/yaml/constructor.py create mode 100644 lib/spack/external/yaml/lib/yaml/cyaml.py create mode 100644 lib/spack/external/yaml/lib/yaml/dumper.py create mode 100644 lib/spack/external/yaml/lib/yaml/emitter.py create mode 100644 lib/spack/external/yaml/lib/yaml/error.py create mode 100644 lib/spack/external/yaml/lib/yaml/events.py create mode 100644 lib/spack/external/yaml/lib/yaml/loader.py create mode 100644 lib/spack/external/yaml/lib/yaml/nodes.py create mode 100644 lib/spack/external/yaml/lib/yaml/parser.py create mode 100644 lib/spack/external/yaml/lib/yaml/reader.py create mode 100644 lib/spack/external/yaml/lib/yaml/representer.py create mode 100644 lib/spack/external/yaml/lib/yaml/resolver.py create mode 100644 lib/spack/external/yaml/lib/yaml/scanner.py create mode 100644 lib/spack/external/yaml/lib/yaml/serializer.py create mode 100644 lib/spack/external/yaml/lib/yaml/tokens.py create mode 100644 lib/spack/external/yaml/lib3/yaml/__init__.py create mode 100644 lib/spack/external/yaml/lib3/yaml/composer.py create mode 100644 lib/spack/external/yaml/lib3/yaml/constructor.py create mode 100644 lib/spack/external/yaml/lib3/yaml/cyaml.py create mode 100644 lib/spack/external/yaml/lib3/yaml/dumper.py create mode 100644 lib/spack/external/yaml/lib3/yaml/emitter.py create mode 100644 lib/spack/external/yaml/lib3/yaml/error.py create mode 100644 lib/spack/external/yaml/lib3/yaml/events.py create mode 100644 lib/spack/external/yaml/lib3/yaml/loader.py create mode 100644 lib/spack/external/yaml/lib3/yaml/nodes.py create mode 100644 lib/spack/external/yaml/lib3/yaml/parser.py create mode 100644 lib/spack/external/yaml/lib3/yaml/reader.py create mode 100644 lib/spack/external/yaml/lib3/yaml/representer.py create mode 100644 lib/spack/external/yaml/lib3/yaml/resolver.py create mode 100644 lib/spack/external/yaml/lib3/yaml/scanner.py create mode 100644 lib/spack/external/yaml/lib3/yaml/serializer.py create mode 100644 lib/spack/external/yaml/lib3/yaml/tokens.py delete mode 100644 lib/spack/external/yaml/loader.py delete mode 100644 lib/spack/external/yaml/nodes.py delete mode 100644 lib/spack/external/yaml/parser.py delete mode 100644 lib/spack/external/yaml/reader.py delete mode 100644 lib/spack/external/yaml/representer.py delete mode 100644 lib/spack/external/yaml/resolver.py delete mode 100644 lib/spack/external/yaml/scanner.py delete mode 100644 lib/spack/external/yaml/serializer.py delete mode 100644 lib/spack/external/yaml/tokens.py (limited to 'lib') diff --git a/.travis.yml b/.travis.yml index 11e7e5fac3..4cd3b14b9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,7 +46,6 @@ addons: packages: - gfortran - graphviz - - libyaml-dev # Work around Travis's lack of support for Python on OSX before_install: diff --git a/bin/spack b/bin/spack index f885f577c8..550b999eb9 100755 --- a/bin/spack +++ b/bin/spack @@ -46,6 +46,13 @@ sys.path.insert(0, SPACK_LIB_PATH) SPACK_EXTERNAL_LIBS = os.path.join(SPACK_LIB_PATH, "external") sys.path.insert(0, SPACK_EXTERNAL_LIBS) +# Handle vendoring of YAML specially, as it has two versions. +if sys.version_info[0] == 2: + SPACK_YAML_LIBS = os.path.join(SPACK_EXTERNAL_LIBS, "yaml/lib") +else: + SPACK_YAML_LIBS = os.path.join(SPACK_EXTERNAL_LIBS, "yaml/lib3") +sys.path.insert(0, SPACK_YAML_LIBS) + # Quick and dirty check to clean orphaned .pyc files left over from # previous revisions. These files were present in earlier versions of # Spack, were removed, but shadow system modules that Spack still diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index db8d3d29dc..69ec2a0b33 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -51,6 +51,10 @@ from sphinx.apidoc import main as sphinx_apidoc # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('exts')) sys.path.insert(0, os.path.abspath('../external')) +if sys.version_info[0] < 3: + sys.path.insert(0, os.path.abspath('../external/yaml/lib')) +else: + sys.path.insert(0, os.path.abspath('../external/yaml/lib3')) sys.path.append(os.path.abspath('..')) # Add the Spack bin directory to the path so that we can use its output in docs. @@ -110,13 +114,13 @@ handling_spack = False for line in fileinput.input('spack.rst', inplace=1): if handling_spack: if not line.startswith(' :noindex:'): - print ' :noindex: %s' % ' '.join(spack.__all__) + print(' :noindex: %s' % ' '.join(spack.__all__)) handling_spack = False if line.startswith('.. automodule::'): handling_spack = (line == '.. automodule:: spack\n') - print line, + sys.stdout.write(line) # Enable todo items todo_include_todos = True diff --git a/lib/spack/external/_pytest/pytester.py b/lib/spack/external/_pytest/pytester.py index 17ff529a6c..d87c0a762a 100644 --- a/lib/spack/external/_pytest/pytester.py +++ b/lib/spack/external/_pytest/pytester.py @@ -551,7 +551,7 @@ class Testdir: def _possibly_invalidate_import_caches(self): # invalidate caches if we can (py33 and above) try: - import importlib + import importlib # nopyqver except ImportError: pass else: diff --git a/lib/spack/external/ordereddict_backport.py b/lib/spack/external/ordereddict_backport.py index 8ddad1477e..154e5d1872 100644 --- a/lib/spack/external/ordereddict_backport.py +++ b/lib/spack/external/ordereddict_backport.py @@ -8,7 +8,13 @@ try: from thread import get_ident as _get_ident except ImportError: - from dummy_thread import get_ident as _get_ident + try: + from dummy_thread import get_ident as _get_ident + except ImportError: + try: + from _dummy_thread import get_ident as _get_ident + except ImportError: + from threading import get_ident as _get_ident # nopyqver try: from _abcoll import KeysView, ValuesView, ItemsView diff --git a/lib/spack/external/pyqver2.py b/lib/spack/external/pyqver2.py index 571e005524..07b191425b 100755 --- a/lib/spack/external/pyqver2.py +++ b/lib/spack/external/pyqver2.py @@ -57,11 +57,7 @@ StandardModules = { "hmac": (2, 2), "hotshot": (2, 2), "HTMLParser": (2, 2), -# skip importlib until we can conditionally skip for pytest. -# pytest tries to import this and catches the exception, but -# the test will still fail. -# TODO: can we excelude with a comment like '# flake: noqa?' -# "importlib": (2, 7), + "importlib": (2, 7), "inspect": (2, 1), "io": (2, 6), "itertools": (2, 3), @@ -262,7 +258,7 @@ class NodeChecker(object): self.add(node, (2,2), "yield expression") self.default(node) -def get_versions(source): +def get_versions(source, filename=None): """Return information about the Python versions required for specific features. The return value is a dictionary with keys as a version number as a tuple @@ -346,65 +342,3 @@ def qver(source): #(2, 6) """ return max(get_versions(source).keys()) - - -if __name__ == '__main__': - - Verbose = False - MinVersion = (2, 3) - Lint = False - - files = [] - i = 1 - while i < len(sys.argv): - a = sys.argv[i] - if a == "--test": - import doctest - doctest.testmod() - sys.exit(0) - if a == "-v" or a == "--verbose": - Verbose = True - elif a == "-l" or a == "--lint": - Lint = True - elif a == "-m" or a == "--min-version": - i += 1 - MinVersion = tuple(map(int, sys.argv[i].split("."))) - else: - files.append(a) - i += 1 - - if not files: - print >>sys.stderr, """Usage: %s [options] source ... - - Report minimum Python version required to run given source files. - - -m x.y or --min-version x.y (default 2.3) - report version triggers at or above version x.y in verbose mode - -v or --verbose - print more detailed report of version triggers for each version - """ % sys.argv[0] - sys.exit(1) - - for fn in files: - try: - f = open(fn) - source = f.read() - f.close() - ver = get_versions(source) - if Verbose: - print fn - for v in sorted([k for k in ver.keys() if k >= MinVersion], reverse=True): - reasons = [x for x in uniq(ver[v]) if x] - if reasons: - # each reason is (lineno, message) - print "\t%s\t%s" % (".".join(map(str, v)), ", ".join([x[1] for x in reasons])) - elif Lint: - for v in sorted([k for k in ver.keys() if k >= MinVersion], reverse=True): - reasons = [x for x in uniq(ver[v]) if x] - for r in reasons: - # each reason is (lineno, message) - print "%s:%s: %s %s" % (fn, r[0], ".".join(map(str, v)), r[1]) - else: - print "%s\t%s" % (".".join(map(str, max(ver.keys()))), fn) - except SyntaxError, x: - print "%s: syntax error compiling with Python %s: %s" % (fn, platform.python_version(), x) diff --git a/lib/spack/external/pyqver3.py b/lib/spack/external/pyqver3.py new file mode 100755 index 0000000000..b63576a064 --- /dev/null +++ b/lib/spack/external/pyqver3.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python3 +# +# pyqver3.py +# by Greg Hewgill +# https://github.com/ghewgill/pyqver +# +# This software is provided 'as-is', without any express or implied +# warranty. In no event will the author be held liable for any damages +# arising from the use of this software. +# +# Permission is granted to anyone to use this software for any purpose, +# including commercial applications, and to alter it and redistribute it +# freely, subject to the following restrictions: +# +# 1. The origin of this software must not be misrepresented; you must not +# claim that you wrote the original software. If you use this software +# in a product, an acknowledgment in the product documentation would be +# appreciated but is not required. +# 2. Altered source versions must be plainly marked as such, and must not be +# misrepresented as being the original software. +# 3. This notice may not be removed or altered from any source distribution. +# +# Copyright (c) 2009-2013 Greg Hewgill http://hewgill.com +# +import ast +import platform +import sys + +StandardModules = { +# skip argparse now that it's in lib/spack/external +# "argparse": (3, 2), + "faulthandler": (3, 3), + "importlib": (3, 1), + "ipaddress": (3, 3), + "lzma": (3, 3), + "tkinter.ttk": (3, 1), + "unittest.mock": (3, 3), + "venv": (3, 3), +} + +Functions = { + "bytearray.maketrans": (3, 1), + "bytes.maketrans": (3, 1), + "bz2.open": (3, 3), + "collections.Counter": (3, 1), + "collections.OrderedDict": (3, 1), + "crypt.mksalt": (3, 3), + "email.generator.BytesGenerator": (3, 2), + "email.message_from_binary_file": (3, 2), + "email.message_from_bytes": (3, 2), + "functools.lru_cache": (3, 2), + "gzip.compress": (3, 2), + "gzip.decompress": (3, 2), + "inspect.getclosurevars": (3, 3), + "inspect.getgeneratorlocals": (3, 3), + "inspect.getgeneratorstate": (3, 2), + "itertools.combinations_with_replacement": (3, 1), + "itertools.compress": (3, 1), + "logging.config.dictConfig": (3, 2), + "logging.NullHandler": (3, 1), + "math.erf": (3, 2), + "math.erfc": (3, 2), + "math.expm1": (3, 2), + "math.gamma": (3, 2), + "math.isfinite": (3, 2), + "math.lgamma": (3, 2), + "math.log2": (3, 3), + "os.environb": (3, 2), + "os.fsdecode": (3, 2), + "os.fsencode": (3, 2), + "os.fwalk": (3, 3), + "os.getenvb": (3, 2), + "os.get_exec_path": (3, 2), + "os.getgrouplist": (3, 3), + "os.getpriority": (3, 3), + "os.getresgid": (3, 2), + "os.getresuid": (3, 2), + "os.get_terminal_size": (3, 3), + "os.getxattr": (3, 3), + "os.initgroups": (3, 2), + "os.listxattr": (3, 3), + "os.lockf": (3, 3), + "os.pipe2": (3, 3), + "os.posix_fadvise": (3, 3), + "os.posix_fallocate": (3, 3), + "os.pread": (3, 3), + "os.pwrite": (3, 3), + "os.readv": (3, 3), + "os.removexattr": (3, 3), + "os.replace": (3, 3), + "os.sched_get_priority_max": (3, 3), + "os.sched_get_priority_min": (3, 3), + "os.sched_getaffinity": (3, 3), + "os.sched_getparam": (3, 3), + "os.sched_getscheduler": (3, 3), + "os.sched_rr_get_interval": (3, 3), + "os.sched_setaffinity": (3, 3), + "os.sched_setparam": (3, 3), + "os.sched_setscheduler": (3, 3), + "os.sched_yield": (3, 3), + "os.sendfile": (3, 3), + "os.setpriority": (3, 3), + "os.setresgid": (3, 2), + "os.setresuid": (3, 2), + "os.setxattr": (3, 3), + "os.sync": (3, 3), + "os.truncate": (3, 3), + "os.waitid": (3, 3), + "os.writev": (3, 3), + "shutil.chown": (3, 3), + "shutil.disk_usage": (3, 3), + "shutil.get_archive_formats": (3, 3), + "shutil.get_terminal_size": (3, 3), + "shutil.get_unpack_formats": (3, 3), + "shutil.make_archive": (3, 3), + "shutil.register_archive_format": (3, 3), + "shutil.register_unpack_format": (3, 3), + "shutil.unpack_archive": (3, 3), + "shutil.unregister_archive_format": (3, 3), + "shutil.unregister_unpack_format": (3, 3), + "shutil.which": (3, 3), + "signal.pthread_kill": (3, 3), + "signal.pthread_sigmask": (3, 3), + "signal.sigpending": (3, 3), + "signal.sigtimedwait": (3, 3), + "signal.sigwait": (3, 3), + "signal.sigwaitinfo": (3, 3), + "socket.CMSG_LEN": (3, 3), + "socket.CMSG_SPACE": (3, 3), + "socket.fromshare": (3, 3), + "socket.if_indextoname": (3, 3), + "socket.if_nameindex": (3, 3), + "socket.if_nametoindex": (3, 3), + "socket.sethostname": (3, 3), + "ssl.match_hostname": (3, 2), + "ssl.RAND_bytes": (3, 3), + "ssl.RAND_pseudo_bytes": (3, 3), + "ssl.SSLContext": (3, 2), + "ssl.SSLEOFError": (3, 3), + "ssl.SSLSyscallError": (3, 3), + "ssl.SSLWantReadError": (3, 3), + "ssl.SSLWantWriteError": (3, 3), + "ssl.SSLZeroReturnError": (3, 3), + "stat.filemode": (3, 3), + "textwrap.indent": (3, 3), + "threading.get_ident": (3, 3), + "time.clock_getres": (3, 3), + "time.clock_gettime": (3, 3), + "time.clock_settime": (3, 3), + "time.get_clock_info": (3, 3), + "time.monotonic": (3, 3), + "time.perf_counter": (3, 3), + "time.process_time": (3, 3), + "types.new_class": (3, 3), + "types.prepare_class": (3, 3), +} + +def uniq(a): + if len(a) == 0: + return [] + else: + return [a[0]] + uniq([x for x in a if x != a[0]]) + +class NodeChecker(ast.NodeVisitor): + def __init__(self): + self.vers = dict() + self.vers[(3,0)] = [] + def add(self, node, ver, msg): + if ver not in self.vers: + self.vers[ver] = [] + self.vers[ver].append((node.lineno, msg)) + def visit_Call(self, node): + def rollup(n): + if isinstance(n, ast.Name): + return n.id + elif isinstance(n, ast.Attribute): + r = rollup(n.value) + if r: + return r + "." + n.attr + name = rollup(node.func) + if name: + v = Functions.get(name) + if v is not None: + self.add(node, v, name) + self.generic_visit(node) + def visit_Import(self, node): + for n in node.names: + v = StandardModules.get(n.name) + if v is not None: + self.add(node, v, n.name) + self.generic_visit(node) + def visit_ImportFrom(self, node): + v = StandardModules.get(node.module) + if v is not None: + self.add(node, v, node.module) + for n in node.names: + name = node.module + "." + n.name + v = Functions.get(name) + if v is not None: + self.add(node, v, name) + def visit_Raise(self, node): + if isinstance(node.cause, ast.Name) and node.cause.id == "None": + self.add(node, (3,3), "raise ... from None") + def visit_YieldFrom(self, node): + self.add(node, (3,3), "yield from") + +def get_versions(source, filename=None): + """Return information about the Python versions required for specific features. + + The return value is a dictionary with keys as a version number as a tuple + (for example Python 3.1 is (3,1)) and the value are a list of features that + require the indicated Python version. + """ + tree = ast.parse(source, filename=filename) + checker = NodeChecker() + checker.visit(tree) + return checker.vers + +def v33(source): + if sys.version_info >= (3, 3): + return qver(source) + else: + print("Not all features tested, run --test with Python 3.3", file=sys.stderr) + return (3, 3) + +def qver(source): + """Return the minimum Python version required to run a particular bit of code. + + >>> qver('print("hello world")') + (3, 0) + >>> qver("import importlib") + (3, 1) + >>> qver("from importlib import x") + (3, 1) + >>> qver("import tkinter.ttk") + (3, 1) + >>> qver("from collections import Counter") + (3, 1) + >>> qver("collections.OrderedDict()") + (3, 1) + >>> qver("import functools\\n@functools.lru_cache()\\ndef f(x): x*x") + (3, 2) + >>> v33("yield from x") + (3, 3) + >>> v33("raise x from None") + (3, 3) + """ + return max(get_versions(source).keys()) diff --git a/lib/spack/external/six.py b/lib/spack/external/six.py new file mode 100644 index 0000000000..5293325821 --- /dev/null +++ b/lib/spack/external/six.py @@ -0,0 +1,886 @@ +# Copyright (c) 2010-2017 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getstatusoutput", "commands", "subprocess"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/lib/spack/external/yaml/README b/lib/spack/external/yaml/README index c1edf13870..d186328eeb 100644 --- a/lib/spack/external/yaml/README +++ b/lib/spack/external/yaml/README @@ -28,7 +28,7 @@ Post your questions and opinions to the YAML-Core mailing list: 'http://lists.sourceforge.net/lists/listinfo/yaml-core'. Submit bug reports and feature requests to the PyYAML bug tracker: -'http://pyyaml.org/newticket?component=pyyaml'. +'https://bitbucket.org/xi/pyyaml/issues/new'. PyYAML is written by Kirill Simonov . It is released under the MIT license. See the file LICENSE for more details. diff --git a/lib/spack/external/yaml/__init__.py b/lib/spack/external/yaml/__init__.py deleted file mode 100644 index f977f46ba7..0000000000 --- a/lib/spack/external/yaml/__init__.py +++ /dev/null @@ -1,315 +0,0 @@ - -from error import * - -from tokens import * -from events import * -from nodes import * - -from loader import * -from dumper import * - -__version__ = '3.10' - -try: - from cyaml import * - __with_libyaml__ = True -except ImportError: - __with_libyaml__ = False - -def scan(stream, Loader=Loader): - """ - Scan a YAML stream and produce scanning tokens. - """ - loader = Loader(stream) - try: - while loader.check_token(): - yield loader.get_token() - finally: - loader.dispose() - -def parse(stream, Loader=Loader): - """ - Parse a YAML stream and produce parsing events. - """ - loader = Loader(stream) - try: - while loader.check_event(): - yield loader.get_event() - finally: - loader.dispose() - -def compose(stream, Loader=Loader): - """ - Parse the first YAML document in a stream - and produce the corresponding representation tree. - """ - loader = Loader(stream) - try: - return loader.get_single_node() - finally: - loader.dispose() - -def compose_all(stream, Loader=Loader): - """ - Parse all YAML documents in a stream - and produce corresponding representation trees. - """ - loader = Loader(stream) - try: - while loader.check_node(): - yield loader.get_node() - finally: - loader.dispose() - -def load(stream, Loader=Loader): - """ - Parse the first YAML document in a stream - and produce the corresponding Python object. - """ - loader = Loader(stream) - try: - return loader.get_single_data() - finally: - loader.dispose() - -def load_all(stream, Loader=Loader): - """ - Parse all YAML documents in a stream - and produce corresponding Python objects. - """ - loader = Loader(stream) - try: - while loader.check_data(): - yield loader.get_data() - finally: - loader.dispose() - -def safe_load(stream): - """ - Parse the first YAML document in a stream - and produce the corresponding Python object. - Resolve only basic YAML tags. - """ - return load(stream, SafeLoader) - -def safe_load_all(stream): - """ - Parse all YAML documents in a stream - and produce corresponding Python objects. - Resolve only basic YAML tags. - """ - return load_all(stream, SafeLoader) - -def emit(events, stream=None, Dumper=Dumper, - canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None): - """ - Emit YAML parsing events into a stream. - If stream is None, return the produced string instead. - """ - getvalue = None - if stream is None: - from StringIO import StringIO - stream = StringIO() - getvalue = stream.getvalue - dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, - allow_unicode=allow_unicode, line_break=line_break) - try: - for event in events: - dumper.emit(event) - finally: - dumper.dispose() - if getvalue: - return getvalue() - -def serialize_all(nodes, stream=None, Dumper=Dumper, - canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None, - encoding='utf-8', explicit_start=None, explicit_end=None, - version=None, tags=None): - """ - Serialize a sequence of representation trees into a YAML stream. - If stream is None, return the produced string instead. - """ - getvalue = None - if stream is None: - if encoding is None: - from StringIO import StringIO - else: - from cStringIO import StringIO - stream = StringIO() - getvalue = stream.getvalue - dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, - allow_unicode=allow_unicode, line_break=line_break, - encoding=encoding, version=version, tags=tags, - explicit_start=explicit_start, explicit_end=explicit_end) - try: - dumper.open() - for node in nodes: - dumper.serialize(node) - dumper.close() - finally: - dumper.dispose() - if getvalue: - return getvalue() - -def serialize(node, stream=None, Dumper=Dumper, **kwds): - """ - Serialize a representation tree into a YAML stream. - If stream is None, return the produced string instead. - """ - return serialize_all([node], stream, Dumper=Dumper, **kwds) - -def dump_all(documents, stream=None, Dumper=Dumper, - default_style=None, default_flow_style=None, - canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None, - encoding='utf-8', explicit_start=None, explicit_end=None, - version=None, tags=None): - """ - Serialize a sequence of Python objects into a YAML stream. - If stream is None, return the produced string instead. - """ - getvalue = None - if stream is None: - if encoding is None: - from StringIO import StringIO - else: - from cStringIO import StringIO - stream = StringIO() - getvalue = stream.getvalue - dumper = Dumper(stream, default_style=default_style, - default_flow_style=default_flow_style, - canonical=canonical, indent=indent, width=width, - allow_unicode=allow_unicode, line_break=line_break, - encoding=encoding, version=version, tags=tags, - explicit_start=explicit_start, explicit_end=explicit_end) - try: - dumper.open() - for data in documents: - dumper.represent(data) - dumper.close() - finally: - dumper.dispose() - if getvalue: - return getvalue() - -def dump(data, stream=None, Dumper=Dumper, **kwds): - """ - Serialize a Python object into a YAML stream. - If stream is None, return the produced string instead. - """ - return dump_all([data], stream, Dumper=Dumper, **kwds) - -def safe_dump_all(documents, stream=None, **kwds): - """ - Serialize a sequence of Python objects into a YAML stream. - Produce only basic YAML tags. - If stream is None, return the produced string instead. - """ - return dump_all(documents, stream, Dumper=SafeDumper, **kwds) - -def safe_dump(data, stream=None, **kwds): - """ - Serialize a Python object into a YAML stream. - Produce only basic YAML tags. - If stream is None, return the produced string instead. - """ - return dump_all([data], stream, Dumper=SafeDumper, **kwds) - -def add_implicit_resolver(tag, regexp, first=None, - Loader=Loader, Dumper=Dumper): - """ - Add an implicit scalar detector. - If an implicit scalar value matches the given regexp, - the corresponding tag is assigned to the scalar. - first is a sequence of possible initial characters or None. - """ - Loader.add_implicit_resolver(tag, regexp, first) - Dumper.add_implicit_resolver(tag, regexp, first) - -def add_path_resolver(tag, path, kind=None, Loader=Loader, Dumper=Dumper): - """ - Add a path based resolver for the given tag. - A path is a list of keys that forms a path - to a node in the representation tree. - Keys can be string values, integers, or None. - """ - Loader.add_path_resolver(tag, path, kind) - Dumper.add_path_resolver(tag, path, kind) - -def add_constructor(tag, constructor, Loader=Loader): - """ - Add a constructor for the given tag. - Constructor is a function that accepts a Loader instance - and a node object and produces the corresponding Python object. - """ - Loader.add_constructor(tag, constructor) - -def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): - """ - Add a multi-constructor for the given tag prefix. - Multi-constructor is called for a node if its tag starts with tag_prefix. - Multi-constructor accepts a Loader instance, a tag suffix, - and a node object and produces the corresponding Python object. - """ - Loader.add_multi_constructor(tag_prefix, multi_constructor) - -def add_representer(data_type, representer, Dumper=Dumper): - """ - Add a representer for the given type. - Representer is a function accepting a Dumper instance - and an instance of the given data type - and producing the corresponding representation node. - """ - Dumper.add_representer(data_type, representer) - -def add_multi_representer(data_type, multi_representer, Dumper=Dumper): - """ - Add a representer for the given type. - Multi-representer is a function accepting a Dumper instance - and an instance of the given data type or subtype - and producing the corresponding representation node. - """ - Dumper.add_multi_representer(data_type, multi_representer) - -class YAMLObjectMetaclass(type): - """ - The metaclass for YAMLObject. - """ - def __init__(cls, name, bases, kwds): - super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) - if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: - cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) - cls.yaml_dumper.add_representer(cls, cls.to_yaml) - -class YAMLObject(object): - """ - An object that can dump itself to a YAML stream - and load itself from a YAML stream. - """ - - __metaclass__ = YAMLObjectMetaclass - __slots__ = () # no direct instantiation, so allow immutable subclasses - - yaml_loader = Loader - yaml_dumper = Dumper - - yaml_tag = None - yaml_flow_style = None - - def from_yaml(cls, loader, node): - """ - Convert a representation node to a Python object. - """ - return loader.construct_yaml_object(node, cls) - from_yaml = classmethod(from_yaml) - - def to_yaml(cls, dumper, data): - """ - Convert a Python object to a representation node. - """ - return dumper.represent_yaml_object(cls.yaml_tag, data, cls, - flow_style=cls.yaml_flow_style) - to_yaml = classmethod(to_yaml) - diff --git a/lib/spack/external/yaml/composer.py b/lib/spack/external/yaml/composer.py deleted file mode 100644 index 06e5ac782f..0000000000 --- a/lib/spack/external/yaml/composer.py +++ /dev/null @@ -1,139 +0,0 @@ - -__all__ = ['Composer', 'ComposerError'] - -from error import MarkedYAMLError -from events import * -from nodes import * - -class ComposerError(MarkedYAMLError): - pass - -class Composer(object): - - def __init__(self): - self.anchors = {} - - def check_node(self): - # Drop the STREAM-START event. - if self.check_event(StreamStartEvent): - self.get_event() - - # If there are more documents available? - return not self.check_event(StreamEndEvent) - - def get_node(self): - # Get the root node of the next document. - if not self.check_event(StreamEndEvent): - return self.compose_document() - - def get_single_node(self): - # Drop the STREAM-START event. - self.get_event() - - # Compose a document if the stream is not empty. - document = None - if not self.check_event(StreamEndEvent): - document = self.compose_document() - - # Ensure that the stream contains no more documents. - if not self.check_event(StreamEndEvent): - event = self.get_event() - raise ComposerError("expected a single document in the stream", - document.start_mark, "but found another document", - event.start_mark) - - # Drop the STREAM-END event. - self.get_event() - - return document - - def compose_document(self): - # Drop the DOCUMENT-START event. - self.get_event() - - # Compose the root node. - node = self.compose_node(None, None) - - # Drop the DOCUMENT-END event. - self.get_event() - - self.anchors = {} - return node - - def compose_node(self, parent, index): - if self.check_event(AliasEvent): - event = self.get_event() - anchor = event.anchor - if anchor not in self.anchors: - raise ComposerError(None, None, "found undefined alias %r" - % anchor.encode('utf-8'), event.start_mark) - return self.anchors[anchor] - event = self.peek_event() - anchor = event.anchor - if anchor is not None: - if anchor in self.anchors: - raise ComposerError("found duplicate anchor %r; first occurence" - % anchor.encode('utf-8'), self.anchors[anchor].start_mark, - "second occurence", event.start_mark) - self.descend_resolver(parent, index) - if self.check_event(ScalarEvent): - node = self.compose_scalar_node(anchor) - elif self.check_event(SequenceStartEvent): - node = self.compose_sequence_node(anchor) - elif self.check_event(MappingStartEvent): - node = self.compose_mapping_node(anchor) - self.ascend_resolver() - return node - - def compose_scalar_node(self, anchor): - event = self.get_event() - tag = event.tag - if tag is None or tag == u'!': - tag = self.resolve(ScalarNode, event.value, event.implicit) - node = ScalarNode(tag, event.value, - event.start_mark, event.end_mark, style=event.style) - if anchor is not None: - self.anchors[anchor] = node - return node - - def compose_sequence_node(self, anchor): - start_event = self.get_event() - tag = start_event.tag - if tag is None or tag == u'!': - tag = self.resolve(SequenceNode, None, start_event.implicit) - node = SequenceNode(tag, [], - start_event.start_mark, None, - flow_style=start_event.flow_style) - if anchor is not None: - self.anchors[anchor] = node - index = 0 - while not self.check_event(SequenceEndEvent): - node.value.append(self.compose_node(node, index)) - index += 1 - end_event = self.get_event() - node.end_mark = end_event.end_mark - return node - - def compose_mapping_node(self, anchor): - start_event = self.get_event() - tag = start_event.tag - if tag is None or tag == u'!': - tag = self.resolve(MappingNode, None, start_event.implicit) - node = MappingNode(tag, [], - start_event.start_mark, None, - flow_style=start_event.flow_style) - if anchor is not None: - self.anchors[anchor] = node - while not self.check_event(MappingEndEvent): - #key_event = self.peek_event() - item_key = self.compose_node(node, None) - #if item_key in node.value: - # raise ComposerError("while composing a mapping", start_event.start_mark, - # "found duplicate key", key_event.start_mark) - item_value = self.compose_node(node, item_key) - #node.value[item_key] = item_value - node.value.append((item_key, item_value)) - end_event = self.get_event() - node.end_mark = end_event.end_mark - return node - diff --git a/lib/spack/external/yaml/constructor.py b/lib/spack/external/yaml/constructor.py deleted file mode 100644 index 8c0ec181b2..0000000000 --- a/lib/spack/external/yaml/constructor.py +++ /dev/null @@ -1,678 +0,0 @@ - -__all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', - 'ConstructorError'] - -from error import * -from nodes import * - -import datetime - -import binascii, re, sys, types - -class ConstructorError(MarkedYAMLError): - pass - -class BaseConstructor(object): - - yaml_constructors = {} - yaml_multi_constructors = {} - - def __init__(self): - self.constructed_objects = {} - self.recursive_objects = {} - self.state_generators = [] - self.deep_construct = False - - def check_data(self): - # If there are more documents available? - return self.check_node() - - def get_data(self): - # Construct and return the next document. - if self.check_node(): - return self.construct_document(self.get_node()) - - def get_single_data(self): - # Ensure that the stream contains a single document and construct it. - node = self.get_single_node() - if node is not None: - return self.construct_document(node) - return None - - def construct_document(self, node): - data = self.construct_object(node) - while self.state_generators: - state_generators = self.state_generators - self.state_generators = [] - for generator in state_generators: - for dummy in generator: - pass - self.constructed_objects = {} - self.recursive_objects = {} - self.deep_construct = False - return data - - def construct_object(self, node, deep=False): - if node in self.constructed_objects: - return self.constructed_objects[node] - if deep: - old_deep = self.deep_construct - self.deep_construct = True - if node in self.recursive_objects: - raise ConstructorError(None, None, - "found unconstructable recursive node", node.start_mark) - self.recursive_objects[node] = None - constructor = None - tag_suffix = None - if node.tag in self.yaml_constructors: - constructor = self.yaml_constructors[node.tag] - else: - for tag_prefix in self.yaml_multi_constructors: - if node.tag.startswith(tag_prefix): - tag_suffix = node.tag[len(tag_prefix):] - constructor = self.yaml_multi_constructors[tag_prefix] - break - else: - if None in self.yaml_multi_constructors: - tag_suffix = node.tag - constructor = self.yaml_multi_constructors[None] - elif None in self.yaml_constructors: - constructor = self.yaml_constructors[None] - elif isinstance(node, ScalarNode): - constructor = self.__class__.construct_scalar - elif isinstance(node, SequenceNode): - constructor = self.__class__.construct_sequence - elif isinstance(node, MappingNode): - constructor = self.__class__.construct_mapping - if tag_suffix is None: - data = constructor(self, node) - else: - data = constructor(self, tag_suffix, node) - if isinstance(data, types.GeneratorType): - generator = data - data = generator.next() - if self.deep_construct: - for dummy in generator: - pass - else: - self.state_generators.append(generator) - self.constructed_objects[node] = data - del self.recursive_objects[node] - if deep: - self.deep_construct = old_deep - return data - - def construct_scalar(self, node): - if not isinstance(node, ScalarNode): - raise ConstructorError(None, None, - "expected a scalar node, but found %s" % node.id, - node.start_mark) - return node.value - - def construct_sequence(self, node, deep=False): - if not isinstance(node, SequenceNode): - raise ConstructorError(None, None, - "expected a sequence node, but found %s" % node.id, - node.start_mark) - return [self.construct_object(child, deep=deep) - for child in node.value] - - def construct_mapping(self, node, deep=False): - if not isinstance(node, MappingNode): - raise ConstructorError(None, None, - "expected a mapping node, but found %s" % node.id, - node.start_mark) - mapping = {} - for key_node, value_node in node.value: - key = self.construct_object(key_node, deep=deep) - try: - hash(key) - except TypeError, exc: - raise ConstructorError("while constructing a mapping", node.start_mark, - "found unacceptable key (%s)" % exc, key_node.start_mark) - value = self.construct_object(value_node, deep=deep) - if key in mapping: - raise ConstructorError("while constructing a mapping", node.start_mark, - "found already in-use key (%s)" % key, key_node.start_mark) - mapping[key] = value - return mapping - - def construct_pairs(self, node, deep=False): - if not isinstance(node, MappingNode): - raise ConstructorError(None, None, - "expected a mapping node, but found %s" % node.id, - node.start_mark) - pairs = [] - for key_node, value_node in node.value: - key = self.construct_object(key_node, deep=deep) - value = self.construct_object(value_node, deep=deep) - pairs.append((key, value)) - return pairs - - def add_constructor(cls, tag, constructor): - if not 'yaml_constructors' in cls.__dict__: - cls.yaml_constructors = cls.yaml_constructors.copy() - cls.yaml_constructors[tag] = constructor - add_constructor = classmethod(add_constructor) - - def add_multi_constructor(cls, tag_prefix, multi_constructor): - if not 'yaml_multi_constructors' in cls.__dict__: - cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() - cls.yaml_multi_constructors[tag_prefix] = multi_constructor - add_multi_constructor = classmethod(add_multi_constructor) - -class SafeConstructor(BaseConstructor): - - def construct_scalar(self, node): - if isinstance(node, MappingNode): - for key_node, value_node in node.value: - if key_node.tag == u'tag:yaml.org,2002:value': - return self.construct_scalar(value_node) - return BaseConstructor.construct_scalar(self, node) - - def flatten_mapping(self, node): - merge = [] - index = 0 - while index < len(node.value): - key_node, value_node = node.value[index] - if key_node.tag == u'tag:yaml.org,2002:merge': - del node.value[index] - if isinstance(value_node, MappingNode): - self.flatten_mapping(value_node) - merge.extend(value_node.value) - elif isinstance(value_node, SequenceNode): - submerge = [] - for subnode in value_node.value: - if not isinstance(subnode, MappingNode): - raise ConstructorError("while constructing a mapping", - node.start_mark, - "expected a mapping for merging, but found %s" - % subnode.id, subnode.start_mark) - self.flatten_mapping(subnode) - submerge.append(subnode.value) - submerge.reverse() - for value in submerge: - merge.extend(value) - else: - raise ConstructorError("while constructing a mapping", node.start_mark, - "expected a mapping or list of mappings for merging, but found %s" - % value_node.id, value_node.start_mark) - elif key_node.tag == u'tag:yaml.org,2002:value': - key_node.tag = u'tag:yaml.org,2002:str' - index += 1 - else: - index += 1 - if merge: - node.value = merge + node.value - - def construct_mapping(self, node, deep=False): - if isinstance(node, MappingNode): - self.flatten_mapping(node) - return BaseConstructor.construct_mapping(self, node, deep=deep) - - def construct_yaml_null(self, node): - self.construct_scalar(node) - return None - - bool_values = { - u'yes': True, - u'no': False, - u'true': True, - u'false': False, - u'on': True, - u'off': False, - } - - def construct_yaml_bool(self, node): - value = self.construct_scalar(node) - return self.bool_values[value.lower()] - - def construct_yaml_int(self, node): - value = str(self.construct_scalar(node)) - value = value.replace('_', '') - sign = +1 - if value[0] == '-': - sign = -1 - if value[0] in '+-': - value = value[1:] - if value == '0': - return 0 - elif value.startswith('0b'): - return sign*int(value[2:], 2) - elif value.startswith('0x'): - return sign*int(value[2:], 16) - elif value[0] == '0': - return sign*int(value, 8) - elif ':' in value: - digits = [int(part) for part in value.split(':')] - digits.reverse() - base = 1 - value = 0 - for digit in digits: - value += digit*base - base *= 60 - return sign*value - else: - return sign*int(value) - - inf_value = 1e300 - while inf_value != inf_value*inf_value: - inf_value *= inf_value - nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99). - - def construct_yaml_float(self, node): - value = str(self.construct_scalar(node)) - value = value.replace('_', '').lower() - sign = +1 - if value[0] == '-': - sign = -1 - if value[0] in '+-': - value = value[1:] - if value == '.inf': - return sign*self.inf_value - elif value == '.nan': - return self.nan_value - elif ':' in value: - digits = [float(part) for part in value.split(':')] - digits.reverse() - base = 1 - value = 0.0 - for digit in digits: - value += digit*base - base *= 60 - return sign*value - else: - return sign*float(value) - - def construct_yaml_binary(self, node): - value = self.construct_scalar(node) - try: - return str(value).decode('base64') - except (binascii.Error, UnicodeEncodeError), exc: - raise ConstructorError(None, None, - "failed to decode base64 data: %s" % exc, node.start_mark) - - timestamp_regexp = re.compile( - ur'''^(?P[0-9][0-9][0-9][0-9]) - -(?P[0-9][0-9]?) - -(?P[0-9][0-9]?) - (?:(?:[Tt]|[ \t]+) - (?P[0-9][0-9]?) - :(?P[0-9][0-9]) - :(?P[0-9][0-9]) - (?:\.(?P[0-9]*))? - (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) - (?::(?P[0-9][0-9]))?))?)?$''', re.X) - - def construct_yaml_timestamp(self, node): - value = self.construct_scalar(node) - match = self.timestamp_regexp.match(node.value) - values = match.groupdict() - year = int(values['year']) - month = int(values['month']) - day = int(values['day']) - if not values['hour']: - return datetime.date(year, month, day) - hour = int(values['hour']) - minute = int(values['minute']) - second = int(values['second']) - fraction = 0 - if values['fraction']: - fraction = values['fraction'][:6] - while len(fraction) < 6: - fraction += '0' - fraction = int(fraction) - delta = None - if values['tz_sign']: - tz_hour = int(values['tz_hour']) - tz_minute = int(values['tz_minute'] or 0) - delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) - if values['tz_sign'] == '-': - delta = -delta - data = datetime.datetime(year, month, day, hour, minute, second, fraction) - if delta: - data -= delta - return data - - def construct_yaml_omap(self, node): - # Note: we do not check for duplicate keys, because it's too - # CPU-expensive. - omap = [] - yield omap - if not isinstance(node, SequenceNode): - raise ConstructorError("while constructing an ordered map", node.start_mark, - "expected a sequence, but found %s" % node.id, node.start_mark) - for subnode in node.value: - if not isinstance(subnode, MappingNode): - raise ConstructorError("while constructing an ordered map", node.start_mark, - "expected a mapping of length 1, but found %s" % subnode.id, - subnode.start_mark) - if len(subnode.value) != 1: - raise ConstructorError("while constructing an ordered map", node.start_mark, - "expected a single mapping item, but found %d items" % len(subnode.value), - subnode.start_mark) - key_node, value_node = subnode.value[0] - key = self.construct_object(key_node) - value = self.construct_object(value_node) - omap.append((key, value)) - - def construct_yaml_pairs(self, node): - # Note: the same code as `construct_yaml_omap`. - pairs = [] - yield pairs - if not isinstance(node, SequenceNode): - raise ConstructorError("while constructing pairs", node.start_mark, - "expected a sequence, but found %s" % node.id, node.start_mark) - for subnode in node.value: - if not isinstance(subnode, MappingNode): - raise ConstructorError("while constructing pairs", node.start_mark, - "expected a mapping of length 1, but found %s" % subnode.id, - subnode.start_mark) - if len(subnode.value) != 1: - raise ConstructorError("while constructing pairs", node.start_mark, - "expected a single mapping item, but found %d items" % len(subnode.value), - subnode.start_mark) - key_node, value_node = subnode.value[0] - key = self.construct_object(key_node) - value = self.construct_object(value_node) - pairs.append((key, value)) - - def construct_yaml_set(self, node): - data = set() - yield data - value = self.construct_mapping(node) - data.update(value) - - def construct_yaml_str(self, node): - value = self.construct_scalar(node) - try: - return value.encode('ascii') - except UnicodeEncodeError: - return value - - def construct_yaml_seq(self, node): - data = [] - yield data - data.extend(self.construct_sequence(node)) - - def construct_yaml_map(self, node): - data = {} - yield data - value = self.construct_mapping(node) - data.update(value) - - def construct_yaml_object(self, node, cls): - data = cls.__new__(cls) - yield data - if hasattr(data, '__setstate__'): - state = self.construct_mapping(node, deep=True) - data.__setstate__(state) - else: - state = self.construct_mapping(node) - data.__dict__.update(state) - - def construct_undefined(self, node): - raise ConstructorError(None, None, - "could not determine a constructor for the tag %r" % node.tag.encode('utf-8'), - node.start_mark) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:null', - SafeConstructor.construct_yaml_null) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:bool', - SafeConstructor.construct_yaml_bool) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:int', - SafeConstructor.construct_yaml_int) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:float', - SafeConstructor.construct_yaml_float) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:binary', - SafeConstructor.construct_yaml_binary) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:timestamp', - SafeConstructor.construct_yaml_timestamp) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:omap', - SafeConstructor.construct_yaml_omap) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:pairs', - SafeConstructor.construct_yaml_pairs) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:set', - SafeConstructor.construct_yaml_set) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:str', - SafeConstructor.construct_yaml_str) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:seq', - SafeConstructor.construct_yaml_seq) - -SafeConstructor.add_constructor( - u'tag:yaml.org,2002:map', - SafeConstructor.construct_yaml_map) - -SafeConstructor.add_constructor(None, - SafeConstructor.construct_undefined) - -class Constructor(SafeConstructor): - - def construct_python_str(self, node): - return self.construct_scalar(node).encode('utf-8') - - def construct_python_unicode(self, node): - return self.construct_scalar(node) - - def construct_python_long(self, node): - return long(self.construct_yaml_int(node)) - - def construct_python_complex(self, node): - return complex(self.construct_scalar(node)) - - def construct_python_tuple(self, node): - return tuple(self.construct_sequence(node)) - - def find_python_module(self, name, mark): - if not name: - raise ConstructorError("while constructing a Python module", mark, - "expected non-empty name appended to the tag", mark) - try: - __import__(name) - except ImportError, exc: - raise ConstructorError("while constructing a Python module", mark, - "cannot find module %r (%s)" % (name.encode('utf-8'), exc), mark) - return sys.modules[name] - - def find_python_name(self, name, mark): - if not name: - raise ConstructorError("while constructing a Python object", mark, - "expected non-empty name appended to the tag", mark) - if u'.' in name: - module_name, object_name = name.rsplit('.', 1) - else: - module_name = '__builtin__' - object_name = name - try: - __import__(module_name) - except ImportError, exc: - raise ConstructorError("while constructing a Python object", mark, - "cannot find module %r (%s)" % (module_name.encode('utf-8'), exc), mark) - module = sys.modules[module_name] - if not hasattr(module, object_name): - raise ConstructorError("while constructing a Python object", mark, - "cannot find %r in the module %r" % (object_name.encode('utf-8'), - module.__name__), mark) - return getattr(module, object_name) - - def construct_python_name(self, suffix, node): - value = self.construct_scalar(node) - if value: - raise ConstructorError("while constructing a Python name", node.start_mark, - "expected the empty value, but found %r" % value.encode('utf-8'), - node.start_mark) - return self.find_python_name(suffix, node.start_mark) - - def construct_python_module(self, suffix, node): - value = self.construct_scalar(node) - if value: - raise ConstructorError("while constructing a Python module", node.start_mark, - "expected the empty value, but found %r" % value.encode('utf-8'), - node.start_mark) - return self.find_python_module(suffix, node.start_mark) - - class classobj: pass - - def make_python_instance(self, suffix, node, - args=None, kwds=None, newobj=False): - if not args: - args = [] - if not kwds: - kwds = {} - cls = self.find_python_name(suffix, node.start_mark) - if newobj and isinstance(cls, type(self.classobj)) \ - and not args and not kwds: - instance = self.classobj() - instance.__class__ = cls - return instance - elif newobj and isinstance(cls, type): - return cls.__new__(cls, *args, **kwds) - else: - return cls(*args, **kwds) - - def set_python_instance_state(self, instance, state): - if hasattr(instance, '__setstate__'): - instance.__setstate__(state) - else: - slotstate = {} - if isinstance(state, tuple) and len(state) == 2: - state, slotstate = state - if hasattr(instance, '__dict__'): - instance.__dict__.update(state) - elif state: - slotstate.update(state) - for key, value in slotstate.items(): - setattr(object, key, value) - - def construct_python_object(self, suffix, node): - # Format: - # !!python/object:module.name { ... state ... } - instance = self.make_python_instance(suffix, node, newobj=True) - yield instance - deep = hasattr(instance, '__setstate__') - state = self.construct_mapping(node, deep=deep) - self.set_python_instance_state(instance, state) - - def construct_python_object_apply(self, suffix, node, newobj=False): - # Format: - # !!python/object/apply # (or !!python/object/new) - # args: [ ... arguments ... ] - # kwds: { ... keywords ... } - # state: ... state ... - # listitems: [ ... listitems ... ] - # dictitems: { ... dictitems ... } - # or short format: - # !!python/object/apply [ ... arguments ... ] - # The difference between !!python/object/apply and !!python/object/new - # is how an object is created, check make_python_instance for details. - if isinstance(node, SequenceNode): - args = self.construct_sequence(node, deep=True) - kwds = {} - state = {} - listitems = [] - dictitems = {} - else: - value = self.construct_mapping(node, deep=True) - args = value.get('args', []) - kwds = value.get('kwds', {}) - state = value.get('state', {}) - listitems = value.get('listitems', []) - dictitems = value.get('dictitems', {}) - instance = self.make_python_instance(suffix, node, args, kwds, newobj) - if state: - self.set_python_instance_state(instance, state) - if listitems: - instance.extend(listitems) - if dictitems: - for key in dictitems: - instance[key] = dictitems[key] - return instance - - def construct_python_object_new(self, suffix, node): - return self.construct_python_object_apply(suffix, node, newobj=True) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/none', - Constructor.construct_yaml_null) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/bool', - Constructor.construct_yaml_bool) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/str', - Constructor.construct_python_str) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/unicode', - Constructor.construct_python_unicode) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/int', - Constructor.construct_yaml_int) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/long', - Constructor.construct_python_long) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/float', - Constructor.construct_yaml_float) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/complex', - Constructor.construct_python_complex) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/list', - Constructor.construct_yaml_seq) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/tuple', - Constructor.construct_python_tuple) - -Constructor.add_constructor( - u'tag:yaml.org,2002:python/dict', - Constructor.construct_yaml_map) - -Constructor.add_multi_constructor( - u'tag:yaml.org,2002:python/name:', - Constructor.construct_python_name) - -Constructor.add_multi_constructor( - u'tag:yaml.org,2002:python/module:', - Constructor.construct_python_module) - -Constructor.add_multi_constructor( - u'tag:yaml.org,2002:python/object:', - Constructor.construct_python_object) - -Constructor.add_multi_constructor( - u'tag:yaml.org,2002:python/object/apply:', - Constructor.construct_python_object_apply) - -Constructor.add_multi_constructor( - u'tag:yaml.org,2002:python/object/new:', - Constructor.construct_python_object_new) - diff --git a/lib/spack/external/yaml/dumper.py b/lib/spack/external/yaml/dumper.py deleted file mode 100644 index f811d2c919..0000000000 --- a/lib/spack/external/yaml/dumper.py +++ /dev/null @@ -1,62 +0,0 @@ - -__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] - -from emitter import * -from serializer import * -from representer import * -from resolver import * - -class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): - - def __init__(self, stream, - default_style=None, default_flow_style=None, - canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None, - encoding=None, explicit_start=None, explicit_end=None, - version=None, tags=None): - Emitter.__init__(self, stream, canonical=canonical, - indent=indent, width=width, - allow_unicode=allow_unicode, line_break=line_break) - Serializer.__init__(self, encoding=encoding, - explicit_start=explicit_start, explicit_end=explicit_end, - version=version, tags=tags) - Representer.__init__(self, default_style=default_style, - default_flow_style=default_flow_style) - Resolver.__init__(self) - -class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): - - def __init__(self, stream, - default_style=None, default_flow_style=None, - canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None, - encoding=None, explicit_start=None, explicit_end=None, - version=None, tags=None): - Emitter.__init__(self, stream, canonical=canonical, - indent=indent, width=width, - allow_unicode=allow_unicode, line_break=line_break) - Serializer.__init__(self, encoding=encoding, - explicit_start=explicit_start, explicit_end=explicit_end, - version=version, tags=tags) - SafeRepresenter.__init__(self, default_style=default_style, - default_flow_style=default_flow_style) - Resolver.__init__(self) - -class Dumper(Emitter, Serializer, Representer, Resolver): - - def __init__(self, stream, - default_style=None, default_flow_style=None, - canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None, - encoding=None, explicit_start=None, explicit_end=None, - version=None, tags=None): - Emitter.__init__(self, stream, canonical=canonical, - indent=indent, width=width, - allow_unicode=allow_unicode, line_break=line_break) - Serializer.__init__(self, encoding=encoding, - explicit_start=explicit_start, explicit_end=explicit_end, - version=version, tags=tags) - Representer.__init__(self, default_style=default_style, - default_flow_style=default_flow_style) - Resolver.__init__(self) - diff --git a/lib/spack/external/yaml/emitter.py b/lib/spack/external/yaml/emitter.py deleted file mode 100644 index e5bcdcccbb..0000000000 --- a/lib/spack/external/yaml/emitter.py +++ /dev/null @@ -1,1140 +0,0 @@ - -# Emitter expects events obeying the following grammar: -# stream ::= STREAM-START document* STREAM-END -# document ::= DOCUMENT-START node DOCUMENT-END -# node ::= SCALAR | sequence | mapping -# sequence ::= SEQUENCE-START node* SEQUENCE-END -# mapping ::= MAPPING-START (node node)* MAPPING-END - -__all__ = ['Emitter', 'EmitterError'] - -from error import YAMLError -from events import * - -class EmitterError(YAMLError): - pass - -class ScalarAnalysis(object): - def __init__(self, scalar, empty, multiline, - allow_flow_plain, allow_block_plain, - allow_single_quoted, allow_double_quoted, - allow_block): - self.scalar = scalar - self.empty = empty - self.multiline = multiline - self.allow_flow_plain = allow_flow_plain - self.allow_block_plain = allow_block_plain - self.allow_single_quoted = allow_single_quoted - self.allow_double_quoted = allow_double_quoted - self.allow_block = allow_block - -class Emitter(object): - - DEFAULT_TAG_PREFIXES = { - u'!' : u'!', - u'tag:yaml.org,2002:' : u'!!', - } - - def __init__(self, stream, canonical=None, indent=None, width=None, - allow_unicode=None, line_break=None): - - # The stream should have the methods `write` and possibly `flush`. - self.stream = stream - - # Encoding can be overriden by STREAM-START. - self.encoding = None - - # Emitter is a state machine with a stack of states to handle nested - # structures. - self.states = [] - self.state = self.expect_stream_start - - # Current event and the event queue. - self.events = [] - self.event = None - - # The current indentation level and the stack of previous indents. - self.indents = [] - self.indent = None - - # Flow level. - self.flow_level = 0 - - # Contexts. - self.root_context = False - self.sequence_context = False - self.mapping_context = False - self.simple_key_context = False - - # Characteristics of the last emitted character: - # - current position. - # - is it a whitespace? - # - is it an indention character - # (indentation space, '-', '?', or ':')? - self.line = 0 - self.column = 0 - self.whitespace = True - self.indention = True - - # Whether the document requires an explicit document indicator - self.open_ended = False - - # Formatting details. - self.canonical = canonical - self.allow_unicode = allow_unicode - self.best_indent = 2 - if indent and 1 < indent < 10: - self.best_indent = indent - self.best_width = 80 - if width and width > self.best_indent*2: - self.best_width = width - self.best_line_break = u'\n' - if line_break in [u'\r', u'\n', u'\r\n']: - self.best_line_break = line_break - - # Tag prefixes. - self.tag_prefixes = None - - # Prepared anchor and tag. - self.prepared_anchor = None - self.prepared_tag = None - - # Scalar analysis and style. - self.analysis = None - self.style = None - - def dispose(self): - # Reset the state attributes (to clear self-references) - self.states = [] - self.state = None - - def emit(self, event): - self.events.append(event) - while not self.need_more_events(): - self.event = self.events.pop(0) - self.state() - self.event = None - - # In some cases, we wait for a few next events before emitting. - - def need_more_events(self): - if not self.events: - return True - event = self.events[0] - if isinstance(event, DocumentStartEvent): - return self.need_events(1) - elif isinstance(event, SequenceStartEvent): - return self.need_events(2) - elif isinstance(event, MappingStartEvent): - return self.need_events(3) - else: - return False - - def need_events(self, count): - level = 0 - for event in self.events[1:]: - if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): - level += 1 - elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): - level -= 1 - elif isinstance(event, StreamEndEvent): - level = -1 - if level < 0: - return False - return (len(self.events) < count+1) - - def increase_indent(self, flow=False, indentless=False): - self.indents.append(self.indent) - if self.indent is None: - if flow: - self.indent = self.best_indent - else: - self.indent = 0 - elif not indentless: - self.indent += self.best_indent - - # States. - - # Stream handlers. - - def expect_stream_start(self): - if isinstance(self.event, StreamStartEvent): - if self.event.encoding and not getattr(self.stream, 'encoding', None): - self.encoding = self.event.encoding - self.write_stream_start() - self.state = self.expect_first_document_start - else: - raise EmitterError("expected StreamStartEvent, but got %s" - % self.event) - - def expect_nothing(self): - raise EmitterError("expected nothing, but got %s" % self.event) - - # Document handlers. - - def expect_first_document_start(self): - return self.expect_document_start(first=True) - - def expect_document_start(self, first=False): - if isinstance(self.event, DocumentStartEvent): - if (self.event.version or self.event.tags) and self.open_ended: - self.write_indicator(u'...', True) - self.write_indent() - if self.event.version: - version_text = self.prepare_version(self.event.version) - self.write_version_directive(version_text) - self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() - if self.event.tags: - handles = self.event.tags.keys() - handles.sort() - for handle in handles: - prefix = self.event.tags[handle] - self.tag_prefixes[prefix] = handle - handle_text = self.prepare_tag_handle(handle) - prefix_text = self.prepare_tag_prefix(prefix) - self.write_tag_directive(handle_text, prefix_text) - implicit = (first and not self.event.explicit and not self.canonical - and not self.event.version and not self.event.tags - and not self.check_empty_document()) - if not implicit: - self.write_indent() - self.write_indicator(u'---', True) - if self.canonical: - self.write_indent() - self.state = self.expect_document_root - elif isinstance(self.event, StreamEndEvent): - if self.open_ended: - self.write_indicator(u'...', True) - self.write_indent() - self.write_stream_end() - self.state = self.expect_nothing - else: - raise EmitterError("expected DocumentStartEvent, but got %s" - % self.event) - - def expect_document_end(self): - if isinstance(self.event, DocumentEndEvent): - self.write_indent() - if self.event.explicit: - self.write_indicator(u'...', True) - self.write_indent() - self.flush_stream() - self.state = self.expect_document_start - else: - raise EmitterError("expected DocumentEndEvent, but got %s" - % self.event) - - def expect_document_root(self): - self.states.append(self.expect_document_end) - self.expect_node(root=True) - - # Node handlers. - - def expect_node(self, root=False, sequence=False, mapping=False, - simple_key=False): - self.root_context = root - self.sequence_context = sequence - self.mapping_context = mapping - self.simple_key_context = simple_key - if isinstance(self.event, AliasEvent): - self.expect_alias() - elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): - self.process_anchor(u'&') - self.process_tag() - if isinstance(self.event, ScalarEvent): - self.expect_scalar() - elif isinstance(self.event, SequenceStartEvent): - if self.flow_level or self.canonical or self.event.flow_style \ - or self.check_empty_sequence(): - self.expect_flow_sequence() - else: - self.expect_block_sequence() - elif isinstance(self.event, MappingStartEvent): - if self.flow_level or self.canonical or self.event.flow_style \ - or self.check_empty_mapping(): - self.expect_flow_mapping() - else: - self.expect_block_mapping() - else: - raise EmitterError("expected NodeEvent, but got %s" % self.event) - - def expect_alias(self): - if self.event.anchor is None: - raise EmitterError("anchor is not specified for alias") - self.process_anchor(u'*') - self.state = self.states.pop() - - def expect_scalar(self): - self.increase_indent(flow=True) - self.process_scalar() - self.indent = self.indents.pop() - self.state = self.states.pop() - - # Flow sequence handlers. - - def expect_flow_sequence(self): - self.write_indicator(u'[', True, whitespace=True) - self.flow_level += 1 - self.increase_indent(flow=True) - self.state = self.expect_first_flow_sequence_item - - def expect_first_flow_sequence_item(self): - if isinstance(self.event, SequenceEndEvent): - self.indent = self.indents.pop() - self.flow_level -= 1 - self.write_indicator(u']', False) - self.state = self.states.pop() - else: - if self.canonical or self.column > self.best_width: - self.write_indent() - self.states.append(self.expect_flow_sequence_item) - self.expect_node(sequence=True) - - def expect_flow_sequence_item(self): - if isinstance(self.event, SequenceEndEvent): - self.indent = self.indents.pop() - self.flow_level -= 1 - if self.canonical: - self.write_indicator(u',', False) - self.write_indent() - self.write_indicator(u']', False) - self.state = self.states.pop() - else: - self.write_indicator(u',', False) - if self.canonical or self.column > self.best_width: - self.write_indent() - self.states.append(self.expect_flow_sequence_item) - self.expect_node(sequence=True) - - # Flow mapping handlers. - - def expect_flow_mapping(self): - self.write_indicator(u'{', True, whitespace=True) - self.flow_level += 1 - self.increase_indent(flow=True) - self.state = self.expect_first_flow_mapping_key - - def expect_first_flow_mapping_key(self): - if isinstance(self.event, MappingEndEvent): - self.indent = self.indents.pop() - self.flow_level -= 1 - self.write_indicator(u'}', False) - self.state = self.states.pop() - else: - if self.canonical or self.column > self.best_width: - self.write_indent() - if not self.canonical and self.check_simple_key(): - self.states.append(self.expect_flow_mapping_simple_value) - self.expect_node(mapping=True, simple_key=True) - else: - self.write_indicator(u'?', True) - self.states.append(self.expect_flow_mapping_value) - self.expect_node(mapping=True) - - def expect_flow_mapping_key(self): - if isinstance(self.event, MappingEndEvent): - self.indent = self.indents.pop() - self.flow_level -= 1 - if self.canonical: - self.write_indicator(u',', False) - self.write_indent() - self.write_indicator(u'}', False) - self.state = self.states.pop() - else: - self.write_indicator(u',', False) - if self.canonical or self.column > self.best_width: - self.write_indent() - if not self.canonical and self.check_simple_key(): - self.states.append(self.expect_flow_mapping_simple_value) - self.expect_node(mapping=True, simple_key=True) - else: - self.write_indicator(u'?', True) - self.states.append(self.expect_flow_mapping_value) - self.expect_node(mapping=True) - - def expect_flow_mapping_simple_value(self): - self.write_indicator(u':', False) - self.states.append(self.expect_flow_mapping_key) - self.expect_node(mapping=True) - - def expect_flow_mapping_value(self): - if self.canonical or self.column > self.best_width: - self.write_indent() - self.write_indicator(u':', True) - self.states.append(self.expect_flow_mapping_key) - self.expect_node(mapping=True) - - # Block sequence handlers. - - def expect_block_sequence(self): - indentless = (self.mapping_context and not self.indention) - self.increase_indent(flow=False, indentless=indentless) - self.state = self.expect_first_block_sequence_item - - def expect_first_block_sequence_item(self): - return self.expect_block_sequence_item(first=True) - - def expect_block_sequence_item(self, first=False): - if not first and isinstance(self.event, SequenceEndEvent): - self.indent = self.indents.pop() - self.state = self.states.pop() - else: - self.write_indent() - self.write_indicator(u'-', True, indention=True) - self.states.append(self.expect_block_sequence_item) - self.expect_node(sequence=True) - - # Block mapping handlers. - - def expect_block_mapping(self): - self.increase_indent(flow=False) - self.state = self.expect_first_block_mapping_key - - def expect_first_block_mapping_key(self): - return self.expect_block_mapping_key(first=True) - - def expect_block_mapping_key(self, first=False): - if not first and isinstance(self.event, MappingEndEvent): - self.indent = self.indents.pop() - self.state = self.states.pop() - else: - self.write_indent() - if self.check_simple_key(): - self.states.append(self.expect_block_mapping_simple_value) - self.expect_node(mapping=True, simple_key=True) - else: - self.write_indicator(u'?', True, indention=True) - self.states.append(self.expect_block_mapping_value) - self.expect_node(mapping=True) - - def expect_block_mapping_simple_value(self): - self.write_indicator(u':', False) - self.states.append(self.expect_block_mapping_key) - self.expect_node(mapping=True) - - def expect_block_mapping_value(self): - self.write_indent() - self.write_indicator(u':', True, indention=True) - self.states.append(self.expect_block_mapping_key) - self.expect_node(mapping=True) - - # Checkers. - - def check_empty_sequence(self): - return (isinstance(self.event, SequenceStartEvent) and self.events - and isinstance(self.events[0], SequenceEndEvent)) - - def check_empty_mapping(self): - return (isinstance(self.event, MappingStartEvent) and self.events - and isinstance(self.events[0], MappingEndEvent)) - - def check_empty_document(self): - if not isinstance(self.event, DocumentStartEvent) or not self.events: - return False - event = self.events[0] - return (isinstance(event, ScalarEvent) and event.anchor is None - and event.tag is None and event.implicit and event.value == u'') - - def check_simple_key(self): - length = 0 - if isinstance(self.event, NodeEvent) and self.event.anchor is not None: - if self.prepared_anchor is None: - self.prepared_anchor = self.prepare_anchor(self.event.anchor) - length += len(self.prepared_anchor) - if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ - and self.event.tag is not None: - if self.prepared_tag is None: - self.prepared_tag = self.prepare_tag(self.event.tag) - length += len(self.prepared_tag) - if isinstance(self.event, ScalarEvent): - if self.analysis is None: - self.analysis = self.analyze_scalar(self.event.value) - length += len(self.analysis.scalar) - return (length < 128 and (isinstance(self.event, AliasEvent) - or (isinstance(self.event, ScalarEvent) - and not self.analysis.empty and not self.analysis.multiline) - or self.check_empty_sequence() or self.check_empty_mapping())) - - # Anchor, Tag, and Scalar processors. - - def process_anchor(self, indicator): - if self.event.anchor is None: - self.prepared_anchor = None - return - if self.prepared_anchor is None: - self.prepared_anchor = self.prepare_anchor(self.event.anchor) - if self.prepared_anchor: - self.write_indicator(indicator+self.prepared_anchor, True) - self.prepared_anchor = None - - def process_tag(self): - tag = self.event.tag - if isinstance(self.event, ScalarEvent): - if self.style is None: - self.style = self.choose_scalar_style() - if ((not self.canonical or tag is None) and - ((self.style == '' and self.event.implicit[0]) - or (self.style != '' and self.event.implicit[1]))): - self.prepared_tag = None - return - if self.event.implicit[0] and tag is None: - tag = u'!' - self.prepared_tag = None - else: - if (not self.canonical or tag is None) and self.event.implicit: - self.prepared_tag = None - return - if tag is None: - raise EmitterError("tag is not specified") - if self.prepared_tag is None: - self.prepared_tag = self.prepare_tag(tag) - if self.prepared_tag: - self.write_indicator(self.prepared_tag, True) - self.prepared_tag = None - - def choose_scalar_style(self): - if self.analysis is None: - self.analysis = self.analyze_scalar(self.event.value) - if self.event.style == '"' or self.canonical: - return '"' - if not self.event.style and self.event.implicit[0]: - if (not (self.simple_key_context and - (self.analysis.empty or self.analysis.multiline)) - and (self.flow_level and self.analysis.allow_flow_plain - or (not self.flow_level and self.analysis.allow_block_plain))): - return '' - if self.event.style and self.event.style in '|>': - if (not self.flow_level and not self.simple_key_context - and self.analysis.allow_block): - return self.event.style - if not self.event.style or self.event.style == '\'': - if (self.analysis.allow_single_quoted and - not (self.simple_key_context and self.analysis.multiline)): - return '\'' - return '"' - - def process_scalar(self): - if self.analysis is None: - self.analysis = self.analyze_scalar(self.event.value) - if self.style is None: - self.style = self.choose_scalar_style() - split = (not self.simple_key_context) - #if self.analysis.multiline and split \ - # and (not self.style or self.style in '\'\"'): - # self.write_indent() - if self.style == '"': - self.write_double_quoted(self.analysis.scalar, split) - elif self.style == '\'': - self.write_single_quoted(self.analysis.scalar, split) - elif self.style == '>': - self.write_folded(self.analysis.scalar) - elif self.style == '|': - self.write_literal(self.analysis.scalar) - else: - self.write_plain(self.analysis.scalar, split) - self.analysis = None - self.style = None - - # Analyzers. - - def prepare_version(self, version): - major, minor = version - if major != 1: - raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) - return u'%d.%d' % (major, minor) - - def prepare_tag_handle(self, handle): - if not handle: - raise EmitterError("tag handle must not be empty") - if handle[0] != u'!' or handle[-1] != u'!': - raise EmitterError("tag handle must start and end with '!': %r" - % (handle.encode('utf-8'))) - for ch in handle[1:-1]: - if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-_'): - raise EmitterError("invalid character %r in the tag handle: %r" - % (ch.encode('utf-8'), handle.encode('utf-8'))) - return handle - - def prepare_tag_prefix(self, prefix): - if not prefix: - raise EmitterError("tag prefix must not be empty") - chunks = [] - start = end = 0 - if prefix[0] == u'!': - end = 1 - while end < len(prefix): - ch = prefix[end] - if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-;/?!:@&=+$,_.~*\'()[]': - end += 1 - else: - if start < end: - chunks.append(prefix[start:end]) - start = end = end+1 - data = ch.encode('utf-8') - for ch in data: - chunks.append(u'%%%02X' % ord(ch)) - if start < end: - chunks.append(prefix[start:end]) - return u''.join(chunks) - - def prepare_tag(self, tag): - if not tag: - raise EmitterError("tag must not be empty") - if tag == u'!': - return tag - handle = None - suffix = tag - prefixes = self.tag_prefixes.keys() - prefixes.sort() - for prefix in prefixes: - if tag.startswith(prefix) \ - and (prefix == u'!' or len(prefix) < len(tag)): - handle = self.tag_prefixes[prefix] - suffix = tag[len(prefix):] - chunks = [] - start = end = 0 - while end < len(suffix): - ch = suffix[end] - if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-;/?:@&=+$,_.~*\'()[]' \ - or (ch == u'!' and handle != u'!'): - end += 1 - else: - if start < end: - chunks.append(suffix[start:end]) - start = end = end+1 - data = ch.encode('utf-8') - for ch in data: - chunks.append(u'%%%02X' % ord(ch)) - if start < end: - chunks.append(suffix[start:end]) - suffix_text = u''.join(chunks) - if handle: - return u'%s%s' % (handle, suffix_text) - else: - return u'!<%s>' % suffix_text - - def prepare_anchor(self, anchor): - if not anchor: - raise EmitterError("anchor must not be empty") - for ch in anchor: - if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-_'): - raise EmitterError("invalid character %r in the anchor: %r" - % (ch.encode('utf-8'), anchor.encode('utf-8'))) - return anchor - - def analyze_scalar(self, scalar): - - # Empty scalar is a special case. - if not scalar: - return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, - allow_flow_plain=False, allow_block_plain=True, - allow_single_quoted=True, allow_double_quoted=True, - allow_block=False) - - # Indicators and special characters. - block_indicators = False - flow_indicators = False - line_breaks = False - special_characters = False - - # Important whitespace combinations. - leading_space = False - leading_break = False - trailing_space = False - trailing_break = False - break_space = False - space_break = False - - # Check document indicators. - if scalar.startswith(u'---') or scalar.startswith(u'...'): - block_indicators = True - flow_indicators = True - - # First character or preceded by a whitespace. - preceeded_by_whitespace = True - - # Last character or followed by a whitespace. - followed_by_whitespace = (len(scalar) == 1 or - scalar[1] in u'\0 \t\r\n\x85\u2028\u2029') - - # The previous character is a space. - previous_space = False - - # The previous character is a break. - previous_break = False - - index = 0 - while index < len(scalar): - ch = scalar[index] - - # Check for indicators. - if index == 0: - # Leading indicators are special characters. - if ch in u'#,[]{}&*!|>\'\"%@`': - flow_indicators = True - block_indicators = True - if ch in u'?:': - flow_indicators = True - if followed_by_whitespace: - block_indicators = True - if ch == u'-' and followed_by_whitespace: - flow_indicators = True - block_indicators = True - else: - # Some indicators cannot appear within a scalar as well. - if ch in u',?[]{}': - flow_indicators = True - if ch == u':': - flow_indicators = True - if followed_by_whitespace: - block_indicators = True - if ch == u'#' and preceeded_by_whitespace: - flow_indicators = True - block_indicators = True - - # Check for line breaks, special, and unicode characters. - if ch in u'\n\x85\u2028\u2029': - line_breaks = True - if not (ch == u'\n' or u'\x20' <= ch <= u'\x7E'): - if (ch == u'\x85' or u'\xA0' <= ch <= u'\uD7FF' - or u'\uE000' <= ch <= u'\uFFFD') and ch != u'\uFEFF': - unicode_characters = True - if not self.allow_unicode: - special_characters = True - else: - special_characters = True - - # Detect important whitespace combinations. - if ch == u' ': - if index == 0: - leading_space = True - if index == len(scalar)-1: - trailing_space = True - if previous_break: - break_space = True - previous_space = True - previous_break = False - elif ch in u'\n\x85\u2028\u2029': - if index == 0: - leading_break = True - if index == len(scalar)-1: - trailing_break = True - if previous_space: - space_break = True - previous_space = False - previous_break = True - else: - previous_space = False - previous_break = False - - # Prepare for the next character. - index += 1 - preceeded_by_whitespace = (ch in u'\0 \t\r\n\x85\u2028\u2029') - followed_by_whitespace = (index+1 >= len(scalar) or - scalar[index+1] in u'\0 \t\r\n\x85\u2028\u2029') - - # Let's decide what styles are allowed. - allow_flow_plain = True - allow_block_plain = True - allow_single_quoted = True - allow_double_quoted = True - allow_block = True - - # Leading and trailing whitespaces are bad for plain scalars. - if (leading_space or leading_break - or trailing_space or trailing_break): - allow_flow_plain = allow_block_plain = False - - # We do not permit trailing spaces for block scalars. - if trailing_space: - allow_block = False - - # Spaces at the beginning of a new line are only acceptable for block - # scalars. - if break_space: - allow_flow_plain = allow_block_plain = allow_single_quoted = False - - # Spaces followed by breaks, as well as special character are only - # allowed for double quoted scalars. - if space_break or special_characters: - allow_flow_plain = allow_block_plain = \ - allow_single_quoted = allow_block = False - - # Although the plain scalar writer supports breaks, we never emit - # multiline plain scalars. - if line_breaks: - allow_flow_plain = allow_block_plain = False - - # Flow indicators are forbidden for flow plain scalars. - if flow_indicators: - allow_flow_plain = False - - # Block indicators are forbidden for block plain scalars. - if block_indicators: - allow_block_plain = False - - return ScalarAnalysis(scalar=scalar, - empty=False, multiline=line_breaks, - allow_flow_plain=allow_flow_plain, - allow_block_plain=allow_block_plain, - allow_single_quoted=allow_single_quoted, - allow_double_quoted=allow_double_quoted, - allow_block=allow_block) - - # Writers. - - def flush_stream(self): - if hasattr(self.stream, 'flush'): - self.stream.flush() - - def write_stream_start(self): - # Write BOM if needed. - if self.encoding and self.encoding.startswith('utf-16'): - self.stream.write(u'\uFEFF'.encode(self.encoding)) - - def write_stream_end(self): - self.flush_stream() - - def write_indicator(self, indicator, need_whitespace, - whitespace=False, indention=False): - if self.whitespace or not need_whitespace: - data = indicator - else: - data = u' '+indicator - self.whitespace = whitespace - self.indention = self.indention and indention - self.column += len(data) - self.open_ended = False - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - - def write_indent(self): - indent = self.indent or 0 - if not self.indention or self.column > indent \ - or (self.column == indent and not self.whitespace): - self.write_line_break() - if self.column < indent: - self.whitespace = True - data = u' '*(indent-self.column) - self.column = indent - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - - def write_line_break(self, data=None): - if data is None: - data = self.best_line_break - self.whitespace = True - self.indention = True - self.line += 1 - self.column = 0 - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - - def write_version_directive(self, version_text): - data = u'%%YAML %s' % version_text - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - self.write_line_break() - - def write_tag_directive(self, handle_text, prefix_text): - data = u'%%TAG %s %s' % (handle_text, prefix_text) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - self.write_line_break() - - # Scalar streams. - - def write_single_quoted(self, text, split=True): - self.write_indicator(u'\'', True) - spaces = False - breaks = False - start = end = 0 - while end <= len(text): - ch = None - if end < len(text): - ch = text[end] - if spaces: - if ch is None or ch != u' ': - if start+1 == end and self.column > self.best_width and split \ - and start != 0 and end != len(text): - self.write_indent() - else: - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end - elif breaks: - if ch is None or ch not in u'\n\x85\u2028\u2029': - if text[start] == u'\n': - self.write_line_break() - for br in text[start:end]: - if br == u'\n': - self.write_line_break() - else: - self.write_line_break(br) - self.write_indent() - start = end - else: - if ch is None or ch in u' \n\x85\u2028\u2029' or ch == u'\'': - if start < end: - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end - if ch == u'\'': - data = u'\'\'' - self.column += 2 - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end + 1 - if ch is not None: - spaces = (ch == u' ') - breaks = (ch in u'\n\x85\u2028\u2029') - end += 1 - self.write_indicator(u'\'', False) - - ESCAPE_REPLACEMENTS = { - u'\0': u'0', - u'\x07': u'a', - u'\x08': u'b', - u'\x09': u't', - u'\x0A': u'n', - u'\x0B': u'v', - u'\x0C': u'f', - u'\x0D': u'r', - u'\x1B': u'e', - u'\"': u'\"', - u'\\': u'\\', - u'\x85': u'N', - u'\xA0': u'_', - u'\u2028': u'L', - u'\u2029': u'P', - } - - def write_double_quoted(self, text, split=True): - self.write_indicator(u'"', True) - start = end = 0 - while end <= len(text): - ch = None - if end < len(text): - ch = text[end] - if ch is None or ch in u'"\\\x85\u2028\u2029\uFEFF' \ - or not (u'\x20' <= ch <= u'\x7E' - or (self.allow_unicode - and (u'\xA0' <= ch <= u'\uD7FF' - or u'\uE000' <= ch <= u'\uFFFD'))): - if start < end: - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end - if ch is not None: - if ch in self.ESCAPE_REPLACEMENTS: - data = u'\\'+self.ESCAPE_REPLACEMENTS[ch] - elif ch <= u'\xFF': - data = u'\\x%02X' % ord(ch) - elif ch <= u'\uFFFF': - data = u'\\u%04X' % ord(ch) - else: - data = u'\\U%08X' % ord(ch) - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end+1 - if 0 < end < len(text)-1 and (ch == u' ' or start >= end) \ - and self.column+(end-start) > self.best_width and split: - data = text[start:end]+u'\\' - if start < end: - start = end - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - self.write_indent() - self.whitespace = False - self.indention = False - if text[start] == u' ': - data = u'\\' - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - end += 1 - self.write_indicator(u'"', False) - - def determine_block_hints(self, text): - hints = u'' - if text: - if text[0] in u' \n\x85\u2028\u2029': - hints += unicode(self.best_indent) - if text[-1] not in u'\n\x85\u2028\u2029': - hints += u'-' - elif len(text) == 1 or text[-2] in u'\n\x85\u2028\u2029': - hints += u'+' - return hints - - def write_folded(self, text): - hints = self.determine_block_hints(text) - self.write_indicator(u'>'+hints, True) - if hints[-1:] == u'+': - self.open_ended = True - self.write_line_break() - leading_space = True - spaces = False - breaks = True - start = end = 0 - while end <= len(text): - ch = None - if end < len(text): - ch = text[end] - if breaks: - if ch is None or ch not in u'\n\x85\u2028\u2029': - if not leading_space and ch is not None and ch != u' ' \ - and text[start] == u'\n': - self.write_line_break() - leading_space = (ch == u' ') - for br in text[start:end]: - if br == u'\n': - self.write_line_break() - else: - self.write_line_break(br) - if ch is not None: - self.write_indent() - start = end - elif spaces: - if ch != u' ': - if start+1 == end and self.column > self.best_width: - self.write_indent() - else: - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end - else: - if ch is None or ch in u' \n\x85\u2028\u2029': - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - if ch is None: - self.write_line_break() - start = end - if ch is not None: - breaks = (ch in u'\n\x85\u2028\u2029') - spaces = (ch == u' ') - end += 1 - - def write_literal(self, text): - hints = self.determine_block_hints(text) - self.write_indicator(u'|'+hints, True) - if hints[-1:] == u'+': - self.open_ended = True - self.write_line_break() - breaks = True - start = end = 0 - while end <= len(text): - ch = None - if end < len(text): - ch = text[end] - if breaks: - if ch is None or ch not in u'\n\x85\u2028\u2029': - for br in text[start:end]: - if br == u'\n': - self.write_line_break() - else: - self.write_line_break(br) - if ch is not None: - self.write_indent() - start = end - else: - if ch is None or ch in u'\n\x85\u2028\u2029': - data = text[start:end] - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - if ch is None: - self.write_line_break() - start = end - if ch is not None: - breaks = (ch in u'\n\x85\u2028\u2029') - end += 1 - - def write_plain(self, text, split=True): - if self.root_context: - self.open_ended = True - if not text: - return - if not self.whitespace: - data = u' ' - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - self.whitespace = False - self.indention = False - spaces = False - breaks = False - start = end = 0 - while end <= len(text): - ch = None - if end < len(text): - ch = text[end] - if spaces: - if ch != u' ': - if start+1 == end and self.column > self.best_width and split: - self.write_indent() - self.whitespace = False - self.indention = False - else: - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end - elif breaks: - if ch not in u'\n\x85\u2028\u2029': - if text[start] == u'\n': - self.write_line_break() - for br in text[start:end]: - if br == u'\n': - self.write_line_break() - else: - self.write_line_break(br) - self.write_indent() - self.whitespace = False - self.indention = False - start = end - else: - if ch is None or ch in u' \n\x85\u2028\u2029': - data = text[start:end] - self.column += len(data) - if self.encoding: - data = data.encode(self.encoding) - self.stream.write(data) - start = end - if ch is not None: - spaces = (ch == u' ') - breaks = (ch in u'\n\x85\u2028\u2029') - end += 1 - diff --git a/lib/spack/external/yaml/error.py b/lib/spack/external/yaml/error.py deleted file mode 100644 index 577686db5f..0000000000 --- a/lib/spack/external/yaml/error.py +++ /dev/null @@ -1,75 +0,0 @@ - -__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] - -class Mark(object): - - def __init__(self, name, index, line, column, buffer, pointer): - self.name = name - self.index = index - self.line = line - self.column = column - self.buffer = buffer - self.pointer = pointer - - def get_snippet(self, indent=4, max_length=75): - if self.buffer is None: - return None - head = '' - start = self.pointer - while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029': - start -= 1 - if self.pointer-start > max_length/2-1: - head = ' ... ' - start += 5 - break - tail = '' - end = self.pointer - while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029': - end += 1 - if end-self.pointer > max_length/2-1: - tail = ' ... ' - end -= 5 - break - snippet = self.buffer[start:end].encode('utf-8') - return ' '*indent + head + snippet + tail + '\n' \ - + ' '*(indent+self.pointer-start+len(head)) + '^' - - def __str__(self): - snippet = self.get_snippet() - where = " in \"%s\", line %d, column %d" \ - % (self.name, self.line+1, self.column+1) - if snippet is not None: - where += ":\n"+snippet - return where - -class YAMLError(Exception): - pass - -class MarkedYAMLError(YAMLError): - - def __init__(self, context=None, context_mark=None, - problem=None, problem_mark=None, note=None): - self.context = context - self.context_mark = context_mark - self.problem = problem - self.problem_mark = problem_mark - self.note = note - - def __str__(self): - lines = [] - if self.context is not None: - lines.append(self.context) - if self.context_mark is not None \ - and (self.problem is None or self.problem_mark is None - or self.context_mark.name != self.problem_mark.name - or self.context_mark.line != self.problem_mark.line - or self.context_mark.column != self.problem_mark.column): - lines.append(str(self.context_mark)) - if self.problem is not None: - lines.append(self.problem) - if self.problem_mark is not None: - lines.append(str(self.problem_mark)) - if self.note is not None: - lines.append(self.note) - return '\n'.join(lines) - diff --git a/lib/spack/external/yaml/events.py b/lib/spack/external/yaml/events.py deleted file mode 100644 index f79ad389cb..0000000000 --- a/lib/spack/external/yaml/events.py +++ /dev/null @@ -1,86 +0,0 @@ - -# Abstract classes. - -class Event(object): - def __init__(self, start_mark=None, end_mark=None): - self.start_mark = start_mark - self.end_mark = end_mark - def __repr__(self): - attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] - if hasattr(self, key)] - arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) - for key in attributes]) - return '%s(%s)' % (self.__class__.__name__, arguments) - -class NodeEvent(Event): - def __init__(self, anchor, start_mark=None, end_mark=None): - self.anchor = anchor - self.start_mark = start_mark - self.end_mark = end_mark - -class CollectionStartEvent(NodeEvent): - def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, - flow_style=None): - self.anchor = anchor - self.tag = tag - self.implicit = implicit - self.start_mark = start_mark - self.end_mark = end_mark - self.flow_style = flow_style - -class CollectionEndEvent(Event): - pass - -# Implementations. - -class StreamStartEvent(Event): - def __init__(self, start_mark=None, end_mark=None, encoding=None): - self.start_mark = start_mark - self.end_mark = end_mark - self.encoding = encoding - -class StreamEndEvent(Event): - pass - -class DocumentStartEvent(Event): - def __init__(self, start_mark=None, end_mark=None, - explicit=None, version=None, tags=None): - self.start_mark = start_mark - self.end_mark = end_mark - self.explicit = explicit - self.version = version - self.tags = tags - -class DocumentEndEvent(Event): - def __init__(self, start_mark=None, end_mark=None, - explicit=None): - self.start_mark = start_mark - self.end_mark = end_mark - self.explicit = explicit - -class AliasEvent(NodeEvent): - pass - -class ScalarEvent(NodeEvent): - def __init__(self, anchor, tag, implicit, value, - start_mark=None, end_mark=None, style=None): - self.anchor = anchor - self.tag = tag - self.implicit = implicit - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - self.style = style - -class SequenceStartEvent(CollectionStartEvent): - pass - -class SequenceEndEvent(CollectionEndEvent): - pass - -class MappingStartEvent(CollectionStartEvent): - pass - -class MappingEndEvent(CollectionEndEvent): - pass - diff --git a/lib/spack/external/yaml/lib/yaml/__init__.py b/lib/spack/external/yaml/lib/yaml/__init__.py new file mode 100644 index 0000000000..87c15d38aa --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/__init__.py @@ -0,0 +1,315 @@ + +from error import * + +from tokens import * +from events import * +from nodes import * + +from loader import * +from dumper import * + +__version__ = '3.12' + +try: + from cyaml import * + __with_libyaml__ = True +except ImportError: + __with_libyaml__ = False + +def scan(stream, Loader=Loader): + """ + Scan a YAML stream and produce scanning tokens. + """ + loader = Loader(stream) + try: + while loader.check_token(): + yield loader.get_token() + finally: + loader.dispose() + +def parse(stream, Loader=Loader): + """ + Parse a YAML stream and produce parsing events. + """ + loader = Loader(stream) + try: + while loader.check_event(): + yield loader.get_event() + finally: + loader.dispose() + +def compose(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding representation tree. + """ + loader = Loader(stream) + try: + return loader.get_single_node() + finally: + loader.dispose() + +def compose_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding representation trees. + """ + loader = Loader(stream) + try: + while loader.check_node(): + yield loader.get_node() + finally: + loader.dispose() + +def load(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + """ + loader = Loader(stream) + try: + return loader.get_single_data() + finally: + loader.dispose() + +def load_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + """ + loader = Loader(stream) + try: + while loader.check_data(): + yield loader.get_data() + finally: + loader.dispose() + +def safe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + Resolve only basic YAML tags. + """ + return load(stream, SafeLoader) + +def safe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + Resolve only basic YAML tags. + """ + return load_all(stream, SafeLoader) + +def emit(events, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + """ + Emit YAML parsing events into a stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + from StringIO import StringIO + stream = StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + try: + for event in events: + dumper.emit(event) + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize_all(nodes, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding='utf-8', explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of representation trees into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + from StringIO import StringIO + else: + from cStringIO import StringIO + stream = StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for node in nodes: + dumper.serialize(node) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize(node, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a representation tree into a YAML stream. + If stream is None, return the produced string instead. + """ + return serialize_all([node], stream, Dumper=Dumper, **kwds) + +def dump_all(documents, stream=None, Dumper=Dumper, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding='utf-8', explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of Python objects into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + from StringIO import StringIO + else: + from cStringIO import StringIO + stream = StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, default_style=default_style, + default_flow_style=default_flow_style, + canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for data in documents: + dumper.represent(data) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def dump(data, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a Python object into a YAML stream. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=Dumper, **kwds) + +def safe_dump_all(documents, stream=None, **kwds): + """ + Serialize a sequence of Python objects into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all(documents, stream, Dumper=SafeDumper, **kwds) + +def safe_dump(data, stream=None, **kwds): + """ + Serialize a Python object into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=SafeDumper, **kwds) + +def add_implicit_resolver(tag, regexp, first=None, + Loader=Loader, Dumper=Dumper): + """ + Add an implicit scalar detector. + If an implicit scalar value matches the given regexp, + the corresponding tag is assigned to the scalar. + first is a sequence of possible initial characters or None. + """ + Loader.add_implicit_resolver(tag, regexp, first) + Dumper.add_implicit_resolver(tag, regexp, first) + +def add_path_resolver(tag, path, kind=None, Loader=Loader, Dumper=Dumper): + """ + Add a path based resolver for the given tag. + A path is a list of keys that forms a path + to a node in the representation tree. + Keys can be string values, integers, or None. + """ + Loader.add_path_resolver(tag, path, kind) + Dumper.add_path_resolver(tag, path, kind) + +def add_constructor(tag, constructor, Loader=Loader): + """ + Add a constructor for the given tag. + Constructor is a function that accepts a Loader instance + and a node object and produces the corresponding Python object. + """ + Loader.add_constructor(tag, constructor) + +def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): + """ + Add a multi-constructor for the given tag prefix. + Multi-constructor is called for a node if its tag starts with tag_prefix. + Multi-constructor accepts a Loader instance, a tag suffix, + and a node object and produces the corresponding Python object. + """ + Loader.add_multi_constructor(tag_prefix, multi_constructor) + +def add_representer(data_type, representer, Dumper=Dumper): + """ + Add a representer for the given type. + Representer is a function accepting a Dumper instance + and an instance of the given data type + and producing the corresponding representation node. + """ + Dumper.add_representer(data_type, representer) + +def add_multi_representer(data_type, multi_representer, Dumper=Dumper): + """ + Add a representer for the given type. + Multi-representer is a function accepting a Dumper instance + and an instance of the given data type or subtype + and producing the corresponding representation node. + """ + Dumper.add_multi_representer(data_type, multi_representer) + +class YAMLObjectMetaclass(type): + """ + The metaclass for YAMLObject. + """ + def __init__(cls, name, bases, kwds): + super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) + if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: + cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) + cls.yaml_dumper.add_representer(cls, cls.to_yaml) + +class YAMLObject(object): + """ + An object that can dump itself to a YAML stream + and load itself from a YAML stream. + """ + + __metaclass__ = YAMLObjectMetaclass + __slots__ = () # no direct instantiation, so allow immutable subclasses + + yaml_loader = Loader + yaml_dumper = Dumper + + yaml_tag = None + yaml_flow_style = None + + def from_yaml(cls, loader, node): + """ + Convert a representation node to a Python object. + """ + return loader.construct_yaml_object(node, cls) + from_yaml = classmethod(from_yaml) + + def to_yaml(cls, dumper, data): + """ + Convert a Python object to a representation node. + """ + return dumper.represent_yaml_object(cls.yaml_tag, data, cls, + flow_style=cls.yaml_flow_style) + to_yaml = classmethod(to_yaml) + diff --git a/lib/spack/external/yaml/lib/yaml/composer.py b/lib/spack/external/yaml/lib/yaml/composer.py new file mode 100644 index 0000000000..06e5ac782f --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/composer.py @@ -0,0 +1,139 @@ + +__all__ = ['Composer', 'ComposerError'] + +from error import MarkedYAMLError +from events import * +from nodes import * + +class ComposerError(MarkedYAMLError): + pass + +class Composer(object): + + def __init__(self): + self.anchors = {} + + def check_node(self): + # Drop the STREAM-START event. + if self.check_event(StreamStartEvent): + self.get_event() + + # If there are more documents available? + return not self.check_event(StreamEndEvent) + + def get_node(self): + # Get the root node of the next document. + if not self.check_event(StreamEndEvent): + return self.compose_document() + + def get_single_node(self): + # Drop the STREAM-START event. + self.get_event() + + # Compose a document if the stream is not empty. + document = None + if not self.check_event(StreamEndEvent): + document = self.compose_document() + + # Ensure that the stream contains no more documents. + if not self.check_event(StreamEndEvent): + event = self.get_event() + raise ComposerError("expected a single document in the stream", + document.start_mark, "but found another document", + event.start_mark) + + # Drop the STREAM-END event. + self.get_event() + + return document + + def compose_document(self): + # Drop the DOCUMENT-START event. + self.get_event() + + # Compose the root node. + node = self.compose_node(None, None) + + # Drop the DOCUMENT-END event. + self.get_event() + + self.anchors = {} + return node + + def compose_node(self, parent, index): + if self.check_event(AliasEvent): + event = self.get_event() + anchor = event.anchor + if anchor not in self.anchors: + raise ComposerError(None, None, "found undefined alias %r" + % anchor.encode('utf-8'), event.start_mark) + return self.anchors[anchor] + event = self.peek_event() + anchor = event.anchor + if anchor is not None: + if anchor in self.anchors: + raise ComposerError("found duplicate anchor %r; first occurence" + % anchor.encode('utf-8'), self.anchors[anchor].start_mark, + "second occurence", event.start_mark) + self.descend_resolver(parent, index) + if self.check_event(ScalarEvent): + node = self.compose_scalar_node(anchor) + elif self.check_event(SequenceStartEvent): + node = self.compose_sequence_node(anchor) + elif self.check_event(MappingStartEvent): + node = self.compose_mapping_node(anchor) + self.ascend_resolver() + return node + + def compose_scalar_node(self, anchor): + event = self.get_event() + tag = event.tag + if tag is None or tag == u'!': + tag = self.resolve(ScalarNode, event.value, event.implicit) + node = ScalarNode(tag, event.value, + event.start_mark, event.end_mark, style=event.style) + if anchor is not None: + self.anchors[anchor] = node + return node + + def compose_sequence_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == u'!': + tag = self.resolve(SequenceNode, None, start_event.implicit) + node = SequenceNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + index = 0 + while not self.check_event(SequenceEndEvent): + node.value.append(self.compose_node(node, index)) + index += 1 + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + + def compose_mapping_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == u'!': + tag = self.resolve(MappingNode, None, start_event.implicit) + node = MappingNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + while not self.check_event(MappingEndEvent): + #key_event = self.peek_event() + item_key = self.compose_node(node, None) + #if item_key in node.value: + # raise ComposerError("while composing a mapping", start_event.start_mark, + # "found duplicate key", key_event.start_mark) + item_value = self.compose_node(node, item_key) + #node.value[item_key] = item_value + node.value.append((item_key, item_value)) + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + diff --git a/lib/spack/external/yaml/lib/yaml/constructor.py b/lib/spack/external/yaml/lib/yaml/constructor.py new file mode 100644 index 0000000000..635faac3e6 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/constructor.py @@ -0,0 +1,675 @@ + +__all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', + 'ConstructorError'] + +from error import * +from nodes import * + +import datetime + +import binascii, re, sys, types + +class ConstructorError(MarkedYAMLError): + pass + +class BaseConstructor(object): + + yaml_constructors = {} + yaml_multi_constructors = {} + + def __init__(self): + self.constructed_objects = {} + self.recursive_objects = {} + self.state_generators = [] + self.deep_construct = False + + def check_data(self): + # If there are more documents available? + return self.check_node() + + def get_data(self): + # Construct and return the next document. + if self.check_node(): + return self.construct_document(self.get_node()) + + def get_single_data(self): + # Ensure that the stream contains a single document and construct it. + node = self.get_single_node() + if node is not None: + return self.construct_document(node) + return None + + def construct_document(self, node): + data = self.construct_object(node) + while self.state_generators: + state_generators = self.state_generators + self.state_generators = [] + for generator in state_generators: + for dummy in generator: + pass + self.constructed_objects = {} + self.recursive_objects = {} + self.deep_construct = False + return data + + def construct_object(self, node, deep=False): + if node in self.constructed_objects: + return self.constructed_objects[node] + if deep: + old_deep = self.deep_construct + self.deep_construct = True + if node in self.recursive_objects: + raise ConstructorError(None, None, + "found unconstructable recursive node", node.start_mark) + self.recursive_objects[node] = None + constructor = None + tag_suffix = None + if node.tag in self.yaml_constructors: + constructor = self.yaml_constructors[node.tag] + else: + for tag_prefix in self.yaml_multi_constructors: + if node.tag.startswith(tag_prefix): + tag_suffix = node.tag[len(tag_prefix):] + constructor = self.yaml_multi_constructors[tag_prefix] + break + else: + if None in self.yaml_multi_constructors: + tag_suffix = node.tag + constructor = self.yaml_multi_constructors[None] + elif None in self.yaml_constructors: + constructor = self.yaml_constructors[None] + elif isinstance(node, ScalarNode): + constructor = self.__class__.construct_scalar + elif isinstance(node, SequenceNode): + constructor = self.__class__.construct_sequence + elif isinstance(node, MappingNode): + constructor = self.__class__.construct_mapping + if tag_suffix is None: + data = constructor(self, node) + else: + data = constructor(self, tag_suffix, node) + if isinstance(data, types.GeneratorType): + generator = data + data = generator.next() + if self.deep_construct: + for dummy in generator: + pass + else: + self.state_generators.append(generator) + self.constructed_objects[node] = data + del self.recursive_objects[node] + if deep: + self.deep_construct = old_deep + return data + + def construct_scalar(self, node): + if not isinstance(node, ScalarNode): + raise ConstructorError(None, None, + "expected a scalar node, but found %s" % node.id, + node.start_mark) + return node.value + + def construct_sequence(self, node, deep=False): + if not isinstance(node, SequenceNode): + raise ConstructorError(None, None, + "expected a sequence node, but found %s" % node.id, + node.start_mark) + return [self.construct_object(child, deep=deep) + for child in node.value] + + def construct_mapping(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + mapping = {} + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + try: + hash(key) + except TypeError, exc: + raise ConstructorError("while constructing a mapping", node.start_mark, + "found unacceptable key (%s)" % exc, key_node.start_mark) + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + def construct_pairs(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + pairs = [] + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + value = self.construct_object(value_node, deep=deep) + pairs.append((key, value)) + return pairs + + def add_constructor(cls, tag, constructor): + if not 'yaml_constructors' in cls.__dict__: + cls.yaml_constructors = cls.yaml_constructors.copy() + cls.yaml_constructors[tag] = constructor + add_constructor = classmethod(add_constructor) + + def add_multi_constructor(cls, tag_prefix, multi_constructor): + if not 'yaml_multi_constructors' in cls.__dict__: + cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() + cls.yaml_multi_constructors[tag_prefix] = multi_constructor + add_multi_constructor = classmethod(add_multi_constructor) + +class SafeConstructor(BaseConstructor): + + def construct_scalar(self, node): + if isinstance(node, MappingNode): + for key_node, value_node in node.value: + if key_node.tag == u'tag:yaml.org,2002:value': + return self.construct_scalar(value_node) + return BaseConstructor.construct_scalar(self, node) + + def flatten_mapping(self, node): + merge = [] + index = 0 + while index < len(node.value): + key_node, value_node = node.value[index] + if key_node.tag == u'tag:yaml.org,2002:merge': + del node.value[index] + if isinstance(value_node, MappingNode): + self.flatten_mapping(value_node) + merge.extend(value_node.value) + elif isinstance(value_node, SequenceNode): + submerge = [] + for subnode in value_node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing a mapping", + node.start_mark, + "expected a mapping for merging, but found %s" + % subnode.id, subnode.start_mark) + self.flatten_mapping(subnode) + submerge.append(subnode.value) + submerge.reverse() + for value in submerge: + merge.extend(value) + else: + raise ConstructorError("while constructing a mapping", node.start_mark, + "expected a mapping or list of mappings for merging, but found %s" + % value_node.id, value_node.start_mark) + elif key_node.tag == u'tag:yaml.org,2002:value': + key_node.tag = u'tag:yaml.org,2002:str' + index += 1 + else: + index += 1 + if merge: + node.value = merge + node.value + + def construct_mapping(self, node, deep=False): + if isinstance(node, MappingNode): + self.flatten_mapping(node) + return BaseConstructor.construct_mapping(self, node, deep=deep) + + def construct_yaml_null(self, node): + self.construct_scalar(node) + return None + + bool_values = { + u'yes': True, + u'no': False, + u'true': True, + u'false': False, + u'on': True, + u'off': False, + } + + def construct_yaml_bool(self, node): + value = self.construct_scalar(node) + return self.bool_values[value.lower()] + + def construct_yaml_int(self, node): + value = str(self.construct_scalar(node)) + value = value.replace('_', '') + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '0': + return 0 + elif value.startswith('0b'): + return sign*int(value[2:], 2) + elif value.startswith('0x'): + return sign*int(value[2:], 16) + elif value[0] == '0': + return sign*int(value, 8) + elif ':' in value: + digits = [int(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*int(value) + + inf_value = 1e300 + while inf_value != inf_value*inf_value: + inf_value *= inf_value + nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99). + + def construct_yaml_float(self, node): + value = str(self.construct_scalar(node)) + value = value.replace('_', '').lower() + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '.inf': + return sign*self.inf_value + elif value == '.nan': + return self.nan_value + elif ':' in value: + digits = [float(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0.0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*float(value) + + def construct_yaml_binary(self, node): + value = self.construct_scalar(node) + try: + return str(value).decode('base64') + except (binascii.Error, UnicodeEncodeError), exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + timestamp_regexp = re.compile( + ur'''^(?P[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)?$''', re.X) + + def construct_yaml_timestamp(self, node): + value = self.construct_scalar(node) + match = self.timestamp_regexp.match(node.value) + values = match.groupdict() + year = int(values['year']) + month = int(values['month']) + day = int(values['day']) + if not values['hour']: + return datetime.date(year, month, day) + hour = int(values['hour']) + minute = int(values['minute']) + second = int(values['second']) + fraction = 0 + if values['fraction']: + fraction = values['fraction'][:6] + while len(fraction) < 6: + fraction += '0' + fraction = int(fraction) + delta = None + if values['tz_sign']: + tz_hour = int(values['tz_hour']) + tz_minute = int(values['tz_minute'] or 0) + delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) + if values['tz_sign'] == '-': + delta = -delta + data = datetime.datetime(year, month, day, hour, minute, second, fraction) + if delta: + data -= delta + return data + + def construct_yaml_omap(self, node): + # Note: we do not check for duplicate keys, because it's too + # CPU-expensive. + omap = [] + yield omap + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + omap.append((key, value)) + + def construct_yaml_pairs(self, node): + # Note: the same code as `construct_yaml_omap`. + pairs = [] + yield pairs + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + pairs.append((key, value)) + + def construct_yaml_set(self, node): + data = set() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_str(self, node): + value = self.construct_scalar(node) + try: + return value.encode('ascii') + except UnicodeEncodeError: + return value + + def construct_yaml_seq(self, node): + data = [] + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = {} + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_object(self, node, cls): + data = cls.__new__(cls) + yield data + if hasattr(data, '__setstate__'): + state = self.construct_mapping(node, deep=True) + data.__setstate__(state) + else: + state = self.construct_mapping(node) + data.__dict__.update(state) + + def construct_undefined(self, node): + raise ConstructorError(None, None, + "could not determine a constructor for the tag %r" % node.tag.encode('utf-8'), + node.start_mark) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:null', + SafeConstructor.construct_yaml_null) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:bool', + SafeConstructor.construct_yaml_bool) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:int', + SafeConstructor.construct_yaml_int) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:float', + SafeConstructor.construct_yaml_float) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:binary', + SafeConstructor.construct_yaml_binary) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:timestamp', + SafeConstructor.construct_yaml_timestamp) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:omap', + SafeConstructor.construct_yaml_omap) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:pairs', + SafeConstructor.construct_yaml_pairs) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:set', + SafeConstructor.construct_yaml_set) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:str', + SafeConstructor.construct_yaml_str) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:seq', + SafeConstructor.construct_yaml_seq) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:map', + SafeConstructor.construct_yaml_map) + +SafeConstructor.add_constructor(None, + SafeConstructor.construct_undefined) + +class Constructor(SafeConstructor): + + def construct_python_str(self, node): + return self.construct_scalar(node).encode('utf-8') + + def construct_python_unicode(self, node): + return self.construct_scalar(node) + + def construct_python_long(self, node): + return long(self.construct_yaml_int(node)) + + def construct_python_complex(self, node): + return complex(self.construct_scalar(node)) + + def construct_python_tuple(self, node): + return tuple(self.construct_sequence(node)) + + def find_python_module(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python module", mark, + "expected non-empty name appended to the tag", mark) + try: + __import__(name) + except ImportError, exc: + raise ConstructorError("while constructing a Python module", mark, + "cannot find module %r (%s)" % (name.encode('utf-8'), exc), mark) + return sys.modules[name] + + def find_python_name(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python object", mark, + "expected non-empty name appended to the tag", mark) + if u'.' in name: + module_name, object_name = name.rsplit('.', 1) + else: + module_name = '__builtin__' + object_name = name + try: + __import__(module_name) + except ImportError, exc: + raise ConstructorError("while constructing a Python object", mark, + "cannot find module %r (%s)" % (module_name.encode('utf-8'), exc), mark) + module = sys.modules[module_name] + if not hasattr(module, object_name): + raise ConstructorError("while constructing a Python object", mark, + "cannot find %r in the module %r" % (object_name.encode('utf-8'), + module.__name__), mark) + return getattr(module, object_name) + + def construct_python_name(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python name", node.start_mark, + "expected the empty value, but found %r" % value.encode('utf-8'), + node.start_mark) + return self.find_python_name(suffix, node.start_mark) + + def construct_python_module(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python module", node.start_mark, + "expected the empty value, but found %r" % value.encode('utf-8'), + node.start_mark) + return self.find_python_module(suffix, node.start_mark) + + class classobj: pass + + def make_python_instance(self, suffix, node, + args=None, kwds=None, newobj=False): + if not args: + args = [] + if not kwds: + kwds = {} + cls = self.find_python_name(suffix, node.start_mark) + if newobj and isinstance(cls, type(self.classobj)) \ + and not args and not kwds: + instance = self.classobj() + instance.__class__ = cls + return instance + elif newobj and isinstance(cls, type): + return cls.__new__(cls, *args, **kwds) + else: + return cls(*args, **kwds) + + def set_python_instance_state(self, instance, state): + if hasattr(instance, '__setstate__'): + instance.__setstate__(state) + else: + slotstate = {} + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + if hasattr(instance, '__dict__'): + instance.__dict__.update(state) + elif state: + slotstate.update(state) + for key, value in slotstate.items(): + setattr(object, key, value) + + def construct_python_object(self, suffix, node): + # Format: + # !!python/object:module.name { ... state ... } + instance = self.make_python_instance(suffix, node, newobj=True) + yield instance + deep = hasattr(instance, '__setstate__') + state = self.construct_mapping(node, deep=deep) + self.set_python_instance_state(instance, state) + + def construct_python_object_apply(self, suffix, node, newobj=False): + # Format: + # !!python/object/apply # (or !!python/object/new) + # args: [ ... arguments ... ] + # kwds: { ... keywords ... } + # state: ... state ... + # listitems: [ ... listitems ... ] + # dictitems: { ... dictitems ... } + # or short format: + # !!python/object/apply [ ... arguments ... ] + # The difference between !!python/object/apply and !!python/object/new + # is how an object is created, check make_python_instance for details. + if isinstance(node, SequenceNode): + args = self.construct_sequence(node, deep=True) + kwds = {} + state = {} + listitems = [] + dictitems = {} + else: + value = self.construct_mapping(node, deep=True) + args = value.get('args', []) + kwds = value.get('kwds', {}) + state = value.get('state', {}) + listitems = value.get('listitems', []) + dictitems = value.get('dictitems', {}) + instance = self.make_python_instance(suffix, node, args, kwds, newobj) + if state: + self.set_python_instance_state(instance, state) + if listitems: + instance.extend(listitems) + if dictitems: + for key in dictitems: + instance[key] = dictitems[key] + return instance + + def construct_python_object_new(self, suffix, node): + return self.construct_python_object_apply(suffix, node, newobj=True) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/none', + Constructor.construct_yaml_null) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/bool', + Constructor.construct_yaml_bool) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/str', + Constructor.construct_python_str) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/unicode', + Constructor.construct_python_unicode) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/int', + Constructor.construct_yaml_int) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/long', + Constructor.construct_python_long) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/float', + Constructor.construct_yaml_float) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/complex', + Constructor.construct_python_complex) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/list', + Constructor.construct_yaml_seq) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/tuple', + Constructor.construct_python_tuple) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/dict', + Constructor.construct_yaml_map) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/name:', + Constructor.construct_python_name) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/module:', + Constructor.construct_python_module) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/object:', + Constructor.construct_python_object) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/object/apply:', + Constructor.construct_python_object_apply) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/object/new:', + Constructor.construct_python_object_new) + diff --git a/lib/spack/external/yaml/lib/yaml/cyaml.py b/lib/spack/external/yaml/lib/yaml/cyaml.py new file mode 100644 index 0000000000..68dcd75192 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/cyaml.py @@ -0,0 +1,85 @@ + +__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', + 'CBaseDumper', 'CSafeDumper', 'CDumper'] + +from _yaml import CParser, CEmitter + +from constructor import * + +from serializer import * +from representer import * + +from resolver import * + +class CBaseLoader(CParser, BaseConstructor, BaseResolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class CSafeLoader(CParser, SafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class CLoader(CParser, Constructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + Constructor.__init__(self) + Resolver.__init__(self) + +class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CSafeDumper(CEmitter, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CDumper(CEmitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/lib/spack/external/yaml/lib/yaml/dumper.py b/lib/spack/external/yaml/lib/yaml/dumper.py new file mode 100644 index 0000000000..f811d2c919 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/dumper.py @@ -0,0 +1,62 @@ + +__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] + +from emitter import * +from serializer import * +from representer import * +from resolver import * + +class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class Dumper(Emitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/lib/spack/external/yaml/lib/yaml/emitter.py b/lib/spack/external/yaml/lib/yaml/emitter.py new file mode 100644 index 0000000000..e5bcdcccbb --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/emitter.py @@ -0,0 +1,1140 @@ + +# Emitter expects events obeying the following grammar: +# stream ::= STREAM-START document* STREAM-END +# document ::= DOCUMENT-START node DOCUMENT-END +# node ::= SCALAR | sequence | mapping +# sequence ::= SEQUENCE-START node* SEQUENCE-END +# mapping ::= MAPPING-START (node node)* MAPPING-END + +__all__ = ['Emitter', 'EmitterError'] + +from error import YAMLError +from events import * + +class EmitterError(YAMLError): + pass + +class ScalarAnalysis(object): + def __init__(self, scalar, empty, multiline, + allow_flow_plain, allow_block_plain, + allow_single_quoted, allow_double_quoted, + allow_block): + self.scalar = scalar + self.empty = empty + self.multiline = multiline + self.allow_flow_plain = allow_flow_plain + self.allow_block_plain = allow_block_plain + self.allow_single_quoted = allow_single_quoted + self.allow_double_quoted = allow_double_quoted + self.allow_block = allow_block + +class Emitter(object): + + DEFAULT_TAG_PREFIXES = { + u'!' : u'!', + u'tag:yaml.org,2002:' : u'!!', + } + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + + # The stream should have the methods `write` and possibly `flush`. + self.stream = stream + + # Encoding can be overriden by STREAM-START. + self.encoding = None + + # Emitter is a state machine with a stack of states to handle nested + # structures. + self.states = [] + self.state = self.expect_stream_start + + # Current event and the event queue. + self.events = [] + self.event = None + + # The current indentation level and the stack of previous indents. + self.indents = [] + self.indent = None + + # Flow level. + self.flow_level = 0 + + # Contexts. + self.root_context = False + self.sequence_context = False + self.mapping_context = False + self.simple_key_context = False + + # Characteristics of the last emitted character: + # - current position. + # - is it a whitespace? + # - is it an indention character + # (indentation space, '-', '?', or ':')? + self.line = 0 + self.column = 0 + self.whitespace = True + self.indention = True + + # Whether the document requires an explicit document indicator + self.open_ended = False + + # Formatting details. + self.canonical = canonical + self.allow_unicode = allow_unicode + self.best_indent = 2 + if indent and 1 < indent < 10: + self.best_indent = indent + self.best_width = 80 + if width and width > self.best_indent*2: + self.best_width = width + self.best_line_break = u'\n' + if line_break in [u'\r', u'\n', u'\r\n']: + self.best_line_break = line_break + + # Tag prefixes. + self.tag_prefixes = None + + # Prepared anchor and tag. + self.prepared_anchor = None + self.prepared_tag = None + + # Scalar analysis and style. + self.analysis = None + self.style = None + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def emit(self, event): + self.events.append(event) + while not self.need_more_events(): + self.event = self.events.pop(0) + self.state() + self.event = None + + # In some cases, we wait for a few next events before emitting. + + def need_more_events(self): + if not self.events: + return True + event = self.events[0] + if isinstance(event, DocumentStartEvent): + return self.need_events(1) + elif isinstance(event, SequenceStartEvent): + return self.need_events(2) + elif isinstance(event, MappingStartEvent): + return self.need_events(3) + else: + return False + + def need_events(self, count): + level = 0 + for event in self.events[1:]: + if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): + level += 1 + elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): + level -= 1 + elif isinstance(event, StreamEndEvent): + level = -1 + if level < 0: + return False + return (len(self.events) < count+1) + + def increase_indent(self, flow=False, indentless=False): + self.indents.append(self.indent) + if self.indent is None: + if flow: + self.indent = self.best_indent + else: + self.indent = 0 + elif not indentless: + self.indent += self.best_indent + + # States. + + # Stream handlers. + + def expect_stream_start(self): + if isinstance(self.event, StreamStartEvent): + if self.event.encoding and not getattr(self.stream, 'encoding', None): + self.encoding = self.event.encoding + self.write_stream_start() + self.state = self.expect_first_document_start + else: + raise EmitterError("expected StreamStartEvent, but got %s" + % self.event) + + def expect_nothing(self): + raise EmitterError("expected nothing, but got %s" % self.event) + + # Document handlers. + + def expect_first_document_start(self): + return self.expect_document_start(first=True) + + def expect_document_start(self, first=False): + if isinstance(self.event, DocumentStartEvent): + if (self.event.version or self.event.tags) and self.open_ended: + self.write_indicator(u'...', True) + self.write_indent() + if self.event.version: + version_text = self.prepare_version(self.event.version) + self.write_version_directive(version_text) + self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() + if self.event.tags: + handles = self.event.tags.keys() + handles.sort() + for handle in handles: + prefix = self.event.tags[handle] + self.tag_prefixes[prefix] = handle + handle_text = self.prepare_tag_handle(handle) + prefix_text = self.prepare_tag_prefix(prefix) + self.write_tag_directive(handle_text, prefix_text) + implicit = (first and not self.event.explicit and not self.canonical + and not self.event.version and not self.event.tags + and not self.check_empty_document()) + if not implicit: + self.write_indent() + self.write_indicator(u'---', True) + if self.canonical: + self.write_indent() + self.state = self.expect_document_root + elif isinstance(self.event, StreamEndEvent): + if self.open_ended: + self.write_indicator(u'...', True) + self.write_indent() + self.write_stream_end() + self.state = self.expect_nothing + else: + raise EmitterError("expected DocumentStartEvent, but got %s" + % self.event) + + def expect_document_end(self): + if isinstance(self.event, DocumentEndEvent): + self.write_indent() + if self.event.explicit: + self.write_indicator(u'...', True) + self.write_indent() + self.flush_stream() + self.state = self.expect_document_start + else: + raise EmitterError("expected DocumentEndEvent, but got %s" + % self.event) + + def expect_document_root(self): + self.states.append(self.expect_document_end) + self.expect_node(root=True) + + # Node handlers. + + def expect_node(self, root=False, sequence=False, mapping=False, + simple_key=False): + self.root_context = root + self.sequence_context = sequence + self.mapping_context = mapping + self.simple_key_context = simple_key + if isinstance(self.event, AliasEvent): + self.expect_alias() + elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): + self.process_anchor(u'&') + self.process_tag() + if isinstance(self.event, ScalarEvent): + self.expect_scalar() + elif isinstance(self.event, SequenceStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_sequence(): + self.expect_flow_sequence() + else: + self.expect_block_sequence() + elif isinstance(self.event, MappingStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_mapping(): + self.expect_flow_mapping() + else: + self.expect_block_mapping() + else: + raise EmitterError("expected NodeEvent, but got %s" % self.event) + + def expect_alias(self): + if self.event.anchor is None: + raise EmitterError("anchor is not specified for alias") + self.process_anchor(u'*') + self.state = self.states.pop() + + def expect_scalar(self): + self.increase_indent(flow=True) + self.process_scalar() + self.indent = self.indents.pop() + self.state = self.states.pop() + + # Flow sequence handlers. + + def expect_flow_sequence(self): + self.write_indicator(u'[', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_sequence_item + + def expect_first_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(u']', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + def expect_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(u',', False) + self.write_indent() + self.write_indicator(u']', False) + self.state = self.states.pop() + else: + self.write_indicator(u',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + # Flow mapping handlers. + + def expect_flow_mapping(self): + self.write_indicator(u'{', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_mapping_key + + def expect_first_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(u'}', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator(u'?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(u',', False) + self.write_indent() + self.write_indicator(u'}', False) + self.state = self.states.pop() + else: + self.write_indicator(u',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator(u'?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_simple_value(self): + self.write_indicator(u':', False) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + def expect_flow_mapping_value(self): + if self.canonical or self.column > self.best_width: + self.write_indent() + self.write_indicator(u':', True) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + # Block sequence handlers. + + def expect_block_sequence(self): + indentless = (self.mapping_context and not self.indention) + self.increase_indent(flow=False, indentless=indentless) + self.state = self.expect_first_block_sequence_item + + def expect_first_block_sequence_item(self): + return self.expect_block_sequence_item(first=True) + + def expect_block_sequence_item(self, first=False): + if not first and isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + self.write_indicator(u'-', True, indention=True) + self.states.append(self.expect_block_sequence_item) + self.expect_node(sequence=True) + + # Block mapping handlers. + + def expect_block_mapping(self): + self.increase_indent(flow=False) + self.state = self.expect_first_block_mapping_key + + def expect_first_block_mapping_key(self): + return self.expect_block_mapping_key(first=True) + + def expect_block_mapping_key(self, first=False): + if not first and isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + if self.check_simple_key(): + self.states.append(self.expect_block_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator(u'?', True, indention=True) + self.states.append(self.expect_block_mapping_value) + self.expect_node(mapping=True) + + def expect_block_mapping_simple_value(self): + self.write_indicator(u':', False) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + def expect_block_mapping_value(self): + self.write_indent() + self.write_indicator(u':', True, indention=True) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + # Checkers. + + def check_empty_sequence(self): + return (isinstance(self.event, SequenceStartEvent) and self.events + and isinstance(self.events[0], SequenceEndEvent)) + + def check_empty_mapping(self): + return (isinstance(self.event, MappingStartEvent) and self.events + and isinstance(self.events[0], MappingEndEvent)) + + def check_empty_document(self): + if not isinstance(self.event, DocumentStartEvent) or not self.events: + return False + event = self.events[0] + return (isinstance(event, ScalarEvent) and event.anchor is None + and event.tag is None and event.implicit and event.value == u'') + + def check_simple_key(self): + length = 0 + if isinstance(self.event, NodeEvent) and self.event.anchor is not None: + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + length += len(self.prepared_anchor) + if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ + and self.event.tag is not None: + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(self.event.tag) + length += len(self.prepared_tag) + if isinstance(self.event, ScalarEvent): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + length += len(self.analysis.scalar) + return (length < 128 and (isinstance(self.event, AliasEvent) + or (isinstance(self.event, ScalarEvent) + and not self.analysis.empty and not self.analysis.multiline) + or self.check_empty_sequence() or self.check_empty_mapping())) + + # Anchor, Tag, and Scalar processors. + + def process_anchor(self, indicator): + if self.event.anchor is None: + self.prepared_anchor = None + return + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + if self.prepared_anchor: + self.write_indicator(indicator+self.prepared_anchor, True) + self.prepared_anchor = None + + def process_tag(self): + tag = self.event.tag + if isinstance(self.event, ScalarEvent): + if self.style is None: + self.style = self.choose_scalar_style() + if ((not self.canonical or tag is None) and + ((self.style == '' and self.event.implicit[0]) + or (self.style != '' and self.event.implicit[1]))): + self.prepared_tag = None + return + if self.event.implicit[0] and tag is None: + tag = u'!' + self.prepared_tag = None + else: + if (not self.canonical or tag is None) and self.event.implicit: + self.prepared_tag = None + return + if tag is None: + raise EmitterError("tag is not specified") + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(tag) + if self.prepared_tag: + self.write_indicator(self.prepared_tag, True) + self.prepared_tag = None + + def choose_scalar_style(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.event.style == '"' or self.canonical: + return '"' + if not self.event.style and self.event.implicit[0]: + if (not (self.simple_key_context and + (self.analysis.empty or self.analysis.multiline)) + and (self.flow_level and self.analysis.allow_flow_plain + or (not self.flow_level and self.analysis.allow_block_plain))): + return '' + if self.event.style and self.event.style in '|>': + if (not self.flow_level and not self.simple_key_context + and self.analysis.allow_block): + return self.event.style + if not self.event.style or self.event.style == '\'': + if (self.analysis.allow_single_quoted and + not (self.simple_key_context and self.analysis.multiline)): + return '\'' + return '"' + + def process_scalar(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.style is None: + self.style = self.choose_scalar_style() + split = (not self.simple_key_context) + #if self.analysis.multiline and split \ + # and (not self.style or self.style in '\'\"'): + # self.write_indent() + if self.style == '"': + self.write_double_quoted(self.analysis.scalar, split) + elif self.style == '\'': + self.write_single_quoted(self.analysis.scalar, split) + elif self.style == '>': + self.write_folded(self.analysis.scalar) + elif self.style == '|': + self.write_literal(self.analysis.scalar) + else: + self.write_plain(self.analysis.scalar, split) + self.analysis = None + self.style = None + + # Analyzers. + + def prepare_version(self, version): + major, minor = version + if major != 1: + raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) + return u'%d.%d' % (major, minor) + + def prepare_tag_handle(self, handle): + if not handle: + raise EmitterError("tag handle must not be empty") + if handle[0] != u'!' or handle[-1] != u'!': + raise EmitterError("tag handle must start and end with '!': %r" + % (handle.encode('utf-8'))) + for ch in handle[1:-1]: + if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_'): + raise EmitterError("invalid character %r in the tag handle: %r" + % (ch.encode('utf-8'), handle.encode('utf-8'))) + return handle + + def prepare_tag_prefix(self, prefix): + if not prefix: + raise EmitterError("tag prefix must not be empty") + chunks = [] + start = end = 0 + if prefix[0] == u'!': + end = 1 + while end < len(prefix): + ch = prefix[end] + if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-;/?!:@&=+$,_.~*\'()[]': + end += 1 + else: + if start < end: + chunks.append(prefix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append(u'%%%02X' % ord(ch)) + if start < end: + chunks.append(prefix[start:end]) + return u''.join(chunks) + + def prepare_tag(self, tag): + if not tag: + raise EmitterError("tag must not be empty") + if tag == u'!': + return tag + handle = None + suffix = tag + prefixes = self.tag_prefixes.keys() + prefixes.sort() + for prefix in prefixes: + if tag.startswith(prefix) \ + and (prefix == u'!' or len(prefix) < len(tag)): + handle = self.tag_prefixes[prefix] + suffix = tag[len(prefix):] + chunks = [] + start = end = 0 + while end < len(suffix): + ch = suffix[end] + if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-;/?:@&=+$,_.~*\'()[]' \ + or (ch == u'!' and handle != u'!'): + end += 1 + else: + if start < end: + chunks.append(suffix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append(u'%%%02X' % ord(ch)) + if start < end: + chunks.append(suffix[start:end]) + suffix_text = u''.join(chunks) + if handle: + return u'%s%s' % (handle, suffix_text) + else: + return u'!<%s>' % suffix_text + + def prepare_anchor(self, anchor): + if not anchor: + raise EmitterError("anchor must not be empty") + for ch in anchor: + if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_'): + raise EmitterError("invalid character %r in the anchor: %r" + % (ch.encode('utf-8'), anchor.encode('utf-8'))) + return anchor + + def analyze_scalar(self, scalar): + + # Empty scalar is a special case. + if not scalar: + return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, + allow_flow_plain=False, allow_block_plain=True, + allow_single_quoted=True, allow_double_quoted=True, + allow_block=False) + + # Indicators and special characters. + block_indicators = False + flow_indicators = False + line_breaks = False + special_characters = False + + # Important whitespace combinations. + leading_space = False + leading_break = False + trailing_space = False + trailing_break = False + break_space = False + space_break = False + + # Check document indicators. + if scalar.startswith(u'---') or scalar.startswith(u'...'): + block_indicators = True + flow_indicators = True + + # First character or preceded by a whitespace. + preceeded_by_whitespace = True + + # Last character or followed by a whitespace. + followed_by_whitespace = (len(scalar) == 1 or + scalar[1] in u'\0 \t\r\n\x85\u2028\u2029') + + # The previous character is a space. + previous_space = False + + # The previous character is a break. + previous_break = False + + index = 0 + while index < len(scalar): + ch = scalar[index] + + # Check for indicators. + if index == 0: + # Leading indicators are special characters. + if ch in u'#,[]{}&*!|>\'\"%@`': + flow_indicators = True + block_indicators = True + if ch in u'?:': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == u'-' and followed_by_whitespace: + flow_indicators = True + block_indicators = True + else: + # Some indicators cannot appear within a scalar as well. + if ch in u',?[]{}': + flow_indicators = True + if ch == u':': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == u'#' and preceeded_by_whitespace: + flow_indicators = True + block_indicators = True + + # Check for line breaks, special, and unicode characters. + if ch in u'\n\x85\u2028\u2029': + line_breaks = True + if not (ch == u'\n' or u'\x20' <= ch <= u'\x7E'): + if (ch == u'\x85' or u'\xA0' <= ch <= u'\uD7FF' + or u'\uE000' <= ch <= u'\uFFFD') and ch != u'\uFEFF': + unicode_characters = True + if not self.allow_unicode: + special_characters = True + else: + special_characters = True + + # Detect important whitespace combinations. + if ch == u' ': + if index == 0: + leading_space = True + if index == len(scalar)-1: + trailing_space = True + if previous_break: + break_space = True + previous_space = True + previous_break = False + elif ch in u'\n\x85\u2028\u2029': + if index == 0: + leading_break = True + if index == len(scalar)-1: + trailing_break = True + if previous_space: + space_break = True + previous_space = False + previous_break = True + else: + previous_space = False + previous_break = False + + # Prepare for the next character. + index += 1 + preceeded_by_whitespace = (ch in u'\0 \t\r\n\x85\u2028\u2029') + followed_by_whitespace = (index+1 >= len(scalar) or + scalar[index+1] in u'\0 \t\r\n\x85\u2028\u2029') + + # Let's decide what styles are allowed. + allow_flow_plain = True + allow_block_plain = True + allow_single_quoted = True + allow_double_quoted = True + allow_block = True + + # Leading and trailing whitespaces are bad for plain scalars. + if (leading_space or leading_break + or trailing_space or trailing_break): + allow_flow_plain = allow_block_plain = False + + # We do not permit trailing spaces for block scalars. + if trailing_space: + allow_block = False + + # Spaces at the beginning of a new line are only acceptable for block + # scalars. + if break_space: + allow_flow_plain = allow_block_plain = allow_single_quoted = False + + # Spaces followed by breaks, as well as special character are only + # allowed for double quoted scalars. + if space_break or special_characters: + allow_flow_plain = allow_block_plain = \ + allow_single_quoted = allow_block = False + + # Although the plain scalar writer supports breaks, we never emit + # multiline plain scalars. + if line_breaks: + allow_flow_plain = allow_block_plain = False + + # Flow indicators are forbidden for flow plain scalars. + if flow_indicators: + allow_flow_plain = False + + # Block indicators are forbidden for block plain scalars. + if block_indicators: + allow_block_plain = False + + return ScalarAnalysis(scalar=scalar, + empty=False, multiline=line_breaks, + allow_flow_plain=allow_flow_plain, + allow_block_plain=allow_block_plain, + allow_single_quoted=allow_single_quoted, + allow_double_quoted=allow_double_quoted, + allow_block=allow_block) + + # Writers. + + def flush_stream(self): + if hasattr(self.stream, 'flush'): + self.stream.flush() + + def write_stream_start(self): + # Write BOM if needed. + if self.encoding and self.encoding.startswith('utf-16'): + self.stream.write(u'\uFEFF'.encode(self.encoding)) + + def write_stream_end(self): + self.flush_stream() + + def write_indicator(self, indicator, need_whitespace, + whitespace=False, indention=False): + if self.whitespace or not need_whitespace: + data = indicator + else: + data = u' '+indicator + self.whitespace = whitespace + self.indention = self.indention and indention + self.column += len(data) + self.open_ended = False + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_indent(self): + indent = self.indent or 0 + if not self.indention or self.column > indent \ + or (self.column == indent and not self.whitespace): + self.write_line_break() + if self.column < indent: + self.whitespace = True + data = u' '*(indent-self.column) + self.column = indent + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_line_break(self, data=None): + if data is None: + data = self.best_line_break + self.whitespace = True + self.indention = True + self.line += 1 + self.column = 0 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_version_directive(self, version_text): + data = u'%%YAML %s' % version_text + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + def write_tag_directive(self, handle_text, prefix_text): + data = u'%%TAG %s %s' % (handle_text, prefix_text) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + # Scalar streams. + + def write_single_quoted(self, text, split=True): + self.write_indicator(u'\'', True) + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch is None or ch != u' ': + if start+1 == end and self.column > self.best_width and split \ + and start != 0 and end != len(text): + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch is None or ch not in u'\n\x85\u2028\u2029': + if text[start] == u'\n': + self.write_line_break() + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + start = end + else: + if ch is None or ch in u' \n\x85\u2028\u2029' or ch == u'\'': + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch == u'\'': + data = u'\'\'' + self.column += 2 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + 1 + if ch is not None: + spaces = (ch == u' ') + breaks = (ch in u'\n\x85\u2028\u2029') + end += 1 + self.write_indicator(u'\'', False) + + ESCAPE_REPLACEMENTS = { + u'\0': u'0', + u'\x07': u'a', + u'\x08': u'b', + u'\x09': u't', + u'\x0A': u'n', + u'\x0B': u'v', + u'\x0C': u'f', + u'\x0D': u'r', + u'\x1B': u'e', + u'\"': u'\"', + u'\\': u'\\', + u'\x85': u'N', + u'\xA0': u'_', + u'\u2028': u'L', + u'\u2029': u'P', + } + + def write_double_quoted(self, text, split=True): + self.write_indicator(u'"', True) + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if ch is None or ch in u'"\\\x85\u2028\u2029\uFEFF' \ + or not (u'\x20' <= ch <= u'\x7E' + or (self.allow_unicode + and (u'\xA0' <= ch <= u'\uD7FF' + or u'\uE000' <= ch <= u'\uFFFD'))): + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + if ch in self.ESCAPE_REPLACEMENTS: + data = u'\\'+self.ESCAPE_REPLACEMENTS[ch] + elif ch <= u'\xFF': + data = u'\\x%02X' % ord(ch) + elif ch <= u'\uFFFF': + data = u'\\u%04X' % ord(ch) + else: + data = u'\\U%08X' % ord(ch) + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end+1 + if 0 < end < len(text)-1 and (ch == u' ' or start >= end) \ + and self.column+(end-start) > self.best_width and split: + data = text[start:end]+u'\\' + if start < end: + start = end + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_indent() + self.whitespace = False + self.indention = False + if text[start] == u' ': + data = u'\\' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + end += 1 + self.write_indicator(u'"', False) + + def determine_block_hints(self, text): + hints = u'' + if text: + if text[0] in u' \n\x85\u2028\u2029': + hints += unicode(self.best_indent) + if text[-1] not in u'\n\x85\u2028\u2029': + hints += u'-' + elif len(text) == 1 or text[-2] in u'\n\x85\u2028\u2029': + hints += u'+' + return hints + + def write_folded(self, text): + hints = self.determine_block_hints(text) + self.write_indicator(u'>'+hints, True) + if hints[-1:] == u'+': + self.open_ended = True + self.write_line_break() + leading_space = True + spaces = False + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in u'\n\x85\u2028\u2029': + if not leading_space and ch is not None and ch != u' ' \ + and text[start] == u'\n': + self.write_line_break() + leading_space = (ch == u' ') + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + elif spaces: + if ch != u' ': + if start+1 == end and self.column > self.best_width: + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + else: + if ch is None or ch in u' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in u'\n\x85\u2028\u2029') + spaces = (ch == u' ') + end += 1 + + def write_literal(self, text): + hints = self.determine_block_hints(text) + self.write_indicator(u'|'+hints, True) + if hints[-1:] == u'+': + self.open_ended = True + self.write_line_break() + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in u'\n\x85\u2028\u2029': + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + else: + if ch is None or ch in u'\n\x85\u2028\u2029': + data = text[start:end] + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in u'\n\x85\u2028\u2029') + end += 1 + + def write_plain(self, text, split=True): + if self.root_context: + self.open_ended = True + if not text: + return + if not self.whitespace: + data = u' ' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.whitespace = False + self.indention = False + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch != u' ': + if start+1 == end and self.column > self.best_width and split: + self.write_indent() + self.whitespace = False + self.indention = False + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch not in u'\n\x85\u2028\u2029': + if text[start] == u'\n': + self.write_line_break() + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + self.whitespace = False + self.indention = False + start = end + else: + if ch is None or ch in u' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + spaces = (ch == u' ') + breaks = (ch in u'\n\x85\u2028\u2029') + end += 1 + diff --git a/lib/spack/external/yaml/lib/yaml/error.py b/lib/spack/external/yaml/lib/yaml/error.py new file mode 100644 index 0000000000..577686db5f --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/error.py @@ -0,0 +1,75 @@ + +__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] + +class Mark(object): + + def __init__(self, name, index, line, column, buffer, pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029': + start -= 1 + if self.pointer-start > max_length/2-1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029': + end += 1 + if end-self.pointer > max_length/2-1: + tail = ' ... ' + end -= 5 + break + snippet = self.buffer[start:end].encode('utf-8') + return ' '*indent + head + snippet + tail + '\n' \ + + ' '*(indent+self.pointer-start+len(head)) + '^' + + def __str__(self): + snippet = self.get_snippet() + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + if snippet is not None: + where += ":\n"+snippet + return where + +class YAMLError(Exception): + pass + +class MarkedYAMLError(YAMLError): + + def __init__(self, context=None, context_mark=None, + problem=None, problem_mark=None, note=None): + self.context = context + self.context_mark = context_mark + self.problem = problem + self.problem_mark = problem_mark + self.note = note + + def __str__(self): + lines = [] + if self.context is not None: + lines.append(self.context) + if self.context_mark is not None \ + and (self.problem is None or self.problem_mark is None + or self.context_mark.name != self.problem_mark.name + or self.context_mark.line != self.problem_mark.line + or self.context_mark.column != self.problem_mark.column): + lines.append(str(self.context_mark)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_mark is not None: + lines.append(str(self.problem_mark)) + if self.note is not None: + lines.append(self.note) + return '\n'.join(lines) + diff --git a/lib/spack/external/yaml/lib/yaml/events.py b/lib/spack/external/yaml/lib/yaml/events.py new file mode 100644 index 0000000000..f79ad389cb --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/events.py @@ -0,0 +1,86 @@ + +# Abstract classes. + +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] + if hasattr(self, key)] + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +class NodeEvent(Event): + def __init__(self, anchor, start_mark=None, end_mark=None): + self.anchor = anchor + self.start_mark = start_mark + self.end_mark = end_mark + +class CollectionStartEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, + flow_style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class CollectionEndEvent(Event): + pass + +# Implementations. + +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndEvent(Event): + pass + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + +class AliasEvent(NodeEvent): + pass + +class ScalarEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, value, + start_mark=None, end_mark=None, style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class SequenceStartEvent(CollectionStartEvent): + pass + +class SequenceEndEvent(CollectionEndEvent): + pass + +class MappingStartEvent(CollectionStartEvent): + pass + +class MappingEndEvent(CollectionEndEvent): + pass + diff --git a/lib/spack/external/yaml/lib/yaml/loader.py b/lib/spack/external/yaml/lib/yaml/loader.py new file mode 100644 index 0000000000..293ff467b1 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/loader.py @@ -0,0 +1,40 @@ + +__all__ = ['BaseLoader', 'SafeLoader', 'Loader'] + +from reader import * +from scanner import * +from parser import * +from composer import * +from constructor import * +from resolver import * + +class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + diff --git a/lib/spack/external/yaml/lib/yaml/nodes.py b/lib/spack/external/yaml/lib/yaml/nodes.py new file mode 100644 index 0000000000..c4f070c41e --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/nodes.py @@ -0,0 +1,49 @@ + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + value = self.value + #if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + #else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + +class ScalarNode(Node): + id = 'scalar' + def __init__(self, tag, value, + start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class CollectionNode(Node): + def __init__(self, tag, value, + start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class SequenceNode(CollectionNode): + id = 'sequence' + +class MappingNode(CollectionNode): + id = 'mapping' + diff --git a/lib/spack/external/yaml/lib/yaml/parser.py b/lib/spack/external/yaml/lib/yaml/parser.py new file mode 100644 index 0000000000..f9e3057f33 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/parser.py @@ -0,0 +1,589 @@ + +# The following YAML grammar is LL(1) and is parsed by a recursive descent +# parser. +# +# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +# implicit_document ::= block_node DOCUMENT-END* +# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +# block_node_or_indentless_sequence ::= +# ALIAS +# | properties (block_content | indentless_block_sequence)? +# | block_content +# | indentless_block_sequence +# block_node ::= ALIAS +# | properties block_content? +# | block_content +# flow_node ::= ALIAS +# | properties flow_content? +# | flow_content +# properties ::= TAG ANCHOR? | ANCHOR TAG? +# block_content ::= block_collection | flow_collection | SCALAR +# flow_content ::= flow_collection | SCALAR +# block_collection ::= block_sequence | block_mapping +# flow_collection ::= flow_sequence | flow_mapping +# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +# block_mapping ::= BLOCK-MAPPING_START +# ((KEY block_node_or_indentless_sequence?)? +# (VALUE block_node_or_indentless_sequence?)?)* +# BLOCK-END +# flow_sequence ::= FLOW-SEQUENCE-START +# (flow_sequence_entry FLOW-ENTRY)* +# flow_sequence_entry? +# FLOW-SEQUENCE-END +# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# flow_mapping ::= FLOW-MAPPING-START +# (flow_mapping_entry FLOW-ENTRY)* +# flow_mapping_entry? +# FLOW-MAPPING-END +# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# +# FIRST sets: +# +# stream: { STREAM-START } +# explicit_document: { DIRECTIVE DOCUMENT-START } +# implicit_document: FIRST(block_node) +# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_sequence: { BLOCK-SEQUENCE-START } +# block_mapping: { BLOCK-MAPPING-START } +# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } +# indentless_sequence: { ENTRY } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_sequence: { FLOW-SEQUENCE-START } +# flow_mapping: { FLOW-MAPPING-START } +# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } +# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } + +__all__ = ['Parser', 'ParserError'] + +from error import MarkedYAMLError +from tokens import * +from events import * +from scanner import * + +class ParserError(MarkedYAMLError): + pass + +class Parser(object): + # Since writing a recursive-descendant parser is a straightforward task, we + # do not give many comments here. + + DEFAULT_TAGS = { + u'!': u'!', + u'!!': u'tag:yaml.org,2002:', + } + + def __init__(self): + self.current_event = None + self.yaml_version = None + self.tag_handles = {} + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + + # Parse the stream start. + token = self.get_token() + event = StreamStartEvent(token.start_mark, token.end_mark, + encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + + # Parse an implicit document. + if not self.check_token(DirectiveToken, DocumentStartToken, + StreamEndToken): + self.tag_handles = self.DEFAULT_TAGS + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_block_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + + # Parse any extra document end indicators. + while self.check_token(DocumentEndToken): + self.get_token() + + # Parse an explicit document. + if not self.check_token(StreamEndToken): + token = self.peek_token() + start_mark = token.start_mark + version, tags = self.process_directives() + if not self.check_token(DocumentStartToken): + raise ParserError(None, None, + "expected '', but found %r" + % self.peek_token().id, + self.peek_token().start_mark) + token = self.get_token() + end_mark = token.end_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=True, version=version, tags=tags) + self.states.append(self.parse_document_end) + self.state = self.parse_document_content + else: + # Parse the end of the stream. + token = self.get_token() + event = StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + if self.check_token(DocumentEndToken): + token = self.get_token() + end_mark = token.end_mark + explicit = True + event = DocumentEndEvent(start_mark, end_mark, + explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + if self.check_token(DirectiveToken, + DocumentStartToken, DocumentEndToken, StreamEndToken): + event = self.process_empty_scalar(self.peek_token().start_mark) + self.state = self.states.pop() + return event + else: + return self.parse_block_node() + + def process_directives(self): + self.yaml_version = None + self.tag_handles = {} + while self.check_token(DirectiveToken): + token = self.get_token() + if token.name == u'YAML': + if self.yaml_version is not None: + raise ParserError(None, None, + "found duplicate YAML directive", token.start_mark) + major, minor = token.value + if major != 1: + raise ParserError(None, None, + "found incompatible YAML document (version 1.* is required)", + token.start_mark) + self.yaml_version = token.value + elif token.name == u'TAG': + handle, prefix = token.value + if handle in self.tag_handles: + raise ParserError(None, None, + "duplicate tag handle %r" % handle.encode('utf-8'), + token.start_mark) + self.tag_handles[handle] = prefix + if self.tag_handles: + value = self.yaml_version, self.tag_handles.copy() + else: + value = self.yaml_version, None + for key in self.DEFAULT_TAGS: + if key not in self.tag_handles: + self.tag_handles[key] = self.DEFAULT_TAGS[key] + return value + + # block_node_or_indentless_sequence ::= ALIAS + # | properties (block_content | indentless_block_sequence)? + # | block_content + # | indentless_block_sequence + # block_node ::= ALIAS + # | properties block_content? + # | block_content + # flow_node ::= ALIAS + # | properties flow_content? + # | flow_content + # properties ::= TAG ANCHOR? | ANCHOR TAG? + # block_content ::= block_collection | flow_collection | SCALAR + # flow_content ::= flow_collection | SCALAR + # block_collection ::= block_sequence | block_mapping + # flow_collection ::= flow_sequence | flow_mapping + + def parse_block_node(self): + return self.parse_node(block=True) + + def parse_flow_node(self): + return self.parse_node() + + def parse_block_node_or_indentless_sequence(self): + return self.parse_node(block=True, indentless_sequence=True) + + def parse_node(self, block=False, indentless_sequence=False): + if self.check_token(AliasToken): + token = self.get_token() + event = AliasEvent(token.value, token.start_mark, token.end_mark) + self.state = self.states.pop() + else: + anchor = None + tag = None + start_mark = end_mark = tag_mark = None + if self.check_token(AnchorToken): + token = self.get_token() + start_mark = token.start_mark + end_mark = token.end_mark + anchor = token.value + if self.check_token(TagToken): + token = self.get_token() + tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + elif self.check_token(TagToken): + token = self.get_token() + start_mark = tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + if self.check_token(AnchorToken): + token = self.get_token() + end_mark = token.end_mark + anchor = token.value + if tag is not None: + handle, suffix = tag + if handle is not None: + if handle not in self.tag_handles: + raise ParserError("while parsing a node", start_mark, + "found undefined tag handle %r" % handle.encode('utf-8'), + tag_mark) + tag = self.tag_handles[handle]+suffix + else: + tag = suffix + #if tag == u'!': + # raise ParserError("while parsing a node", start_mark, + # "found non-specific tag '!'", tag_mark, + # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = (tag is None or tag == u'!') + if indentless_sequence and self.check_token(BlockEntryToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark) + self.state = self.parse_indentless_sequence_entry + else: + if self.check_token(ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if (token.plain and tag is None) or tag == u'!': + implicit = (True, False) + elif tag is None: + implicit = (False, True) + else: + implicit = (False, False) + event = ScalarEvent(anchor, tag, implicit, token.value, + start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + elif block and self.check_token(BlockSequenceStartToken): + end_mark = self.peek_token().start_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_sequence_first_entry + elif block and self.check_token(BlockMappingStartToken): + end_mark = self.peek_token().start_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_mapping_first_key + elif anchor is not None or tag is not None: + # Empty scalars are allowed even if a tag or an anchor is + # specified. + event = ScalarEvent(anchor, tag, (implicit, False), u'', + start_mark, end_mark) + self.state = self.states.pop() + else: + if block: + node = 'block' + else: + node = 'flow' + token = self.peek_token() + raise ParserError("while parsing a %s node" % node, start_mark, + "expected the node content, but found %r" % token.id, + token.start_mark) + return event + + # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + + def parse_block_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_sequence_entry() + + def parse_block_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, BlockEndToken): + self.states.append(self.parse_block_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_block_sequence_entry + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block collection", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + + def parse_indentless_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, + KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_indentless_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_indentless_sequence_entry + return self.process_empty_scalar(token.end_mark) + token = self.peek_token() + event = SequenceEndEvent(token.start_mark, token.start_mark) + self.state = self.states.pop() + return event + + # block_mapping ::= BLOCK-MAPPING_START + # ((KEY block_node_or_indentless_sequence?)? + # (VALUE block_node_or_indentless_sequence?)?)* + # BLOCK-END + + def parse_block_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_mapping_key() + + def parse_block_mapping_key(self): + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_value) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_value + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block mapping", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_block_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_key) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_block_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + # flow_sequence ::= FLOW-SEQUENCE-START + # (flow_sequence_entry FLOW-ENTRY)* + # flow_sequence_entry? + # FLOW-SEQUENCE-END + # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + # + # Note that while production rules for both flow_sequence_entry and + # flow_mapping_entry are equal, their interpretations are different. + # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + # generate an inline mapping (set syntax). + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(FlowSequenceEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow sequence", self.marks[-1], + "expected ',' or ']', but got %r" % token.id, token.start_mark) + + if self.check_token(KeyToken): + token = self.peek_token() + event = MappingStartEvent(None, None, True, + token.start_mark, token.end_mark, + flow_style=True) + self.state = self.parse_flow_sequence_entry_mapping_key + return event + elif not self.check_token(FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_flow_node() + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_key(self): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_value + return self.process_empty_scalar(token.end_mark) + + def parse_flow_sequence_entry_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_end) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_end + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_sequence_entry_mapping_end + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return MappingEndEvent(token.start_mark, token.start_mark) + + # flow_mapping ::= FLOW-MAPPING-START + # (flow_mapping_entry FLOW-ENTRY)* + # flow_mapping_entry? + # FLOW-MAPPING-END + # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(FlowMappingEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow mapping", self.marks[-1], + "expected ',' or '}', but got %r" % token.id, token.start_mark) + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_value + return self.process_empty_scalar(token.end_mark) + elif not self.check_token(FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_empty_value) + return self.parse_flow_node() + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_mapping_empty_value(self): + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(self.peek_token().start_mark) + + def process_empty_scalar(self, mark): + return ScalarEvent(None, None, (True, False), u'', mark, mark) + diff --git a/lib/spack/external/yaml/lib/yaml/reader.py b/lib/spack/external/yaml/lib/yaml/reader.py new file mode 100644 index 0000000000..3249e6b9f5 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/reader.py @@ -0,0 +1,190 @@ +# This module contains abstractions for the input stream. You don't have to +# looks further, there are no pretty code. +# +# We define two classes here. +# +# Mark(source, line, column) +# It's just a record and its only use is producing nice error messages. +# Parser does not use it for any other purposes. +# +# Reader(source, data) +# Reader determines the encoding of `data` and converts it to unicode. +# Reader provides the following methods and attributes: +# reader.peek(length=1) - return the next `length` characters +# reader.forward(length=1) - move the current position to `length` characters. +# reader.index - the number of the current character. +# reader.line, stream.column - the line and the column of the current character. + +__all__ = ['Reader', 'ReaderError'] + +from error import YAMLError, Mark + +import codecs, re + +class ReaderError(YAMLError): + + def __init__(self, name, position, character, encoding, reason): + self.name = name + self.character = character + self.position = position + self.encoding = encoding + self.reason = reason + + def __str__(self): + if isinstance(self.character, str): + return "'%s' codec can't decode byte #x%02x: %s\n" \ + " in \"%s\", position %d" \ + % (self.encoding, ord(self.character), self.reason, + self.name, self.position) + else: + return "unacceptable character #x%04x: %s\n" \ + " in \"%s\", position %d" \ + % (self.character, self.reason, + self.name, self.position) + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to unicode, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a `str` object, + # - a `unicode` object, + # - a file-like object with its `read` method returning `str`, + # - a file-like object with its `read` method returning `unicode`. + + # Yeah, it's ugly and slow. + + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = u'' + self.pointer = 0 + self.raw_buffer = None + self.raw_decode = None + self.encoding = None + self.index = 0 + self.line = 0 + self.column = 0 + if isinstance(stream, unicode): + self.name = "" + self.check_printable(stream) + self.buffer = stream+u'\0' + elif isinstance(stream, str): + self.name = "" + self.raw_buffer = stream + self.determine_encoding() + else: + self.stream = stream + self.name = getattr(stream, 'name', "") + self.eof = False + self.raw_buffer = '' + self.determine_encoding() + + def peek(self, index=0): + try: + return self.buffer[self.pointer+index] + except IndexError: + self.update(index+1) + return self.buffer[self.pointer+index] + + def prefix(self, length=1): + if self.pointer+length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer+length] + + def forward(self, length=1): + if self.pointer+length+1 >= len(self.buffer): + self.update(length+1) + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.index += 1 + if ch in u'\n\x85\u2028\u2029' \ + or (ch == u'\r' and self.buffer[self.pointer] != u'\n'): + self.line += 1 + self.column = 0 + elif ch != u'\uFEFF': + self.column += 1 + length -= 1 + + def get_mark(self): + if self.stream is None: + return Mark(self.name, self.index, self.line, self.column, + self.buffer, self.pointer) + else: + return Mark(self.name, self.index, self.line, self.column, + None, None) + + def determine_encoding(self): + while not self.eof and len(self.raw_buffer) < 2: + self.update_raw() + if not isinstance(self.raw_buffer, unicode): + if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): + self.raw_decode = codecs.utf_16_le_decode + self.encoding = 'utf-16-le' + elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): + self.raw_decode = codecs.utf_16_be_decode + self.encoding = 'utf-16-be' + else: + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.update(1) + + NON_PRINTABLE = re.compile(u'[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') + def check_printable(self, data): + match = self.NON_PRINTABLE.search(data) + if match: + character = match.group() + position = self.index+(len(self.buffer)-self.pointer)+match.start() + raise ReaderError(self.name, position, ord(character), + 'unicode', "special characters are not allowed") + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + if self.raw_decode is not None: + try: + data, converted = self.raw_decode(self.raw_buffer, + 'strict', self.eof) + except UnicodeDecodeError, exc: + character = exc.object[exc.start] + if self.stream is not None: + position = self.stream_pointer-len(self.raw_buffer)+exc.start + else: + position = exc.start + raise ReaderError(self.name, position, character, + exc.encoding, exc.reason) + else: + data = self.raw_buffer + converted = len(data) + self.check_printable(data) + self.buffer += data + self.raw_buffer = self.raw_buffer[converted:] + if self.eof: + self.buffer += u'\0' + self.raw_buffer = None + break + + def update_raw(self, size=1024): + data = self.stream.read(size) + if data: + self.raw_buffer += data + self.stream_pointer += len(data) + else: + self.eof = True + +#try: +# import psyco +# psyco.bind(Reader) +#except ImportError: +# pass + diff --git a/lib/spack/external/yaml/lib/yaml/representer.py b/lib/spack/external/yaml/lib/yaml/representer.py new file mode 100644 index 0000000000..4ea8cb1fe1 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/representer.py @@ -0,0 +1,486 @@ + +__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', + 'RepresenterError'] + +from error import * +from nodes import * + +import datetime + +import sys, copy_reg, types + +class RepresenterError(YAMLError): + pass + +class BaseRepresenter(object): + + yaml_representers = {} + yaml_multi_representers = {} + + def __init__(self, default_style=None, default_flow_style=None): + self.default_style = default_style + self.default_flow_style = default_flow_style + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent(self, data): + node = self.represent_data(data) + self.serialize(node) + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def get_classobj_bases(self, cls): + bases = [cls] + for base in cls.__bases__: + bases.extend(self.get_classobj_bases(base)) + return bases + + def represent_data(self, data): + if self.ignore_aliases(data): + self.alias_key = None + else: + self.alias_key = id(data) + if self.alias_key is not None: + if self.alias_key in self.represented_objects: + node = self.represented_objects[self.alias_key] + #if node is None: + # raise RepresenterError("recursive objects are not allowed: %r" % data) + return node + #self.represented_objects[alias_key] = None + self.object_keeper.append(data) + data_types = type(data).__mro__ + if type(data) is types.InstanceType: + data_types = self.get_classobj_bases(data.__class__)+list(data_types) + if data_types[0] in self.yaml_representers: + node = self.yaml_representers[data_types[0]](self, data) + else: + for data_type in data_types: + if data_type in self.yaml_multi_representers: + node = self.yaml_multi_representers[data_type](self, data) + break + else: + if None in self.yaml_multi_representers: + node = self.yaml_multi_representers[None](self, data) + elif None in self.yaml_representers: + node = self.yaml_representers[None](self, data) + else: + node = ScalarNode(None, unicode(data)) + #if alias_key is not None: + # self.represented_objects[alias_key] = node + return node + + def add_representer(cls, data_type, representer): + if not 'yaml_representers' in cls.__dict__: + cls.yaml_representers = cls.yaml_representers.copy() + cls.yaml_representers[data_type] = representer + add_representer = classmethod(add_representer) + + def add_multi_representer(cls, data_type, representer): + if not 'yaml_multi_representers' in cls.__dict__: + cls.yaml_multi_representers = cls.yaml_multi_representers.copy() + cls.yaml_multi_representers[data_type] = representer + add_multi_representer = classmethod(add_multi_representer) + + def represent_scalar(self, tag, value, style=None): + if style is None: + style = self.default_style + node = ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node + + def represent_sequence(self, tag, sequence, flow_style=None): + value = [] + node = SequenceNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + for item in sequence: + node_item = self.represent_data(item) + if not (isinstance(node_item, ScalarNode) and not node_item.style): + best_style = False + value.append(node_item) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = mapping.items() + mapping.sort() + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def ignore_aliases(self, data): + return False + +class SafeRepresenter(BaseRepresenter): + + def ignore_aliases(self, data): + if data is None: + return True + if isinstance(data, tuple) and data == (): + return True + if isinstance(data, (str, unicode, bool, int, float)): + return True + + def represent_none(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:null', + u'null') + + def represent_str(self, data): + tag = None + style = None + try: + data = unicode(data, 'ascii') + tag = u'tag:yaml.org,2002:str' + except UnicodeDecodeError: + try: + data = unicode(data, 'utf-8') + tag = u'tag:yaml.org,2002:str' + except UnicodeDecodeError: + data = data.encode('base64') + tag = u'tag:yaml.org,2002:binary' + style = '|' + return self.represent_scalar(tag, data, style=style) + + def represent_unicode(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:str', data) + + def represent_bool(self, data): + if data: + value = u'true' + else: + value = u'false' + return self.represent_scalar(u'tag:yaml.org,2002:bool', value) + + def represent_int(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) + + def represent_long(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) + + inf_value = 1e300 + while repr(inf_value) != repr(inf_value*inf_value): + inf_value *= inf_value + + def represent_float(self, data): + if data != data or (data == 0.0 and data == 1.0): + value = u'.nan' + elif data == self.inf_value: + value = u'.inf' + elif data == -self.inf_value: + value = u'-.inf' + else: + value = unicode(repr(data)).lower() + # Note that in some cases `repr(data)` represents a float number + # without the decimal parts. For instance: + # >>> repr(1e17) + # '1e17' + # Unfortunately, this is not a valid float representation according + # to the definition of the `!!float` tag. We fix this by adding + # '.0' before the 'e' symbol. + if u'.' not in value and u'e' in value: + value = value.replace(u'e', u'.0e', 1) + return self.represent_scalar(u'tag:yaml.org,2002:float', value) + + def represent_list(self, data): + #pairs = (len(data) > 0 and isinstance(data, list)) + #if pairs: + # for item in data: + # if not isinstance(item, tuple) or len(item) != 2: + # pairs = False + # break + #if not pairs: + return self.represent_sequence(u'tag:yaml.org,2002:seq', data) + #value = [] + #for item_key, item_value in data: + # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', + # [(item_key, item_value)])) + #return SequenceNode(u'tag:yaml.org,2002:pairs', value) + + def represent_dict(self, data): + return self.represent_mapping(u'tag:yaml.org,2002:map', data) + + def represent_set(self, data): + value = {} + for key in data: + value[key] = None + return self.represent_mapping(u'tag:yaml.org,2002:set', value) + + def represent_date(self, data): + value = unicode(data.isoformat()) + return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) + + def represent_datetime(self, data): + value = unicode(data.isoformat(' ')) + return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) + + def represent_yaml_object(self, tag, data, cls, flow_style=None): + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__.copy() + return self.represent_mapping(tag, state, flow_style=flow_style) + + def represent_undefined(self, data): + raise RepresenterError("cannot represent an object: %s" % data) + +SafeRepresenter.add_representer(type(None), + SafeRepresenter.represent_none) + +SafeRepresenter.add_representer(str, + SafeRepresenter.represent_str) + +SafeRepresenter.add_representer(unicode, + SafeRepresenter.represent_unicode) + +SafeRepresenter.add_representer(bool, + SafeRepresenter.represent_bool) + +SafeRepresenter.add_representer(int, + SafeRepresenter.represent_int) + +SafeRepresenter.add_representer(long, + SafeRepresenter.represent_long) + +SafeRepresenter.add_representer(float, + SafeRepresenter.represent_float) + +SafeRepresenter.add_representer(list, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(tuple, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(dict, + SafeRepresenter.represent_dict) + +SafeRepresenter.add_representer(set, + SafeRepresenter.represent_set) + +SafeRepresenter.add_representer(datetime.date, + SafeRepresenter.represent_date) + +SafeRepresenter.add_representer(datetime.datetime, + SafeRepresenter.represent_datetime) + +SafeRepresenter.add_representer(None, + SafeRepresenter.represent_undefined) + +class Representer(SafeRepresenter): + + def represent_str(self, data): + tag = None + style = None + try: + data = unicode(data, 'ascii') + tag = u'tag:yaml.org,2002:str' + except UnicodeDecodeError: + try: + data = unicode(data, 'utf-8') + tag = u'tag:yaml.org,2002:python/str' + except UnicodeDecodeError: + data = data.encode('base64') + tag = u'tag:yaml.org,2002:binary' + style = '|' + return self.represent_scalar(tag, data, style=style) + + def represent_unicode(self, data): + tag = None + try: + data.encode('ascii') + tag = u'tag:yaml.org,2002:python/unicode' + except UnicodeEncodeError: + tag = u'tag:yaml.org,2002:str' + return self.represent_scalar(tag, data) + + def represent_long(self, data): + tag = u'tag:yaml.org,2002:int' + if int(data) is not data: + tag = u'tag:yaml.org,2002:python/long' + return self.represent_scalar(tag, unicode(data)) + + def represent_complex(self, data): + if data.imag == 0.0: + data = u'%r' % data.real + elif data.real == 0.0: + data = u'%rj' % data.imag + elif data.imag > 0: + data = u'%r+%rj' % (data.real, data.imag) + else: + data = u'%r%rj' % (data.real, data.imag) + return self.represent_scalar(u'tag:yaml.org,2002:python/complex', data) + + def represent_tuple(self, data): + return self.represent_sequence(u'tag:yaml.org,2002:python/tuple', data) + + def represent_name(self, data): + name = u'%s.%s' % (data.__module__, data.__name__) + return self.represent_scalar(u'tag:yaml.org,2002:python/name:'+name, u'') + + def represent_module(self, data): + return self.represent_scalar( + u'tag:yaml.org,2002:python/module:'+data.__name__, u'') + + def represent_instance(self, data): + # For instances of classic classes, we use __getinitargs__ and + # __getstate__ to serialize the data. + + # If data.__getinitargs__ exists, the object must be reconstructed by + # calling cls(**args), where args is a tuple returned by + # __getinitargs__. Otherwise, the cls.__init__ method should never be + # called and the class instance is created by instantiating a trivial + # class and assigning to the instance's __class__ variable. + + # If data.__getstate__ exists, it returns the state of the object. + # Otherwise, the state of the object is data.__dict__. + + # We produce either a !!python/object or !!python/object/new node. + # If data.__getinitargs__ does not exist and state is a dictionary, we + # produce a !!python/object node . Otherwise we produce a + # !!python/object/new node. + + cls = data.__class__ + class_name = u'%s.%s' % (cls.__module__, cls.__name__) + args = None + state = None + if hasattr(data, '__getinitargs__'): + args = list(data.__getinitargs__()) + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__ + if args is None and isinstance(state, dict): + return self.represent_mapping( + u'tag:yaml.org,2002:python/object:'+class_name, state) + if isinstance(state, dict) and not state: + return self.represent_sequence( + u'tag:yaml.org,2002:python/object/new:'+class_name, args) + value = {} + if args: + value['args'] = args + value['state'] = state + return self.represent_mapping( + u'tag:yaml.org,2002:python/object/new:'+class_name, value) + + def represent_object(self, data): + # We use __reduce__ API to save the data. data.__reduce__ returns + # a tuple of length 2-5: + # (function, args, state, listitems, dictitems) + + # For reconstructing, we calls function(*args), then set its state, + # listitems, and dictitems if they are not None. + + # A special case is when function.__name__ == '__newobj__'. In this + # case we create the object with args[0].__new__(*args). + + # Another special case is when __reduce__ returns a string - we don't + # support it. + + # We produce a !!python/object, !!python/object/new or + # !!python/object/apply node. + + cls = type(data) + if cls in copy_reg.dispatch_table: + reduce = copy_reg.dispatch_table[cls](data) + elif hasattr(data, '__reduce_ex__'): + reduce = data.__reduce_ex__(2) + elif hasattr(data, '__reduce__'): + reduce = data.__reduce__() + else: + raise RepresenterError("cannot represent object: %r" % data) + reduce = (list(reduce)+[None]*5)[:5] + function, args, state, listitems, dictitems = reduce + args = list(args) + if state is None: + state = {} + if listitems is not None: + listitems = list(listitems) + if dictitems is not None: + dictitems = dict(dictitems) + if function.__name__ == '__newobj__': + function = args[0] + args = args[1:] + tag = u'tag:yaml.org,2002:python/object/new:' + newobj = True + else: + tag = u'tag:yaml.org,2002:python/object/apply:' + newobj = False + function_name = u'%s.%s' % (function.__module__, function.__name__) + if not args and not listitems and not dictitems \ + and isinstance(state, dict) and newobj: + return self.represent_mapping( + u'tag:yaml.org,2002:python/object:'+function_name, state) + if not listitems and not dictitems \ + and isinstance(state, dict) and not state: + return self.represent_sequence(tag+function_name, args) + value = {} + if args: + value['args'] = args + if state or not isinstance(state, dict): + value['state'] = state + if listitems: + value['listitems'] = listitems + if dictitems: + value['dictitems'] = dictitems + return self.represent_mapping(tag+function_name, value) + +Representer.add_representer(str, + Representer.represent_str) + +Representer.add_representer(unicode, + Representer.represent_unicode) + +Representer.add_representer(long, + Representer.represent_long) + +Representer.add_representer(complex, + Representer.represent_complex) + +Representer.add_representer(tuple, + Representer.represent_tuple) + +Representer.add_representer(type, + Representer.represent_name) + +Representer.add_representer(types.ClassType, + Representer.represent_name) + +Representer.add_representer(types.FunctionType, + Representer.represent_name) + +Representer.add_representer(types.BuiltinFunctionType, + Representer.represent_name) + +Representer.add_representer(types.ModuleType, + Representer.represent_module) + +Representer.add_multi_representer(types.InstanceType, + Representer.represent_instance) + +Representer.add_multi_representer(object, + Representer.represent_object) + diff --git a/lib/spack/external/yaml/lib/yaml/resolver.py b/lib/spack/external/yaml/lib/yaml/resolver.py new file mode 100644 index 0000000000..528fbc0ead --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/resolver.py @@ -0,0 +1,227 @@ + +__all__ = ['BaseResolver', 'Resolver'] + +from error import * +from nodes import * + +import re + +class ResolverError(YAMLError): + pass + +class BaseResolver(object): + + DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = u'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + def add_implicit_resolver(cls, tag, regexp, first): + if not 'yaml_implicit_resolvers' in cls.__dict__: + implicit_resolvers = {} + for key in cls.yaml_implicit_resolvers: + implicit_resolvers[key] = cls.yaml_implicit_resolvers[key][:] + cls.yaml_implicit_resolvers = implicit_resolvers + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + add_implicit_resolver = classmethod(add_implicit_resolver) + + def add_path_resolver(cls, tag, path, kind=None): + # Note: `add_path_resolver` is experimental. The API could be changed. + # `new_path` is a pattern that is matched against the path from the + # root to the node that is being considered. `node_path` elements are + # tuples `(node_check, index_check)`. `node_check` is a node class: + # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` + # matches any kind of a node. `index_check` could be `None`, a boolean + # value, a string value, or a number. `None` and `False` match against + # any _value_ of sequence and mapping nodes. `True` matches against + # any _key_ of a mapping node. A string `index_check` matches against + # a mapping value that corresponds to a scalar key which content is + # equal to the `index_check` value. An integer `index_check` matches + # against a sequence value with the index equal to `index_check`. + if not 'yaml_path_resolvers' in cls.__dict__: + cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() + new_path = [] + for element in path: + if isinstance(element, (list, tuple)): + if len(element) == 2: + node_check, index_check = element + elif len(element) == 1: + node_check = element[0] + index_check = True + else: + raise ResolverError("Invalid path element: %s" % element) + else: + node_check = None + index_check = element + if node_check is str: + node_check = ScalarNode + elif node_check is list: + node_check = SequenceNode + elif node_check is dict: + node_check = MappingNode + elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ + and not isinstance(node_check, basestring) \ + and node_check is not None: + raise ResolverError("Invalid node checker: %s" % node_check) + if not isinstance(index_check, (basestring, int)) \ + and index_check is not None: + raise ResolverError("Invalid index checker: %s" % index_check) + new_path.append((node_check, index_check)) + if kind is str: + kind = ScalarNode + elif kind is list: + kind = SequenceNode + elif kind is dict: + kind = MappingNode + elif kind not in [ScalarNode, SequenceNode, MappingNode] \ + and kind is not None: + raise ResolverError("Invalid node kind: %s" % kind) + cls.yaml_path_resolvers[tuple(new_path), kind] = tag + add_path_resolver = classmethod(add_path_resolver) + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, + current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, + current_node, current_index): + node_check, index_check = path[depth-1] + if isinstance(node_check, basestring): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if (index_check is False or index_check is None) \ + and current_index is None: + return + if isinstance(index_check, basestring): + if not (isinstance(current_index, ScalarNode) + and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit): + if kind is ScalarNode and implicit[0]: + if value == u'': + resolvers = self.yaml_implicit_resolvers.get(u'', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + resolvers += self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers: + if regexp.match(value): + return tag + implicit = implicit[1] + if self.yaml_path_resolvers: + exact_paths = self.resolver_exact_paths[-1] + if kind in exact_paths: + return exact_paths[kind] + if None in exact_paths: + return exact_paths[None] + if kind is ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is MappingNode: + return self.DEFAULT_MAPPING_TAG + +class Resolver(BaseResolver): + pass + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:bool', + re.compile(ur'''^(?:yes|Yes|YES|no|No|NO + |true|True|TRUE|false|False|FALSE + |on|On|ON|off|Off|OFF)$''', re.X), + list(u'yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:float', + re.compile(ur'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? + |\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* + |[-+]?\.(?:inf|Inf|INF) + |\.(?:nan|NaN|NAN))$''', re.X), + list(u'-+0123456789.')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:int', + re.compile(ur'''^(?:[-+]?0b[0-1_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list(u'-+0123456789')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:merge', + re.compile(ur'^(?:<<)$'), + [u'<']) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:null', + re.compile(ur'''^(?: ~ + |null|Null|NULL + | )$''', re.X), + [u'~', u'n', u'N', u'']) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:timestamp', + re.compile(ur'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? + (?:[Tt]|[ \t]+)[0-9][0-9]? + :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? + (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), + list(u'0123456789')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:value', + re.compile(ur'^(?:=)$'), + [u'=']) + +# The following resolver is only for documentation purposes. It cannot work +# because plain scalars cannot start with '!', '&', or '*'. +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:yaml', + re.compile(ur'^(?:!|&|\*)$'), + list(u'!&*')) + diff --git a/lib/spack/external/yaml/lib/yaml/scanner.py b/lib/spack/external/yaml/lib/yaml/scanner.py new file mode 100644 index 0000000000..834f662a4c --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/scanner.py @@ -0,0 +1,1453 @@ + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DIRECTIVE(name, value) +# DOCUMENT-START +# DOCUMENT-END +# BLOCK-SEQUENCE-START +# BLOCK-MAPPING-START +# BLOCK-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# BLOCK-ENTRY +# FLOW-ENTRY +# KEY +# VALUE +# ALIAS(value) +# ANCHOR(value) +# TAG(value) +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. +# + +__all__ = ['Scanner', 'ScannerError'] + +from error import MarkedYAMLError +from tokens import * + +class ScannerError(MarkedYAMLError): + pass + +class SimpleKey(object): + # See below simple keys treatment. + + def __init__(self, token_number, required, index, line, column, mark): + self.token_number = token_number + self.required = required + self.index = index + self.line = line + self.column = column + self.mark = mark + +class Scanner(object): + + def __init__(self): + """Initialize the scanner.""" + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # The current indentation level. + self.indent = -1 + + # Past indentation levels. + self.indents = [] + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # Example of simple keys: + # --- + # block simple key: value + # ? not a simple key: + # : { flow simple key: value } + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line and 1024 characters. + + # Can a simple key start at the current position? A simple key may + # start: + # - at the beginning of the line, not counting indentation spaces + # (in block context), + # - after '{', '[', ',' (in the flow context), + # - after '?', ':', '-' (in the block context). + # In the block context, this flag also signifies if a block collection + # may start at the current position. + self.allow_simple_key = True + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, required, index, line, column, mark) + # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), + # '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Compare the current indentation and column. It may add some tokens + # and decrease the current indentation level. + self.unwind_indent(self.column) + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == u'\0': + return self.fetch_stream_end() + + # Is it a directive? + if ch == u'%' and self.check_directive(): + return self.fetch_directive() + + # Is it the document start? + if ch == u'-' and self.check_document_start(): + return self.fetch_document_start() + + # Is it the document end? + if ch == u'.' and self.check_document_end(): + return self.fetch_document_end() + + # TODO: support for BOM within a stream. + #if ch == u'\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == u'[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == u'{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == u']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == u'}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == u',': + return self.fetch_flow_entry() + + # Is it the block entry indicator? + if ch == u'-' and self.check_block_entry(): + return self.fetch_block_entry() + + # Is it the key indicator? + if ch == u'?' and self.check_key(): + return self.fetch_key() + + # Is it the value indicator? + if ch == u':' and self.check_value(): + return self.fetch_value() + + # Is it an alias? + if ch == u'*': + return self.fetch_alias() + + # Is it an anchor? + if ch == u'&': + return self.fetch_anchor() + + # Is it a tag? + if ch == u'!': + return self.fetch_tag() + + # Is it a literal scalar? + if ch == u'|' and not self.flow_level: + return self.fetch_literal() + + # Is it a folded scalar? + if ch == u'>' and not self.flow_level: + return self.fetch_folded() + + # Is it a single quoted scalar? + if ch == u'\'': + return self.fetch_single() + + # Is it a double quoted scalar? + if ch == u'\"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It's an error. Let's produce a nice error message. + raise ScannerError("while scanning for the next token", None, + "found character %r that cannot start any token" + % ch.encode('utf-8'), self.get_mark()) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don't need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # - should be no longer than 1024 characters. + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in self.possible_simple_keys.keys(): + key = self.possible_simple_keys[level] + if key.line != self.line \ + or self.index-key.index > 1024: + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it's possible + # and save its position. This function is called for + # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. + + # Check if a simple key is required at the current position. + required = not self.flow_level and self.indent == self.column + + # The next token might be a simple key. Let's save it's number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken+len(self.tokens) + key = SimpleKey(token_number, required, + self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + key = self.possible_simple_keys[self.flow_level] + + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + + del self.possible_simple_keys[self.flow_level] + + # Indentation functions. + + def unwind_indent(self, column): + + ## In flow context, tokens should respect indentation. + ## Actually the condition should be `self.indent >= column` according to + ## the spec. But this condition will prohibit intuitively correct + ## constructions such as + ## key : { + ## } + #if self.flow_level and self.indent > column: + # raise ScannerError(None, None, + # "invalid intendation or unclosed '[' or '{'", + # self.get_mark()) + + # In the flow context, indentation is ignored. We make the scanner less + # restrictive then specification requires. + if self.flow_level: + return + + # In block context, we may need to issue the BLOCK-END tokens. + while self.indent > column: + mark = self.get_mark() + self.indent = self.indents.pop() + self.tokens.append(BlockEndToken(mark, mark)) + + def add_indent(self, column): + # Check if we need to increase indentation. + if self.indent < column: + self.indents.append(self.indent) + self.indent = column + return True + return False + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(StreamStartToken(mark, mark, + encoding=self.encoding)) + + + def fetch_stream_end(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_directive(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Scan and add DIRECTIVE. + self.tokens.append(self.scan_directive()) + + def fetch_document_start(self): + self.fetch_document_indicator(DocumentStartToken) + + def fetch_document_end(self): + self.fetch_document_indicator(DocumentEndToken) + + def fetch_document_indicator(self, TokenClass): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. Note that there could not be a block collection + # after '---'. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Add DOCUMENT-START or DOCUMENT-END. + start_mark = self.get_mark() + self.forward(3) + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_entry(self): + + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(FlowEntryToken(start_mark, end_mark)) + + def fetch_block_entry(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a new entry? + if not self.allow_simple_key: + raise ScannerError(None, None, + "sequence entries are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-SEQUENCE-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockSequenceStartToken(mark, mark)) + + # It's an error for the block entry to occur in the flow context, + # but we let the parser detect this. + else: + pass + + # Simple keys are allowed after '-'. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add BLOCK-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(BlockEntryToken(start_mark, end_mark)) + + def fetch_key(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a key (not nessesary a simple)? + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping keys are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-MAPPING-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after '?' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add KEY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(KeyToken(start_mark, end_mark)) + + def fetch_value(self): + + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number-self.tokens_taken, + KeyToken(key.mark, key.mark)) + + # If this key starts a new block mapping, we need to add + # BLOCK-MAPPING-START. + if not self.flow_level: + if self.add_indent(key.column): + self.tokens.insert(key.token_number-self.tokens_taken, + BlockMappingStartToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # It must be a part of a complex key. + else: + + # Block context needs additional checks. + # (Do we really need them? They will be catched by the parser + # anyway.) + if not self.flow_level: + + # We are allowed to start a complex value if and only if + # we can start a simple key. + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping values are not allowed here", + self.get_mark()) + + # If this value starts a new block mapping, we need to add + # BLOCK-MAPPING-START. It will be detected as an error later by + # the parser. + if not self.flow_level: + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after ':' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(ValueToken(start_mark, end_mark)) + + def fetch_alias(self): + + # ALIAS could be a simple key. + self.save_possible_simple_key() + + # No simple keys after ALIAS. + self.allow_simple_key = False + + # Scan and add ALIAS. + self.tokens.append(self.scan_anchor(AliasToken)) + + def fetch_anchor(self): + + # ANCHOR could start a simple key. + self.save_possible_simple_key() + + # No simple keys after ANCHOR. + self.allow_simple_key = False + + # Scan and add ANCHOR. + self.tokens.append(self.scan_anchor(AnchorToken)) + + def fetch_tag(self): + + # TAG could start a simple key. + self.save_possible_simple_key() + + # No simple keys after TAG. + self.allow_simple_key = False + + # Scan and add TAG. + self.tokens.append(self.scan_tag()) + + def fetch_literal(self): + self.fetch_block_scalar(style='|') + + def fetch_folded(self): + self.fetch_block_scalar(style='>') + + def fetch_block_scalar(self, style): + + # A simple key may follow a block scalar. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Scan and add SCALAR. + self.tokens.append(self.scan_block_scalar(style)) + + def fetch_single(self): + self.fetch_flow_scalar(style='\'') + + def fetch_double(self): + self.fetch_flow_scalar(style='"') + + def fetch_flow_scalar(self, style): + + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar(style)) + + def fetch_plain(self): + + # A plain scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after plain scalars. But note that `scan_plain` will + # change this flag if the scan is finished at the beginning of the + # line. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_directive(self): + + # DIRECTIVE: ^ '%' ... + # The '%' indicator is already checked. + if self.column == 0: + return True + + def check_document_start(self): + + # DOCUMENT-START: ^ '---' (' '|'\n') + if self.column == 0: + if self.prefix(3) == u'---' \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return True + + def check_document_end(self): + + # DOCUMENT-END: ^ '...' (' '|'\n') + if self.column == 0: + if self.prefix(3) == u'...' \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return True + + def check_block_entry(self): + + # BLOCK-ENTRY: '-' (' '|'\n') + return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' + + def check_key(self): + + # KEY(flow context): '?' + if self.flow_level: + return True + + # KEY(block context): '?' (' '|'\n') + else: + return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' + + def check_value(self): + + # VALUE(flow context): ':' + if self.flow_level: + return True + + # VALUE(block context): ':' (' '|'\n') + else: + return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' + + def check_plain(self): + + # A plain scalar may start with any non-space character except: + # '-', '?', ':', ',', '[', ']', '{', '}', + # '#', '&', '*', '!', '|', '>', '\'', '\"', + # '%', '@', '`'. + # + # It may also start with + # '-', '?', ':' + # if it is followed by a non-space character. + # + # Note that we limit the last rule to the block context (except the + # '-' character) because we want the flow context to be space + # independent. + ch = self.peek() + return ch not in u'\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ + or (self.peek(1) not in u'\0 \t\r\n\x85\u2028\u2029' + and (ch == u'-' or (not self.flow_level and ch in u'?:'))) + + # Scanners. + + def scan_to_next_token(self): + # We ignore spaces, line breaks and comments. + # If we find a line break in the block context, we set the flag + # `allow_simple_key` on. + # The byte order mark is stripped if it's the first character in the + # stream. We do not yet support BOM inside the stream as the + # specification requires. Any such mark will be considered as a part + # of the document. + # + # TODO: We need to make tab handling rules more sane. A good rule is + # Tabs cannot precede tokens + # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, + # KEY(block), VALUE(block), BLOCK-ENTRY + # So the checking code is + # if : + # self.allow_simple_keys = False + # We also need to add the check for `allow_simple_keys == True` to + # `unwind_indent` before issuing BLOCK-END. + # Scanners for block, flow, and plain scalars need to be modified. + + if self.index == 0 and self.peek() == u'\uFEFF': + self.forward() + found = False + while not found: + while self.peek() == u' ': + self.forward() + if self.peek() == u'#': + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + if self.scan_line_break(): + if not self.flow_level: + self.allow_simple_key = True + else: + found = True + + def scan_directive(self): + # See the specification for details. + start_mark = self.get_mark() + self.forward() + name = self.scan_directive_name(start_mark) + value = None + if name == u'YAML': + value = self.scan_yaml_directive_value(start_mark) + end_mark = self.get_mark() + elif name == u'TAG': + value = self.scan_tag_directive_value(start_mark) + end_mark = self.get_mark() + else: + end_mark = self.get_mark() + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + self.scan_directive_ignored_line(start_mark) + return DirectiveToken(name, value, start_mark, end_mark) + + def scan_directive_name(self, start_mark): + # See the specification for details. + length = 0 + ch = self.peek(length) + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + return value + + def scan_yaml_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + major = self.scan_yaml_directive_number(start_mark) + if self.peek() != '.': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or '.', but found %r" + % self.peek().encode('utf-8'), + self.get_mark()) + self.forward() + minor = self.scan_yaml_directive_number(start_mark) + if self.peek() not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or ' ', but found %r" + % self.peek().encode('utf-8'), + self.get_mark()) + return (major, minor) + + def scan_yaml_directive_number(self, start_mark): + # See the specification for details. + ch = self.peek() + if not (u'0' <= ch <= u'9'): + raise ScannerError("while scanning a directive", start_mark, + "expected a digit, but found %r" % ch.encode('utf-8'), + self.get_mark()) + length = 0 + while u'0' <= self.peek(length) <= u'9': + length += 1 + value = int(self.prefix(length)) + self.forward(length) + return value + + def scan_tag_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + handle = self.scan_tag_directive_handle(start_mark) + while self.peek() == u' ': + self.forward() + prefix = self.scan_tag_directive_prefix(start_mark) + return (handle, prefix) + + def scan_tag_directive_handle(self, start_mark): + # See the specification for details. + value = self.scan_tag_handle('directive', start_mark) + ch = self.peek() + if ch != u' ': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch.encode('utf-8'), + self.get_mark()) + return value + + def scan_tag_directive_prefix(self, start_mark): + # See the specification for details. + value = self.scan_tag_uri('directive', start_mark) + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch.encode('utf-8'), + self.get_mark()) + return value + + def scan_directive_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + if self.peek() == u'#': + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in u'\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a comment or a line break, but found %r" + % ch.encode('utf-8'), self.get_mark()) + self.scan_line_break() + + def scan_anchor(self, TokenClass): + # The specification does not restrict characters for anchors and + # aliases. This may lead to problems, for instance, the document: + # [ *alias, value ] + # can be interpteted in two ways, as + # [ "value" ] + # and + # [ *alias , "value" ] + # Therefore we restrict aliases to numbers and ASCII letters. + start_mark = self.get_mark() + indicator = self.peek() + if indicator == u'*': + name = 'alias' + else: + name = 'anchor' + self.forward() + length = 0 + ch = self.peek(length) + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in u'\0 \t\r\n\x85\u2028\u2029?:,]}%@`': + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + end_mark = self.get_mark() + return TokenClass(value, start_mark, end_mark) + + def scan_tag(self): + # See the specification for details. + start_mark = self.get_mark() + ch = self.peek(1) + if ch == u'<': + handle = None + self.forward(2) + suffix = self.scan_tag_uri('tag', start_mark) + if self.peek() != u'>': + raise ScannerError("while parsing a tag", start_mark, + "expected '>', but found %r" % self.peek().encode('utf-8'), + self.get_mark()) + self.forward() + elif ch in u'\0 \t\r\n\x85\u2028\u2029': + handle = None + suffix = u'!' + self.forward() + else: + length = 1 + use_handle = False + while ch not in u'\0 \r\n\x85\u2028\u2029': + if ch == u'!': + use_handle = True + break + length += 1 + ch = self.peek(length) + handle = u'!' + if use_handle: + handle = self.scan_tag_handle('tag', start_mark) + else: + handle = u'!' + self.forward() + suffix = self.scan_tag_uri('tag', start_mark) + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a tag", start_mark, + "expected ' ', but found %r" % ch.encode('utf-8'), + self.get_mark()) + value = (handle, suffix) + end_mark = self.get_mark() + return TagToken(value, start_mark, end_mark) + + def scan_block_scalar(self, style): + # See the specification for details. + + if style == '>': + folded = True + else: + folded = False + + chunks = [] + start_mark = self.get_mark() + + # Scan the header. + self.forward() + chomping, increment = self.scan_block_scalar_indicators(start_mark) + self.scan_block_scalar_ignored_line(start_mark) + + # Determine the indentation level and go to the first non-empty line. + min_indent = self.indent+1 + if min_indent < 1: + min_indent = 1 + if increment is None: + breaks, max_indent, end_mark = self.scan_block_scalar_indentation() + indent = max(min_indent, max_indent) + else: + indent = min_indent+increment-1 + breaks, end_mark = self.scan_block_scalar_breaks(indent) + line_break = u'' + + # Scan the inner part of the block scalar. + while self.column == indent and self.peek() != u'\0': + chunks.extend(breaks) + leading_non_space = self.peek() not in u' \t' + length = 0 + while self.peek(length) not in u'\0\r\n\x85\u2028\u2029': + length += 1 + chunks.append(self.prefix(length)) + self.forward(length) + line_break = self.scan_line_break() + breaks, end_mark = self.scan_block_scalar_breaks(indent) + if self.column == indent and self.peek() != u'\0': + + # Unfortunately, folding rules are ambiguous. + # + # This is the folding according to the specification: + + if folded and line_break == u'\n' \ + and leading_non_space and self.peek() not in u' \t': + if not breaks: + chunks.append(u' ') + else: + chunks.append(line_break) + + # This is Clark Evans's interpretation (also in the spec + # examples): + # + #if folded and line_break == u'\n': + # if not breaks: + # if self.peek() not in ' \t': + # chunks.append(u' ') + # else: + # chunks.append(line_break) + #else: + # chunks.append(line_break) + else: + break + + # Chomp the tail. + if chomping is not False: + chunks.append(line_break) + if chomping is True: + chunks.extend(breaks) + + # We are done. + return ScalarToken(u''.join(chunks), False, start_mark, end_mark, + style) + + def scan_block_scalar_indicators(self, start_mark): + # See the specification for details. + chomping = None + increment = None + ch = self.peek() + if ch in u'+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch in u'0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + elif ch in u'0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + ch = self.peek() + if ch in u'+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected chomping or indentation indicators, but found %r" + % ch.encode('utf-8'), self.get_mark()) + return chomping, increment + + def scan_block_scalar_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + if self.peek() == u'#': + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in u'\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected a comment or a line break, but found %r" + % ch.encode('utf-8'), self.get_mark()) + self.scan_line_break() + + def scan_block_scalar_indentation(self): + # See the specification for details. + chunks = [] + max_indent = 0 + end_mark = self.get_mark() + while self.peek() in u' \r\n\x85\u2028\u2029': + if self.peek() != u' ': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + else: + self.forward() + if self.column > max_indent: + max_indent = self.column + return chunks, max_indent, end_mark + + def scan_block_scalar_breaks(self, indent): + # See the specification for details. + chunks = [] + end_mark = self.get_mark() + while self.column < indent and self.peek() == u' ': + self.forward() + while self.peek() in u'\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + while self.column < indent and self.peek() == u' ': + self.forward() + return chunks, end_mark + + def scan_flow_scalar(self, style): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don't need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + if style == '"': + double = True + else: + double = False + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + self.forward() + end_mark = self.get_mark() + return ScalarToken(u''.join(chunks), False, start_mark, end_mark, + style) + + ESCAPE_REPLACEMENTS = { + u'0': u'\0', + u'a': u'\x07', + u'b': u'\x08', + u't': u'\x09', + u'\t': u'\x09', + u'n': u'\x0A', + u'v': u'\x0B', + u'f': u'\x0C', + u'r': u'\x0D', + u'e': u'\x1B', + u' ': u'\x20', + u'\"': u'\"', + u'\\': u'\\', + u'N': u'\x85', + u'_': u'\xA0', + u'L': u'\u2028', + u'P': u'\u2029', + } + + ESCAPE_CODES = { + u'x': 2, + u'u': 4, + u'U': 8, + } + + def scan_flow_scalar_non_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in u'\'\"\\\0 \t\r\n\x85\u2028\u2029': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if not double and ch == u'\'' and self.peek(1) == u'\'': + chunks.append(u'\'') + self.forward(2) + elif (double and ch == u'\'') or (not double and ch in u'\"\\'): + chunks.append(ch) + self.forward() + elif double and ch == u'\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in u'0123456789ABCDEFabcdef': + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "expected escape sequence of %d hexdecimal numbers, but found %r" % + (length, self.peek(k).encode('utf-8')), self.get_mark()) + code = int(self.prefix(length), 16) + chunks.append(unichr(code)) + self.forward(length) + elif ch in u'\r\n\x85\u2028\u2029': + self.scan_line_break() + chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) + else: + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "found unknown escape character %r" % ch.encode('utf-8'), self.get_mark()) + else: + return chunks + + def scan_flow_scalar_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in u' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == u'\0': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected end of stream", self.get_mark()) + elif ch in u'\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + breaks = self.scan_flow_scalar_breaks(double, start_mark) + if line_break != u'\n': + chunks.append(line_break) + elif not breaks: + chunks.append(u' ') + chunks.extend(breaks) + else: + chunks.append(whitespaces) + return chunks + + def scan_flow_scalar_breaks(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + # Instead of checking indentation, we check for document + # separators. + prefix = self.prefix(3) + if (prefix == u'---' or prefix == u'...') \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected document separator", self.get_mark()) + while self.peek() in u' \t': + self.forward() + if self.peek() in u'\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + else: + return chunks + + def scan_plain(self): + # See the specification for details. + # We add an additional restriction for the flow context: + # plain scalars in the flow context cannot contain ',', ':' and '?'. + # We also keep track of the `allow_simple_key` flag here. + # Indentation rules are loosed for the flow context. + chunks = [] + start_mark = self.get_mark() + end_mark = start_mark + indent = self.indent+1 + # We allow zero indentation for scalars, but then we need to check for + # document separators at the beginning of the line. + #if indent == 0: + # indent = 1 + spaces = [] + while True: + length = 0 + if self.peek() == u'#': + break + while True: + ch = self.peek(length) + if ch in u'\0 \t\r\n\x85\u2028\u2029' \ + or (not self.flow_level and ch == u':' and + self.peek(length+1) in u'\0 \t\r\n\x85\u2028\u2029') \ + or (self.flow_level and ch in u',:?[]{}'): + break + length += 1 + # It's not clear what we should do with ':' in the flow context. + if (self.flow_level and ch == u':' + and self.peek(length+1) not in u'\0 \t\r\n\x85\u2028\u2029,[]{}'): + self.forward(length) + raise ScannerError("while scanning a plain scalar", start_mark, + "found unexpected ':'", self.get_mark(), + "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + spaces = self.scan_plain_spaces(indent, start_mark) + if not spaces or self.peek() == u'#' \ + or (not self.flow_level and self.column < indent): + break + return ScalarToken(u''.join(chunks), True, start_mark, end_mark) + + def scan_plain_spaces(self, indent, start_mark): + # See the specification for details. + # The specification is really confusing about tabs in plain scalars. + # We just forbid them completely. Do not use tabs in YAML! + chunks = [] + length = 0 + while self.peek(length) in u' ': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch in u'\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + self.allow_simple_key = True + prefix = self.prefix(3) + if (prefix == u'---' or prefix == u'...') \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return + breaks = [] + while self.peek() in u' \r\n\x85\u2028\u2029': + if self.peek() == ' ': + self.forward() + else: + breaks.append(self.scan_line_break()) + prefix = self.prefix(3) + if (prefix == u'---' or prefix == u'...') \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return + if line_break != u'\n': + chunks.append(line_break) + elif not breaks: + chunks.append(u' ') + chunks.extend(breaks) + elif whitespaces: + chunks.append(whitespaces) + return chunks + + def scan_tag_handle(self, name, start_mark): + # See the specification for details. + # For some strange reasons, the specification does not allow '_' in + # tag handles. I have allowed it anyway. + ch = self.peek() + if ch != u'!': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch.encode('utf-8'), + self.get_mark()) + length = 1 + ch = self.peek(length) + if ch != u' ': + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_': + length += 1 + ch = self.peek(length) + if ch != u'!': + self.forward(length) + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch.encode('utf-8'), + self.get_mark()) + length += 1 + value = self.prefix(length) + self.forward(length) + return value + + def scan_tag_uri(self, name, start_mark): + # See the specification for details. + # Note: we do not check if URI is well-formed. + chunks = [] + length = 0 + ch = self.peek(length) + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-;/?:@&=+$,_.!~*\'()[]%': + if ch == u'%': + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + chunks.append(self.scan_uri_escapes(name, start_mark)) + else: + length += 1 + ch = self.peek(length) + if length: + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + if not chunks: + raise ScannerError("while parsing a %s" % name, start_mark, + "expected URI, but found %r" % ch.encode('utf-8'), + self.get_mark()) + return u''.join(chunks) + + def scan_uri_escapes(self, name, start_mark): + # See the specification for details. + bytes = [] + mark = self.get_mark() + while self.peek() == u'%': + self.forward() + for k in range(2): + if self.peek(k) not in u'0123456789ABCDEFabcdef': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected URI escape sequence of 2 hexdecimal numbers, but found %r" % + (self.peek(k).encode('utf-8')), self.get_mark()) + bytes.append(chr(int(self.prefix(2), 16))) + self.forward(2) + try: + value = unicode(''.join(bytes), 'utf-8') + except UnicodeDecodeError, exc: + raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) + return value + + def scan_line_break(self): + # Transforms: + # '\r\n' : '\n' + # '\r' : '\n' + # '\n' : '\n' + # '\x85' : '\n' + # '\u2028' : '\u2028' + # '\u2029 : '\u2029' + # default : '' + ch = self.peek() + if ch in u'\r\n\x85': + if self.prefix(2) == u'\r\n': + self.forward(2) + else: + self.forward() + return u'\n' + elif ch in u'\u2028\u2029': + self.forward() + return ch + return u'' + +#try: +# import psyco +# psyco.bind(Scanner) +#except ImportError: +# pass + diff --git a/lib/spack/external/yaml/lib/yaml/serializer.py b/lib/spack/external/yaml/lib/yaml/serializer.py new file mode 100644 index 0000000000..0bf1e96dc1 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/serializer.py @@ -0,0 +1,111 @@ + +__all__ = ['Serializer', 'SerializerError'] + +from error import YAMLError +from events import * +from nodes import * + +class SerializerError(YAMLError): + pass + +class Serializer(object): + + ANCHOR_TEMPLATE = u'id%03d' + + def __init__(self, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + self.use_encoding = encoding + self.use_explicit_start = explicit_start + self.use_explicit_end = explicit_end + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + self.closed = None + + def open(self): + if self.closed is None: + self.emit(StreamStartEvent(encoding=self.use_encoding)) + self.closed = False + elif self.closed: + raise SerializerError("serializer is closed") + else: + raise SerializerError("serializer is already opened") + + def close(self): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif not self.closed: + self.emit(StreamEndEvent()) + self.closed = True + + #def __del__(self): + # self.close() + + def serialize(self, node): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif self.closed: + raise SerializerError("serializer is closed") + self.emit(DocumentStartEvent(explicit=self.use_explicit_start, + version=self.use_version, tags=self.use_tags)) + self.anchor_node(node) + self.serialize_node(node, None, None) + self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + + def anchor_node(self, node): + if node in self.anchors: + if self.anchors[node] is None: + self.anchors[node] = self.generate_anchor(node) + else: + self.anchors[node] = None + if isinstance(node, SequenceNode): + for item in node.value: + self.anchor_node(item) + elif isinstance(node, MappingNode): + for key, value in node.value: + self.anchor_node(key) + self.anchor_node(value) + + def generate_anchor(self, node): + self.last_anchor_id += 1 + return self.ANCHOR_TEMPLATE % self.last_anchor_id + + def serialize_node(self, node, parent, index): + alias = self.anchors[node] + if node in self.serialized_nodes: + self.emit(AliasEvent(alias)) + else: + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if isinstance(node, ScalarNode): + detected_tag = self.resolve(ScalarNode, node.value, (True, False)) + default_tag = self.resolve(ScalarNode, node.value, (False, True)) + implicit = (node.tag == detected_tag), (node.tag == default_tag) + self.emit(ScalarEvent(alias, node.tag, implicit, node.value, + style=node.style)) + elif isinstance(node, SequenceNode): + implicit = (node.tag + == self.resolve(SequenceNode, node.value, True)) + self.emit(SequenceStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + index = 0 + for item in node.value: + self.serialize_node(item, node, index) + index += 1 + self.emit(SequenceEndEvent()) + elif isinstance(node, MappingNode): + implicit = (node.tag + == self.resolve(MappingNode, node.value, True)) + self.emit(MappingStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + for key, value in node.value: + self.serialize_node(key, node, None) + self.serialize_node(value, node, key) + self.emit(MappingEndEvent()) + self.ascend_resolver() + diff --git a/lib/spack/external/yaml/lib/yaml/tokens.py b/lib/spack/external/yaml/lib/yaml/tokens.py new file mode 100644 index 0000000000..4d0b48a394 --- /dev/null +++ b/lib/spack/external/yaml/lib/yaml/tokens.py @@ -0,0 +1,104 @@ + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in self.__dict__ + if not key.endswith('_mark')] + attributes.sort() + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +#class BOMToken(Token): +# id = '' + +class DirectiveToken(Token): + id = '' + def __init__(self, name, value, start_mark, end_mark): + self.name = name + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class DocumentStartToken(Token): + id = '' + +class DocumentEndToken(Token): + id = '' + +class StreamStartToken(Token): + id = '' + def __init__(self, start_mark=None, end_mark=None, + encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndToken(Token): + id = '' + +class BlockSequenceStartToken(Token): + id = '' + +class BlockMappingStartToken(Token): + id = '' + +class BlockEndToken(Token): + id = '' + +class FlowSequenceStartToken(Token): + id = '[' + +class FlowMappingStartToken(Token): + id = '{' + +class FlowSequenceEndToken(Token): + id = ']' + +class FlowMappingEndToken(Token): + id = '}' + +class KeyToken(Token): + id = '?' + +class ValueToken(Token): + id = ':' + +class BlockEntryToken(Token): + id = '-' + +class FlowEntryToken(Token): + id = ',' + +class AliasToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class AnchorToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class TagToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class ScalarToken(Token): + id = '' + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + diff --git a/lib/spack/external/yaml/lib3/yaml/__init__.py b/lib/spack/external/yaml/lib3/yaml/__init__.py new file mode 100644 index 0000000000..d7d27fe63b --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/__init__.py @@ -0,0 +1,312 @@ + +from .error import * + +from .tokens import * +from .events import * +from .nodes import * + +from .loader import * +from .dumper import * + +__version__ = '3.12' +try: + from .cyaml import * + __with_libyaml__ = True +except ImportError: + __with_libyaml__ = False + +import io + +def scan(stream, Loader=Loader): + """ + Scan a YAML stream and produce scanning tokens. + """ + loader = Loader(stream) + try: + while loader.check_token(): + yield loader.get_token() + finally: + loader.dispose() + +def parse(stream, Loader=Loader): + """ + Parse a YAML stream and produce parsing events. + """ + loader = Loader(stream) + try: + while loader.check_event(): + yield loader.get_event() + finally: + loader.dispose() + +def compose(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding representation tree. + """ + loader = Loader(stream) + try: + return loader.get_single_node() + finally: + loader.dispose() + +def compose_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding representation trees. + """ + loader = Loader(stream) + try: + while loader.check_node(): + yield loader.get_node() + finally: + loader.dispose() + +def load(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + """ + loader = Loader(stream) + try: + return loader.get_single_data() + finally: + loader.dispose() + +def load_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + """ + loader = Loader(stream) + try: + while loader.check_data(): + yield loader.get_data() + finally: + loader.dispose() + +def safe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + Resolve only basic YAML tags. + """ + return load(stream, SafeLoader) + +def safe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + Resolve only basic YAML tags. + """ + return load_all(stream, SafeLoader) + +def emit(events, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + """ + Emit YAML parsing events into a stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + stream = io.StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + try: + for event in events: + dumper.emit(event) + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize_all(nodes, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of representation trees into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for node in nodes: + dumper.serialize(node) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize(node, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a representation tree into a YAML stream. + If stream is None, return the produced string instead. + """ + return serialize_all([node], stream, Dumper=Dumper, **kwds) + +def dump_all(documents, stream=None, Dumper=Dumper, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of Python objects into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, default_style=default_style, + default_flow_style=default_flow_style, + canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for data in documents: + dumper.represent(data) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def dump(data, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a Python object into a YAML stream. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=Dumper, **kwds) + +def safe_dump_all(documents, stream=None, **kwds): + """ + Serialize a sequence of Python objects into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all(documents, stream, Dumper=SafeDumper, **kwds) + +def safe_dump(data, stream=None, **kwds): + """ + Serialize a Python object into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=SafeDumper, **kwds) + +def add_implicit_resolver(tag, regexp, first=None, + Loader=Loader, Dumper=Dumper): + """ + Add an implicit scalar detector. + If an implicit scalar value matches the given regexp, + the corresponding tag is assigned to the scalar. + first is a sequence of possible initial characters or None. + """ + Loader.add_implicit_resolver(tag, regexp, first) + Dumper.add_implicit_resolver(tag, regexp, first) + +def add_path_resolver(tag, path, kind=None, Loader=Loader, Dumper=Dumper): + """ + Add a path based resolver for the given tag. + A path is a list of keys that forms a path + to a node in the representation tree. + Keys can be string values, integers, or None. + """ + Loader.add_path_resolver(tag, path, kind) + Dumper.add_path_resolver(tag, path, kind) + +def add_constructor(tag, constructor, Loader=Loader): + """ + Add a constructor for the given tag. + Constructor is a function that accepts a Loader instance + and a node object and produces the corresponding Python object. + """ + Loader.add_constructor(tag, constructor) + +def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): + """ + Add a multi-constructor for the given tag prefix. + Multi-constructor is called for a node if its tag starts with tag_prefix. + Multi-constructor accepts a Loader instance, a tag suffix, + and a node object and produces the corresponding Python object. + """ + Loader.add_multi_constructor(tag_prefix, multi_constructor) + +def add_representer(data_type, representer, Dumper=Dumper): + """ + Add a representer for the given type. + Representer is a function accepting a Dumper instance + and an instance of the given data type + and producing the corresponding representation node. + """ + Dumper.add_representer(data_type, representer) + +def add_multi_representer(data_type, multi_representer, Dumper=Dumper): + """ + Add a representer for the given type. + Multi-representer is a function accepting a Dumper instance + and an instance of the given data type or subtype + and producing the corresponding representation node. + """ + Dumper.add_multi_representer(data_type, multi_representer) + +class YAMLObjectMetaclass(type): + """ + The metaclass for YAMLObject. + """ + def __init__(cls, name, bases, kwds): + super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) + if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: + cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) + cls.yaml_dumper.add_representer(cls, cls.to_yaml) + +class YAMLObject(metaclass=YAMLObjectMetaclass): + """ + An object that can dump itself to a YAML stream + and load itself from a YAML stream. + """ + + __slots__ = () # no direct instantiation, so allow immutable subclasses + + yaml_loader = Loader + yaml_dumper = Dumper + + yaml_tag = None + yaml_flow_style = None + + @classmethod + def from_yaml(cls, loader, node): + """ + Convert a representation node to a Python object. + """ + return loader.construct_yaml_object(node, cls) + + @classmethod + def to_yaml(cls, dumper, data): + """ + Convert a Python object to a representation node. + """ + return dumper.represent_yaml_object(cls.yaml_tag, data, cls, + flow_style=cls.yaml_flow_style) + diff --git a/lib/spack/external/yaml/lib3/yaml/composer.py b/lib/spack/external/yaml/lib3/yaml/composer.py new file mode 100644 index 0000000000..d5c6a7acd9 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/composer.py @@ -0,0 +1,139 @@ + +__all__ = ['Composer', 'ComposerError'] + +from .error import MarkedYAMLError +from .events import * +from .nodes import * + +class ComposerError(MarkedYAMLError): + pass + +class Composer: + + def __init__(self): + self.anchors = {} + + def check_node(self): + # Drop the STREAM-START event. + if self.check_event(StreamStartEvent): + self.get_event() + + # If there are more documents available? + return not self.check_event(StreamEndEvent) + + def get_node(self): + # Get the root node of the next document. + if not self.check_event(StreamEndEvent): + return self.compose_document() + + def get_single_node(self): + # Drop the STREAM-START event. + self.get_event() + + # Compose a document if the stream is not empty. + document = None + if not self.check_event(StreamEndEvent): + document = self.compose_document() + + # Ensure that the stream contains no more documents. + if not self.check_event(StreamEndEvent): + event = self.get_event() + raise ComposerError("expected a single document in the stream", + document.start_mark, "but found another document", + event.start_mark) + + # Drop the STREAM-END event. + self.get_event() + + return document + + def compose_document(self): + # Drop the DOCUMENT-START event. + self.get_event() + + # Compose the root node. + node = self.compose_node(None, None) + + # Drop the DOCUMENT-END event. + self.get_event() + + self.anchors = {} + return node + + def compose_node(self, parent, index): + if self.check_event(AliasEvent): + event = self.get_event() + anchor = event.anchor + if anchor not in self.anchors: + raise ComposerError(None, None, "found undefined alias %r" + % anchor, event.start_mark) + return self.anchors[anchor] + event = self.peek_event() + anchor = event.anchor + if anchor is not None: + if anchor in self.anchors: + raise ComposerError("found duplicate anchor %r; first occurence" + % anchor, self.anchors[anchor].start_mark, + "second occurence", event.start_mark) + self.descend_resolver(parent, index) + if self.check_event(ScalarEvent): + node = self.compose_scalar_node(anchor) + elif self.check_event(SequenceStartEvent): + node = self.compose_sequence_node(anchor) + elif self.check_event(MappingStartEvent): + node = self.compose_mapping_node(anchor) + self.ascend_resolver() + return node + + def compose_scalar_node(self, anchor): + event = self.get_event() + tag = event.tag + if tag is None or tag == '!': + tag = self.resolve(ScalarNode, event.value, event.implicit) + node = ScalarNode(tag, event.value, + event.start_mark, event.end_mark, style=event.style) + if anchor is not None: + self.anchors[anchor] = node + return node + + def compose_sequence_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(SequenceNode, None, start_event.implicit) + node = SequenceNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + index = 0 + while not self.check_event(SequenceEndEvent): + node.value.append(self.compose_node(node, index)) + index += 1 + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + + def compose_mapping_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(MappingNode, None, start_event.implicit) + node = MappingNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + while not self.check_event(MappingEndEvent): + #key_event = self.peek_event() + item_key = self.compose_node(node, None) + #if item_key in node.value: + # raise ComposerError("while composing a mapping", start_event.start_mark, + # "found duplicate key", key_event.start_mark) + item_value = self.compose_node(node, item_key) + #node.value[item_key] = item_value + node.value.append((item_key, item_value)) + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + diff --git a/lib/spack/external/yaml/lib3/yaml/constructor.py b/lib/spack/external/yaml/lib3/yaml/constructor.py new file mode 100644 index 0000000000..981543aebb --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/constructor.py @@ -0,0 +1,686 @@ + +__all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', + 'ConstructorError'] + +from .error import * +from .nodes import * + +import collections, datetime, base64, binascii, re, sys, types + +class ConstructorError(MarkedYAMLError): + pass + +class BaseConstructor: + + yaml_constructors = {} + yaml_multi_constructors = {} + + def __init__(self): + self.constructed_objects = {} + self.recursive_objects = {} + self.state_generators = [] + self.deep_construct = False + + def check_data(self): + # If there are more documents available? + return self.check_node() + + def get_data(self): + # Construct and return the next document. + if self.check_node(): + return self.construct_document(self.get_node()) + + def get_single_data(self): + # Ensure that the stream contains a single document and construct it. + node = self.get_single_node() + if node is not None: + return self.construct_document(node) + return None + + def construct_document(self, node): + data = self.construct_object(node) + while self.state_generators: + state_generators = self.state_generators + self.state_generators = [] + for generator in state_generators: + for dummy in generator: + pass + self.constructed_objects = {} + self.recursive_objects = {} + self.deep_construct = False + return data + + def construct_object(self, node, deep=False): + if node in self.constructed_objects: + return self.constructed_objects[node] + if deep: + old_deep = self.deep_construct + self.deep_construct = True + if node in self.recursive_objects: + raise ConstructorError(None, None, + "found unconstructable recursive node", node.start_mark) + self.recursive_objects[node] = None + constructor = None + tag_suffix = None + if node.tag in self.yaml_constructors: + constructor = self.yaml_constructors[node.tag] + else: + for tag_prefix in self.yaml_multi_constructors: + if node.tag.startswith(tag_prefix): + tag_suffix = node.tag[len(tag_prefix):] + constructor = self.yaml_multi_constructors[tag_prefix] + break + else: + if None in self.yaml_multi_constructors: + tag_suffix = node.tag + constructor = self.yaml_multi_constructors[None] + elif None in self.yaml_constructors: + constructor = self.yaml_constructors[None] + elif isinstance(node, ScalarNode): + constructor = self.__class__.construct_scalar + elif isinstance(node, SequenceNode): + constructor = self.__class__.construct_sequence + elif isinstance(node, MappingNode): + constructor = self.__class__.construct_mapping + if tag_suffix is None: + data = constructor(self, node) + else: + data = constructor(self, tag_suffix, node) + if isinstance(data, types.GeneratorType): + generator = data + data = next(generator) + if self.deep_construct: + for dummy in generator: + pass + else: + self.state_generators.append(generator) + self.constructed_objects[node] = data + del self.recursive_objects[node] + if deep: + self.deep_construct = old_deep + return data + + def construct_scalar(self, node): + if not isinstance(node, ScalarNode): + raise ConstructorError(None, None, + "expected a scalar node, but found %s" % node.id, + node.start_mark) + return node.value + + def construct_sequence(self, node, deep=False): + if not isinstance(node, SequenceNode): + raise ConstructorError(None, None, + "expected a sequence node, but found %s" % node.id, + node.start_mark) + return [self.construct_object(child, deep=deep) + for child in node.value] + + def construct_mapping(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + mapping = {} + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + if not isinstance(key, collections.Hashable): + raise ConstructorError("while constructing a mapping", node.start_mark, + "found unhashable key", key_node.start_mark) + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + def construct_pairs(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + pairs = [] + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + value = self.construct_object(value_node, deep=deep) + pairs.append((key, value)) + return pairs + + @classmethod + def add_constructor(cls, tag, constructor): + if not 'yaml_constructors' in cls.__dict__: + cls.yaml_constructors = cls.yaml_constructors.copy() + cls.yaml_constructors[tag] = constructor + + @classmethod + def add_multi_constructor(cls, tag_prefix, multi_constructor): + if not 'yaml_multi_constructors' in cls.__dict__: + cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() + cls.yaml_multi_constructors[tag_prefix] = multi_constructor + +class SafeConstructor(BaseConstructor): + + def construct_scalar(self, node): + if isinstance(node, MappingNode): + for key_node, value_node in node.value: + if key_node.tag == 'tag:yaml.org,2002:value': + return self.construct_scalar(value_node) + return super().construct_scalar(node) + + def flatten_mapping(self, node): + merge = [] + index = 0 + while index < len(node.value): + key_node, value_node = node.value[index] + if key_node.tag == 'tag:yaml.org,2002:merge': + del node.value[index] + if isinstance(value_node, MappingNode): + self.flatten_mapping(value_node) + merge.extend(value_node.value) + elif isinstance(value_node, SequenceNode): + submerge = [] + for subnode in value_node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing a mapping", + node.start_mark, + "expected a mapping for merging, but found %s" + % subnode.id, subnode.start_mark) + self.flatten_mapping(subnode) + submerge.append(subnode.value) + submerge.reverse() + for value in submerge: + merge.extend(value) + else: + raise ConstructorError("while constructing a mapping", node.start_mark, + "expected a mapping or list of mappings for merging, but found %s" + % value_node.id, value_node.start_mark) + elif key_node.tag == 'tag:yaml.org,2002:value': + key_node.tag = 'tag:yaml.org,2002:str' + index += 1 + else: + index += 1 + if merge: + node.value = merge + node.value + + def construct_mapping(self, node, deep=False): + if isinstance(node, MappingNode): + self.flatten_mapping(node) + return super().construct_mapping(node, deep=deep) + + def construct_yaml_null(self, node): + self.construct_scalar(node) + return None + + bool_values = { + 'yes': True, + 'no': False, + 'true': True, + 'false': False, + 'on': True, + 'off': False, + } + + def construct_yaml_bool(self, node): + value = self.construct_scalar(node) + return self.bool_values[value.lower()] + + def construct_yaml_int(self, node): + value = self.construct_scalar(node) + value = value.replace('_', '') + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '0': + return 0 + elif value.startswith('0b'): + return sign*int(value[2:], 2) + elif value.startswith('0x'): + return sign*int(value[2:], 16) + elif value[0] == '0': + return sign*int(value, 8) + elif ':' in value: + digits = [int(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*int(value) + + inf_value = 1e300 + while inf_value != inf_value*inf_value: + inf_value *= inf_value + nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99). + + def construct_yaml_float(self, node): + value = self.construct_scalar(node) + value = value.replace('_', '').lower() + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '.inf': + return sign*self.inf_value + elif value == '.nan': + return self.nan_value + elif ':' in value: + digits = [float(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0.0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*float(value) + + def construct_yaml_binary(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + timestamp_regexp = re.compile( + r'''^(?P[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)?$''', re.X) + + def construct_yaml_timestamp(self, node): + value = self.construct_scalar(node) + match = self.timestamp_regexp.match(node.value) + values = match.groupdict() + year = int(values['year']) + month = int(values['month']) + day = int(values['day']) + if not values['hour']: + return datetime.date(year, month, day) + hour = int(values['hour']) + minute = int(values['minute']) + second = int(values['second']) + fraction = 0 + if values['fraction']: + fraction = values['fraction'][:6] + while len(fraction) < 6: + fraction += '0' + fraction = int(fraction) + delta = None + if values['tz_sign']: + tz_hour = int(values['tz_hour']) + tz_minute = int(values['tz_minute'] or 0) + delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) + if values['tz_sign'] == '-': + delta = -delta + data = datetime.datetime(year, month, day, hour, minute, second, fraction) + if delta: + data -= delta + return data + + def construct_yaml_omap(self, node): + # Note: we do not check for duplicate keys, because it's too + # CPU-expensive. + omap = [] + yield omap + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + omap.append((key, value)) + + def construct_yaml_pairs(self, node): + # Note: the same code as `construct_yaml_omap`. + pairs = [] + yield pairs + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + pairs.append((key, value)) + + def construct_yaml_set(self, node): + data = set() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_str(self, node): + return self.construct_scalar(node) + + def construct_yaml_seq(self, node): + data = [] + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = {} + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_object(self, node, cls): + data = cls.__new__(cls) + yield data + if hasattr(data, '__setstate__'): + state = self.construct_mapping(node, deep=True) + data.__setstate__(state) + else: + state = self.construct_mapping(node) + data.__dict__.update(state) + + def construct_undefined(self, node): + raise ConstructorError(None, None, + "could not determine a constructor for the tag %r" % node.tag, + node.start_mark) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:null', + SafeConstructor.construct_yaml_null) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:bool', + SafeConstructor.construct_yaml_bool) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:int', + SafeConstructor.construct_yaml_int) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:float', + SafeConstructor.construct_yaml_float) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:binary', + SafeConstructor.construct_yaml_binary) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:timestamp', + SafeConstructor.construct_yaml_timestamp) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:omap', + SafeConstructor.construct_yaml_omap) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:pairs', + SafeConstructor.construct_yaml_pairs) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:set', + SafeConstructor.construct_yaml_set) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:str', + SafeConstructor.construct_yaml_str) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:seq', + SafeConstructor.construct_yaml_seq) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:map', + SafeConstructor.construct_yaml_map) + +SafeConstructor.add_constructor(None, + SafeConstructor.construct_undefined) + +class Constructor(SafeConstructor): + + def construct_python_str(self, node): + return self.construct_scalar(node) + + def construct_python_unicode(self, node): + return self.construct_scalar(node) + + def construct_python_bytes(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + def construct_python_long(self, node): + return self.construct_yaml_int(node) + + def construct_python_complex(self, node): + return complex(self.construct_scalar(node)) + + def construct_python_tuple(self, node): + return tuple(self.construct_sequence(node)) + + def find_python_module(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python module", mark, + "expected non-empty name appended to the tag", mark) + try: + __import__(name) + except ImportError as exc: + raise ConstructorError("while constructing a Python module", mark, + "cannot find module %r (%s)" % (name, exc), mark) + return sys.modules[name] + + def find_python_name(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python object", mark, + "expected non-empty name appended to the tag", mark) + if '.' in name: + module_name, object_name = name.rsplit('.', 1) + else: + module_name = 'builtins' + object_name = name + try: + __import__(module_name) + except ImportError as exc: + raise ConstructorError("while constructing a Python object", mark, + "cannot find module %r (%s)" % (module_name, exc), mark) + module = sys.modules[module_name] + if not hasattr(module, object_name): + raise ConstructorError("while constructing a Python object", mark, + "cannot find %r in the module %r" + % (object_name, module.__name__), mark) + return getattr(module, object_name) + + def construct_python_name(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python name", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_name(suffix, node.start_mark) + + def construct_python_module(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python module", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_module(suffix, node.start_mark) + + def make_python_instance(self, suffix, node, + args=None, kwds=None, newobj=False): + if not args: + args = [] + if not kwds: + kwds = {} + cls = self.find_python_name(suffix, node.start_mark) + if newobj and isinstance(cls, type): + return cls.__new__(cls, *args, **kwds) + else: + return cls(*args, **kwds) + + def set_python_instance_state(self, instance, state): + if hasattr(instance, '__setstate__'): + instance.__setstate__(state) + else: + slotstate = {} + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + if hasattr(instance, '__dict__'): + instance.__dict__.update(state) + elif state: + slotstate.update(state) + for key, value in slotstate.items(): + setattr(object, key, value) + + def construct_python_object(self, suffix, node): + # Format: + # !!python/object:module.name { ... state ... } + instance = self.make_python_instance(suffix, node, newobj=True) + yield instance + deep = hasattr(instance, '__setstate__') + state = self.construct_mapping(node, deep=deep) + self.set_python_instance_state(instance, state) + + def construct_python_object_apply(self, suffix, node, newobj=False): + # Format: + # !!python/object/apply # (or !!python/object/new) + # args: [ ... arguments ... ] + # kwds: { ... keywords ... } + # state: ... state ... + # listitems: [ ... listitems ... ] + # dictitems: { ... dictitems ... } + # or short format: + # !!python/object/apply [ ... arguments ... ] + # The difference between !!python/object/apply and !!python/object/new + # is how an object is created, check make_python_instance for details. + if isinstance(node, SequenceNode): + args = self.construct_sequence(node, deep=True) + kwds = {} + state = {} + listitems = [] + dictitems = {} + else: + value = self.construct_mapping(node, deep=True) + args = value.get('args', []) + kwds = value.get('kwds', {}) + state = value.get('state', {}) + listitems = value.get('listitems', []) + dictitems = value.get('dictitems', {}) + instance = self.make_python_instance(suffix, node, args, kwds, newobj) + if state: + self.set_python_instance_state(instance, state) + if listitems: + instance.extend(listitems) + if dictitems: + for key in dictitems: + instance[key] = dictitems[key] + return instance + + def construct_python_object_new(self, suffix, node): + return self.construct_python_object_apply(suffix, node, newobj=True) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/none', + Constructor.construct_yaml_null) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/bool', + Constructor.construct_yaml_bool) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/str', + Constructor.construct_python_str) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/unicode', + Constructor.construct_python_unicode) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/bytes', + Constructor.construct_python_bytes) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/int', + Constructor.construct_yaml_int) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/long', + Constructor.construct_python_long) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/float', + Constructor.construct_yaml_float) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/complex', + Constructor.construct_python_complex) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/list', + Constructor.construct_yaml_seq) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/tuple', + Constructor.construct_python_tuple) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/dict', + Constructor.construct_yaml_map) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/name:', + Constructor.construct_python_name) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/module:', + Constructor.construct_python_module) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object:', + Constructor.construct_python_object) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/apply:', + Constructor.construct_python_object_apply) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/new:', + Constructor.construct_python_object_new) + diff --git a/lib/spack/external/yaml/lib3/yaml/cyaml.py b/lib/spack/external/yaml/lib3/yaml/cyaml.py new file mode 100644 index 0000000000..d5cb87e994 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/cyaml.py @@ -0,0 +1,85 @@ + +__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', + 'CBaseDumper', 'CSafeDumper', 'CDumper'] + +from _yaml import CParser, CEmitter + +from .constructor import * + +from .serializer import * +from .representer import * + +from .resolver import * + +class CBaseLoader(CParser, BaseConstructor, BaseResolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class CSafeLoader(CParser, SafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class CLoader(CParser, Constructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + Constructor.__init__(self) + Resolver.__init__(self) + +class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CSafeDumper(CEmitter, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CDumper(CEmitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/lib/spack/external/yaml/lib3/yaml/dumper.py b/lib/spack/external/yaml/lib3/yaml/dumper.py new file mode 100644 index 0000000000..0b69128771 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/dumper.py @@ -0,0 +1,62 @@ + +__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] + +from .emitter import * +from .serializer import * +from .representer import * +from .resolver import * + +class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class Dumper(Emitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/lib/spack/external/yaml/lib3/yaml/emitter.py b/lib/spack/external/yaml/lib3/yaml/emitter.py new file mode 100644 index 0000000000..34cb145a5f --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/emitter.py @@ -0,0 +1,1137 @@ + +# Emitter expects events obeying the following grammar: +# stream ::= STREAM-START document* STREAM-END +# document ::= DOCUMENT-START node DOCUMENT-END +# node ::= SCALAR | sequence | mapping +# sequence ::= SEQUENCE-START node* SEQUENCE-END +# mapping ::= MAPPING-START (node node)* MAPPING-END + +__all__ = ['Emitter', 'EmitterError'] + +from .error import YAMLError +from .events import * + +class EmitterError(YAMLError): + pass + +class ScalarAnalysis: + def __init__(self, scalar, empty, multiline, + allow_flow_plain, allow_block_plain, + allow_single_quoted, allow_double_quoted, + allow_block): + self.scalar = scalar + self.empty = empty + self.multiline = multiline + self.allow_flow_plain = allow_flow_plain + self.allow_block_plain = allow_block_plain + self.allow_single_quoted = allow_single_quoted + self.allow_double_quoted = allow_double_quoted + self.allow_block = allow_block + +class Emitter: + + DEFAULT_TAG_PREFIXES = { + '!' : '!', + 'tag:yaml.org,2002:' : '!!', + } + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + + # The stream should have the methods `write` and possibly `flush`. + self.stream = stream + + # Encoding can be overriden by STREAM-START. + self.encoding = None + + # Emitter is a state machine with a stack of states to handle nested + # structures. + self.states = [] + self.state = self.expect_stream_start + + # Current event and the event queue. + self.events = [] + self.event = None + + # The current indentation level and the stack of previous indents. + self.indents = [] + self.indent = None + + # Flow level. + self.flow_level = 0 + + # Contexts. + self.root_context = False + self.sequence_context = False + self.mapping_context = False + self.simple_key_context = False + + # Characteristics of the last emitted character: + # - current position. + # - is it a whitespace? + # - is it an indention character + # (indentation space, '-', '?', or ':')? + self.line = 0 + self.column = 0 + self.whitespace = True + self.indention = True + + # Whether the document requires an explicit document indicator + self.open_ended = False + + # Formatting details. + self.canonical = canonical + self.allow_unicode = allow_unicode + self.best_indent = 2 + if indent and 1 < indent < 10: + self.best_indent = indent + self.best_width = 80 + if width and width > self.best_indent*2: + self.best_width = width + self.best_line_break = '\n' + if line_break in ['\r', '\n', '\r\n']: + self.best_line_break = line_break + + # Tag prefixes. + self.tag_prefixes = None + + # Prepared anchor and tag. + self.prepared_anchor = None + self.prepared_tag = None + + # Scalar analysis and style. + self.analysis = None + self.style = None + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def emit(self, event): + self.events.append(event) + while not self.need_more_events(): + self.event = self.events.pop(0) + self.state() + self.event = None + + # In some cases, we wait for a few next events before emitting. + + def need_more_events(self): + if not self.events: + return True + event = self.events[0] + if isinstance(event, DocumentStartEvent): + return self.need_events(1) + elif isinstance(event, SequenceStartEvent): + return self.need_events(2) + elif isinstance(event, MappingStartEvent): + return self.need_events(3) + else: + return False + + def need_events(self, count): + level = 0 + for event in self.events[1:]: + if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): + level += 1 + elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): + level -= 1 + elif isinstance(event, StreamEndEvent): + level = -1 + if level < 0: + return False + return (len(self.events) < count+1) + + def increase_indent(self, flow=False, indentless=False): + self.indents.append(self.indent) + if self.indent is None: + if flow: + self.indent = self.best_indent + else: + self.indent = 0 + elif not indentless: + self.indent += self.best_indent + + # States. + + # Stream handlers. + + def expect_stream_start(self): + if isinstance(self.event, StreamStartEvent): + if self.event.encoding and not hasattr(self.stream, 'encoding'): + self.encoding = self.event.encoding + self.write_stream_start() + self.state = self.expect_first_document_start + else: + raise EmitterError("expected StreamStartEvent, but got %s" + % self.event) + + def expect_nothing(self): + raise EmitterError("expected nothing, but got %s" % self.event) + + # Document handlers. + + def expect_first_document_start(self): + return self.expect_document_start(first=True) + + def expect_document_start(self, first=False): + if isinstance(self.event, DocumentStartEvent): + if (self.event.version or self.event.tags) and self.open_ended: + self.write_indicator('...', True) + self.write_indent() + if self.event.version: + version_text = self.prepare_version(self.event.version) + self.write_version_directive(version_text) + self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() + if self.event.tags: + handles = sorted(self.event.tags.keys()) + for handle in handles: + prefix = self.event.tags[handle] + self.tag_prefixes[prefix] = handle + handle_text = self.prepare_tag_handle(handle) + prefix_text = self.prepare_tag_prefix(prefix) + self.write_tag_directive(handle_text, prefix_text) + implicit = (first and not self.event.explicit and not self.canonical + and not self.event.version and not self.event.tags + and not self.check_empty_document()) + if not implicit: + self.write_indent() + self.write_indicator('---', True) + if self.canonical: + self.write_indent() + self.state = self.expect_document_root + elif isinstance(self.event, StreamEndEvent): + if self.open_ended: + self.write_indicator('...', True) + self.write_indent() + self.write_stream_end() + self.state = self.expect_nothing + else: + raise EmitterError("expected DocumentStartEvent, but got %s" + % self.event) + + def expect_document_end(self): + if isinstance(self.event, DocumentEndEvent): + self.write_indent() + if self.event.explicit: + self.write_indicator('...', True) + self.write_indent() + self.flush_stream() + self.state = self.expect_document_start + else: + raise EmitterError("expected DocumentEndEvent, but got %s" + % self.event) + + def expect_document_root(self): + self.states.append(self.expect_document_end) + self.expect_node(root=True) + + # Node handlers. + + def expect_node(self, root=False, sequence=False, mapping=False, + simple_key=False): + self.root_context = root + self.sequence_context = sequence + self.mapping_context = mapping + self.simple_key_context = simple_key + if isinstance(self.event, AliasEvent): + self.expect_alias() + elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): + self.process_anchor('&') + self.process_tag() + if isinstance(self.event, ScalarEvent): + self.expect_scalar() + elif isinstance(self.event, SequenceStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_sequence(): + self.expect_flow_sequence() + else: + self.expect_block_sequence() + elif isinstance(self.event, MappingStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_mapping(): + self.expect_flow_mapping() + else: + self.expect_block_mapping() + else: + raise EmitterError("expected NodeEvent, but got %s" % self.event) + + def expect_alias(self): + if self.event.anchor is None: + raise EmitterError("anchor is not specified for alias") + self.process_anchor('*') + self.state = self.states.pop() + + def expect_scalar(self): + self.increase_indent(flow=True) + self.process_scalar() + self.indent = self.indents.pop() + self.state = self.states.pop() + + # Flow sequence handlers. + + def expect_flow_sequence(self): + self.write_indicator('[', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_sequence_item + + def expect_first_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(']', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + def expect_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator(']', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + # Flow mapping handlers. + + def expect_flow_mapping(self): + self.write_indicator('{', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_mapping_key + + def expect_first_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator('}', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator('}', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + def expect_flow_mapping_value(self): + if self.canonical or self.column > self.best_width: + self.write_indent() + self.write_indicator(':', True) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + # Block sequence handlers. + + def expect_block_sequence(self): + indentless = (self.mapping_context and not self.indention) + self.increase_indent(flow=False, indentless=indentless) + self.state = self.expect_first_block_sequence_item + + def expect_first_block_sequence_item(self): + return self.expect_block_sequence_item(first=True) + + def expect_block_sequence_item(self, first=False): + if not first and isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + self.write_indicator('-', True, indention=True) + self.states.append(self.expect_block_sequence_item) + self.expect_node(sequence=True) + + # Block mapping handlers. + + def expect_block_mapping(self): + self.increase_indent(flow=False) + self.state = self.expect_first_block_mapping_key + + def expect_first_block_mapping_key(self): + return self.expect_block_mapping_key(first=True) + + def expect_block_mapping_key(self, first=False): + if not first and isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + if self.check_simple_key(): + self.states.append(self.expect_block_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True, indention=True) + self.states.append(self.expect_block_mapping_value) + self.expect_node(mapping=True) + + def expect_block_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + def expect_block_mapping_value(self): + self.write_indent() + self.write_indicator(':', True, indention=True) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + # Checkers. + + def check_empty_sequence(self): + return (isinstance(self.event, SequenceStartEvent) and self.events + and isinstance(self.events[0], SequenceEndEvent)) + + def check_empty_mapping(self): + return (isinstance(self.event, MappingStartEvent) and self.events + and isinstance(self.events[0], MappingEndEvent)) + + def check_empty_document(self): + if not isinstance(self.event, DocumentStartEvent) or not self.events: + return False + event = self.events[0] + return (isinstance(event, ScalarEvent) and event.anchor is None + and event.tag is None and event.implicit and event.value == '') + + def check_simple_key(self): + length = 0 + if isinstance(self.event, NodeEvent) and self.event.anchor is not None: + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + length += len(self.prepared_anchor) + if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ + and self.event.tag is not None: + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(self.event.tag) + length += len(self.prepared_tag) + if isinstance(self.event, ScalarEvent): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + length += len(self.analysis.scalar) + return (length < 128 and (isinstance(self.event, AliasEvent) + or (isinstance(self.event, ScalarEvent) + and not self.analysis.empty and not self.analysis.multiline) + or self.check_empty_sequence() or self.check_empty_mapping())) + + # Anchor, Tag, and Scalar processors. + + def process_anchor(self, indicator): + if self.event.anchor is None: + self.prepared_anchor = None + return + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + if self.prepared_anchor: + self.write_indicator(indicator+self.prepared_anchor, True) + self.prepared_anchor = None + + def process_tag(self): + tag = self.event.tag + if isinstance(self.event, ScalarEvent): + if self.style is None: + self.style = self.choose_scalar_style() + if ((not self.canonical or tag is None) and + ((self.style == '' and self.event.implicit[0]) + or (self.style != '' and self.event.implicit[1]))): + self.prepared_tag = None + return + if self.event.implicit[0] and tag is None: + tag = '!' + self.prepared_tag = None + else: + if (not self.canonical or tag is None) and self.event.implicit: + self.prepared_tag = None + return + if tag is None: + raise EmitterError("tag is not specified") + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(tag) + if self.prepared_tag: + self.write_indicator(self.prepared_tag, True) + self.prepared_tag = None + + def choose_scalar_style(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.event.style == '"' or self.canonical: + return '"' + if not self.event.style and self.event.implicit[0]: + if (not (self.simple_key_context and + (self.analysis.empty or self.analysis.multiline)) + and (self.flow_level and self.analysis.allow_flow_plain + or (not self.flow_level and self.analysis.allow_block_plain))): + return '' + if self.event.style and self.event.style in '|>': + if (not self.flow_level and not self.simple_key_context + and self.analysis.allow_block): + return self.event.style + if not self.event.style or self.event.style == '\'': + if (self.analysis.allow_single_quoted and + not (self.simple_key_context and self.analysis.multiline)): + return '\'' + return '"' + + def process_scalar(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.style is None: + self.style = self.choose_scalar_style() + split = (not self.simple_key_context) + #if self.analysis.multiline and split \ + # and (not self.style or self.style in '\'\"'): + # self.write_indent() + if self.style == '"': + self.write_double_quoted(self.analysis.scalar, split) + elif self.style == '\'': + self.write_single_quoted(self.analysis.scalar, split) + elif self.style == '>': + self.write_folded(self.analysis.scalar) + elif self.style == '|': + self.write_literal(self.analysis.scalar) + else: + self.write_plain(self.analysis.scalar, split) + self.analysis = None + self.style = None + + # Analyzers. + + def prepare_version(self, version): + major, minor = version + if major != 1: + raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) + return '%d.%d' % (major, minor) + + def prepare_tag_handle(self, handle): + if not handle: + raise EmitterError("tag handle must not be empty") + if handle[0] != '!' or handle[-1] != '!': + raise EmitterError("tag handle must start and end with '!': %r" % handle) + for ch in handle[1:-1]: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the tag handle: %r" + % (ch, handle)) + return handle + + def prepare_tag_prefix(self, prefix): + if not prefix: + raise EmitterError("tag prefix must not be empty") + chunks = [] + start = end = 0 + if prefix[0] == '!': + end = 1 + while end < len(prefix): + ch = prefix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?!:@&=+$,_.~*\'()[]': + end += 1 + else: + if start < end: + chunks.append(prefix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(prefix[start:end]) + return ''.join(chunks) + + def prepare_tag(self, tag): + if not tag: + raise EmitterError("tag must not be empty") + if tag == '!': + return tag + handle = None + suffix = tag + prefixes = sorted(self.tag_prefixes.keys()) + for prefix in prefixes: + if tag.startswith(prefix) \ + and (prefix == '!' or len(prefix) < len(tag)): + handle = self.tag_prefixes[prefix] + suffix = tag[len(prefix):] + chunks = [] + start = end = 0 + while end < len(suffix): + ch = suffix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.~*\'()[]' \ + or (ch == '!' and handle != '!'): + end += 1 + else: + if start < end: + chunks.append(suffix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(suffix[start:end]) + suffix_text = ''.join(chunks) + if handle: + return '%s%s' % (handle, suffix_text) + else: + return '!<%s>' % suffix_text + + def prepare_anchor(self, anchor): + if not anchor: + raise EmitterError("anchor must not be empty") + for ch in anchor: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the anchor: %r" + % (ch, anchor)) + return anchor + + def analyze_scalar(self, scalar): + + # Empty scalar is a special case. + if not scalar: + return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, + allow_flow_plain=False, allow_block_plain=True, + allow_single_quoted=True, allow_double_quoted=True, + allow_block=False) + + # Indicators and special characters. + block_indicators = False + flow_indicators = False + line_breaks = False + special_characters = False + + # Important whitespace combinations. + leading_space = False + leading_break = False + trailing_space = False + trailing_break = False + break_space = False + space_break = False + + # Check document indicators. + if scalar.startswith('---') or scalar.startswith('...'): + block_indicators = True + flow_indicators = True + + # First character or preceded by a whitespace. + preceeded_by_whitespace = True + + # Last character or followed by a whitespace. + followed_by_whitespace = (len(scalar) == 1 or + scalar[1] in '\0 \t\r\n\x85\u2028\u2029') + + # The previous character is a space. + previous_space = False + + # The previous character is a break. + previous_break = False + + index = 0 + while index < len(scalar): + ch = scalar[index] + + # Check for indicators. + if index == 0: + # Leading indicators are special characters. + if ch in '#,[]{}&*!|>\'\"%@`': + flow_indicators = True + block_indicators = True + if ch in '?:': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '-' and followed_by_whitespace: + flow_indicators = True + block_indicators = True + else: + # Some indicators cannot appear within a scalar as well. + if ch in ',?[]{}': + flow_indicators = True + if ch == ':': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '#' and preceeded_by_whitespace: + flow_indicators = True + block_indicators = True + + # Check for line breaks, special, and unicode characters. + if ch in '\n\x85\u2028\u2029': + line_breaks = True + if not (ch == '\n' or '\x20' <= ch <= '\x7E'): + if (ch == '\x85' or '\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD') and ch != '\uFEFF': + unicode_characters = True + if not self.allow_unicode: + special_characters = True + else: + special_characters = True + + # Detect important whitespace combinations. + if ch == ' ': + if index == 0: + leading_space = True + if index == len(scalar)-1: + trailing_space = True + if previous_break: + break_space = True + previous_space = True + previous_break = False + elif ch in '\n\x85\u2028\u2029': + if index == 0: + leading_break = True + if index == len(scalar)-1: + trailing_break = True + if previous_space: + space_break = True + previous_space = False + previous_break = True + else: + previous_space = False + previous_break = False + + # Prepare for the next character. + index += 1 + preceeded_by_whitespace = (ch in '\0 \t\r\n\x85\u2028\u2029') + followed_by_whitespace = (index+1 >= len(scalar) or + scalar[index+1] in '\0 \t\r\n\x85\u2028\u2029') + + # Let's decide what styles are allowed. + allow_flow_plain = True + allow_block_plain = True + allow_single_quoted = True + allow_double_quoted = True + allow_block = True + + # Leading and trailing whitespaces are bad for plain scalars. + if (leading_space or leading_break + or trailing_space or trailing_break): + allow_flow_plain = allow_block_plain = False + + # We do not permit trailing spaces for block scalars. + if trailing_space: + allow_block = False + + # Spaces at the beginning of a new line are only acceptable for block + # scalars. + if break_space: + allow_flow_plain = allow_block_plain = allow_single_quoted = False + + # Spaces followed by breaks, as well as special character are only + # allowed for double quoted scalars. + if space_break or special_characters: + allow_flow_plain = allow_block_plain = \ + allow_single_quoted = allow_block = False + + # Although the plain scalar writer supports breaks, we never emit + # multiline plain scalars. + if line_breaks: + allow_flow_plain = allow_block_plain = False + + # Flow indicators are forbidden for flow plain scalars. + if flow_indicators: + allow_flow_plain = False + + # Block indicators are forbidden for block plain scalars. + if block_indicators: + allow_block_plain = False + + return ScalarAnalysis(scalar=scalar, + empty=False, multiline=line_breaks, + allow_flow_plain=allow_flow_plain, + allow_block_plain=allow_block_plain, + allow_single_quoted=allow_single_quoted, + allow_double_quoted=allow_double_quoted, + allow_block=allow_block) + + # Writers. + + def flush_stream(self): + if hasattr(self.stream, 'flush'): + self.stream.flush() + + def write_stream_start(self): + # Write BOM if needed. + if self.encoding and self.encoding.startswith('utf-16'): + self.stream.write('\uFEFF'.encode(self.encoding)) + + def write_stream_end(self): + self.flush_stream() + + def write_indicator(self, indicator, need_whitespace, + whitespace=False, indention=False): + if self.whitespace or not need_whitespace: + data = indicator + else: + data = ' '+indicator + self.whitespace = whitespace + self.indention = self.indention and indention + self.column += len(data) + self.open_ended = False + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_indent(self): + indent = self.indent or 0 + if not self.indention or self.column > indent \ + or (self.column == indent and not self.whitespace): + self.write_line_break() + if self.column < indent: + self.whitespace = True + data = ' '*(indent-self.column) + self.column = indent + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_line_break(self, data=None): + if data is None: + data = self.best_line_break + self.whitespace = True + self.indention = True + self.line += 1 + self.column = 0 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_version_directive(self, version_text): + data = '%%YAML %s' % version_text + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + def write_tag_directive(self, handle_text, prefix_text): + data = '%%TAG %s %s' % (handle_text, prefix_text) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + # Scalar streams. + + def write_single_quoted(self, text, split=True): + self.write_indicator('\'', True) + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch is None or ch != ' ': + if start+1 == end and self.column > self.best_width and split \ + and start != 0 and end != len(text): + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029' or ch == '\'': + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch == '\'': + data = '\'\'' + self.column += 2 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + 1 + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + self.write_indicator('\'', False) + + ESCAPE_REPLACEMENTS = { + '\0': '0', + '\x07': 'a', + '\x08': 'b', + '\x09': 't', + '\x0A': 'n', + '\x0B': 'v', + '\x0C': 'f', + '\x0D': 'r', + '\x1B': 'e', + '\"': '\"', + '\\': '\\', + '\x85': 'N', + '\xA0': '_', + '\u2028': 'L', + '\u2029': 'P', + } + + def write_double_quoted(self, text, split=True): + self.write_indicator('"', True) + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if ch is None or ch in '"\\\x85\u2028\u2029\uFEFF' \ + or not ('\x20' <= ch <= '\x7E' + or (self.allow_unicode + and ('\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD'))): + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + if ch in self.ESCAPE_REPLACEMENTS: + data = '\\'+self.ESCAPE_REPLACEMENTS[ch] + elif ch <= '\xFF': + data = '\\x%02X' % ord(ch) + elif ch <= '\uFFFF': + data = '\\u%04X' % ord(ch) + else: + data = '\\U%08X' % ord(ch) + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end+1 + if 0 < end < len(text)-1 and (ch == ' ' or start >= end) \ + and self.column+(end-start) > self.best_width and split: + data = text[start:end]+'\\' + if start < end: + start = end + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_indent() + self.whitespace = False + self.indention = False + if text[start] == ' ': + data = '\\' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + end += 1 + self.write_indicator('"', False) + + def determine_block_hints(self, text): + hints = '' + if text: + if text[0] in ' \n\x85\u2028\u2029': + hints += str(self.best_indent) + if text[-1] not in '\n\x85\u2028\u2029': + hints += '-' + elif len(text) == 1 or text[-2] in '\n\x85\u2028\u2029': + hints += '+' + return hints + + def write_folded(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('>'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + leading_space = True + spaces = False + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if not leading_space and ch is not None and ch != ' ' \ + and text[start] == '\n': + self.write_line_break() + leading_space = (ch == ' ') + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + elif spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width: + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + spaces = (ch == ' ') + end += 1 + + def write_literal(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('|'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + else: + if ch is None or ch in '\n\x85\u2028\u2029': + data = text[start:end] + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + + def write_plain(self, text, split=True): + if self.root_context: + self.open_ended = True + if not text: + return + if not self.whitespace: + data = ' ' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.whitespace = False + self.indention = False + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width and split: + self.write_indent() + self.whitespace = False + self.indention = False + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + self.whitespace = False + self.indention = False + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + diff --git a/lib/spack/external/yaml/lib3/yaml/error.py b/lib/spack/external/yaml/lib3/yaml/error.py new file mode 100644 index 0000000000..b796b4dc51 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/error.py @@ -0,0 +1,75 @@ + +__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] + +class Mark: + + def __init__(self, name, index, line, column, buffer, pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start-1] not in '\0\r\n\x85\u2028\u2029': + start -= 1 + if self.pointer-start > max_length/2-1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in '\0\r\n\x85\u2028\u2029': + end += 1 + if end-self.pointer > max_length/2-1: + tail = ' ... ' + end -= 5 + break + snippet = self.buffer[start:end] + return ' '*indent + head + snippet + tail + '\n' \ + + ' '*(indent+self.pointer-start+len(head)) + '^' + + def __str__(self): + snippet = self.get_snippet() + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + if snippet is not None: + where += ":\n"+snippet + return where + +class YAMLError(Exception): + pass + +class MarkedYAMLError(YAMLError): + + def __init__(self, context=None, context_mark=None, + problem=None, problem_mark=None, note=None): + self.context = context + self.context_mark = context_mark + self.problem = problem + self.problem_mark = problem_mark + self.note = note + + def __str__(self): + lines = [] + if self.context is not None: + lines.append(self.context) + if self.context_mark is not None \ + and (self.problem is None or self.problem_mark is None + or self.context_mark.name != self.problem_mark.name + or self.context_mark.line != self.problem_mark.line + or self.context_mark.column != self.problem_mark.column): + lines.append(str(self.context_mark)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_mark is not None: + lines.append(str(self.problem_mark)) + if self.note is not None: + lines.append(self.note) + return '\n'.join(lines) + diff --git a/lib/spack/external/yaml/lib3/yaml/events.py b/lib/spack/external/yaml/lib3/yaml/events.py new file mode 100644 index 0000000000..f79ad389cb --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/events.py @@ -0,0 +1,86 @@ + +# Abstract classes. + +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] + if hasattr(self, key)] + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +class NodeEvent(Event): + def __init__(self, anchor, start_mark=None, end_mark=None): + self.anchor = anchor + self.start_mark = start_mark + self.end_mark = end_mark + +class CollectionStartEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, + flow_style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class CollectionEndEvent(Event): + pass + +# Implementations. + +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndEvent(Event): + pass + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + +class AliasEvent(NodeEvent): + pass + +class ScalarEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, value, + start_mark=None, end_mark=None, style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class SequenceStartEvent(CollectionStartEvent): + pass + +class SequenceEndEvent(CollectionEndEvent): + pass + +class MappingStartEvent(CollectionStartEvent): + pass + +class MappingEndEvent(CollectionEndEvent): + pass + diff --git a/lib/spack/external/yaml/lib3/yaml/loader.py b/lib/spack/external/yaml/lib3/yaml/loader.py new file mode 100644 index 0000000000..08c8f01b34 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/loader.py @@ -0,0 +1,40 @@ + +__all__ = ['BaseLoader', 'SafeLoader', 'Loader'] + +from .reader import * +from .scanner import * +from .parser import * +from .composer import * +from .constructor import * +from .resolver import * + +class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + diff --git a/lib/spack/external/yaml/lib3/yaml/nodes.py b/lib/spack/external/yaml/lib3/yaml/nodes.py new file mode 100644 index 0000000000..c4f070c41e --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/nodes.py @@ -0,0 +1,49 @@ + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + value = self.value + #if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + #else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + +class ScalarNode(Node): + id = 'scalar' + def __init__(self, tag, value, + start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class CollectionNode(Node): + def __init__(self, tag, value, + start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class SequenceNode(CollectionNode): + id = 'sequence' + +class MappingNode(CollectionNode): + id = 'mapping' + diff --git a/lib/spack/external/yaml/lib3/yaml/parser.py b/lib/spack/external/yaml/lib3/yaml/parser.py new file mode 100644 index 0000000000..13a5995d29 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/parser.py @@ -0,0 +1,589 @@ + +# The following YAML grammar is LL(1) and is parsed by a recursive descent +# parser. +# +# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +# implicit_document ::= block_node DOCUMENT-END* +# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +# block_node_or_indentless_sequence ::= +# ALIAS +# | properties (block_content | indentless_block_sequence)? +# | block_content +# | indentless_block_sequence +# block_node ::= ALIAS +# | properties block_content? +# | block_content +# flow_node ::= ALIAS +# | properties flow_content? +# | flow_content +# properties ::= TAG ANCHOR? | ANCHOR TAG? +# block_content ::= block_collection | flow_collection | SCALAR +# flow_content ::= flow_collection | SCALAR +# block_collection ::= block_sequence | block_mapping +# flow_collection ::= flow_sequence | flow_mapping +# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +# block_mapping ::= BLOCK-MAPPING_START +# ((KEY block_node_or_indentless_sequence?)? +# (VALUE block_node_or_indentless_sequence?)?)* +# BLOCK-END +# flow_sequence ::= FLOW-SEQUENCE-START +# (flow_sequence_entry FLOW-ENTRY)* +# flow_sequence_entry? +# FLOW-SEQUENCE-END +# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# flow_mapping ::= FLOW-MAPPING-START +# (flow_mapping_entry FLOW-ENTRY)* +# flow_mapping_entry? +# FLOW-MAPPING-END +# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# +# FIRST sets: +# +# stream: { STREAM-START } +# explicit_document: { DIRECTIVE DOCUMENT-START } +# implicit_document: FIRST(block_node) +# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_sequence: { BLOCK-SEQUENCE-START } +# block_mapping: { BLOCK-MAPPING-START } +# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } +# indentless_sequence: { ENTRY } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_sequence: { FLOW-SEQUENCE-START } +# flow_mapping: { FLOW-MAPPING-START } +# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } +# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } + +__all__ = ['Parser', 'ParserError'] + +from .error import MarkedYAMLError +from .tokens import * +from .events import * +from .scanner import * + +class ParserError(MarkedYAMLError): + pass + +class Parser: + # Since writing a recursive-descendant parser is a straightforward task, we + # do not give many comments here. + + DEFAULT_TAGS = { + '!': '!', + '!!': 'tag:yaml.org,2002:', + } + + def __init__(self): + self.current_event = None + self.yaml_version = None + self.tag_handles = {} + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + + # Parse the stream start. + token = self.get_token() + event = StreamStartEvent(token.start_mark, token.end_mark, + encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + + # Parse an implicit document. + if not self.check_token(DirectiveToken, DocumentStartToken, + StreamEndToken): + self.tag_handles = self.DEFAULT_TAGS + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_block_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + + # Parse any extra document end indicators. + while self.check_token(DocumentEndToken): + self.get_token() + + # Parse an explicit document. + if not self.check_token(StreamEndToken): + token = self.peek_token() + start_mark = token.start_mark + version, tags = self.process_directives() + if not self.check_token(DocumentStartToken): + raise ParserError(None, None, + "expected '', but found %r" + % self.peek_token().id, + self.peek_token().start_mark) + token = self.get_token() + end_mark = token.end_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=True, version=version, tags=tags) + self.states.append(self.parse_document_end) + self.state = self.parse_document_content + else: + # Parse the end of the stream. + token = self.get_token() + event = StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + if self.check_token(DocumentEndToken): + token = self.get_token() + end_mark = token.end_mark + explicit = True + event = DocumentEndEvent(start_mark, end_mark, + explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + if self.check_token(DirectiveToken, + DocumentStartToken, DocumentEndToken, StreamEndToken): + event = self.process_empty_scalar(self.peek_token().start_mark) + self.state = self.states.pop() + return event + else: + return self.parse_block_node() + + def process_directives(self): + self.yaml_version = None + self.tag_handles = {} + while self.check_token(DirectiveToken): + token = self.get_token() + if token.name == 'YAML': + if self.yaml_version is not None: + raise ParserError(None, None, + "found duplicate YAML directive", token.start_mark) + major, minor = token.value + if major != 1: + raise ParserError(None, None, + "found incompatible YAML document (version 1.* is required)", + token.start_mark) + self.yaml_version = token.value + elif token.name == 'TAG': + handle, prefix = token.value + if handle in self.tag_handles: + raise ParserError(None, None, + "duplicate tag handle %r" % handle, + token.start_mark) + self.tag_handles[handle] = prefix + if self.tag_handles: + value = self.yaml_version, self.tag_handles.copy() + else: + value = self.yaml_version, None + for key in self.DEFAULT_TAGS: + if key not in self.tag_handles: + self.tag_handles[key] = self.DEFAULT_TAGS[key] + return value + + # block_node_or_indentless_sequence ::= ALIAS + # | properties (block_content | indentless_block_sequence)? + # | block_content + # | indentless_block_sequence + # block_node ::= ALIAS + # | properties block_content? + # | block_content + # flow_node ::= ALIAS + # | properties flow_content? + # | flow_content + # properties ::= TAG ANCHOR? | ANCHOR TAG? + # block_content ::= block_collection | flow_collection | SCALAR + # flow_content ::= flow_collection | SCALAR + # block_collection ::= block_sequence | block_mapping + # flow_collection ::= flow_sequence | flow_mapping + + def parse_block_node(self): + return self.parse_node(block=True) + + def parse_flow_node(self): + return self.parse_node() + + def parse_block_node_or_indentless_sequence(self): + return self.parse_node(block=True, indentless_sequence=True) + + def parse_node(self, block=False, indentless_sequence=False): + if self.check_token(AliasToken): + token = self.get_token() + event = AliasEvent(token.value, token.start_mark, token.end_mark) + self.state = self.states.pop() + else: + anchor = None + tag = None + start_mark = end_mark = tag_mark = None + if self.check_token(AnchorToken): + token = self.get_token() + start_mark = token.start_mark + end_mark = token.end_mark + anchor = token.value + if self.check_token(TagToken): + token = self.get_token() + tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + elif self.check_token(TagToken): + token = self.get_token() + start_mark = tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + if self.check_token(AnchorToken): + token = self.get_token() + end_mark = token.end_mark + anchor = token.value + if tag is not None: + handle, suffix = tag + if handle is not None: + if handle not in self.tag_handles: + raise ParserError("while parsing a node", start_mark, + "found undefined tag handle %r" % handle, + tag_mark) + tag = self.tag_handles[handle]+suffix + else: + tag = suffix + #if tag == '!': + # raise ParserError("while parsing a node", start_mark, + # "found non-specific tag '!'", tag_mark, + # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = (tag is None or tag == '!') + if indentless_sequence and self.check_token(BlockEntryToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark) + self.state = self.parse_indentless_sequence_entry + else: + if self.check_token(ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if (token.plain and tag is None) or tag == '!': + implicit = (True, False) + elif tag is None: + implicit = (False, True) + else: + implicit = (False, False) + event = ScalarEvent(anchor, tag, implicit, token.value, + start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + elif block and self.check_token(BlockSequenceStartToken): + end_mark = self.peek_token().start_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_sequence_first_entry + elif block and self.check_token(BlockMappingStartToken): + end_mark = self.peek_token().start_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_mapping_first_key + elif anchor is not None or tag is not None: + # Empty scalars are allowed even if a tag or an anchor is + # specified. + event = ScalarEvent(anchor, tag, (implicit, False), '', + start_mark, end_mark) + self.state = self.states.pop() + else: + if block: + node = 'block' + else: + node = 'flow' + token = self.peek_token() + raise ParserError("while parsing a %s node" % node, start_mark, + "expected the node content, but found %r" % token.id, + token.start_mark) + return event + + # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + + def parse_block_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_sequence_entry() + + def parse_block_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, BlockEndToken): + self.states.append(self.parse_block_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_block_sequence_entry + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block collection", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + + def parse_indentless_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, + KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_indentless_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_indentless_sequence_entry + return self.process_empty_scalar(token.end_mark) + token = self.peek_token() + event = SequenceEndEvent(token.start_mark, token.start_mark) + self.state = self.states.pop() + return event + + # block_mapping ::= BLOCK-MAPPING_START + # ((KEY block_node_or_indentless_sequence?)? + # (VALUE block_node_or_indentless_sequence?)?)* + # BLOCK-END + + def parse_block_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_mapping_key() + + def parse_block_mapping_key(self): + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_value) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_value + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block mapping", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_block_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_key) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_block_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + # flow_sequence ::= FLOW-SEQUENCE-START + # (flow_sequence_entry FLOW-ENTRY)* + # flow_sequence_entry? + # FLOW-SEQUENCE-END + # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + # + # Note that while production rules for both flow_sequence_entry and + # flow_mapping_entry are equal, their interpretations are different. + # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + # generate an inline mapping (set syntax). + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(FlowSequenceEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow sequence", self.marks[-1], + "expected ',' or ']', but got %r" % token.id, token.start_mark) + + if self.check_token(KeyToken): + token = self.peek_token() + event = MappingStartEvent(None, None, True, + token.start_mark, token.end_mark, + flow_style=True) + self.state = self.parse_flow_sequence_entry_mapping_key + return event + elif not self.check_token(FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_flow_node() + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_key(self): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_value + return self.process_empty_scalar(token.end_mark) + + def parse_flow_sequence_entry_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_end) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_end + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_sequence_entry_mapping_end + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return MappingEndEvent(token.start_mark, token.start_mark) + + # flow_mapping ::= FLOW-MAPPING-START + # (flow_mapping_entry FLOW-ENTRY)* + # flow_mapping_entry? + # FLOW-MAPPING-END + # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(FlowMappingEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow mapping", self.marks[-1], + "expected ',' or '}', but got %r" % token.id, token.start_mark) + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_value + return self.process_empty_scalar(token.end_mark) + elif not self.check_token(FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_empty_value) + return self.parse_flow_node() + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_mapping_empty_value(self): + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(self.peek_token().start_mark) + + def process_empty_scalar(self, mark): + return ScalarEvent(None, None, (True, False), '', mark, mark) + diff --git a/lib/spack/external/yaml/lib3/yaml/reader.py b/lib/spack/external/yaml/lib3/yaml/reader.py new file mode 100644 index 0000000000..f70e920f44 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/reader.py @@ -0,0 +1,192 @@ +# This module contains abstractions for the input stream. You don't have to +# looks further, there are no pretty code. +# +# We define two classes here. +# +# Mark(source, line, column) +# It's just a record and its only use is producing nice error messages. +# Parser does not use it for any other purposes. +# +# Reader(source, data) +# Reader determines the encoding of `data` and converts it to unicode. +# Reader provides the following methods and attributes: +# reader.peek(length=1) - return the next `length` characters +# reader.forward(length=1) - move the current position to `length` characters. +# reader.index - the number of the current character. +# reader.line, stream.column - the line and the column of the current character. + +__all__ = ['Reader', 'ReaderError'] + +from .error import YAMLError, Mark + +import codecs, re + +class ReaderError(YAMLError): + + def __init__(self, name, position, character, encoding, reason): + self.name = name + self.character = character + self.position = position + self.encoding = encoding + self.reason = reason + + def __str__(self): + if isinstance(self.character, bytes): + return "'%s' codec can't decode byte #x%02x: %s\n" \ + " in \"%s\", position %d" \ + % (self.encoding, ord(self.character), self.reason, + self.name, self.position) + else: + return "unacceptable character #x%04x: %s\n" \ + " in \"%s\", position %d" \ + % (self.character, self.reason, + self.name, self.position) + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to a unicode string, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a `bytes` object, + # - a `str` object, + # - a file-like object with its `read` method returning `str`, + # - a file-like object with its `read` method returning `unicode`. + + # Yeah, it's ugly and slow. + + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = '' + self.pointer = 0 + self.raw_buffer = None + self.raw_decode = None + self.encoding = None + self.index = 0 + self.line = 0 + self.column = 0 + if isinstance(stream, str): + self.name = "" + self.check_printable(stream) + self.buffer = stream+'\0' + elif isinstance(stream, bytes): + self.name = "" + self.raw_buffer = stream + self.determine_encoding() + else: + self.stream = stream + self.name = getattr(stream, 'name', "") + self.eof = False + self.raw_buffer = None + self.determine_encoding() + + def peek(self, index=0): + try: + return self.buffer[self.pointer+index] + except IndexError: + self.update(index+1) + return self.buffer[self.pointer+index] + + def prefix(self, length=1): + if self.pointer+length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer+length] + + def forward(self, length=1): + if self.pointer+length+1 >= len(self.buffer): + self.update(length+1) + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.index += 1 + if ch in '\n\x85\u2028\u2029' \ + or (ch == '\r' and self.buffer[self.pointer] != '\n'): + self.line += 1 + self.column = 0 + elif ch != '\uFEFF': + self.column += 1 + length -= 1 + + def get_mark(self): + if self.stream is None: + return Mark(self.name, self.index, self.line, self.column, + self.buffer, self.pointer) + else: + return Mark(self.name, self.index, self.line, self.column, + None, None) + + def determine_encoding(self): + while not self.eof and (self.raw_buffer is None or len(self.raw_buffer) < 2): + self.update_raw() + if isinstance(self.raw_buffer, bytes): + if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): + self.raw_decode = codecs.utf_16_le_decode + self.encoding = 'utf-16-le' + elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): + self.raw_decode = codecs.utf_16_be_decode + self.encoding = 'utf-16-be' + else: + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.update(1) + + NON_PRINTABLE = re.compile('[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') + def check_printable(self, data): + match = self.NON_PRINTABLE.search(data) + if match: + character = match.group() + position = self.index+(len(self.buffer)-self.pointer)+match.start() + raise ReaderError(self.name, position, ord(character), + 'unicode', "special characters are not allowed") + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + if self.raw_decode is not None: + try: + data, converted = self.raw_decode(self.raw_buffer, + 'strict', self.eof) + except UnicodeDecodeError as exc: + character = self.raw_buffer[exc.start] + if self.stream is not None: + position = self.stream_pointer-len(self.raw_buffer)+exc.start + else: + position = exc.start + raise ReaderError(self.name, position, character, + exc.encoding, exc.reason) + else: + data = self.raw_buffer + converted = len(data) + self.check_printable(data) + self.buffer += data + self.raw_buffer = self.raw_buffer[converted:] + if self.eof: + self.buffer += '\0' + self.raw_buffer = None + break + + def update_raw(self, size=4096): + data = self.stream.read(size) + if self.raw_buffer is None: + self.raw_buffer = data + else: + self.raw_buffer += data + self.stream_pointer += len(data) + if not data: + self.eof = True + +#try: +# import psyco +# psyco.bind(Reader) +#except ImportError: +# pass + diff --git a/lib/spack/external/yaml/lib3/yaml/representer.py b/lib/spack/external/yaml/lib3/yaml/representer.py new file mode 100644 index 0000000000..b9e65c5109 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/representer.py @@ -0,0 +1,387 @@ + +__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', + 'RepresenterError'] + +from .error import * +from .nodes import * + +import datetime, sys, copyreg, types, base64, collections + +class RepresenterError(YAMLError): + pass + +class BaseRepresenter: + + yaml_representers = {} + yaml_multi_representers = {} + + def __init__(self, default_style=None, default_flow_style=None): + self.default_style = default_style + self.default_flow_style = default_flow_style + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent(self, data): + node = self.represent_data(data) + self.serialize(node) + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent_data(self, data): + if self.ignore_aliases(data): + self.alias_key = None + else: + self.alias_key = id(data) + if self.alias_key is not None: + if self.alias_key in self.represented_objects: + node = self.represented_objects[self.alias_key] + #if node is None: + # raise RepresenterError("recursive objects are not allowed: %r" % data) + return node + #self.represented_objects[alias_key] = None + self.object_keeper.append(data) + data_types = type(data).__mro__ + if data_types[0] in self.yaml_representers: + node = self.yaml_representers[data_types[0]](self, data) + else: + for data_type in data_types: + if data_type in self.yaml_multi_representers: + node = self.yaml_multi_representers[data_type](self, data) + break + else: + if None in self.yaml_multi_representers: + node = self.yaml_multi_representers[None](self, data) + elif None in self.yaml_representers: + node = self.yaml_representers[None](self, data) + else: + node = ScalarNode(None, str(data)) + #if alias_key is not None: + # self.represented_objects[alias_key] = node + return node + + @classmethod + def add_representer(cls, data_type, representer): + if not 'yaml_representers' in cls.__dict__: + cls.yaml_representers = cls.yaml_representers.copy() + cls.yaml_representers[data_type] = representer + + @classmethod + def add_multi_representer(cls, data_type, representer): + if not 'yaml_multi_representers' in cls.__dict__: + cls.yaml_multi_representers = cls.yaml_multi_representers.copy() + cls.yaml_multi_representers[data_type] = representer + + def represent_scalar(self, tag, value, style=None): + if style is None: + style = self.default_style + node = ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node + + def represent_sequence(self, tag, sequence, flow_style=None): + value = [] + node = SequenceNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + for item in sequence: + node_item = self.represent_data(item) + if not (isinstance(node_item, ScalarNode) and not node_item.style): + best_style = False + value.append(node_item) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = list(mapping.items()) + try: + mapping = sorted(mapping) + except TypeError: + pass + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def ignore_aliases(self, data): + return False + +class SafeRepresenter(BaseRepresenter): + + def ignore_aliases(self, data): + if data is None: + return True + if isinstance(data, tuple) and data == (): + return True + if isinstance(data, (str, bytes, bool, int, float)): + return True + + def represent_none(self, data): + return self.represent_scalar('tag:yaml.org,2002:null', 'null') + + def represent_str(self, data): + return self.represent_scalar('tag:yaml.org,2002:str', data) + + def represent_binary(self, data): + if hasattr(base64, 'encodebytes'): + data = base64.encodebytes(data).decode('ascii') + else: + data = base64.encodestring(data).decode('ascii') + return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') + + def represent_bool(self, data): + if data: + value = 'true' + else: + value = 'false' + return self.represent_scalar('tag:yaml.org,2002:bool', value) + + def represent_int(self, data): + return self.represent_scalar('tag:yaml.org,2002:int', str(data)) + + inf_value = 1e300 + while repr(inf_value) != repr(inf_value*inf_value): + inf_value *= inf_value + + def represent_float(self, data): + if data != data or (data == 0.0 and data == 1.0): + value = '.nan' + elif data == self.inf_value: + value = '.inf' + elif data == -self.inf_value: + value = '-.inf' + else: + value = repr(data).lower() + # Note that in some cases `repr(data)` represents a float number + # without the decimal parts. For instance: + # >>> repr(1e17) + # '1e17' + # Unfortunately, this is not a valid float representation according + # to the definition of the `!!float` tag. We fix this by adding + # '.0' before the 'e' symbol. + if '.' not in value and 'e' in value: + value = value.replace('e', '.0e', 1) + return self.represent_scalar('tag:yaml.org,2002:float', value) + + def represent_list(self, data): + #pairs = (len(data) > 0 and isinstance(data, list)) + #if pairs: + # for item in data: + # if not isinstance(item, tuple) or len(item) != 2: + # pairs = False + # break + #if not pairs: + return self.represent_sequence('tag:yaml.org,2002:seq', data) + #value = [] + #for item_key, item_value in data: + # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', + # [(item_key, item_value)])) + #return SequenceNode(u'tag:yaml.org,2002:pairs', value) + + def represent_dict(self, data): + return self.represent_mapping('tag:yaml.org,2002:map', data) + + def represent_set(self, data): + value = {} + for key in data: + value[key] = None + return self.represent_mapping('tag:yaml.org,2002:set', value) + + def represent_date(self, data): + value = data.isoformat() + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_datetime(self, data): + value = data.isoformat(' ') + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_yaml_object(self, tag, data, cls, flow_style=None): + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__.copy() + return self.represent_mapping(tag, state, flow_style=flow_style) + + def represent_undefined(self, data): + raise RepresenterError("cannot represent an object: %s" % data) + +SafeRepresenter.add_representer(type(None), + SafeRepresenter.represent_none) + +SafeRepresenter.add_representer(str, + SafeRepresenter.represent_str) + +SafeRepresenter.add_representer(bytes, + SafeRepresenter.represent_binary) + +SafeRepresenter.add_representer(bool, + SafeRepresenter.represent_bool) + +SafeRepresenter.add_representer(int, + SafeRepresenter.represent_int) + +SafeRepresenter.add_representer(float, + SafeRepresenter.represent_float) + +SafeRepresenter.add_representer(list, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(tuple, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(dict, + SafeRepresenter.represent_dict) + +SafeRepresenter.add_representer(set, + SafeRepresenter.represent_set) + +SafeRepresenter.add_representer(datetime.date, + SafeRepresenter.represent_date) + +SafeRepresenter.add_representer(datetime.datetime, + SafeRepresenter.represent_datetime) + +SafeRepresenter.add_representer(None, + SafeRepresenter.represent_undefined) + +class Representer(SafeRepresenter): + + def represent_complex(self, data): + if data.imag == 0.0: + data = '%r' % data.real + elif data.real == 0.0: + data = '%rj' % data.imag + elif data.imag > 0: + data = '%r+%rj' % (data.real, data.imag) + else: + data = '%r%rj' % (data.real, data.imag) + return self.represent_scalar('tag:yaml.org,2002:python/complex', data) + + def represent_tuple(self, data): + return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) + + def represent_name(self, data): + name = '%s.%s' % (data.__module__, data.__name__) + return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') + + def represent_module(self, data): + return self.represent_scalar( + 'tag:yaml.org,2002:python/module:'+data.__name__, '') + + def represent_object(self, data): + # We use __reduce__ API to save the data. data.__reduce__ returns + # a tuple of length 2-5: + # (function, args, state, listitems, dictitems) + + # For reconstructing, we calls function(*args), then set its state, + # listitems, and dictitems if they are not None. + + # A special case is when function.__name__ == '__newobj__'. In this + # case we create the object with args[0].__new__(*args). + + # Another special case is when __reduce__ returns a string - we don't + # support it. + + # We produce a !!python/object, !!python/object/new or + # !!python/object/apply node. + + cls = type(data) + if cls in copyreg.dispatch_table: + reduce = copyreg.dispatch_table[cls](data) + elif hasattr(data, '__reduce_ex__'): + reduce = data.__reduce_ex__(2) + elif hasattr(data, '__reduce__'): + reduce = data.__reduce__() + else: + raise RepresenterError("cannot represent object: %r" % data) + reduce = (list(reduce)+[None]*5)[:5] + function, args, state, listitems, dictitems = reduce + args = list(args) + if state is None: + state = {} + if listitems is not None: + listitems = list(listitems) + if dictitems is not None: + dictitems = dict(dictitems) + if function.__name__ == '__newobj__': + function = args[0] + args = args[1:] + tag = 'tag:yaml.org,2002:python/object/new:' + newobj = True + else: + tag = 'tag:yaml.org,2002:python/object/apply:' + newobj = False + function_name = '%s.%s' % (function.__module__, function.__name__) + if not args and not listitems and not dictitems \ + and isinstance(state, dict) and newobj: + return self.represent_mapping( + 'tag:yaml.org,2002:python/object:'+function_name, state) + if not listitems and not dictitems \ + and isinstance(state, dict) and not state: + return self.represent_sequence(tag+function_name, args) + value = {} + if args: + value['args'] = args + if state or not isinstance(state, dict): + value['state'] = state + if listitems: + value['listitems'] = listitems + if dictitems: + value['dictitems'] = dictitems + return self.represent_mapping(tag+function_name, value) + + def represent_ordered_dict(self, data): + # Provide uniform representation across different Python versions. + data_type = type(data) + tag = 'tag:yaml.org,2002:python/object/apply:%s.%s' \ + % (data_type.__module__, data_type.__name__) + items = [[key, value] for key, value in data.items()] + return self.represent_sequence(tag, [items]) + +Representer.add_representer(complex, + Representer.represent_complex) + +Representer.add_representer(tuple, + Representer.represent_tuple) + +Representer.add_representer(type, + Representer.represent_name) + +Representer.add_representer(collections.OrderedDict, + Representer.represent_ordered_dict) + +Representer.add_representer(types.FunctionType, + Representer.represent_name) + +Representer.add_representer(types.BuiltinFunctionType, + Representer.represent_name) + +Representer.add_representer(types.ModuleType, + Representer.represent_module) + +Representer.add_multi_representer(object, + Representer.represent_object) + diff --git a/lib/spack/external/yaml/lib3/yaml/resolver.py b/lib/spack/external/yaml/lib3/yaml/resolver.py new file mode 100644 index 0000000000..02b82e73ee --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/resolver.py @@ -0,0 +1,227 @@ + +__all__ = ['BaseResolver', 'Resolver'] + +from .error import * +from .nodes import * + +import re + +class ResolverError(YAMLError): + pass + +class BaseResolver: + + DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + @classmethod + def add_implicit_resolver(cls, tag, regexp, first): + if not 'yaml_implicit_resolvers' in cls.__dict__: + implicit_resolvers = {} + for key in cls.yaml_implicit_resolvers: + implicit_resolvers[key] = cls.yaml_implicit_resolvers[key][:] + cls.yaml_implicit_resolvers = implicit_resolvers + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + + @classmethod + def add_path_resolver(cls, tag, path, kind=None): + # Note: `add_path_resolver` is experimental. The API could be changed. + # `new_path` is a pattern that is matched against the path from the + # root to the node that is being considered. `node_path` elements are + # tuples `(node_check, index_check)`. `node_check` is a node class: + # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` + # matches any kind of a node. `index_check` could be `None`, a boolean + # value, a string value, or a number. `None` and `False` match against + # any _value_ of sequence and mapping nodes. `True` matches against + # any _key_ of a mapping node. A string `index_check` matches against + # a mapping value that corresponds to a scalar key which content is + # equal to the `index_check` value. An integer `index_check` matches + # against a sequence value with the index equal to `index_check`. + if not 'yaml_path_resolvers' in cls.__dict__: + cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() + new_path = [] + for element in path: + if isinstance(element, (list, tuple)): + if len(element) == 2: + node_check, index_check = element + elif len(element) == 1: + node_check = element[0] + index_check = True + else: + raise ResolverError("Invalid path element: %s" % element) + else: + node_check = None + index_check = element + if node_check is str: + node_check = ScalarNode + elif node_check is list: + node_check = SequenceNode + elif node_check is dict: + node_check = MappingNode + elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ + and not isinstance(node_check, str) \ + and node_check is not None: + raise ResolverError("Invalid node checker: %s" % node_check) + if not isinstance(index_check, (str, int)) \ + and index_check is not None: + raise ResolverError("Invalid index checker: %s" % index_check) + new_path.append((node_check, index_check)) + if kind is str: + kind = ScalarNode + elif kind is list: + kind = SequenceNode + elif kind is dict: + kind = MappingNode + elif kind not in [ScalarNode, SequenceNode, MappingNode] \ + and kind is not None: + raise ResolverError("Invalid node kind: %s" % kind) + cls.yaml_path_resolvers[tuple(new_path), kind] = tag + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, + current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, + current_node, current_index): + node_check, index_check = path[depth-1] + if isinstance(node_check, str): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if (index_check is False or index_check is None) \ + and current_index is None: + return + if isinstance(index_check, str): + if not (isinstance(current_index, ScalarNode) + and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit): + if kind is ScalarNode and implicit[0]: + if value == '': + resolvers = self.yaml_implicit_resolvers.get('', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + resolvers += self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers: + if regexp.match(value): + return tag + implicit = implicit[1] + if self.yaml_path_resolvers: + exact_paths = self.resolver_exact_paths[-1] + if kind in exact_paths: + return exact_paths[kind] + if None in exact_paths: + return exact_paths[None] + if kind is ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is MappingNode: + return self.DEFAULT_MAPPING_TAG + +class Resolver(BaseResolver): + pass + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:bool', + re.compile(r'''^(?:yes|Yes|YES|no|No|NO + |true|True|TRUE|false|False|FALSE + |on|On|ON|off|Off|OFF)$''', re.X), + list('yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:float', + re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? + |\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* + |[-+]?\.(?:inf|Inf|INF) + |\.(?:nan|NaN|NAN))$''', re.X), + list('-+0123456789.')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:int', + re.compile(r'''^(?:[-+]?0b[0-1_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list('-+0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:merge', + re.compile(r'^(?:<<)$'), + ['<']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:null', + re.compile(r'''^(?: ~ + |null|Null|NULL + | )$''', re.X), + ['~', 'n', 'N', '']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:timestamp', + re.compile(r'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? + (?:[Tt]|[ \t]+)[0-9][0-9]? + :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? + (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), + list('0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:value', + re.compile(r'^(?:=)$'), + ['=']) + +# The following resolver is only for documentation purposes. It cannot work +# because plain scalars cannot start with '!', '&', or '*'. +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:yaml', + re.compile(r'^(?:!|&|\*)$'), + list('!&*')) + diff --git a/lib/spack/external/yaml/lib3/yaml/scanner.py b/lib/spack/external/yaml/lib3/yaml/scanner.py new file mode 100644 index 0000000000..c8d127b8ec --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/scanner.py @@ -0,0 +1,1444 @@ + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DIRECTIVE(name, value) +# DOCUMENT-START +# DOCUMENT-END +# BLOCK-SEQUENCE-START +# BLOCK-MAPPING-START +# BLOCK-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# BLOCK-ENTRY +# FLOW-ENTRY +# KEY +# VALUE +# ALIAS(value) +# ANCHOR(value) +# TAG(value) +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. +# + +__all__ = ['Scanner', 'ScannerError'] + +from .error import MarkedYAMLError +from .tokens import * + +class ScannerError(MarkedYAMLError): + pass + +class SimpleKey: + # See below simple keys treatment. + + def __init__(self, token_number, required, index, line, column, mark): + self.token_number = token_number + self.required = required + self.index = index + self.line = line + self.column = column + self.mark = mark + +class Scanner: + + def __init__(self): + """Initialize the scanner.""" + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # The current indentation level. + self.indent = -1 + + # Past indentation levels. + self.indents = [] + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # Example of simple keys: + # --- + # block simple key: value + # ? not a simple key: + # : { flow simple key: value } + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line and 1024 characters. + + # Can a simple key start at the current position? A simple key may + # start: + # - at the beginning of the line, not counting indentation spaces + # (in block context), + # - after '{', '[', ',' (in the flow context), + # - after '?', ':', '-' (in the block context). + # In the block context, this flag also signifies if a block collection + # may start at the current position. + self.allow_simple_key = True + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, required, index, line, column, mark) + # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), + # '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Compare the current indentation and column. It may add some tokens + # and decrease the current indentation level. + self.unwind_indent(self.column) + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == '\0': + return self.fetch_stream_end() + + # Is it a directive? + if ch == '%' and self.check_directive(): + return self.fetch_directive() + + # Is it the document start? + if ch == '-' and self.check_document_start(): + return self.fetch_document_start() + + # Is it the document end? + if ch == '.' and self.check_document_end(): + return self.fetch_document_end() + + # TODO: support for BOM within a stream. + #if ch == '\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == '[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == '{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == ']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == '}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == ',': + return self.fetch_flow_entry() + + # Is it the block entry indicator? + if ch == '-' and self.check_block_entry(): + return self.fetch_block_entry() + + # Is it the key indicator? + if ch == '?' and self.check_key(): + return self.fetch_key() + + # Is it the value indicator? + if ch == ':' and self.check_value(): + return self.fetch_value() + + # Is it an alias? + if ch == '*': + return self.fetch_alias() + + # Is it an anchor? + if ch == '&': + return self.fetch_anchor() + + # Is it a tag? + if ch == '!': + return self.fetch_tag() + + # Is it a literal scalar? + if ch == '|' and not self.flow_level: + return self.fetch_literal() + + # Is it a folded scalar? + if ch == '>' and not self.flow_level: + return self.fetch_folded() + + # Is it a single quoted scalar? + if ch == '\'': + return self.fetch_single() + + # Is it a double quoted scalar? + if ch == '\"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It's an error. Let's produce a nice error message. + raise ScannerError("while scanning for the next token", None, + "found character %r that cannot start any token" % ch, + self.get_mark()) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don't need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # - should be no longer than 1024 characters. + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in list(self.possible_simple_keys): + key = self.possible_simple_keys[level] + if key.line != self.line \ + or self.index-key.index > 1024: + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it's possible + # and save its position. This function is called for + # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. + + # Check if a simple key is required at the current position. + required = not self.flow_level and self.indent == self.column + + # The next token might be a simple key. Let's save it's number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken+len(self.tokens) + key = SimpleKey(token_number, required, + self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + key = self.possible_simple_keys[self.flow_level] + + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not find expected ':'", self.get_mark()) + + del self.possible_simple_keys[self.flow_level] + + # Indentation functions. + + def unwind_indent(self, column): + + ## In flow context, tokens should respect indentation. + ## Actually the condition should be `self.indent >= column` according to + ## the spec. But this condition will prohibit intuitively correct + ## constructions such as + ## key : { + ## } + #if self.flow_level and self.indent > column: + # raise ScannerError(None, None, + # "invalid intendation or unclosed '[' or '{'", + # self.get_mark()) + + # In the flow context, indentation is ignored. We make the scanner less + # restrictive then specification requires. + if self.flow_level: + return + + # In block context, we may need to issue the BLOCK-END tokens. + while self.indent > column: + mark = self.get_mark() + self.indent = self.indents.pop() + self.tokens.append(BlockEndToken(mark, mark)) + + def add_indent(self, column): + # Check if we need to increase indentation. + if self.indent < column: + self.indents.append(self.indent) + self.indent = column + return True + return False + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(StreamStartToken(mark, mark, + encoding=self.encoding)) + + + def fetch_stream_end(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_directive(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Scan and add DIRECTIVE. + self.tokens.append(self.scan_directive()) + + def fetch_document_start(self): + self.fetch_document_indicator(DocumentStartToken) + + def fetch_document_end(self): + self.fetch_document_indicator(DocumentEndToken) + + def fetch_document_indicator(self, TokenClass): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. Note that there could not be a block collection + # after '---'. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Add DOCUMENT-START or DOCUMENT-END. + start_mark = self.get_mark() + self.forward(3) + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_entry(self): + + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(FlowEntryToken(start_mark, end_mark)) + + def fetch_block_entry(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a new entry? + if not self.allow_simple_key: + raise ScannerError(None, None, + "sequence entries are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-SEQUENCE-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockSequenceStartToken(mark, mark)) + + # It's an error for the block entry to occur in the flow context, + # but we let the parser detect this. + else: + pass + + # Simple keys are allowed after '-'. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add BLOCK-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(BlockEntryToken(start_mark, end_mark)) + + def fetch_key(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a key (not nessesary a simple)? + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping keys are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-MAPPING-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after '?' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add KEY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(KeyToken(start_mark, end_mark)) + + def fetch_value(self): + + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number-self.tokens_taken, + KeyToken(key.mark, key.mark)) + + # If this key starts a new block mapping, we need to add + # BLOCK-MAPPING-START. + if not self.flow_level: + if self.add_indent(key.column): + self.tokens.insert(key.token_number-self.tokens_taken, + BlockMappingStartToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # It must be a part of a complex key. + else: + + # Block context needs additional checks. + # (Do we really need them? They will be catched by the parser + # anyway.) + if not self.flow_level: + + # We are allowed to start a complex value if and only if + # we can start a simple key. + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping values are not allowed here", + self.get_mark()) + + # If this value starts a new block mapping, we need to add + # BLOCK-MAPPING-START. It will be detected as an error later by + # the parser. + if not self.flow_level: + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after ':' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(ValueToken(start_mark, end_mark)) + + def fetch_alias(self): + + # ALIAS could be a simple key. + self.save_possible_simple_key() + + # No simple keys after ALIAS. + self.allow_simple_key = False + + # Scan and add ALIAS. + self.tokens.append(self.scan_anchor(AliasToken)) + + def fetch_anchor(self): + + # ANCHOR could start a simple key. + self.save_possible_simple_key() + + # No simple keys after ANCHOR. + self.allow_simple_key = False + + # Scan and add ANCHOR. + self.tokens.append(self.scan_anchor(AnchorToken)) + + def fetch_tag(self): + + # TAG could start a simple key. + self.save_possible_simple_key() + + # No simple keys after TAG. + self.allow_simple_key = False + + # Scan and add TAG. + self.tokens.append(self.scan_tag()) + + def fetch_literal(self): + self.fetch_block_scalar(style='|') + + def fetch_folded(self): + self.fetch_block_scalar(style='>') + + def fetch_block_scalar(self, style): + + # A simple key may follow a block scalar. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Scan and add SCALAR. + self.tokens.append(self.scan_block_scalar(style)) + + def fetch_single(self): + self.fetch_flow_scalar(style='\'') + + def fetch_double(self): + self.fetch_flow_scalar(style='"') + + def fetch_flow_scalar(self, style): + + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar(style)) + + def fetch_plain(self): + + # A plain scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after plain scalars. But note that `scan_plain` will + # change this flag if the scan is finished at the beginning of the + # line. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_directive(self): + + # DIRECTIVE: ^ '%' ... + # The '%' indicator is already checked. + if self.column == 0: + return True + + def check_document_start(self): + + # DOCUMENT-START: ^ '---' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '---' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_document_end(self): + + # DOCUMENT-END: ^ '...' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '...' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_block_entry(self): + + # BLOCK-ENTRY: '-' (' '|'\n') + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_key(self): + + # KEY(flow context): '?' + if self.flow_level: + return True + + # KEY(block context): '?' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_value(self): + + # VALUE(flow context): ':' + if self.flow_level: + return True + + # VALUE(block context): ':' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_plain(self): + + # A plain scalar may start with any non-space character except: + # '-', '?', ':', ',', '[', ']', '{', '}', + # '#', '&', '*', '!', '|', '>', '\'', '\"', + # '%', '@', '`'. + # + # It may also start with + # '-', '?', ':' + # if it is followed by a non-space character. + # + # Note that we limit the last rule to the block context (except the + # '-' character) because we want the flow context to be space + # independent. + ch = self.peek() + return ch not in '\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ + or (self.peek(1) not in '\0 \t\r\n\x85\u2028\u2029' + and (ch == '-' or (not self.flow_level and ch in '?:'))) + + # Scanners. + + def scan_to_next_token(self): + # We ignore spaces, line breaks and comments. + # If we find a line break in the block context, we set the flag + # `allow_simple_key` on. + # The byte order mark is stripped if it's the first character in the + # stream. We do not yet support BOM inside the stream as the + # specification requires. Any such mark will be considered as a part + # of the document. + # + # TODO: We need to make tab handling rules more sane. A good rule is + # Tabs cannot precede tokens + # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, + # KEY(block), VALUE(block), BLOCK-ENTRY + # So the checking code is + # if : + # self.allow_simple_keys = False + # We also need to add the check for `allow_simple_keys == True` to + # `unwind_indent` before issuing BLOCK-END. + # Scanners for block, flow, and plain scalars need to be modified. + + if self.index == 0 and self.peek() == '\uFEFF': + self.forward() + found = False + while not found: + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + if self.scan_line_break(): + if not self.flow_level: + self.allow_simple_key = True + else: + found = True + + def scan_directive(self): + # See the specification for details. + start_mark = self.get_mark() + self.forward() + name = self.scan_directive_name(start_mark) + value = None + if name == 'YAML': + value = self.scan_yaml_directive_value(start_mark) + end_mark = self.get_mark() + elif name == 'TAG': + value = self.scan_tag_directive_value(start_mark) + end_mark = self.get_mark() + else: + end_mark = self.get_mark() + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + self.scan_directive_ignored_line(start_mark) + return DirectiveToken(name, value, start_mark, end_mark) + + def scan_directive_name(self, start_mark): + # See the specification for details. + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + return value + + def scan_yaml_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + major = self.scan_yaml_directive_number(start_mark) + if self.peek() != '.': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or '.', but found %r" % self.peek(), + self.get_mark()) + self.forward() + minor = self.scan_yaml_directive_number(start_mark) + if self.peek() not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or ' ', but found %r" % self.peek(), + self.get_mark()) + return (major, minor) + + def scan_yaml_directive_number(self, start_mark): + # See the specification for details. + ch = self.peek() + if not ('0' <= ch <= '9'): + raise ScannerError("while scanning a directive", start_mark, + "expected a digit, but found %r" % ch, self.get_mark()) + length = 0 + while '0' <= self.peek(length) <= '9': + length += 1 + value = int(self.prefix(length)) + self.forward(length) + return value + + def scan_tag_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + handle = self.scan_tag_directive_handle(start_mark) + while self.peek() == ' ': + self.forward() + prefix = self.scan_tag_directive_prefix(start_mark) + return (handle, prefix) + + def scan_tag_directive_handle(self, start_mark): + # See the specification for details. + value = self.scan_tag_handle('directive', start_mark) + ch = self.peek() + if ch != ' ': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_tag_directive_prefix(self, start_mark): + # See the specification for details. + value = self.scan_tag_uri('directive', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_directive_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a comment or a line break, but found %r" + % ch, self.get_mark()) + self.scan_line_break() + + def scan_anchor(self, TokenClass): + # The specification does not restrict characters for anchors and + # aliases. This may lead to problems, for instance, the document: + # [ *alias, value ] + # can be interpteted in two ways, as + # [ "value" ] + # and + # [ *alias , "value" ] + # Therefore we restrict aliases to numbers and ASCII letters. + start_mark = self.get_mark() + indicator = self.peek() + if indicator == '*': + name = 'alias' + else: + name = 'anchor' + self.forward() + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \t\r\n\x85\u2028\u2029?:,]}%@`': + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + end_mark = self.get_mark() + return TokenClass(value, start_mark, end_mark) + + def scan_tag(self): + # See the specification for details. + start_mark = self.get_mark() + ch = self.peek(1) + if ch == '<': + handle = None + self.forward(2) + suffix = self.scan_tag_uri('tag', start_mark) + if self.peek() != '>': + raise ScannerError("while parsing a tag", start_mark, + "expected '>', but found %r" % self.peek(), + self.get_mark()) + self.forward() + elif ch in '\0 \t\r\n\x85\u2028\u2029': + handle = None + suffix = '!' + self.forward() + else: + length = 1 + use_handle = False + while ch not in '\0 \r\n\x85\u2028\u2029': + if ch == '!': + use_handle = True + break + length += 1 + ch = self.peek(length) + handle = '!' + if use_handle: + handle = self.scan_tag_handle('tag', start_mark) + else: + handle = '!' + self.forward() + suffix = self.scan_tag_uri('tag', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a tag", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + value = (handle, suffix) + end_mark = self.get_mark() + return TagToken(value, start_mark, end_mark) + + def scan_block_scalar(self, style): + # See the specification for details. + + if style == '>': + folded = True + else: + folded = False + + chunks = [] + start_mark = self.get_mark() + + # Scan the header. + self.forward() + chomping, increment = self.scan_block_scalar_indicators(start_mark) + self.scan_block_scalar_ignored_line(start_mark) + + # Determine the indentation level and go to the first non-empty line. + min_indent = self.indent+1 + if min_indent < 1: + min_indent = 1 + if increment is None: + breaks, max_indent, end_mark = self.scan_block_scalar_indentation() + indent = max(min_indent, max_indent) + else: + indent = min_indent+increment-1 + breaks, end_mark = self.scan_block_scalar_breaks(indent) + line_break = '' + + # Scan the inner part of the block scalar. + while self.column == indent and self.peek() != '\0': + chunks.extend(breaks) + leading_non_space = self.peek() not in ' \t' + length = 0 + while self.peek(length) not in '\0\r\n\x85\u2028\u2029': + length += 1 + chunks.append(self.prefix(length)) + self.forward(length) + line_break = self.scan_line_break() + breaks, end_mark = self.scan_block_scalar_breaks(indent) + if self.column == indent and self.peek() != '\0': + + # Unfortunately, folding rules are ambiguous. + # + # This is the folding according to the specification: + + if folded and line_break == '\n' \ + and leading_non_space and self.peek() not in ' \t': + if not breaks: + chunks.append(' ') + else: + chunks.append(line_break) + + # This is Clark Evans's interpretation (also in the spec + # examples): + # + #if folded and line_break == '\n': + # if not breaks: + # if self.peek() not in ' \t': + # chunks.append(' ') + # else: + # chunks.append(line_break) + #else: + # chunks.append(line_break) + else: + break + + # Chomp the tail. + if chomping is not False: + chunks.append(line_break) + if chomping is True: + chunks.extend(breaks) + + # We are done. + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + def scan_block_scalar_indicators(self, start_mark): + # See the specification for details. + chomping = None + increment = None + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + elif ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected chomping or indentation indicators, but found %r" + % ch, self.get_mark()) + return chomping, increment + + def scan_block_scalar_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected a comment or a line break, but found %r" % ch, + self.get_mark()) + self.scan_line_break() + + def scan_block_scalar_indentation(self): + # See the specification for details. + chunks = [] + max_indent = 0 + end_mark = self.get_mark() + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() != ' ': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + else: + self.forward() + if self.column > max_indent: + max_indent = self.column + return chunks, max_indent, end_mark + + def scan_block_scalar_breaks(self, indent): + # See the specification for details. + chunks = [] + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + while self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + return chunks, end_mark + + def scan_flow_scalar(self, style): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don't need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + if style == '"': + double = True + else: + double = False + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + self.forward() + end_mark = self.get_mark() + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + ESCAPE_REPLACEMENTS = { + '0': '\0', + 'a': '\x07', + 'b': '\x08', + 't': '\x09', + '\t': '\x09', + 'n': '\x0A', + 'v': '\x0B', + 'f': '\x0C', + 'r': '\x0D', + 'e': '\x1B', + ' ': '\x20', + '\"': '\"', + '\\': '\\', + 'N': '\x85', + '_': '\xA0', + 'L': '\u2028', + 'P': '\u2029', + } + + ESCAPE_CODES = { + 'x': 2, + 'u': 4, + 'U': 8, + } + + def scan_flow_scalar_non_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in '\'\"\\\0 \t\r\n\x85\u2028\u2029': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if not double and ch == '\'' and self.peek(1) == '\'': + chunks.append('\'') + self.forward(2) + elif (double and ch == '\'') or (not double and ch in '\"\\'): + chunks.append(ch) + self.forward() + elif double and ch == '\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "expected escape sequence of %d hexdecimal numbers, but found %r" % + (length, self.peek(k)), self.get_mark()) + code = int(self.prefix(length), 16) + chunks.append(chr(code)) + self.forward(length) + elif ch in '\r\n\x85\u2028\u2029': + self.scan_line_break() + chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) + else: + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "found unknown escape character %r" % ch, self.get_mark()) + else: + return chunks + + def scan_flow_scalar_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in ' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == '\0': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected end of stream", self.get_mark()) + elif ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + breaks = self.scan_flow_scalar_breaks(double, start_mark) + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + else: + chunks.append(whitespaces) + return chunks + + def scan_flow_scalar_breaks(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + # Instead of checking indentation, we check for document + # separators. + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected document separator", self.get_mark()) + while self.peek() in ' \t': + self.forward() + if self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + else: + return chunks + + def scan_plain(self): + # See the specification for details. + # We add an additional restriction for the flow context: + # plain scalars in the flow context cannot contain ',', ':' and '?'. + # We also keep track of the `allow_simple_key` flag here. + # Indentation rules are loosed for the flow context. + chunks = [] + start_mark = self.get_mark() + end_mark = start_mark + indent = self.indent+1 + # We allow zero indentation for scalars, but then we need to check for + # document separators at the beginning of the line. + #if indent == 0: + # indent = 1 + spaces = [] + while True: + length = 0 + if self.peek() == '#': + break + while True: + ch = self.peek(length) + if ch in '\0 \t\r\n\x85\u2028\u2029' \ + or (not self.flow_level and ch == ':' and + self.peek(length+1) in '\0 \t\r\n\x85\u2028\u2029') \ + or (self.flow_level and ch in ',:?[]{}'): + break + length += 1 + # It's not clear what we should do with ':' in the flow context. + if (self.flow_level and ch == ':' + and self.peek(length+1) not in '\0 \t\r\n\x85\u2028\u2029,[]{}'): + self.forward(length) + raise ScannerError("while scanning a plain scalar", start_mark, + "found unexpected ':'", self.get_mark(), + "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + spaces = self.scan_plain_spaces(indent, start_mark) + if not spaces or self.peek() == '#' \ + or (not self.flow_level and self.column < indent): + break + return ScalarToken(''.join(chunks), True, start_mark, end_mark) + + def scan_plain_spaces(self, indent, start_mark): + # See the specification for details. + # The specification is really confusing about tabs in plain scalars. + # We just forbid them completely. Do not use tabs in YAML! + chunks = [] + length = 0 + while self.peek(length) in ' ': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + self.allow_simple_key = True + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + breaks = [] + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() == ' ': + self.forward() + else: + breaks.append(self.scan_line_break()) + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + elif whitespaces: + chunks.append(whitespaces) + return chunks + + def scan_tag_handle(self, name, start_mark): + # See the specification for details. + # For some strange reasons, the specification does not allow '_' in + # tag handles. I have allowed it anyway. + ch = self.peek() + if ch != '!': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length = 1 + ch = self.peek(length) + if ch != ' ': + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if ch != '!': + self.forward(length) + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length += 1 + value = self.prefix(length) + self.forward(length) + return value + + def scan_tag_uri(self, name, start_mark): + # See the specification for details. + # Note: we do not check if URI is well-formed. + chunks = [] + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.!~*\'()[]%': + if ch == '%': + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + chunks.append(self.scan_uri_escapes(name, start_mark)) + else: + length += 1 + ch = self.peek(length) + if length: + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + if not chunks: + raise ScannerError("while parsing a %s" % name, start_mark, + "expected URI, but found %r" % ch, self.get_mark()) + return ''.join(chunks) + + def scan_uri_escapes(self, name, start_mark): + # See the specification for details. + codes = [] + mark = self.get_mark() + while self.peek() == '%': + self.forward() + for k in range(2): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected URI escape sequence of 2 hexdecimal numbers, but found %r" + % self.peek(k), self.get_mark()) + codes.append(int(self.prefix(2), 16)) + self.forward(2) + try: + value = bytes(codes).decode('utf-8') + except UnicodeDecodeError as exc: + raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) + return value + + def scan_line_break(self): + # Transforms: + # '\r\n' : '\n' + # '\r' : '\n' + # '\n' : '\n' + # '\x85' : '\n' + # '\u2028' : '\u2028' + # '\u2029 : '\u2029' + # default : '' + ch = self.peek() + if ch in '\r\n\x85': + if self.prefix(2) == '\r\n': + self.forward(2) + else: + self.forward() + return '\n' + elif ch in '\u2028\u2029': + self.forward() + return ch + return '' + +#try: +# import psyco +# psyco.bind(Scanner) +#except ImportError: +# pass + diff --git a/lib/spack/external/yaml/lib3/yaml/serializer.py b/lib/spack/external/yaml/lib3/yaml/serializer.py new file mode 100644 index 0000000000..fe911e67ae --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/serializer.py @@ -0,0 +1,111 @@ + +__all__ = ['Serializer', 'SerializerError'] + +from .error import YAMLError +from .events import * +from .nodes import * + +class SerializerError(YAMLError): + pass + +class Serializer: + + ANCHOR_TEMPLATE = 'id%03d' + + def __init__(self, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + self.use_encoding = encoding + self.use_explicit_start = explicit_start + self.use_explicit_end = explicit_end + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + self.closed = None + + def open(self): + if self.closed is None: + self.emit(StreamStartEvent(encoding=self.use_encoding)) + self.closed = False + elif self.closed: + raise SerializerError("serializer is closed") + else: + raise SerializerError("serializer is already opened") + + def close(self): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif not self.closed: + self.emit(StreamEndEvent()) + self.closed = True + + #def __del__(self): + # self.close() + + def serialize(self, node): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif self.closed: + raise SerializerError("serializer is closed") + self.emit(DocumentStartEvent(explicit=self.use_explicit_start, + version=self.use_version, tags=self.use_tags)) + self.anchor_node(node) + self.serialize_node(node, None, None) + self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + + def anchor_node(self, node): + if node in self.anchors: + if self.anchors[node] is None: + self.anchors[node] = self.generate_anchor(node) + else: + self.anchors[node] = None + if isinstance(node, SequenceNode): + for item in node.value: + self.anchor_node(item) + elif isinstance(node, MappingNode): + for key, value in node.value: + self.anchor_node(key) + self.anchor_node(value) + + def generate_anchor(self, node): + self.last_anchor_id += 1 + return self.ANCHOR_TEMPLATE % self.last_anchor_id + + def serialize_node(self, node, parent, index): + alias = self.anchors[node] + if node in self.serialized_nodes: + self.emit(AliasEvent(alias)) + else: + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if isinstance(node, ScalarNode): + detected_tag = self.resolve(ScalarNode, node.value, (True, False)) + default_tag = self.resolve(ScalarNode, node.value, (False, True)) + implicit = (node.tag == detected_tag), (node.tag == default_tag) + self.emit(ScalarEvent(alias, node.tag, implicit, node.value, + style=node.style)) + elif isinstance(node, SequenceNode): + implicit = (node.tag + == self.resolve(SequenceNode, node.value, True)) + self.emit(SequenceStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + index = 0 + for item in node.value: + self.serialize_node(item, node, index) + index += 1 + self.emit(SequenceEndEvent()) + elif isinstance(node, MappingNode): + implicit = (node.tag + == self.resolve(MappingNode, node.value, True)) + self.emit(MappingStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + for key, value in node.value: + self.serialize_node(key, node, None) + self.serialize_node(value, node, key) + self.emit(MappingEndEvent()) + self.ascend_resolver() + diff --git a/lib/spack/external/yaml/lib3/yaml/tokens.py b/lib/spack/external/yaml/lib3/yaml/tokens.py new file mode 100644 index 0000000000..4d0b48a394 --- /dev/null +++ b/lib/spack/external/yaml/lib3/yaml/tokens.py @@ -0,0 +1,104 @@ + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in self.__dict__ + if not key.endswith('_mark')] + attributes.sort() + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +#class BOMToken(Token): +# id = '' + +class DirectiveToken(Token): + id = '' + def __init__(self, name, value, start_mark, end_mark): + self.name = name + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class DocumentStartToken(Token): + id = '' + +class DocumentEndToken(Token): + id = '' + +class StreamStartToken(Token): + id = '' + def __init__(self, start_mark=None, end_mark=None, + encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndToken(Token): + id = '' + +class BlockSequenceStartToken(Token): + id = '' + +class BlockMappingStartToken(Token): + id = '' + +class BlockEndToken(Token): + id = '' + +class FlowSequenceStartToken(Token): + id = '[' + +class FlowMappingStartToken(Token): + id = '{' + +class FlowSequenceEndToken(Token): + id = ']' + +class FlowMappingEndToken(Token): + id = '}' + +class KeyToken(Token): + id = '?' + +class ValueToken(Token): + id = ':' + +class BlockEntryToken(Token): + id = '-' + +class FlowEntryToken(Token): + id = ',' + +class AliasToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class AnchorToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class TagToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class ScalarToken(Token): + id = '' + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + diff --git a/lib/spack/external/yaml/loader.py b/lib/spack/external/yaml/loader.py deleted file mode 100644 index 293ff467b1..0000000000 --- a/lib/spack/external/yaml/loader.py +++ /dev/null @@ -1,40 +0,0 @@ - -__all__ = ['BaseLoader', 'SafeLoader', 'Loader'] - -from reader import * -from scanner import * -from parser import * -from composer import * -from constructor import * -from resolver import * - -class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): - - def __init__(self, stream): - Reader.__init__(self, stream) - Scanner.__init__(self) - Parser.__init__(self) - Composer.__init__(self) - BaseConstructor.__init__(self) - BaseResolver.__init__(self) - -class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): - - def __init__(self, stream): - Reader.__init__(self, stream) - Scanner.__init__(self) - Parser.__init__(self) - Composer.__init__(self) - SafeConstructor.__init__(self) - Resolver.__init__(self) - -class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): - - def __init__(self, stream): - Reader.__init__(self, stream) - Scanner.__init__(self) - Parser.__init__(self) - Composer.__init__(self) - Constructor.__init__(self) - Resolver.__init__(self) - diff --git a/lib/spack/external/yaml/nodes.py b/lib/spack/external/yaml/nodes.py deleted file mode 100644 index c4f070c41e..0000000000 --- a/lib/spack/external/yaml/nodes.py +++ /dev/null @@ -1,49 +0,0 @@ - -class Node(object): - def __init__(self, tag, value, start_mark, end_mark): - self.tag = tag - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - def __repr__(self): - value = self.value - #if isinstance(value, list): - # if len(value) == 0: - # value = '' - # elif len(value) == 1: - # value = '<1 item>' - # else: - # value = '<%d items>' % len(value) - #else: - # if len(value) > 75: - # value = repr(value[:70]+u' ... ') - # else: - # value = repr(value) - value = repr(value) - return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) - -class ScalarNode(Node): - id = 'scalar' - def __init__(self, tag, value, - start_mark=None, end_mark=None, style=None): - self.tag = tag - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - self.style = style - -class CollectionNode(Node): - def __init__(self, tag, value, - start_mark=None, end_mark=None, flow_style=None): - self.tag = tag - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - self.flow_style = flow_style - -class SequenceNode(CollectionNode): - id = 'sequence' - -class MappingNode(CollectionNode): - id = 'mapping' - diff --git a/lib/spack/external/yaml/parser.py b/lib/spack/external/yaml/parser.py deleted file mode 100644 index f9e3057f33..0000000000 --- a/lib/spack/external/yaml/parser.py +++ /dev/null @@ -1,589 +0,0 @@ - -# The following YAML grammar is LL(1) and is parsed by a recursive descent -# parser. -# -# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -# implicit_document ::= block_node DOCUMENT-END* -# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -# block_node_or_indentless_sequence ::= -# ALIAS -# | properties (block_content | indentless_block_sequence)? -# | block_content -# | indentless_block_sequence -# block_node ::= ALIAS -# | properties block_content? -# | block_content -# flow_node ::= ALIAS -# | properties flow_content? -# | flow_content -# properties ::= TAG ANCHOR? | ANCHOR TAG? -# block_content ::= block_collection | flow_collection | SCALAR -# flow_content ::= flow_collection | SCALAR -# block_collection ::= block_sequence | block_mapping -# flow_collection ::= flow_sequence | flow_mapping -# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -# block_mapping ::= BLOCK-MAPPING_START -# ((KEY block_node_or_indentless_sequence?)? -# (VALUE block_node_or_indentless_sequence?)?)* -# BLOCK-END -# flow_sequence ::= FLOW-SEQUENCE-START -# (flow_sequence_entry FLOW-ENTRY)* -# flow_sequence_entry? -# FLOW-SEQUENCE-END -# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -# flow_mapping ::= FLOW-MAPPING-START -# (flow_mapping_entry FLOW-ENTRY)* -# flow_mapping_entry? -# FLOW-MAPPING-END -# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -# -# FIRST sets: -# -# stream: { STREAM-START } -# explicit_document: { DIRECTIVE DOCUMENT-START } -# implicit_document: FIRST(block_node) -# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } -# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } -# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } -# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } -# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } -# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } -# block_sequence: { BLOCK-SEQUENCE-START } -# block_mapping: { BLOCK-MAPPING-START } -# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } -# indentless_sequence: { ENTRY } -# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } -# flow_sequence: { FLOW-SEQUENCE-START } -# flow_mapping: { FLOW-MAPPING-START } -# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } -# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } - -__all__ = ['Parser', 'ParserError'] - -from error import MarkedYAMLError -from tokens import * -from events import * -from scanner import * - -class ParserError(MarkedYAMLError): - pass - -class Parser(object): - # Since writing a recursive-descendant parser is a straightforward task, we - # do not give many comments here. - - DEFAULT_TAGS = { - u'!': u'!', - u'!!': u'tag:yaml.org,2002:', - } - - def __init__(self): - self.current_event = None - self.yaml_version = None - self.tag_handles = {} - self.states = [] - self.marks = [] - self.state = self.parse_stream_start - - def dispose(self): - # Reset the state attributes (to clear self-references) - self.states = [] - self.state = None - - def check_event(self, *choices): - # Check the type of the next event. - if self.current_event is None: - if self.state: - self.current_event = self.state() - if self.current_event is not None: - if not choices: - return True - for choice in choices: - if isinstance(self.current_event, choice): - return True - return False - - def peek_event(self): - # Get the next event. - if self.current_event is None: - if self.state: - self.current_event = self.state() - return self.current_event - - def get_event(self): - # Get the next event and proceed further. - if self.current_event is None: - if self.state: - self.current_event = self.state() - value = self.current_event - self.current_event = None - return value - - # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END - # implicit_document ::= block_node DOCUMENT-END* - # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* - - def parse_stream_start(self): - - # Parse the stream start. - token = self.get_token() - event = StreamStartEvent(token.start_mark, token.end_mark, - encoding=token.encoding) - - # Prepare the next state. - self.state = self.parse_implicit_document_start - - return event - - def parse_implicit_document_start(self): - - # Parse an implicit document. - if not self.check_token(DirectiveToken, DocumentStartToken, - StreamEndToken): - self.tag_handles = self.DEFAULT_TAGS - token = self.peek_token() - start_mark = end_mark = token.start_mark - event = DocumentStartEvent(start_mark, end_mark, - explicit=False) - - # Prepare the next state. - self.states.append(self.parse_document_end) - self.state = self.parse_block_node - - return event - - else: - return self.parse_document_start() - - def parse_document_start(self): - - # Parse any extra document end indicators. - while self.check_token(DocumentEndToken): - self.get_token() - - # Parse an explicit document. - if not self.check_token(StreamEndToken): - token = self.peek_token() - start_mark = token.start_mark - version, tags = self.process_directives() - if not self.check_token(DocumentStartToken): - raise ParserError(None, None, - "expected '', but found %r" - % self.peek_token().id, - self.peek_token().start_mark) - token = self.get_token() - end_mark = token.end_mark - event = DocumentStartEvent(start_mark, end_mark, - explicit=True, version=version, tags=tags) - self.states.append(self.parse_document_end) - self.state = self.parse_document_content - else: - # Parse the end of the stream. - token = self.get_token() - event = StreamEndEvent(token.start_mark, token.end_mark) - assert not self.states - assert not self.marks - self.state = None - return event - - def parse_document_end(self): - - # Parse the document end. - token = self.peek_token() - start_mark = end_mark = token.start_mark - explicit = False - if self.check_token(DocumentEndToken): - token = self.get_token() - end_mark = token.end_mark - explicit = True - event = DocumentEndEvent(start_mark, end_mark, - explicit=explicit) - - # Prepare the next state. - self.state = self.parse_document_start - - return event - - def parse_document_content(self): - if self.check_token(DirectiveToken, - DocumentStartToken, DocumentEndToken, StreamEndToken): - event = self.process_empty_scalar(self.peek_token().start_mark) - self.state = self.states.pop() - return event - else: - return self.parse_block_node() - - def process_directives(self): - self.yaml_version = None - self.tag_handles = {} - while self.check_token(DirectiveToken): - token = self.get_token() - if token.name == u'YAML': - if self.yaml_version is not None: - raise ParserError(None, None, - "found duplicate YAML directive", token.start_mark) - major, minor = token.value - if major != 1: - raise ParserError(None, None, - "found incompatible YAML document (version 1.* is required)", - token.start_mark) - self.yaml_version = token.value - elif token.name == u'TAG': - handle, prefix = token.value - if handle in self.tag_handles: - raise ParserError(None, None, - "duplicate tag handle %r" % handle.encode('utf-8'), - token.start_mark) - self.tag_handles[handle] = prefix - if self.tag_handles: - value = self.yaml_version, self.tag_handles.copy() - else: - value = self.yaml_version, None - for key in self.DEFAULT_TAGS: - if key not in self.tag_handles: - self.tag_handles[key] = self.DEFAULT_TAGS[key] - return value - - # block_node_or_indentless_sequence ::= ALIAS - # | properties (block_content | indentless_block_sequence)? - # | block_content - # | indentless_block_sequence - # block_node ::= ALIAS - # | properties block_content? - # | block_content - # flow_node ::= ALIAS - # | properties flow_content? - # | flow_content - # properties ::= TAG ANCHOR? | ANCHOR TAG? - # block_content ::= block_collection | flow_collection | SCALAR - # flow_content ::= flow_collection | SCALAR - # block_collection ::= block_sequence | block_mapping - # flow_collection ::= flow_sequence | flow_mapping - - def parse_block_node(self): - return self.parse_node(block=True) - - def parse_flow_node(self): - return self.parse_node() - - def parse_block_node_or_indentless_sequence(self): - return self.parse_node(block=True, indentless_sequence=True) - - def parse_node(self, block=False, indentless_sequence=False): - if self.check_token(AliasToken): - token = self.get_token() - event = AliasEvent(token.value, token.start_mark, token.end_mark) - self.state = self.states.pop() - else: - anchor = None - tag = None - start_mark = end_mark = tag_mark = None - if self.check_token(AnchorToken): - token = self.get_token() - start_mark = token.start_mark - end_mark = token.end_mark - anchor = token.value - if self.check_token(TagToken): - token = self.get_token() - tag_mark = token.start_mark - end_mark = token.end_mark - tag = token.value - elif self.check_token(TagToken): - token = self.get_token() - start_mark = tag_mark = token.start_mark - end_mark = token.end_mark - tag = token.value - if self.check_token(AnchorToken): - token = self.get_token() - end_mark = token.end_mark - anchor = token.value - if tag is not None: - handle, suffix = tag - if handle is not None: - if handle not in self.tag_handles: - raise ParserError("while parsing a node", start_mark, - "found undefined tag handle %r" % handle.encode('utf-8'), - tag_mark) - tag = self.tag_handles[handle]+suffix - else: - tag = suffix - #if tag == u'!': - # raise ParserError("while parsing a node", start_mark, - # "found non-specific tag '!'", tag_mark, - # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") - if start_mark is None: - start_mark = end_mark = self.peek_token().start_mark - event = None - implicit = (tag is None or tag == u'!') - if indentless_sequence and self.check_token(BlockEntryToken): - end_mark = self.peek_token().end_mark - event = SequenceStartEvent(anchor, tag, implicit, - start_mark, end_mark) - self.state = self.parse_indentless_sequence_entry - else: - if self.check_token(ScalarToken): - token = self.get_token() - end_mark = token.end_mark - if (token.plain and tag is None) or tag == u'!': - implicit = (True, False) - elif tag is None: - implicit = (False, True) - else: - implicit = (False, False) - event = ScalarEvent(anchor, tag, implicit, token.value, - start_mark, end_mark, style=token.style) - self.state = self.states.pop() - elif self.check_token(FlowSequenceStartToken): - end_mark = self.peek_token().end_mark - event = SequenceStartEvent(anchor, tag, implicit, - start_mark, end_mark, flow_style=True) - self.state = self.parse_flow_sequence_first_entry - elif self.check_token(FlowMappingStartToken): - end_mark = self.peek_token().end_mark - event = MappingStartEvent(anchor, tag, implicit, - start_mark, end_mark, flow_style=True) - self.state = self.parse_flow_mapping_first_key - elif block and self.check_token(BlockSequenceStartToken): - end_mark = self.peek_token().start_mark - event = SequenceStartEvent(anchor, tag, implicit, - start_mark, end_mark, flow_style=False) - self.state = self.parse_block_sequence_first_entry - elif block and self.check_token(BlockMappingStartToken): - end_mark = self.peek_token().start_mark - event = MappingStartEvent(anchor, tag, implicit, - start_mark, end_mark, flow_style=False) - self.state = self.parse_block_mapping_first_key - elif anchor is not None or tag is not None: - # Empty scalars are allowed even if a tag or an anchor is - # specified. - event = ScalarEvent(anchor, tag, (implicit, False), u'', - start_mark, end_mark) - self.state = self.states.pop() - else: - if block: - node = 'block' - else: - node = 'flow' - token = self.peek_token() - raise ParserError("while parsing a %s node" % node, start_mark, - "expected the node content, but found %r" % token.id, - token.start_mark) - return event - - # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END - - def parse_block_sequence_first_entry(self): - token = self.get_token() - self.marks.append(token.start_mark) - return self.parse_block_sequence_entry() - - def parse_block_sequence_entry(self): - if self.check_token(BlockEntryToken): - token = self.get_token() - if not self.check_token(BlockEntryToken, BlockEndToken): - self.states.append(self.parse_block_sequence_entry) - return self.parse_block_node() - else: - self.state = self.parse_block_sequence_entry - return self.process_empty_scalar(token.end_mark) - if not self.check_token(BlockEndToken): - token = self.peek_token() - raise ParserError("while parsing a block collection", self.marks[-1], - "expected , but found %r" % token.id, token.start_mark) - token = self.get_token() - event = SequenceEndEvent(token.start_mark, token.end_mark) - self.state = self.states.pop() - self.marks.pop() - return event - - # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ - - def parse_indentless_sequence_entry(self): - if self.check_token(BlockEntryToken): - token = self.get_token() - if not self.check_token(BlockEntryToken, - KeyToken, ValueToken, BlockEndToken): - self.states.append(self.parse_indentless_sequence_entry) - return self.parse_block_node() - else: - self.state = self.parse_indentless_sequence_entry - return self.process_empty_scalar(token.end_mark) - token = self.peek_token() - event = SequenceEndEvent(token.start_mark, token.start_mark) - self.state = self.states.pop() - return event - - # block_mapping ::= BLOCK-MAPPING_START - # ((KEY block_node_or_indentless_sequence?)? - # (VALUE block_node_or_indentless_sequence?)?)* - # BLOCK-END - - def parse_block_mapping_first_key(self): - token = self.get_token() - self.marks.append(token.start_mark) - return self.parse_block_mapping_key() - - def parse_block_mapping_key(self): - if self.check_token(KeyToken): - token = self.get_token() - if not self.check_token(KeyToken, ValueToken, BlockEndToken): - self.states.append(self.parse_block_mapping_value) - return self.parse_block_node_or_indentless_sequence() - else: - self.state = self.parse_block_mapping_value - return self.process_empty_scalar(token.end_mark) - if not self.check_token(BlockEndToken): - token = self.peek_token() - raise ParserError("while parsing a block mapping", self.marks[-1], - "expected , but found %r" % token.id, token.start_mark) - token = self.get_token() - event = MappingEndEvent(token.start_mark, token.end_mark) - self.state = self.states.pop() - self.marks.pop() - return event - - def parse_block_mapping_value(self): - if self.check_token(ValueToken): - token = self.get_token() - if not self.check_token(KeyToken, ValueToken, BlockEndToken): - self.states.append(self.parse_block_mapping_key) - return self.parse_block_node_or_indentless_sequence() - else: - self.state = self.parse_block_mapping_key - return self.process_empty_scalar(token.end_mark) - else: - self.state = self.parse_block_mapping_key - token = self.peek_token() - return self.process_empty_scalar(token.start_mark) - - # flow_sequence ::= FLOW-SEQUENCE-START - # (flow_sequence_entry FLOW-ENTRY)* - # flow_sequence_entry? - # FLOW-SEQUENCE-END - # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - # - # Note that while production rules for both flow_sequence_entry and - # flow_mapping_entry are equal, their interpretations are different. - # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` - # generate an inline mapping (set syntax). - - def parse_flow_sequence_first_entry(self): - token = self.get_token() - self.marks.append(token.start_mark) - return self.parse_flow_sequence_entry(first=True) - - def parse_flow_sequence_entry(self, first=False): - if not self.check_token(FlowSequenceEndToken): - if not first: - if self.check_token(FlowEntryToken): - self.get_token() - else: - token = self.peek_token() - raise ParserError("while parsing a flow sequence", self.marks[-1], - "expected ',' or ']', but got %r" % token.id, token.start_mark) - - if self.check_token(KeyToken): - token = self.peek_token() - event = MappingStartEvent(None, None, True, - token.start_mark, token.end_mark, - flow_style=True) - self.state = self.parse_flow_sequence_entry_mapping_key - return event - elif not self.check_token(FlowSequenceEndToken): - self.states.append(self.parse_flow_sequence_entry) - return self.parse_flow_node() - token = self.get_token() - event = SequenceEndEvent(token.start_mark, token.end_mark) - self.state = self.states.pop() - self.marks.pop() - return event - - def parse_flow_sequence_entry_mapping_key(self): - token = self.get_token() - if not self.check_token(ValueToken, - FlowEntryToken, FlowSequenceEndToken): - self.states.append(self.parse_flow_sequence_entry_mapping_value) - return self.parse_flow_node() - else: - self.state = self.parse_flow_sequence_entry_mapping_value - return self.process_empty_scalar(token.end_mark) - - def parse_flow_sequence_entry_mapping_value(self): - if self.check_token(ValueToken): - token = self.get_token() - if not self.check_token(FlowEntryToken, FlowSequenceEndToken): - self.states.append(self.parse_flow_sequence_entry_mapping_end) - return self.parse_flow_node() - else: - self.state = self.parse_flow_sequence_entry_mapping_end - return self.process_empty_scalar(token.end_mark) - else: - self.state = self.parse_flow_sequence_entry_mapping_end - token = self.peek_token() - return self.process_empty_scalar(token.start_mark) - - def parse_flow_sequence_entry_mapping_end(self): - self.state = self.parse_flow_sequence_entry - token = self.peek_token() - return MappingEndEvent(token.start_mark, token.start_mark) - - # flow_mapping ::= FLOW-MAPPING-START - # (flow_mapping_entry FLOW-ENTRY)* - # flow_mapping_entry? - # FLOW-MAPPING-END - # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - - def parse_flow_mapping_first_key(self): - token = self.get_token() - self.marks.append(token.start_mark) - return self.parse_flow_mapping_key(first=True) - - def parse_flow_mapping_key(self, first=False): - if not self.check_token(FlowMappingEndToken): - if not first: - if self.check_token(FlowEntryToken): - self.get_token() - else: - token = self.peek_token() - raise ParserError("while parsing a flow mapping", self.marks[-1], - "expected ',' or '}', but got %r" % token.id, token.start_mark) - if self.check_token(KeyToken): - token = self.get_token() - if not self.check_token(ValueToken, - FlowEntryToken, FlowMappingEndToken): - self.states.append(self.parse_flow_mapping_value) - return self.parse_flow_node() - else: - self.state = self.parse_flow_mapping_value - return self.process_empty_scalar(token.end_mark) - elif not self.check_token(FlowMappingEndToken): - self.states.append(self.parse_flow_mapping_empty_value) - return self.parse_flow_node() - token = self.get_token() - event = MappingEndEvent(token.start_mark, token.end_mark) - self.state = self.states.pop() - self.marks.pop() - return event - - def parse_flow_mapping_value(self): - if self.check_token(ValueToken): - token = self.get_token() - if not self.check_token(FlowEntryToken, FlowMappingEndToken): - self.states.append(self.parse_flow_mapping_key) - return self.parse_flow_node() - else: - self.state = self.parse_flow_mapping_key - return self.process_empty_scalar(token.end_mark) - else: - self.state = self.parse_flow_mapping_key - token = self.peek_token() - return self.process_empty_scalar(token.start_mark) - - def parse_flow_mapping_empty_value(self): - self.state = self.parse_flow_mapping_key - return self.process_empty_scalar(self.peek_token().start_mark) - - def process_empty_scalar(self, mark): - return ScalarEvent(None, None, (True, False), u'', mark, mark) - diff --git a/lib/spack/external/yaml/reader.py b/lib/spack/external/yaml/reader.py deleted file mode 100644 index a67af7c5da..0000000000 --- a/lib/spack/external/yaml/reader.py +++ /dev/null @@ -1,189 +0,0 @@ -# This module contains abstractions for the input stream. You don't have to -# looks further, there are no pretty code. -# -# We define two classes here. -# -# Mark(source, line, column) -# It's just a record and its only use is producing nice error messages. -# Parser does not use it for any other purposes. -# -# Reader(source, data) -# Reader determines the encoding of `data` and converts it to unicode. -# Reader provides the following methods and attributes: -# reader.peek(length=1) - return the next `length` characters -# reader.forward(length=1) - move the current position to `length` characters. -# reader.index - the number of the current character. -# reader.line, stream.column - the line and the column of the current character. - -__all__ = ['Reader', 'ReaderError'] - -from error import YAMLError, Mark - -import codecs, re - -class ReaderError(YAMLError): - - def __init__(self, name, position, character, encoding, reason): - self.name = name - self.character = character - self.position = position - self.encoding = encoding - self.reason = reason - - def __str__(self): - if isinstance(self.character, str): - return "'%s' codec can't decode byte #x%02x: %s\n" \ - " in \"%s\", position %d" \ - % (self.encoding, ord(self.character), self.reason, - self.name, self.position) - else: - return "unacceptable character #x%04x: %s\n" \ - " in \"%s\", position %d" \ - % (self.character, self.reason, - self.name, self.position) - -class Reader(object): - # Reader: - # - determines the data encoding and converts it to unicode, - # - checks if characters are in allowed range, - # - adds '\0' to the end. - - # Reader accepts - # - a `str` object, - # - a `unicode` object, - # - a file-like object with its `read` method returning `str`, - # - a file-like object with its `read` method returning `unicode`. - - # Yeah, it's ugly and slow. - - def __init__(self, stream, name=None): - self.stream = None - self.stream_pointer = 0 - self.eof = True - self.buffer = u'' - self.pointer = 0 - self.raw_buffer = None - self.raw_decode = None - self.encoding = None - self.index = 0 - self.line = 0 - self.column = 0 - if isinstance(stream, unicode): - self.name = "" if name is None else name - self.check_printable(stream) - self.buffer = stream+u'\0' - elif isinstance(stream, str): - self.name = "" if name is None else name - self.raw_buffer = stream - self.determine_encoding() - else: - self.stream = stream - self.name = getattr(stream, 'name', "") if name is None else name - self.eof = False - self.raw_buffer = '' - self.determine_encoding() - - def peek(self, index=0): - try: - return self.buffer[self.pointer+index] - except IndexError: - self.update(index+1) - return self.buffer[self.pointer+index] - - def prefix(self, length=1): - if self.pointer+length >= len(self.buffer): - self.update(length) - return self.buffer[self.pointer:self.pointer+length] - - def forward(self, length=1): - if self.pointer+length+1 >= len(self.buffer): - self.update(length+1) - while length: - ch = self.buffer[self.pointer] - self.pointer += 1 - self.index += 1 - if ch in u'\n\x85\u2028\u2029' \ - or (ch == u'\r' and self.buffer[self.pointer] != u'\n'): - self.line += 1 - self.column = 0 - elif ch != u'\uFEFF': - self.column += 1 - length -= 1 - - def get_mark(self): - if self.stream is None: - return Mark(self.name, self.index, self.line, self.column, - self.buffer, self.pointer) - else: - return Mark(self.name, self.index, self.line, self.column, - None, None) - - def determine_encoding(self): - while not self.eof and len(self.raw_buffer) < 2: - self.update_raw() - if not isinstance(self.raw_buffer, unicode): - if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): - self.raw_decode = codecs.utf_16_le_decode - self.encoding = 'utf-16-le' - elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): - self.raw_decode = codecs.utf_16_be_decode - self.encoding = 'utf-16-be' - else: - self.raw_decode = codecs.utf_8_decode - self.encoding = 'utf-8' - self.update(1) - - NON_PRINTABLE = re.compile(u'[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') - def check_printable(self, data): - match = self.NON_PRINTABLE.search(data) - if match: - character = match.group() - position = self.index+(len(self.buffer)-self.pointer)+match.start() - raise ReaderError(self.name, position, ord(character), - 'unicode', "special characters are not allowed") - - def update(self, length): - if self.raw_buffer is None: - return - self.buffer = self.buffer[self.pointer:] - self.pointer = 0 - while len(self.buffer) < length: - if not self.eof: - self.update_raw() - if self.raw_decode is not None: - try: - data, converted = self.raw_decode(self.raw_buffer, - 'strict', self.eof) - except UnicodeDecodeError, exc: - character = exc.object[exc.start] - if self.stream is not None: - position = self.stream_pointer-len(self.raw_buffer)+exc.start - else: - position = exc.start - raise ReaderError(self.name, position, character, - exc.encoding, exc.reason) - else: - data = self.raw_buffer - converted = len(data) - self.check_printable(data) - self.buffer += data - self.raw_buffer = self.raw_buffer[converted:] - if self.eof: - self.buffer += u'\0' - self.raw_buffer = None - break - - def update_raw(self, size=1024): - data = self.stream.read(size) - if data: - self.raw_buffer += data - self.stream_pointer += len(data) - else: - self.eof = True - -#try: -# import psyco -# psyco.bind(Reader) -#except ImportError: -# pass - diff --git a/lib/spack/external/yaml/representer.py b/lib/spack/external/yaml/representer.py deleted file mode 100644 index 5f4fc70dbc..0000000000 --- a/lib/spack/external/yaml/representer.py +++ /dev/null @@ -1,484 +0,0 @@ - -__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', - 'RepresenterError'] - -from error import * -from nodes import * - -import datetime - -import sys, copy_reg, types - -class RepresenterError(YAMLError): - pass - -class BaseRepresenter(object): - - yaml_representers = {} - yaml_multi_representers = {} - - def __init__(self, default_style=None, default_flow_style=None): - self.default_style = default_style - self.default_flow_style = default_flow_style - self.represented_objects = {} - self.object_keeper = [] - self.alias_key = None - - def represent(self, data): - node = self.represent_data(data) - self.serialize(node) - self.represented_objects = {} - self.object_keeper = [] - self.alias_key = None - - def get_classobj_bases(self, cls): - bases = [cls] - for base in cls.__bases__: - bases.extend(self.get_classobj_bases(base)) - return bases - - def represent_data(self, data): - if self.ignore_aliases(data): - self.alias_key = None - else: - self.alias_key = id(data) - if self.alias_key is not None: - if self.alias_key in self.represented_objects: - node = self.represented_objects[self.alias_key] - #if node is None: - # raise RepresenterError("recursive objects are not allowed: %r" % data) - return node - #self.represented_objects[alias_key] = None - self.object_keeper.append(data) - data_types = type(data).__mro__ - if type(data) is types.InstanceType: - data_types = self.get_classobj_bases(data.__class__)+list(data_types) - if data_types[0] in self.yaml_representers: - node = self.yaml_representers[data_types[0]](self, data) - else: - for data_type in data_types: - if data_type in self.yaml_multi_representers: - node = self.yaml_multi_representers[data_type](self, data) - break - else: - if None in self.yaml_multi_representers: - node = self.yaml_multi_representers[None](self, data) - elif None in self.yaml_representers: - node = self.yaml_representers[None](self, data) - else: - node = ScalarNode(None, unicode(data)) - #if alias_key is not None: - # self.represented_objects[alias_key] = node - return node - - def add_representer(cls, data_type, representer): - if not 'yaml_representers' in cls.__dict__: - cls.yaml_representers = cls.yaml_representers.copy() - cls.yaml_representers[data_type] = representer - add_representer = classmethod(add_representer) - - def add_multi_representer(cls, data_type, representer): - if not 'yaml_multi_representers' in cls.__dict__: - cls.yaml_multi_representers = cls.yaml_multi_representers.copy() - cls.yaml_multi_representers[data_type] = representer - add_multi_representer = classmethod(add_multi_representer) - - def represent_scalar(self, tag, value, style=None): - if style is None: - style = self.default_style - node = ScalarNode(tag, value, style=style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - return node - - def represent_sequence(self, tag, sequence, flow_style=None): - value = [] - node = SequenceNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - for item in sequence: - node_item = self.represent_data(item) - if not (isinstance(node_item, ScalarNode) and not node_item.style): - best_style = False - value.append(node_item) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def represent_mapping(self, tag, mapping, flow_style=None): - value = [] - node = MappingNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - if hasattr(mapping, 'items'): - mapping = mapping.items() - mapping.sort() - for item_key, item_value in mapping: - node_key = self.represent_data(item_key) - node_value = self.represent_data(item_value) - if not (isinstance(node_key, ScalarNode) and not node_key.style): - best_style = False - if not (isinstance(node_value, ScalarNode) and not node_value.style): - best_style = False - value.append((node_key, node_value)) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - - def ignore_aliases(self, data): - return False - -class SafeRepresenter(BaseRepresenter): - - def ignore_aliases(self, data): - if data in [None, ()]: - return True - if isinstance(data, (str, unicode, bool, int, float)): - return True - - def represent_none(self, data): - return self.represent_scalar(u'tag:yaml.org,2002:null', - u'null') - - def represent_str(self, data): - tag = None - style = None - try: - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - except UnicodeDecodeError: - try: - data = unicode(data, 'utf-8') - tag = u'tag:yaml.org,2002:str' - except UnicodeDecodeError: - data = data.encode('base64') - tag = u'tag:yaml.org,2002:binary' - style = '|' - return self.represent_scalar(tag, data, style=style) - - def represent_unicode(self, data): - return self.represent_scalar(u'tag:yaml.org,2002:str', data) - - def represent_bool(self, data): - if data: - value = u'true' - else: - value = u'false' - return self.represent_scalar(u'tag:yaml.org,2002:bool', value) - - def represent_int(self, data): - return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) - - def represent_long(self, data): - return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) - - inf_value = 1e300 - while repr(inf_value) != repr(inf_value*inf_value): - inf_value *= inf_value - - def represent_float(self, data): - if data != data or (data == 0.0 and data == 1.0): - value = u'.nan' - elif data == self.inf_value: - value = u'.inf' - elif data == -self.inf_value: - value = u'-.inf' - else: - value = unicode(repr(data)).lower() - # Note that in some cases `repr(data)` represents a float number - # without the decimal parts. For instance: - # >>> repr(1e17) - # '1e17' - # Unfortunately, this is not a valid float representation according - # to the definition of the `!!float` tag. We fix this by adding - # '.0' before the 'e' symbol. - if u'.' not in value and u'e' in value: - value = value.replace(u'e', u'.0e', 1) - return self.represent_scalar(u'tag:yaml.org,2002:float', value) - - def represent_list(self, data): - #pairs = (len(data) > 0 and isinstance(data, list)) - #if pairs: - # for item in data: - # if not isinstance(item, tuple) or len(item) != 2: - # pairs = False - # break - #if not pairs: - return self.represent_sequence(u'tag:yaml.org,2002:seq', data) - #value = [] - #for item_key, item_value in data: - # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', - # [(item_key, item_value)])) - #return SequenceNode(u'tag:yaml.org,2002:pairs', value) - - def represent_dict(self, data): - return self.represent_mapping(u'tag:yaml.org,2002:map', data) - - def represent_set(self, data): - value = {} - for key in data: - value[key] = None - return self.represent_mapping(u'tag:yaml.org,2002:set', value) - - def represent_date(self, data): - value = unicode(data.isoformat()) - return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) - - def represent_datetime(self, data): - value = unicode(data.isoformat(' ')) - return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) - - def represent_yaml_object(self, tag, data, cls, flow_style=None): - if hasattr(data, '__getstate__'): - state = data.__getstate__() - else: - state = data.__dict__.copy() - return self.represent_mapping(tag, state, flow_style=flow_style) - - def represent_undefined(self, data): - raise RepresenterError("cannot represent an object: %s" % data) - -SafeRepresenter.add_representer(type(None), - SafeRepresenter.represent_none) - -SafeRepresenter.add_representer(str, - SafeRepresenter.represent_str) - -SafeRepresenter.add_representer(unicode, - SafeRepresenter.represent_unicode) - -SafeRepresenter.add_representer(bool, - SafeRepresenter.represent_bool) - -SafeRepresenter.add_representer(int, - SafeRepresenter.represent_int) - -SafeRepresenter.add_representer(long, - SafeRepresenter.represent_long) - -SafeRepresenter.add_representer(float, - SafeRepresenter.represent_float) - -SafeRepresenter.add_representer(list, - SafeRepresenter.represent_list) - -SafeRepresenter.add_representer(tuple, - SafeRepresenter.represent_list) - -SafeRepresenter.add_representer(dict, - SafeRepresenter.represent_dict) - -SafeRepresenter.add_representer(set, - SafeRepresenter.represent_set) - -SafeRepresenter.add_representer(datetime.date, - SafeRepresenter.represent_date) - -SafeRepresenter.add_representer(datetime.datetime, - SafeRepresenter.represent_datetime) - -SafeRepresenter.add_representer(None, - SafeRepresenter.represent_undefined) - -class Representer(SafeRepresenter): - - def represent_str(self, data): - tag = None - style = None - try: - data = unicode(data, 'ascii') - tag = u'tag:yaml.org,2002:str' - except UnicodeDecodeError: - try: - data = unicode(data, 'utf-8') - tag = u'tag:yaml.org,2002:python/str' - except UnicodeDecodeError: - data = data.encode('base64') - tag = u'tag:yaml.org,2002:binary' - style = '|' - return self.represent_scalar(tag, data, style=style) - - def represent_unicode(self, data): - tag = None - try: - data.encode('ascii') - tag = u'tag:yaml.org,2002:python/unicode' - except UnicodeEncodeError: - tag = u'tag:yaml.org,2002:str' - return self.represent_scalar(tag, data) - - def represent_long(self, data): - tag = u'tag:yaml.org,2002:int' - if int(data) is not data: - tag = u'tag:yaml.org,2002:python/long' - return self.represent_scalar(tag, unicode(data)) - - def represent_complex(self, data): - if data.imag == 0.0: - data = u'%r' % data.real - elif data.real == 0.0: - data = u'%rj' % data.imag - elif data.imag > 0: - data = u'%r+%rj' % (data.real, data.imag) - else: - data = u'%r%rj' % (data.real, data.imag) - return self.represent_scalar(u'tag:yaml.org,2002:python/complex', data) - - def represent_tuple(self, data): - return self.represent_sequence(u'tag:yaml.org,2002:python/tuple', data) - - def represent_name(self, data): - name = u'%s.%s' % (data.__module__, data.__name__) - return self.represent_scalar(u'tag:yaml.org,2002:python/name:'+name, u'') - - def represent_module(self, data): - return self.represent_scalar( - u'tag:yaml.org,2002:python/module:'+data.__name__, u'') - - def represent_instance(self, data): - # For instances of classic classes, we use __getinitargs__ and - # __getstate__ to serialize the data. - - # If data.__getinitargs__ exists, the object must be reconstructed by - # calling cls(**args), where args is a tuple returned by - # __getinitargs__. Otherwise, the cls.__init__ method should never be - # called and the class instance is created by instantiating a trivial - # class and assigning to the instance's __class__ variable. - - # If data.__getstate__ exists, it returns the state of the object. - # Otherwise, the state of the object is data.__dict__. - - # We produce either a !!python/object or !!python/object/new node. - # If data.__getinitargs__ does not exist and state is a dictionary, we - # produce a !!python/object node . Otherwise we produce a - # !!python/object/new node. - - cls = data.__class__ - class_name = u'%s.%s' % (cls.__module__, cls.__name__) - args = None - state = None - if hasattr(data, '__getinitargs__'): - args = list(data.__getinitargs__()) - if hasattr(data, '__getstate__'): - state = data.__getstate__() - else: - state = data.__dict__ - if args is None and isinstance(state, dict): - return self.represent_mapping( - u'tag:yaml.org,2002:python/object:'+class_name, state) - if isinstance(state, dict) and not state: - return self.represent_sequence( - u'tag:yaml.org,2002:python/object/new:'+class_name, args) - value = {} - if args: - value['args'] = args - value['state'] = state - return self.represent_mapping( - u'tag:yaml.org,2002:python/object/new:'+class_name, value) - - def represent_object(self, data): - # We use __reduce__ API to save the data. data.__reduce__ returns - # a tuple of length 2-5: - # (function, args, state, listitems, dictitems) - - # For reconstructing, we calls function(*args), then set its state, - # listitems, and dictitems if they are not None. - - # A special case is when function.__name__ == '__newobj__'. In this - # case we create the object with args[0].__new__(*args). - - # Another special case is when __reduce__ returns a string - we don't - # support it. - - # We produce a !!python/object, !!python/object/new or - # !!python/object/apply node. - - cls = type(data) - if cls in copy_reg.dispatch_table: - reduce = copy_reg.dispatch_table[cls](data) - elif hasattr(data, '__reduce_ex__'): - reduce = data.__reduce_ex__(2) - elif hasattr(data, '__reduce__'): - reduce = data.__reduce__() - else: - raise RepresenterError("cannot represent object: %r" % data) - reduce = (list(reduce)+[None]*5)[:5] - function, args, state, listitems, dictitems = reduce - args = list(args) - if state is None: - state = {} - if listitems is not None: - listitems = list(listitems) - if dictitems is not None: - dictitems = dict(dictitems) - if function.__name__ == '__newobj__': - function = args[0] - args = args[1:] - tag = u'tag:yaml.org,2002:python/object/new:' - newobj = True - else: - tag = u'tag:yaml.org,2002:python/object/apply:' - newobj = False - function_name = u'%s.%s' % (function.__module__, function.__name__) - if not args and not listitems and not dictitems \ - and isinstance(state, dict) and newobj: - return self.represent_mapping( - u'tag:yaml.org,2002:python/object:'+function_name, state) - if not listitems and not dictitems \ - and isinstance(state, dict) and not state: - return self.represent_sequence(tag+function_name, args) - value = {} - if args: - value['args'] = args - if state or not isinstance(state, dict): - value['state'] = state - if listitems: - value['listitems'] = listitems - if dictitems: - value['dictitems'] = dictitems - return self.represent_mapping(tag+function_name, value) - -Representer.add_representer(str, - Representer.represent_str) - -Representer.add_representer(unicode, - Representer.represent_unicode) - -Representer.add_representer(long, - Representer.represent_long) - -Representer.add_representer(complex, - Representer.represent_complex) - -Representer.add_representer(tuple, - Representer.represent_tuple) - -Representer.add_representer(type, - Representer.represent_name) - -Representer.add_representer(types.ClassType, - Representer.represent_name) - -Representer.add_representer(types.FunctionType, - Representer.represent_name) - -Representer.add_representer(types.BuiltinFunctionType, - Representer.represent_name) - -Representer.add_representer(types.ModuleType, - Representer.represent_module) - -Representer.add_multi_representer(types.InstanceType, - Representer.represent_instance) - -Representer.add_multi_representer(object, - Representer.represent_object) - diff --git a/lib/spack/external/yaml/resolver.py b/lib/spack/external/yaml/resolver.py deleted file mode 100644 index 6b5ab87596..0000000000 --- a/lib/spack/external/yaml/resolver.py +++ /dev/null @@ -1,224 +0,0 @@ - -__all__ = ['BaseResolver', 'Resolver'] - -from error import * -from nodes import * - -import re - -class ResolverError(YAMLError): - pass - -class BaseResolver(object): - - DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' - DEFAULT_SEQUENCE_TAG = u'tag:yaml.org,2002:seq' - DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map' - - yaml_implicit_resolvers = {} - yaml_path_resolvers = {} - - def __init__(self): - self.resolver_exact_paths = [] - self.resolver_prefix_paths = [] - - def add_implicit_resolver(cls, tag, regexp, first): - if not 'yaml_implicit_resolvers' in cls.__dict__: - cls.yaml_implicit_resolvers = cls.yaml_implicit_resolvers.copy() - if first is None: - first = [None] - for ch in first: - cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) - add_implicit_resolver = classmethod(add_implicit_resolver) - - def add_path_resolver(cls, tag, path, kind=None): - # Note: `add_path_resolver` is experimental. The API could be changed. - # `new_path` is a pattern that is matched against the path from the - # root to the node that is being considered. `node_path` elements are - # tuples `(node_check, index_check)`. `node_check` is a node class: - # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` - # matches any kind of a node. `index_check` could be `None`, a boolean - # value, a string value, or a number. `None` and `False` match against - # any _value_ of sequence and mapping nodes. `True` matches against - # any _key_ of a mapping node. A string `index_check` matches against - # a mapping value that corresponds to a scalar key which content is - # equal to the `index_check` value. An integer `index_check` matches - # against a sequence value with the index equal to `index_check`. - if not 'yaml_path_resolvers' in cls.__dict__: - cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() - new_path = [] - for element in path: - if isinstance(element, (list, tuple)): - if len(element) == 2: - node_check, index_check = element - elif len(element) == 1: - node_check = element[0] - index_check = True - else: - raise ResolverError("Invalid path element: %s" % element) - else: - node_check = None - index_check = element - if node_check is str: - node_check = ScalarNode - elif node_check is list: - node_check = SequenceNode - elif node_check is dict: - node_check = MappingNode - elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ - and not isinstance(node_check, basestring) \ - and node_check is not None: - raise ResolverError("Invalid node checker: %s" % node_check) - if not isinstance(index_check, (basestring, int)) \ - and index_check is not None: - raise ResolverError("Invalid index checker: %s" % index_check) - new_path.append((node_check, index_check)) - if kind is str: - kind = ScalarNode - elif kind is list: - kind = SequenceNode - elif kind is dict: - kind = MappingNode - elif kind not in [ScalarNode, SequenceNode, MappingNode] \ - and kind is not None: - raise ResolverError("Invalid node kind: %s" % kind) - cls.yaml_path_resolvers[tuple(new_path), kind] = tag - add_path_resolver = classmethod(add_path_resolver) - - def descend_resolver(self, current_node, current_index): - if not self.yaml_path_resolvers: - return - exact_paths = {} - prefix_paths = [] - if current_node: - depth = len(self.resolver_prefix_paths) - for path, kind in self.resolver_prefix_paths[-1]: - if self.check_resolver_prefix(depth, path, kind, - current_node, current_index): - if len(path) > depth: - prefix_paths.append((path, kind)) - else: - exact_paths[kind] = self.yaml_path_resolvers[path, kind] - else: - for path, kind in self.yaml_path_resolvers: - if not path: - exact_paths[kind] = self.yaml_path_resolvers[path, kind] - else: - prefix_paths.append((path, kind)) - self.resolver_exact_paths.append(exact_paths) - self.resolver_prefix_paths.append(prefix_paths) - - def ascend_resolver(self): - if not self.yaml_path_resolvers: - return - self.resolver_exact_paths.pop() - self.resolver_prefix_paths.pop() - - def check_resolver_prefix(self, depth, path, kind, - current_node, current_index): - node_check, index_check = path[depth-1] - if isinstance(node_check, basestring): - if current_node.tag != node_check: - return - elif node_check is not None: - if not isinstance(current_node, node_check): - return - if index_check is True and current_index is not None: - return - if (index_check is False or index_check is None) \ - and current_index is None: - return - if isinstance(index_check, basestring): - if not (isinstance(current_index, ScalarNode) - and index_check == current_index.value): - return - elif isinstance(index_check, int) and not isinstance(index_check, bool): - if index_check != current_index: - return - return True - - def resolve(self, kind, value, implicit): - if kind is ScalarNode and implicit[0]: - if value == u'': - resolvers = self.yaml_implicit_resolvers.get(u'', []) - else: - resolvers = self.yaml_implicit_resolvers.get(value[0], []) - resolvers += self.yaml_implicit_resolvers.get(None, []) - for tag, regexp in resolvers: - if regexp.match(value): - return tag - implicit = implicit[1] - if self.yaml_path_resolvers: - exact_paths = self.resolver_exact_paths[-1] - if kind in exact_paths: - return exact_paths[kind] - if None in exact_paths: - return exact_paths[None] - if kind is ScalarNode: - return self.DEFAULT_SCALAR_TAG - elif kind is SequenceNode: - return self.DEFAULT_SEQUENCE_TAG - elif kind is MappingNode: - return self.DEFAULT_MAPPING_TAG - -class Resolver(BaseResolver): - pass - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:bool', - re.compile(ur'''^(?:yes|Yes|YES|no|No|NO - |true|True|TRUE|false|False|FALSE - |on|On|ON|off|Off|OFF)$''', re.X), - list(u'yYnNtTfFoO')) - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:float', - re.compile(ur'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? - |\.[0-9_]+(?:[eE][-+][0-9]+)? - |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* - |[-+]?\.(?:inf|Inf|INF) - |\.(?:nan|NaN|NAN))$''', re.X), - list(u'-+0123456789.')) - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:int', - re.compile(ur'''^(?:[-+]?0b[0-1_]+ - |[-+]?0[0-7_]+ - |[-+]?(?:0|[1-9][0-9_]*) - |[-+]?0x[0-9a-fA-F_]+ - |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), - list(u'-+0123456789')) - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:merge', - re.compile(ur'^(?:<<)$'), - [u'<']) - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:null', - re.compile(ur'''^(?: ~ - |null|Null|NULL - | )$''', re.X), - [u'~', u'n', u'N', u'']) - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:timestamp', - re.compile(ur'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] - |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? - (?:[Tt]|[ \t]+)[0-9][0-9]? - :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? - (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), - list(u'0123456789')) - -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:value', - re.compile(ur'^(?:=)$'), - [u'=']) - -# The following resolver is only for documentation purposes. It cannot work -# because plain scalars cannot start with '!', '&', or '*'. -Resolver.add_implicit_resolver( - u'tag:yaml.org,2002:yaml', - re.compile(ur'^(?:!|&|\*)$'), - list(u'!&*')) - diff --git a/lib/spack/external/yaml/scanner.py b/lib/spack/external/yaml/scanner.py deleted file mode 100644 index 5228fad65c..0000000000 --- a/lib/spack/external/yaml/scanner.py +++ /dev/null @@ -1,1457 +0,0 @@ - -# Scanner produces tokens of the following types: -# STREAM-START -# STREAM-END -# DIRECTIVE(name, value) -# DOCUMENT-START -# DOCUMENT-END -# BLOCK-SEQUENCE-START -# BLOCK-MAPPING-START -# BLOCK-END -# FLOW-SEQUENCE-START -# FLOW-MAPPING-START -# FLOW-SEQUENCE-END -# FLOW-MAPPING-END -# BLOCK-ENTRY -# FLOW-ENTRY -# KEY -# VALUE -# ALIAS(value) -# ANCHOR(value) -# TAG(value) -# SCALAR(value, plain, style) -# -# Read comments in the Scanner code for more details. -# - -__all__ = ['Scanner', 'ScannerError'] - -from error import MarkedYAMLError -from tokens import * - -class ScannerError(MarkedYAMLError): - pass - -class SimpleKey(object): - # See below simple keys treatment. - - def __init__(self, token_number, required, index, line, column, mark): - self.token_number = token_number - self.required = required - self.index = index - self.line = line - self.column = column - self.mark = mark - -class Scanner(object): - - def __init__(self): - """Initialize the scanner.""" - # It is assumed that Scanner and Reader will have a common descendant. - # Reader do the dirty work of checking for BOM and converting the - # input data to Unicode. It also adds NUL to the end. - # - # Reader supports the following methods - # self.peek(i=0) # peek the next i-th character - # self.prefix(l=1) # peek the next l characters - # self.forward(l=1) # read the next l characters and move the pointer. - - # Had we reached the end of the stream? - self.done = False - - # The number of unclosed '{' and '['. `flow_level == 0` means block - # context. - self.flow_level = 0 - - # List of processed tokens that are not yet emitted. - self.tokens = [] - - # Add the STREAM-START token. - self.fetch_stream_start() - - # Number of tokens that were emitted through the `get_token` method. - self.tokens_taken = 0 - - # The current indentation level. - self.indent = -1 - - # Past indentation levels. - self.indents = [] - - # Variables related to simple keys treatment. - - # A simple key is a key that is not denoted by the '?' indicator. - # Example of simple keys: - # --- - # block simple key: value - # ? not a simple key: - # : { flow simple key: value } - # We emit the KEY token before all keys, so when we find a potential - # simple key, we try to locate the corresponding ':' indicator. - # Simple keys should be limited to a single line and 1024 characters. - - # Can a simple key start at the current position? A simple key may - # start: - # - at the beginning of the line, not counting indentation spaces - # (in block context), - # - after '{', '[', ',' (in the flow context), - # - after '?', ':', '-' (in the block context). - # In the block context, this flag also signifies if a block collection - # may start at the current position. - self.allow_simple_key = True - - # Keep track of possible simple keys. This is a dictionary. The key - # is `flow_level`; there can be no more that one possible simple key - # for each level. The value is a SimpleKey record: - # (token_number, required, index, line, column, mark) - # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), - # '[', or '{' tokens. - self.possible_simple_keys = {} - - # Public methods. - - def check_token(self, *choices): - # Check if the next token is one of the given types. - while self.need_more_tokens(): - self.fetch_more_tokens() - if self.tokens: - if not choices: - return True - for choice in choices: - if isinstance(self.tokens[0], choice): - return True - return False - - def peek_token(self): - # Return the next token, but do not delete if from the queue. - while self.need_more_tokens(): - self.fetch_more_tokens() - if self.tokens: - return self.tokens[0] - - def get_token(self): - # Return the next token. - while self.need_more_tokens(): - self.fetch_more_tokens() - if self.tokens: - self.tokens_taken += 1 - return self.tokens.pop(0) - - # Private methods. - - def need_more_tokens(self): - if self.done: - return False - if not self.tokens: - return True - # The current token may be a potential simple key, so we - # need to look further. - self.stale_possible_simple_keys() - if self.next_possible_simple_key() == self.tokens_taken: - return True - - def fetch_more_tokens(self): - - # Eat whitespaces and comments until we reach the next token. - self.scan_to_next_token() - - # Remove obsolete possible simple keys. - self.stale_possible_simple_keys() - - # Compare the current indentation and column. It may add some tokens - # and decrease the current indentation level. - self.unwind_indent(self.column) - - # Peek the next character. - ch = self.peek() - - # Is it the end of stream? - if ch == u'\0': - return self.fetch_stream_end() - - # Is it a directive? - if ch == u'%' and self.check_directive(): - return self.fetch_directive() - - # Is it the document start? - if ch == u'-' and self.check_document_start(): - return self.fetch_document_start() - - # Is it the document end? - if ch == u'.' and self.check_document_end(): - return self.fetch_document_end() - - # TODO: support for BOM within a stream. - #if ch == u'\uFEFF': - # return self.fetch_bom() <-- issue BOMToken - - # Note: the order of the following checks is NOT significant. - - # Is it the flow sequence start indicator? - if ch == u'[': - return self.fetch_flow_sequence_start() - - # Is it the flow mapping start indicator? - if ch == u'{': - return self.fetch_flow_mapping_start() - - # Is it the flow sequence end indicator? - if ch == u']': - return self.fetch_flow_sequence_end() - - # Is it the flow mapping end indicator? - if ch == u'}': - return self.fetch_flow_mapping_end() - - # Is it the flow entry indicator? - if ch == u',': - return self.fetch_flow_entry() - - # Is it the block entry indicator? - if ch == u'-' and self.check_block_entry(): - return self.fetch_block_entry() - - # Is it the key indicator? - if ch == u'?' and self.check_key(): - return self.fetch_key() - - # Is it the value indicator? - if ch == u':' and self.check_value(): - return self.fetch_value() - - # Is it an alias? - if ch == u'*': - return self.fetch_alias() - - # Is it an anchor? - if ch == u'&': - return self.fetch_anchor() - - # Is it a tag? - if ch == u'!': - return self.fetch_tag() - - # Is it a literal scalar? - if ch == u'|' and not self.flow_level: - return self.fetch_literal() - - # Is it a folded scalar? - if ch == u'>' and not self.flow_level: - return self.fetch_folded() - - # Is it a single quoted scalar? - if ch == u'\'': - return self.fetch_single() - - # Is it a double quoted scalar? - if ch == u'\"': - return self.fetch_double() - - # It must be a plain scalar then. - if self.check_plain(): - return self.fetch_plain() - - # No? It's an error. Let's produce a nice error message. - raise ScannerError("while scanning for the next token", None, - "found character %r that cannot start any token" - % ch.encode('utf-8'), self.get_mark()) - - # Simple keys treatment. - - def next_possible_simple_key(self): - # Return the number of the nearest possible simple key. Actually we - # don't need to loop through the whole dictionary. We may replace it - # with the following code: - # if not self.possible_simple_keys: - # return None - # return self.possible_simple_keys[ - # min(self.possible_simple_keys.keys())].token_number - min_token_number = None - for level in self.possible_simple_keys: - key = self.possible_simple_keys[level] - if min_token_number is None or key.token_number < min_token_number: - min_token_number = key.token_number - return min_token_number - - def stale_possible_simple_keys(self): - # Remove entries that are no longer possible simple keys. According to - # the YAML specification, simple keys - # - should be limited to a single line, - # - should be no longer than 1024 characters. - # Disabling this procedure will allow simple keys of any length and - # height (may cause problems if indentation is broken though). - for level in self.possible_simple_keys.keys(): - key = self.possible_simple_keys[level] - if key.line != self.line \ - or self.index-key.index > 1024: - if key.required: - raise ScannerError("while scanning a simple key", key.mark, - "could not found expected ':'", self.get_mark()) - del self.possible_simple_keys[level] - - def save_possible_simple_key(self): - # The next token may start a simple key. We check if it's possible - # and save its position. This function is called for - # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. - - # Check if a simple key is required at the current position. - required = not self.flow_level and self.indent == self.column - - # A simple key is required only if it is the first token in the current - # line. Therefore it is always allowed. - assert self.allow_simple_key or not required - - # The next token might be a simple key. Let's save it's number and - # position. - if self.allow_simple_key: - self.remove_possible_simple_key() - token_number = self.tokens_taken+len(self.tokens) - key = SimpleKey(token_number, required, - self.index, self.line, self.column, self.get_mark()) - self.possible_simple_keys[self.flow_level] = key - - def remove_possible_simple_key(self): - # Remove the saved possible key position at the current flow level. - if self.flow_level in self.possible_simple_keys: - key = self.possible_simple_keys[self.flow_level] - - if key.required: - raise ScannerError("while scanning a simple key", key.mark, - "could not found expected ':'", self.get_mark()) - - del self.possible_simple_keys[self.flow_level] - - # Indentation functions. - - def unwind_indent(self, column): - - ## In flow context, tokens should respect indentation. - ## Actually the condition should be `self.indent >= column` according to - ## the spec. But this condition will prohibit intuitively correct - ## constructions such as - ## key : { - ## } - #if self.flow_level and self.indent > column: - # raise ScannerError(None, None, - # "invalid intendation or unclosed '[' or '{'", - # self.get_mark()) - - # In the flow context, indentation is ignored. We make the scanner less - # restrictive then specification requires. - if self.flow_level: - return - - # In block context, we may need to issue the BLOCK-END tokens. - while self.indent > column: - mark = self.get_mark() - self.indent = self.indents.pop() - self.tokens.append(BlockEndToken(mark, mark)) - - def add_indent(self, column): - # Check if we need to increase indentation. - if self.indent < column: - self.indents.append(self.indent) - self.indent = column - return True - return False - - # Fetchers. - - def fetch_stream_start(self): - # We always add STREAM-START as the first token and STREAM-END as the - # last token. - - # Read the token. - mark = self.get_mark() - - # Add STREAM-START. - self.tokens.append(StreamStartToken(mark, mark, - encoding=self.encoding)) - - - def fetch_stream_end(self): - - # Set the current intendation to -1. - self.unwind_indent(-1) - - # Reset simple keys. - self.remove_possible_simple_key() - self.allow_simple_key = False - self.possible_simple_keys = {} - - # Read the token. - mark = self.get_mark() - - # Add STREAM-END. - self.tokens.append(StreamEndToken(mark, mark)) - - # The steam is finished. - self.done = True - - def fetch_directive(self): - - # Set the current intendation to -1. - self.unwind_indent(-1) - - # Reset simple keys. - self.remove_possible_simple_key() - self.allow_simple_key = False - - # Scan and add DIRECTIVE. - self.tokens.append(self.scan_directive()) - - def fetch_document_start(self): - self.fetch_document_indicator(DocumentStartToken) - - def fetch_document_end(self): - self.fetch_document_indicator(DocumentEndToken) - - def fetch_document_indicator(self, TokenClass): - - # Set the current intendation to -1. - self.unwind_indent(-1) - - # Reset simple keys. Note that there could not be a block collection - # after '---'. - self.remove_possible_simple_key() - self.allow_simple_key = False - - # Add DOCUMENT-START or DOCUMENT-END. - start_mark = self.get_mark() - self.forward(3) - end_mark = self.get_mark() - self.tokens.append(TokenClass(start_mark, end_mark)) - - def fetch_flow_sequence_start(self): - self.fetch_flow_collection_start(FlowSequenceStartToken) - - def fetch_flow_mapping_start(self): - self.fetch_flow_collection_start(FlowMappingStartToken) - - def fetch_flow_collection_start(self, TokenClass): - - # '[' and '{' may start a simple key. - self.save_possible_simple_key() - - # Increase the flow level. - self.flow_level += 1 - - # Simple keys are allowed after '[' and '{'. - self.allow_simple_key = True - - # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. - start_mark = self.get_mark() - self.forward() - end_mark = self.get_mark() - self.tokens.append(TokenClass(start_mark, end_mark)) - - def fetch_flow_sequence_end(self): - self.fetch_flow_collection_end(FlowSequenceEndToken) - - def fetch_flow_mapping_end(self): - self.fetch_flow_collection_end(FlowMappingEndToken) - - def fetch_flow_collection_end(self, TokenClass): - - # Reset possible simple key on the current level. - self.remove_possible_simple_key() - - # Decrease the flow level. - self.flow_level -= 1 - - # No simple keys after ']' or '}'. - self.allow_simple_key = False - - # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. - start_mark = self.get_mark() - self.forward() - end_mark = self.get_mark() - self.tokens.append(TokenClass(start_mark, end_mark)) - - def fetch_flow_entry(self): - - # Simple keys are allowed after ','. - self.allow_simple_key = True - - # Reset possible simple key on the current level. - self.remove_possible_simple_key() - - # Add FLOW-ENTRY. - start_mark = self.get_mark() - self.forward() - end_mark = self.get_mark() - self.tokens.append(FlowEntryToken(start_mark, end_mark)) - - def fetch_block_entry(self): - - # Block context needs additional checks. - if not self.flow_level: - - # Are we allowed to start a new entry? - if not self.allow_simple_key: - raise ScannerError(None, None, - "sequence entries are not allowed here", - self.get_mark()) - - # We may need to add BLOCK-SEQUENCE-START. - if self.add_indent(self.column): - mark = self.get_mark() - self.tokens.append(BlockSequenceStartToken(mark, mark)) - - # It's an error for the block entry to occur in the flow context, - # but we let the parser detect this. - else: - pass - - # Simple keys are allowed after '-'. - self.allow_simple_key = True - - # Reset possible simple key on the current level. - self.remove_possible_simple_key() - - # Add BLOCK-ENTRY. - start_mark = self.get_mark() - self.forward() - end_mark = self.get_mark() - self.tokens.append(BlockEntryToken(start_mark, end_mark)) - - def fetch_key(self): - - # Block context needs additional checks. - if not self.flow_level: - - # Are we allowed to start a key (not nessesary a simple)? - if not self.allow_simple_key: - raise ScannerError(None, None, - "mapping keys are not allowed here", - self.get_mark()) - - # We may need to add BLOCK-MAPPING-START. - if self.add_indent(self.column): - mark = self.get_mark() - self.tokens.append(BlockMappingStartToken(mark, mark)) - - # Simple keys are allowed after '?' in the block context. - self.allow_simple_key = not self.flow_level - - # Reset possible simple key on the current level. - self.remove_possible_simple_key() - - # Add KEY. - start_mark = self.get_mark() - self.forward() - end_mark = self.get_mark() - self.tokens.append(KeyToken(start_mark, end_mark)) - - def fetch_value(self): - - # Do we determine a simple key? - if self.flow_level in self.possible_simple_keys: - - # Add KEY. - key = self.possible_simple_keys[self.flow_level] - del self.possible_simple_keys[self.flow_level] - self.tokens.insert(key.token_number-self.tokens_taken, - KeyToken(key.mark, key.mark)) - - # If this key starts a new block mapping, we need to add - # BLOCK-MAPPING-START. - if not self.flow_level: - if self.add_indent(key.column): - self.tokens.insert(key.token_number-self.tokens_taken, - BlockMappingStartToken(key.mark, key.mark)) - - # There cannot be two simple keys one after another. - self.allow_simple_key = False - - # It must be a part of a complex key. - else: - - # Block context needs additional checks. - # (Do we really need them? They will be catched by the parser - # anyway.) - if not self.flow_level: - - # We are allowed to start a complex value if and only if - # we can start a simple key. - if not self.allow_simple_key: - raise ScannerError(None, None, - "mapping values are not allowed here", - self.get_mark()) - - # If this value starts a new block mapping, we need to add - # BLOCK-MAPPING-START. It will be detected as an error later by - # the parser. - if not self.flow_level: - if self.add_indent(self.column): - mark = self.get_mark() - self.tokens.append(BlockMappingStartToken(mark, mark)) - - # Simple keys are allowed after ':' in the block context. - self.allow_simple_key = not self.flow_level - - # Reset possible simple key on the current level. - self.remove_possible_simple_key() - - # Add VALUE. - start_mark = self.get_mark() - self.forward() - end_mark = self.get_mark() - self.tokens.append(ValueToken(start_mark, end_mark)) - - def fetch_alias(self): - - # ALIAS could be a simple key. - self.save_possible_simple_key() - - # No simple keys after ALIAS. - self.allow_simple_key = False - - # Scan and add ALIAS. - self.tokens.append(self.scan_anchor(AliasToken)) - - def fetch_anchor(self): - - # ANCHOR could start a simple key. - self.save_possible_simple_key() - - # No simple keys after ANCHOR. - self.allow_simple_key = False - - # Scan and add ANCHOR. - self.tokens.append(self.scan_anchor(AnchorToken)) - - def fetch_tag(self): - - # TAG could start a simple key. - self.save_possible_simple_key() - - # No simple keys after TAG. - self.allow_simple_key = False - - # Scan and add TAG. - self.tokens.append(self.scan_tag()) - - def fetch_literal(self): - self.fetch_block_scalar(style='|') - - def fetch_folded(self): - self.fetch_block_scalar(style='>') - - def fetch_block_scalar(self, style): - - # A simple key may follow a block scalar. - self.allow_simple_key = True - - # Reset possible simple key on the current level. - self.remove_possible_simple_key() - - # Scan and add SCALAR. - self.tokens.append(self.scan_block_scalar(style)) - - def fetch_single(self): - self.fetch_flow_scalar(style='\'') - - def fetch_double(self): - self.fetch_flow_scalar(style='"') - - def fetch_flow_scalar(self, style): - - # A flow scalar could be a simple key. - self.save_possible_simple_key() - - # No simple keys after flow scalars. - self.allow_simple_key = False - - # Scan and add SCALAR. - self.tokens.append(self.scan_flow_scalar(style)) - - def fetch_plain(self): - - # A plain scalar could be a simple key. - self.save_possible_simple_key() - - # No simple keys after plain scalars. But note that `scan_plain` will - # change this flag if the scan is finished at the beginning of the - # line. - self.allow_simple_key = False - - # Scan and add SCALAR. May change `allow_simple_key`. - self.tokens.append(self.scan_plain()) - - # Checkers. - - def check_directive(self): - - # DIRECTIVE: ^ '%' ... - # The '%' indicator is already checked. - if self.column == 0: - return True - - def check_document_start(self): - - # DOCUMENT-START: ^ '---' (' '|'\n') - if self.column == 0: - if self.prefix(3) == u'---' \ - and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': - return True - - def check_document_end(self): - - # DOCUMENT-END: ^ '...' (' '|'\n') - if self.column == 0: - if self.prefix(3) == u'...' \ - and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': - return True - - def check_block_entry(self): - - # BLOCK-ENTRY: '-' (' '|'\n') - return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' - - def check_key(self): - - # KEY(flow context): '?' - if self.flow_level: - return True - - # KEY(block context): '?' (' '|'\n') - else: - return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' - - def check_value(self): - - # VALUE(flow context): ':' - if self.flow_level: - return True - - # VALUE(block context): ':' (' '|'\n') - else: - return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' - - def check_plain(self): - - # A plain scalar may start with any non-space character except: - # '-', '?', ':', ',', '[', ']', '{', '}', - # '#', '&', '*', '!', '|', '>', '\'', '\"', - # '%', '@', '`'. - # - # It may also start with - # '-', '?', ':' - # if it is followed by a non-space character. - # - # Note that we limit the last rule to the block context (except the - # '-' character) because we want the flow context to be space - # independent. - ch = self.peek() - return ch not in u'\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ - or (self.peek(1) not in u'\0 \t\r\n\x85\u2028\u2029' - and (ch == u'-' or (not self.flow_level and ch in u'?:'))) - - # Scanners. - - def scan_to_next_token(self): - # We ignore spaces, line breaks and comments. - # If we find a line break in the block context, we set the flag - # `allow_simple_key` on. - # The byte order mark is stripped if it's the first character in the - # stream. We do not yet support BOM inside the stream as the - # specification requires. Any such mark will be considered as a part - # of the document. - # - # TODO: We need to make tab handling rules more sane. A good rule is - # Tabs cannot precede tokens - # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, - # KEY(block), VALUE(block), BLOCK-ENTRY - # So the checking code is - # if : - # self.allow_simple_keys = False - # We also need to add the check for `allow_simple_keys == True` to - # `unwind_indent` before issuing BLOCK-END. - # Scanners for block, flow, and plain scalars need to be modified. - - if self.index == 0 and self.peek() == u'\uFEFF': - self.forward() - found = False - while not found: - while self.peek() == u' ': - self.forward() - if self.peek() == u'#': - while self.peek() not in u'\0\r\n\x85\u2028\u2029': - self.forward() - if self.scan_line_break(): - if not self.flow_level: - self.allow_simple_key = True - else: - found = True - - def scan_directive(self): - # See the specification for details. - start_mark = self.get_mark() - self.forward() - name = self.scan_directive_name(start_mark) - value = None - if name == u'YAML': - value = self.scan_yaml_directive_value(start_mark) - end_mark = self.get_mark() - elif name == u'TAG': - value = self.scan_tag_directive_value(start_mark) - end_mark = self.get_mark() - else: - end_mark = self.get_mark() - while self.peek() not in u'\0\r\n\x85\u2028\u2029': - self.forward() - self.scan_directive_ignored_line(start_mark) - return DirectiveToken(name, value, start_mark, end_mark) - - def scan_directive_name(self, start_mark): - # See the specification for details. - length = 0 - ch = self.peek(length) - while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-_': - length += 1 - ch = self.peek(length) - if not length: - raise ScannerError("while scanning a directive", start_mark, - "expected alphabetic or numeric character, but found %r" - % ch.encode('utf-8'), self.get_mark()) - value = self.prefix(length) - self.forward(length) - ch = self.peek() - if ch not in u'\0 \r\n\x85\u2028\u2029': - raise ScannerError("while scanning a directive", start_mark, - "expected alphabetic or numeric character, but found %r" - % ch.encode('utf-8'), self.get_mark()) - return value - - def scan_yaml_directive_value(self, start_mark): - # See the specification for details. - while self.peek() == u' ': - self.forward() - major = self.scan_yaml_directive_number(start_mark) - if self.peek() != '.': - raise ScannerError("while scanning a directive", start_mark, - "expected a digit or '.', but found %r" - % self.peek().encode('utf-8'), - self.get_mark()) - self.forward() - minor = self.scan_yaml_directive_number(start_mark) - if self.peek() not in u'\0 \r\n\x85\u2028\u2029': - raise ScannerError("while scanning a directive", start_mark, - "expected a digit or ' ', but found %r" - % self.peek().encode('utf-8'), - self.get_mark()) - return (major, minor) - - def scan_yaml_directive_number(self, start_mark): - # See the specification for details. - ch = self.peek() - if not (u'0' <= ch <= u'9'): - raise ScannerError("while scanning a directive", start_mark, - "expected a digit, but found %r" % ch.encode('utf-8'), - self.get_mark()) - length = 0 - while u'0' <= self.peek(length) <= u'9': - length += 1 - value = int(self.prefix(length)) - self.forward(length) - return value - - def scan_tag_directive_value(self, start_mark): - # See the specification for details. - while self.peek() == u' ': - self.forward() - handle = self.scan_tag_directive_handle(start_mark) - while self.peek() == u' ': - self.forward() - prefix = self.scan_tag_directive_prefix(start_mark) - return (handle, prefix) - - def scan_tag_directive_handle(self, start_mark): - # See the specification for details. - value = self.scan_tag_handle('directive', start_mark) - ch = self.peek() - if ch != u' ': - raise ScannerError("while scanning a directive", start_mark, - "expected ' ', but found %r" % ch.encode('utf-8'), - self.get_mark()) - return value - - def scan_tag_directive_prefix(self, start_mark): - # See the specification for details. - value = self.scan_tag_uri('directive', start_mark) - ch = self.peek() - if ch not in u'\0 \r\n\x85\u2028\u2029': - raise ScannerError("while scanning a directive", start_mark, - "expected ' ', but found %r" % ch.encode('utf-8'), - self.get_mark()) - return value - - def scan_directive_ignored_line(self, start_mark): - # See the specification for details. - while self.peek() == u' ': - self.forward() - if self.peek() == u'#': - while self.peek() not in u'\0\r\n\x85\u2028\u2029': - self.forward() - ch = self.peek() - if ch not in u'\0\r\n\x85\u2028\u2029': - raise ScannerError("while scanning a directive", start_mark, - "expected a comment or a line break, but found %r" - % ch.encode('utf-8'), self.get_mark()) - self.scan_line_break() - - def scan_anchor(self, TokenClass): - # The specification does not restrict characters for anchors and - # aliases. This may lead to problems, for instance, the document: - # [ *alias, value ] - # can be interpteted in two ways, as - # [ "value" ] - # and - # [ *alias , "value" ] - # Therefore we restrict aliases to numbers and ASCII letters. - start_mark = self.get_mark() - indicator = self.peek() - if indicator == u'*': - name = 'alias' - else: - name = 'anchor' - self.forward() - length = 0 - ch = self.peek(length) - while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-_': - length += 1 - ch = self.peek(length) - if not length: - raise ScannerError("while scanning an %s" % name, start_mark, - "expected alphabetic or numeric character, but found %r" - % ch.encode('utf-8'), self.get_mark()) - value = self.prefix(length) - self.forward(length) - ch = self.peek() - if ch not in u'\0 \t\r\n\x85\u2028\u2029?:,]}%@`': - raise ScannerError("while scanning an %s" % name, start_mark, - "expected alphabetic or numeric character, but found %r" - % ch.encode('utf-8'), self.get_mark()) - end_mark = self.get_mark() - return TokenClass(value, start_mark, end_mark) - - def scan_tag(self): - # See the specification for details. - start_mark = self.get_mark() - ch = self.peek(1) - if ch == u'<': - handle = None - self.forward(2) - suffix = self.scan_tag_uri('tag', start_mark) - if self.peek() != u'>': - raise ScannerError("while parsing a tag", start_mark, - "expected '>', but found %r" % self.peek().encode('utf-8'), - self.get_mark()) - self.forward() - elif ch in u'\0 \t\r\n\x85\u2028\u2029': - handle = None - suffix = u'!' - self.forward() - else: - length = 1 - use_handle = False - while ch not in u'\0 \r\n\x85\u2028\u2029': - if ch == u'!': - use_handle = True - break - length += 1 - ch = self.peek(length) - handle = u'!' - if use_handle: - handle = self.scan_tag_handle('tag', start_mark) - else: - handle = u'!' - self.forward() - suffix = self.scan_tag_uri('tag', start_mark) - ch = self.peek() - if ch not in u'\0 \r\n\x85\u2028\u2029': - raise ScannerError("while scanning a tag", start_mark, - "expected ' ', but found %r" % ch.encode('utf-8'), - self.get_mark()) - value = (handle, suffix) - end_mark = self.get_mark() - return TagToken(value, start_mark, end_mark) - - def scan_block_scalar(self, style): - # See the specification for details. - - if style == '>': - folded = True - else: - folded = False - - chunks = [] - start_mark = self.get_mark() - - # Scan the header. - self.forward() - chomping, increment = self.scan_block_scalar_indicators(start_mark) - self.scan_block_scalar_ignored_line(start_mark) - - # Determine the indentation level and go to the first non-empty line. - min_indent = self.indent+1 - if min_indent < 1: - min_indent = 1 - if increment is None: - breaks, max_indent, end_mark = self.scan_block_scalar_indentation() - indent = max(min_indent, max_indent) - else: - indent = min_indent+increment-1 - breaks, end_mark = self.scan_block_scalar_breaks(indent) - line_break = u'' - - # Scan the inner part of the block scalar. - while self.column == indent and self.peek() != u'\0': - chunks.extend(breaks) - leading_non_space = self.peek() not in u' \t' - length = 0 - while self.peek(length) not in u'\0\r\n\x85\u2028\u2029': - length += 1 - chunks.append(self.prefix(length)) - self.forward(length) - line_break = self.scan_line_break() - breaks, end_mark = self.scan_block_scalar_breaks(indent) - if self.column == indent and self.peek() != u'\0': - - # Unfortunately, folding rules are ambiguous. - # - # This is the folding according to the specification: - - if folded and line_break == u'\n' \ - and leading_non_space and self.peek() not in u' \t': - if not breaks: - chunks.append(u' ') - else: - chunks.append(line_break) - - # This is Clark Evans's interpretation (also in the spec - # examples): - # - #if folded and line_break == u'\n': - # if not breaks: - # if self.peek() not in ' \t': - # chunks.append(u' ') - # else: - # chunks.append(line_break) - #else: - # chunks.append(line_break) - else: - break - - # Chomp the tail. - if chomping is not False: - chunks.append(line_break) - if chomping is True: - chunks.extend(breaks) - - # We are done. - return ScalarToken(u''.join(chunks), False, start_mark, end_mark, - style) - - def scan_block_scalar_indicators(self, start_mark): - # See the specification for details. - chomping = None - increment = None - ch = self.peek() - if ch in u'+-': - if ch == '+': - chomping = True - else: - chomping = False - self.forward() - ch = self.peek() - if ch in u'0123456789': - increment = int(ch) - if increment == 0: - raise ScannerError("while scanning a block scalar", start_mark, - "expected indentation indicator in the range 1-9, but found 0", - self.get_mark()) - self.forward() - elif ch in u'0123456789': - increment = int(ch) - if increment == 0: - raise ScannerError("while scanning a block scalar", start_mark, - "expected indentation indicator in the range 1-9, but found 0", - self.get_mark()) - self.forward() - ch = self.peek() - if ch in u'+-': - if ch == '+': - chomping = True - else: - chomping = False - self.forward() - ch = self.peek() - if ch not in u'\0 \r\n\x85\u2028\u2029': - raise ScannerError("while scanning a block scalar", start_mark, - "expected chomping or indentation indicators, but found %r" - % ch.encode('utf-8'), self.get_mark()) - return chomping, increment - - def scan_block_scalar_ignored_line(self, start_mark): - # See the specification for details. - while self.peek() == u' ': - self.forward() - if self.peek() == u'#': - while self.peek() not in u'\0\r\n\x85\u2028\u2029': - self.forward() - ch = self.peek() - if ch not in u'\0\r\n\x85\u2028\u2029': - raise ScannerError("while scanning a block scalar", start_mark, - "expected a comment or a line break, but found %r" - % ch.encode('utf-8'), self.get_mark()) - self.scan_line_break() - - def scan_block_scalar_indentation(self): - # See the specification for details. - chunks = [] - max_indent = 0 - end_mark = self.get_mark() - while self.peek() in u' \r\n\x85\u2028\u2029': - if self.peek() != u' ': - chunks.append(self.scan_line_break()) - end_mark = self.get_mark() - else: - self.forward() - if self.column > max_indent: - max_indent = self.column - return chunks, max_indent, end_mark - - def scan_block_scalar_breaks(self, indent): - # See the specification for details. - chunks = [] - end_mark = self.get_mark() - while self.column < indent and self.peek() == u' ': - self.forward() - while self.peek() in u'\r\n\x85\u2028\u2029': - chunks.append(self.scan_line_break()) - end_mark = self.get_mark() - while self.column < indent and self.peek() == u' ': - self.forward() - return chunks, end_mark - - def scan_flow_scalar(self, style): - # See the specification for details. - # Note that we loose indentation rules for quoted scalars. Quoted - # scalars don't need to adhere indentation because " and ' clearly - # mark the beginning and the end of them. Therefore we are less - # restrictive then the specification requires. We only need to check - # that document separators are not included in scalars. - if style == '"': - double = True - else: - double = False - chunks = [] - start_mark = self.get_mark() - quote = self.peek() - self.forward() - chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) - while self.peek() != quote: - chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) - chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) - self.forward() - end_mark = self.get_mark() - return ScalarToken(u''.join(chunks), False, start_mark, end_mark, - style) - - ESCAPE_REPLACEMENTS = { - u'0': u'\0', - u'a': u'\x07', - u'b': u'\x08', - u't': u'\x09', - u'\t': u'\x09', - u'n': u'\x0A', - u'v': u'\x0B', - u'f': u'\x0C', - u'r': u'\x0D', - u'e': u'\x1B', - u' ': u'\x20', - u'\"': u'\"', - u'\\': u'\\', - u'N': u'\x85', - u'_': u'\xA0', - u'L': u'\u2028', - u'P': u'\u2029', - } - - ESCAPE_CODES = { - u'x': 2, - u'u': 4, - u'U': 8, - } - - def scan_flow_scalar_non_spaces(self, double, start_mark): - # See the specification for details. - chunks = [] - while True: - length = 0 - while self.peek(length) not in u'\'\"\\\0 \t\r\n\x85\u2028\u2029': - length += 1 - if length: - chunks.append(self.prefix(length)) - self.forward(length) - ch = self.peek() - if not double and ch == u'\'' and self.peek(1) == u'\'': - chunks.append(u'\'') - self.forward(2) - elif (double and ch == u'\'') or (not double and ch in u'\"\\'): - chunks.append(ch) - self.forward() - elif double and ch == u'\\': - self.forward() - ch = self.peek() - if ch in self.ESCAPE_REPLACEMENTS: - chunks.append(self.ESCAPE_REPLACEMENTS[ch]) - self.forward() - elif ch in self.ESCAPE_CODES: - length = self.ESCAPE_CODES[ch] - self.forward() - for k in range(length): - if self.peek(k) not in u'0123456789ABCDEFabcdef': - raise ScannerError("while scanning a double-quoted scalar", start_mark, - "expected escape sequence of %d hexdecimal numbers, but found %r" % - (length, self.peek(k).encode('utf-8')), self.get_mark()) - code = int(self.prefix(length), 16) - chunks.append(unichr(code)) - self.forward(length) - elif ch in u'\r\n\x85\u2028\u2029': - self.scan_line_break() - chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) - else: - raise ScannerError("while scanning a double-quoted scalar", start_mark, - "found unknown escape character %r" % ch.encode('utf-8'), self.get_mark()) - else: - return chunks - - def scan_flow_scalar_spaces(self, double, start_mark): - # See the specification for details. - chunks = [] - length = 0 - while self.peek(length) in u' \t': - length += 1 - whitespaces = self.prefix(length) - self.forward(length) - ch = self.peek() - if ch == u'\0': - raise ScannerError("while scanning a quoted scalar", start_mark, - "found unexpected end of stream", self.get_mark()) - elif ch in u'\r\n\x85\u2028\u2029': - line_break = self.scan_line_break() - breaks = self.scan_flow_scalar_breaks(double, start_mark) - if line_break != u'\n': - chunks.append(line_break) - elif not breaks: - chunks.append(u' ') - chunks.extend(breaks) - else: - chunks.append(whitespaces) - return chunks - - def scan_flow_scalar_breaks(self, double, start_mark): - # See the specification for details. - chunks = [] - while True: - # Instead of checking indentation, we check for document - # separators. - prefix = self.prefix(3) - if (prefix == u'---' or prefix == u'...') \ - and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': - raise ScannerError("while scanning a quoted scalar", start_mark, - "found unexpected document separator", self.get_mark()) - while self.peek() in u' \t': - self.forward() - if self.peek() in u'\r\n\x85\u2028\u2029': - chunks.append(self.scan_line_break()) - else: - return chunks - - def scan_plain(self): - # See the specification for details. - # We add an additional restriction for the flow context: - # plain scalars in the flow context cannot contain ',', ':' and '?'. - # We also keep track of the `allow_simple_key` flag here. - # Indentation rules are loosed for the flow context. - chunks = [] - start_mark = self.get_mark() - end_mark = start_mark - indent = self.indent+1 - # We allow zero indentation for scalars, but then we need to check for - # document separators at the beginning of the line. - #if indent == 0: - # indent = 1 - spaces = [] - while True: - length = 0 - if self.peek() == u'#': - break - while True: - ch = self.peek(length) - if ch in u'\0 \t\r\n\x85\u2028\u2029' \ - or (not self.flow_level and ch == u':' and - self.peek(length+1) in u'\0 \t\r\n\x85\u2028\u2029') \ - or (self.flow_level and ch in u',:?[]{}'): - break - length += 1 - # It's not clear what we should do with ':' in the flow context. - if (self.flow_level and ch == u':' - and self.peek(length+1) not in u'\0 \t\r\n\x85\u2028\u2029,[]{}'): - self.forward(length) - raise ScannerError("while scanning a plain scalar", start_mark, - "found unexpected ':'", self.get_mark(), - "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") - if length == 0: - break - self.allow_simple_key = False - chunks.extend(spaces) - chunks.append(self.prefix(length)) - self.forward(length) - end_mark = self.get_mark() - spaces = self.scan_plain_spaces(indent, start_mark) - if not spaces or self.peek() == u'#' \ - or (not self.flow_level and self.column < indent): - break - return ScalarToken(u''.join(chunks), True, start_mark, end_mark) - - def scan_plain_spaces(self, indent, start_mark): - # See the specification for details. - # The specification is really confusing about tabs in plain scalars. - # We just forbid them completely. Do not use tabs in YAML! - chunks = [] - length = 0 - while self.peek(length) in u' ': - length += 1 - whitespaces = self.prefix(length) - self.forward(length) - ch = self.peek() - if ch in u'\r\n\x85\u2028\u2029': - line_break = self.scan_line_break() - self.allow_simple_key = True - prefix = self.prefix(3) - if (prefix == u'---' or prefix == u'...') \ - and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': - return - breaks = [] - while self.peek() in u' \r\n\x85\u2028\u2029': - if self.peek() == ' ': - self.forward() - else: - breaks.append(self.scan_line_break()) - prefix = self.prefix(3) - if (prefix == u'---' or prefix == u'...') \ - and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': - return - if line_break != u'\n': - chunks.append(line_break) - elif not breaks: - chunks.append(u' ') - chunks.extend(breaks) - elif whitespaces: - chunks.append(whitespaces) - return chunks - - def scan_tag_handle(self, name, start_mark): - # See the specification for details. - # For some strange reasons, the specification does not allow '_' in - # tag handles. I have allowed it anyway. - ch = self.peek() - if ch != u'!': - raise ScannerError("while scanning a %s" % name, start_mark, - "expected '!', but found %r" % ch.encode('utf-8'), - self.get_mark()) - length = 1 - ch = self.peek(length) - if ch != u' ': - while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-_': - length += 1 - ch = self.peek(length) - if ch != u'!': - self.forward(length) - raise ScannerError("while scanning a %s" % name, start_mark, - "expected '!', but found %r" % ch.encode('utf-8'), - self.get_mark()) - length += 1 - value = self.prefix(length) - self.forward(length) - return value - - def scan_tag_uri(self, name, start_mark): - # See the specification for details. - # Note: we do not check if URI is well-formed. - chunks = [] - length = 0 - ch = self.peek(length) - while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ - or ch in u'-;/?:@&=+$,_.!~*\'()[]%': - if ch == u'%': - chunks.append(self.prefix(length)) - self.forward(length) - length = 0 - chunks.append(self.scan_uri_escapes(name, start_mark)) - else: - length += 1 - ch = self.peek(length) - if length: - chunks.append(self.prefix(length)) - self.forward(length) - length = 0 - if not chunks: - raise ScannerError("while parsing a %s" % name, start_mark, - "expected URI, but found %r" % ch.encode('utf-8'), - self.get_mark()) - return u''.join(chunks) - - def scan_uri_escapes(self, name, start_mark): - # See the specification for details. - bytes = [] - mark = self.get_mark() - while self.peek() == u'%': - self.forward() - for k in range(2): - if self.peek(k) not in u'0123456789ABCDEFabcdef': - raise ScannerError("while scanning a %s" % name, start_mark, - "expected URI escape sequence of 2 hexdecimal numbers, but found %r" % - (self.peek(k).encode('utf-8')), self.get_mark()) - bytes.append(chr(int(self.prefix(2), 16))) - self.forward(2) - try: - value = unicode(''.join(bytes), 'utf-8') - except UnicodeDecodeError, exc: - raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) - return value - - def scan_line_break(self): - # Transforms: - # '\r\n' : '\n' - # '\r' : '\n' - # '\n' : '\n' - # '\x85' : '\n' - # '\u2028' : '\u2028' - # '\u2029 : '\u2029' - # default : '' - ch = self.peek() - if ch in u'\r\n\x85': - if self.prefix(2) == u'\r\n': - self.forward(2) - else: - self.forward() - return u'\n' - elif ch in u'\u2028\u2029': - self.forward() - return ch - return u'' - -#try: -# import psyco -# psyco.bind(Scanner) -#except ImportError: -# pass - diff --git a/lib/spack/external/yaml/serializer.py b/lib/spack/external/yaml/serializer.py deleted file mode 100644 index 0bf1e96dc1..0000000000 --- a/lib/spack/external/yaml/serializer.py +++ /dev/null @@ -1,111 +0,0 @@ - -__all__ = ['Serializer', 'SerializerError'] - -from error import YAMLError -from events import * -from nodes import * - -class SerializerError(YAMLError): - pass - -class Serializer(object): - - ANCHOR_TEMPLATE = u'id%03d' - - def __init__(self, encoding=None, - explicit_start=None, explicit_end=None, version=None, tags=None): - self.use_encoding = encoding - self.use_explicit_start = explicit_start - self.use_explicit_end = explicit_end - self.use_version = version - self.use_tags = tags - self.serialized_nodes = {} - self.anchors = {} - self.last_anchor_id = 0 - self.closed = None - - def open(self): - if self.closed is None: - self.emit(StreamStartEvent(encoding=self.use_encoding)) - self.closed = False - elif self.closed: - raise SerializerError("serializer is closed") - else: - raise SerializerError("serializer is already opened") - - def close(self): - if self.closed is None: - raise SerializerError("serializer is not opened") - elif not self.closed: - self.emit(StreamEndEvent()) - self.closed = True - - #def __del__(self): - # self.close() - - def serialize(self, node): - if self.closed is None: - raise SerializerError("serializer is not opened") - elif self.closed: - raise SerializerError("serializer is closed") - self.emit(DocumentStartEvent(explicit=self.use_explicit_start, - version=self.use_version, tags=self.use_tags)) - self.anchor_node(node) - self.serialize_node(node, None, None) - self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) - self.serialized_nodes = {} - self.anchors = {} - self.last_anchor_id = 0 - - def anchor_node(self, node): - if node in self.anchors: - if self.anchors[node] is None: - self.anchors[node] = self.generate_anchor(node) - else: - self.anchors[node] = None - if isinstance(node, SequenceNode): - for item in node.value: - self.anchor_node(item) - elif isinstance(node, MappingNode): - for key, value in node.value: - self.anchor_node(key) - self.anchor_node(value) - - def generate_anchor(self, node): - self.last_anchor_id += 1 - return self.ANCHOR_TEMPLATE % self.last_anchor_id - - def serialize_node(self, node, parent, index): - alias = self.anchors[node] - if node in self.serialized_nodes: - self.emit(AliasEvent(alias)) - else: - self.serialized_nodes[node] = True - self.descend_resolver(parent, index) - if isinstance(node, ScalarNode): - detected_tag = self.resolve(ScalarNode, node.value, (True, False)) - default_tag = self.resolve(ScalarNode, node.value, (False, True)) - implicit = (node.tag == detected_tag), (node.tag == default_tag) - self.emit(ScalarEvent(alias, node.tag, implicit, node.value, - style=node.style)) - elif isinstance(node, SequenceNode): - implicit = (node.tag - == self.resolve(SequenceNode, node.value, True)) - self.emit(SequenceStartEvent(alias, node.tag, implicit, - flow_style=node.flow_style)) - index = 0 - for item in node.value: - self.serialize_node(item, node, index) - index += 1 - self.emit(SequenceEndEvent()) - elif isinstance(node, MappingNode): - implicit = (node.tag - == self.resolve(MappingNode, node.value, True)) - self.emit(MappingStartEvent(alias, node.tag, implicit, - flow_style=node.flow_style)) - for key, value in node.value: - self.serialize_node(key, node, None) - self.serialize_node(value, node, key) - self.emit(MappingEndEvent()) - self.ascend_resolver() - diff --git a/lib/spack/external/yaml/tokens.py b/lib/spack/external/yaml/tokens.py deleted file mode 100644 index 4d0b48a394..0000000000 --- a/lib/spack/external/yaml/tokens.py +++ /dev/null @@ -1,104 +0,0 @@ - -class Token(object): - def __init__(self, start_mark, end_mark): - self.start_mark = start_mark - self.end_mark = end_mark - def __repr__(self): - attributes = [key for key in self.__dict__ - if not key.endswith('_mark')] - attributes.sort() - arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) - for key in attributes]) - return '%s(%s)' % (self.__class__.__name__, arguments) - -#class BOMToken(Token): -# id = '' - -class DirectiveToken(Token): - id = '' - def __init__(self, name, value, start_mark, end_mark): - self.name = name - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - -class DocumentStartToken(Token): - id = '' - -class DocumentEndToken(Token): - id = '' - -class StreamStartToken(Token): - id = '' - def __init__(self, start_mark=None, end_mark=None, - encoding=None): - self.start_mark = start_mark - self.end_mark = end_mark - self.encoding = encoding - -class StreamEndToken(Token): - id = '' - -class BlockSequenceStartToken(Token): - id = '' - -class BlockMappingStartToken(Token): - id = '' - -class BlockEndToken(Token): - id = '' - -class FlowSequenceStartToken(Token): - id = '[' - -class FlowMappingStartToken(Token): - id = '{' - -class FlowSequenceEndToken(Token): - id = ']' - -class FlowMappingEndToken(Token): - id = '}' - -class KeyToken(Token): - id = '?' - -class ValueToken(Token): - id = ':' - -class BlockEntryToken(Token): - id = '-' - -class FlowEntryToken(Token): - id = ',' - -class AliasToken(Token): - id = '' - def __init__(self, value, start_mark, end_mark): - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - -class AnchorToken(Token): - id = '' - def __init__(self, value, start_mark, end_mark): - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - -class TagToken(Token): - id = '' - def __init__(self, value, start_mark, end_mark): - self.value = value - self.start_mark = start_mark - self.end_mark = end_mark - -class ScalarToken(Token): - id = '' - def __init__(self, value, plain, start_mark, end_mark, style=None): - self.value = value - self.plain = plain - self.start_mark = start_mark - self.end_mark = end_mark - self.style = style - diff --git a/lib/spack/spack/test/python_version.py b/lib/spack/spack/test/python_version.py index 5af55bdc5f..084eed7e33 100644 --- a/lib/spack/spack/test/python_version.py +++ b/lib/spack/spack/test/python_version.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. @@ -22,26 +22,52 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -""" -This test ensures that all Spack files are Python version 2.6 or less. +"""Check that Spack complies with minimum supported python versions. + +We ensure that all Spack files work with Python2 >= 2.6 and Python3 >= 3.0. -Spack was originally 2.7, but enough systems in 2014 are still using -2.6 on their frontend nodes that we need 2.6 to get adopted. +We'd like to drop 2.6 support at some point, but there are still many HPC +systems that ship with RHEL6/CentOS 6, which have Python 2.6 as the +default version. Once those go away, we can likely drop 2.6 and increase +the minimum supported Python 3 version, as well. """ import os +import sys import re import unittest import llnl.util.tty as tty -import pyqver2 import spack -spack_max_version = (2, 6) +# +# This test uses pyqver, by Greg Hewgill, which is a dual-source module. +# That means we need to do different checks depending on whether we're +# running Python 2 or Python 3. +# +if sys.version_info[0] < 3: + import pyqver2 as pyqver + spack_min_supported = (2, 6) + + # Exclude Python 3 versions of dual-source modules when using Python 2 + exclude_paths = [ + os.path.join(spack.lib_path, 'external', 'yaml', 'lib3'), + os.path.join(spack.lib_path, 'external', 'pyqver3.py')] + +else: + import pyqver3 as pyqver + spack_min_supported = (3, 0) + + # Exclude Python 2 versions of dual-source modules when using Python 3 + exclude_paths = [ + os.path.join(spack.lib_path, 'external', 'yaml', 'lib'), + os.path.join(spack.lib_path, 'external', 'pyqver2.py')] class PythonVersionTest(unittest.TestCase): - def pyfiles(self, *search_paths): + def pyfiles(self, search_paths, exclude=()): + """List python search files in a set of search paths, excluding + any paths in the exclude list""" # first file is the spack script. yield spack.spack_file @@ -49,53 +75,71 @@ class PythonVersionTest(unittest.TestCase): for path in search_paths: for root, dirnames, filenames in os.walk(path): for filename in filenames: + realpath = os.path.realpath(os.path.join(root, filename)) + if any(realpath.startswith(p) for p in exclude): + continue + if re.match(r'^[^.#].*\.py$', filename): yield os.path.join(root, filename) - def package_py_files(self): - for name in spack.repo.all_package_names(): - yield spack.repo.filename_for_package_name(name) - - def check_python_versions(self, *files): - # dict version -> filename -> reasons + def check_python_versions(self, files): + # This is a dict dict mapping: + # version -> filename -> reasons + # + # Reasons are tuples of (lineno, string), where the string is the + # cause for a version incompatibility. all_issues = {} - for fn in files: - with open(fn) as pyfile: - versions = pyqver2.get_versions(pyfile.read()) - for ver, reasons in versions.items(): - if ver > spack_max_version: - if ver not in all_issues: - all_issues[ver] = {} - all_issues[ver][fn] = reasons + # Parse files and run pyqver on each file. + for path in files: + with open(path) as pyfile: + full_text = pyfile.read() + versions = pyqver.get_versions(full_text, path) + + for ver, reasons in versions.items(): + if ver <= spack_min_supported: + continue + + # Record issues. Mark exceptions with '# nopyqver' comment + for lineno, cause in reasons: + lines = full_text.split('\n') + if not re.search(r'#\s*nopyqver\s*$', lines[lineno - 1]): + all_issues.setdefault(ver, {})[path] = reasons + # Print a message if there are are issues if all_issues: - tty.error("Spack must run on Python version %d.%d" - % spack_max_version) + tty.msg("Spack must remain compatible with Python version %d.%d" + % spack_min_supported) + # Print out a table showing which files/linenos require which + # python version, and a string describing why. for v in sorted(all_issues.keys(), reverse=True): - msgs = [] - for fn in sorted(all_issues[v].keys()): - short_fn = fn - if fn.startswith(spack.prefix): - short_fn = fn[len(spack.prefix):] - - reasons = [r for r in set(all_issues[v][fn]) if r] - for r in reasons: - msgs.append(("%s:%s" % ('spack' + short_fn, r[0]), r[1])) - - tty.error("These files require version %d.%d:" % v) - maxlen = max(len(f) for f, prob in msgs) + messages = [] + for path in sorted(all_issues[v].keys()): + short_path = path + if path.startswith(spack.prefix): + short_path = path[len(spack.prefix):] + + reasons = [r for r in set(all_issues[v][path]) if r] + for lineno, cause in reasons: + file_line = "%s:%s" % (short_path.lstrip('/'), lineno) + messages.append((file_line, cause)) + + print() + tty.msg("These files require version %d.%d:" % v) + maxlen = max(len(f) for f, prob in messages) fmt = "%%-%ds%%s" % (maxlen + 3) - print fmt % ('File', 'Reason') - print fmt % ('-' * (maxlen), '-' * 20) - for msg in msgs: - print fmt % msg + print(fmt % ('File', 'Reason')) + print(fmt % ('-' * (maxlen), '-' * 20)) + for msg in messages: + print(fmt % msg) + # Fail this test if there were issues. self.assertTrue(len(all_issues) == 0) def test_core_module_compatibility(self): - self.check_python_versions(*self.pyfiles(spack.lib_path)) + self.check_python_versions( + self.pyfiles([spack.lib_path], exclude=exclude_paths)) def test_package_module_compatibility(self): - self.check_python_versions(*self.pyfiles(spack.packages_path)) + self.check_python_versions(self.pyfiles([spack.packages_path])) -- cgit v1.2.3-70-g09d2 From 1d1a14dbe9cfc512cedff7430b694df87b2cd5ee Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 7 Mar 2017 14:25:48 -0800 Subject: Convert Python 2 idioms to Python 2/3-compatible ones. - convert print, StringIO, except as, octals, izip - convert print statement to print function - convert StringIO to six.StringIO - remove usage of csv reader in Spec, in favor of simple regex - csv reader only does byte strings - convert 0755 octal literals to 0o755 - convert `except Foo, e` to `except Foo as e` - fix a few places `str` is used. - may need to switch everything to str later. - convert iteritems usages to use six.iteritems - fix urllib and HTMLParser - port metaclasses to use six.with_metaclass - More octal literal conversions for Python 2/3 - Fix a new octal literal. - Convert `basestring` to `six.string_types` - Convert xrange -> range - Fix various issues with encoding, iteritems, and Python3 semantics. - Convert contextlib.nested to explicitly nexted context managers. - Convert use of filter() to list comprehensions. - Replace reduce() with list comprehensions. - Clean up composite: replace inspect.ismethod() with callable() - Python 3 doesn't have "method" objects; inspect.ismethod returns False. - Need to use callable in Composite to make it work. - Update colify to use future division. - Fix zip() usages that need to be lists. - Python3: Use line-buffered logging instead of unbuffered. - Python3 raises an error with unbuffered I/O - See https://bugs.python.org/issue17404 --- bin/spack | 6 ++- lib/spack/llnl/util/filesystem.py | 4 +- lib/spack/llnl/util/lang.py | 5 ++- lib/spack/llnl/util/tty/__init__.py | 8 ++-- lib/spack/llnl/util/tty/colify.py | 20 +++++---- lib/spack/llnl/util/tty/log.py | 8 +++- lib/spack/spack/__init__.py | 2 +- lib/spack/spack/architecture.py | 2 +- lib/spack/spack/build_environment.py | 8 ++-- lib/spack/spack/build_systems/autotools.py | 2 +- lib/spack/spack/cmd/__init__.py | 6 ++- lib/spack/spack/cmd/arch.py | 6 ++- lib/spack/spack/cmd/common/arguments.py | 2 +- lib/spack/spack/cmd/compiler.py | 35 +++++++++------- lib/spack/spack/cmd/configure.py | 1 - lib/spack/spack/cmd/dependents.py | 2 +- lib/spack/spack/cmd/env.py | 5 ++- lib/spack/spack/cmd/flake8.py | 22 +++++----- lib/spack/spack/cmd/graph.py | 5 ++- lib/spack/spack/cmd/info.py | 55 +++++++++++++------------ lib/spack/spack/cmd/list.py | 30 +++++++------- lib/spack/spack/cmd/location.py | 19 +++++---- lib/spack/spack/cmd/md5.py | 2 +- lib/spack/spack/cmd/mirror.py | 4 +- lib/spack/spack/cmd/pkg.py | 8 ++-- lib/spack/spack/cmd/repo.py | 4 +- lib/spack/spack/cmd/spec.py | 23 ++++++----- lib/spack/spack/cmd/test.py | 6 ++- lib/spack/spack/cmd/versions.py | 6 ++- lib/spack/spack/compiler.py | 4 +- lib/spack/spack/compilers/__init__.py | 4 +- lib/spack/spack/concretize.py | 6 ++- lib/spack/spack/config.py | 14 ++++--- lib/spack/spack/database.py | 6 ++- lib/spack/spack/directives.py | 3 +- lib/spack/spack/directory_layout.py | 3 +- lib/spack/spack/environment.py | 2 +- lib/spack/spack/error.py | 3 ++ lib/spack/spack/fetch_strategy.py | 24 ++++++----- lib/spack/spack/graph.py | 3 +- lib/spack/spack/hooks/case_consistency.py | 1 + lib/spack/spack/hooks/module_file_generation.py | 5 ++- lib/spack/spack/modules.py | 22 +++++----- lib/spack/spack/operating_systems/cnl.py | 2 +- lib/spack/spack/package.py | 24 +++++++---- lib/spack/spack/package_prefs.py | 8 ++-- lib/spack/spack/package_test.py | 18 ++++---- lib/spack/spack/parse.py | 6 ++- lib/spack/spack/provider_index.py | 7 ++-- lib/spack/spack/repository.py | 3 +- lib/spack/spack/spec.py | 40 +++++++++--------- lib/spack/spack/stage.py | 17 ++++---- lib/spack/spack/test/cmd/install.py | 6 +-- lib/spack/spack/test/compilers.py | 9 ++-- lib/spack/spack/test/conftest.py | 13 +++--- lib/spack/spack/test/graph.py | 2 +- lib/spack/spack/test/lock.py | 2 +- lib/spack/spack/test/make_executable.py | 2 +- lib/spack/spack/test/modules.py | 6 +-- lib/spack/spack/test/multimethod.py | 2 +- lib/spack/spack/test/pattern.py | 1 + lib/spack/spack/test/provider_index.py | 7 ++-- lib/spack/spack/test/python_version.py | 2 + lib/spack/spack/test/spec_dag.py | 12 +++--- lib/spack/spack/url.py | 6 +-- lib/spack/spack/util/executable.py | 4 +- lib/spack/spack/util/multiproc.py | 3 +- lib/spack/spack/util/naming.py | 2 +- lib/spack/spack/util/pattern.py | 45 +++++++------------- lib/spack/spack/util/prefix.py | 12 +++--- lib/spack/spack/util/spack_json.py | 7 +++- lib/spack/spack/util/spack_yaml.py | 2 +- lib/spack/spack/util/web.py | 24 +++++++---- lib/spack/spack/version.py | 19 ++++++--- 74 files changed, 396 insertions(+), 323 deletions(-) (limited to 'lib') diff --git a/bin/spack b/bin/spack index 550b999eb9..f33d219b8b 100755 --- a/bin/spack +++ b/bin/spack @@ -24,6 +24,8 @@ # 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 __future__ import print_function + import sys if (sys.version_info[0] > 2) or (sys.version_info[:2] < (2, 6)): v_info = sys.version_info[:3] @@ -74,8 +76,8 @@ for pyc_file in orphaned_pyc_files: try: os.remove(pyc_file) except OSError as e: - print ("WARNING: Spack may fail mysteriously. " - "Couldn't remove orphaned .pyc file: %s" % pyc_file) + print("WARNING: Spack may fail mysteriously. " + "Couldn't remove orphaned .pyc file: %s" % pyc_file) # If there is no working directory, use the spack prefix. try: diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index f456a5edf1..8922010e70 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -175,9 +175,9 @@ def change_sed_delimiter(old_delim, new_delim, *filenames): def set_install_permissions(path): """Set appropriate permissions on the installed file.""" if os.path.isdir(path): - os.chmod(path, 0755) + os.chmod(path, 0o755) else: - os.chmod(path, 0644) + os.chmod(path, 0o644) def copy_mode(src, dest): diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index d9fef42e53..ad62063061 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -27,6 +27,7 @@ import re import functools import collections import inspect +from six import string_types # Ignore emacs backups when listing modules ignore_modules = [r'^\.#', '~$'] @@ -80,7 +81,7 @@ def index_by(objects, *funcs): return objects f = funcs[0] - if isinstance(f, basestring): + if isinstance(f, str): f = lambda x: getattr(x, funcs[0]) elif isinstance(f, tuple): f = lambda x: tuple(getattr(x, p) for p in funcs[0]) @@ -326,7 +327,7 @@ def match_predicate(*args): """ def match(string): for arg in args: - if isinstance(arg, basestring): + if isinstance(arg, string_types): if re.search(arg, string): return True elif isinstance(arg, list) or isinstance(arg, tuple): diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index f73d96a4e4..f78d889037 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -29,7 +29,7 @@ import fcntl import termios import struct import traceback -from StringIO import StringIO +from six import StringIO from llnl.util.tty.color import * @@ -93,7 +93,7 @@ def msg(message, *args, **kwargs): else: cwrite("@*b{%s==>} %s" % (st_text, cescape(message))) for arg in args: - print indent + str(arg) + print(indent + str(arg)) def info(message, *args, **kwargs): @@ -201,7 +201,7 @@ def get_yes_or_no(prompt, **kwargs): if not ans: result = default_value if result is None: - print "Please enter yes or no." + print("Please enter yes or no.") else: if ans == 'y' or ans == 'yes': result = True @@ -239,7 +239,7 @@ def hline(label=None, **kwargs): out.write(label) out.write(suffix) - print out.getvalue() + print(out.getvalue()) def terminal_size(): diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py index 67acdfa517..83de530ef1 100644 --- a/lib/spack/llnl/util/tty/colify.py +++ b/lib/spack/llnl/util/tty/colify.py @@ -25,9 +25,11 @@ """ Routines for printing columnar output. See colify() for more information. """ +from __future__ import division + import os import sys -from StringIO import StringIO +from six import StringIO from llnl.util.tty import terminal_size from llnl.util.tty.color import clen, cextra @@ -64,18 +66,18 @@ def config_variable_cols(elts, console_width, padding, cols=0): # Get a bound on the most columns we could possibly have. # 'clen' ignores length of ansi color sequences. lengths = [clen(e) for e in elts] - max_cols = max(1, console_width / (min(lengths) + padding)) + max_cols = max(1, console_width // (min(lengths) + padding)) max_cols = min(len(elts), max_cols) # Range of column counts to try. If forced, use the supplied value. - col_range = [cols] if cols else xrange(1, max_cols + 1) + col_range = [cols] if cols else range(1, max_cols + 1) # Determine the most columns possible for the console width. configs = [ColumnConfig(c) for c in col_range] for i, length in enumerate(lengths): for conf in configs: if conf.valid: - col = i / ((len(elts) + conf.cols - 1) / conf.cols) + col = i // ((len(elts) + conf.cols - 1) // conf.cols) p = padding if col < (conf.cols - 1) else 0 if conf.widths[col] < (length + p): @@ -107,7 +109,7 @@ def config_uniform_cols(elts, console_width, padding, cols=0): # 'clen' ignores length of ansi color sequences. max_len = max(clen(e) for e in elts) + padding if cols == 0: - cols = max(1, console_width / max_len) + cols = max(1, console_width // max_len) cols = min(len(elts), cols) config = ColumnConfig(cols) @@ -193,12 +195,12 @@ def colify(elts, **options): raise ValueError("method must be one of: " + allowed_methods) cols = config.cols - rows = (len(elts) + cols - 1) / cols + rows = (len(elts) + cols - 1) // cols rows_last_col = len(elts) % rows - for row in xrange(rows): + for row in range(rows): output.write(" " * indent) - for col in xrange(cols): + for col in range(cols): elt = col * rows + row width = config.widths[col] + cextra(elts[elt]) if col < cols - 1: @@ -233,7 +235,7 @@ def colify_table(table, **options): columns = len(table[0]) def transpose(): - for i in xrange(columns): + for i in range(columns): for row in table: yield row[i] diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index b1d45214ab..50e07c0b97 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -165,8 +165,12 @@ class log_output(object): self.p.join(60.0) # 1 minute to join the child def _spawn_writing_daemon(self, read, input_stream): - # Parent: read from child, skip the with block. - read_file = os.fdopen(read, 'r', 0) + # This is the Parent: read from child, skip the with block. + + # Use line buffering (3rd param = 1) since Python 3 has a bug + # that prevents unbuffered text I/O. + read_file = os.fdopen(read, 'r', 1) + with open(self.filename, 'w') as log_file: with keyboard_input(input_stream): while True: diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index b0f2faed76..b522804d8d 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -96,7 +96,7 @@ spack_version = Version("0.10.0") try: repo = spack.repository.RepoPath() sys.meta_path.append(repo) -except spack.error.SpackError, e: +except spack.error.SpackError as e: tty.die('while initializing Spack RepoPath:', e.message) diff --git a/lib/spack/spack/architecture.py b/lib/spack/spack/architecture.py index e44e0dc109..bace3c49f6 100644 --- a/lib/spack/spack/architecture.py +++ b/lib/spack/spack/architecture.py @@ -287,7 +287,7 @@ class OperatingSystem(object): # ensure all the version calls we made are cached in the parent # process, as well. This speeds up Spack a lot. - clist = reduce(lambda x, y: x + y, compiler_lists) + clist = [comp for cl in compiler_lists for comp in cl] return clist def find_compiler(self, cmp_cls, *path): diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 3e6dc12b35..a20a7b4db8 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -57,6 +57,7 @@ import os import shutil import sys import traceback +from six import iteritems import llnl.util.lang as lang import llnl.util.tty as tty @@ -310,7 +311,7 @@ def set_build_environment_variables(pkg, env, dirty=False): environment = compiler.environment if 'set' in environment: env_to_set = environment['set'] - for key, value in env_to_set.iteritems(): + for key, value in iteritems(env_to_set): env.set('SPACK_ENV_SET_%s' % key, value) env.set('%s' % key, value) # Let shell know which variables to set @@ -322,8 +323,9 @@ def set_build_environment_variables(pkg, env, dirty=False): env.set('SPACK_COMPILER_EXTRA_RPATHS', extra_rpaths) # Add bin directories from dependencies to the PATH for the build. - bin_dirs = reversed(filter(os.path.isdir, [ - '%s/bin' % d.prefix for d in pkg.spec.dependencies(deptype='build')])) + bin_dirs = reversed( + [d.prefix.bin for d in pkg.spec.dependencies(deptype='build') + if os.path.isdir(d.prefix.bin)]) bin_dirs = filter_system_bin_paths(bin_dirs) for item in bin_dirs: env.prepend_path('PATH', item) diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 76dfd0d16f..ffd00e7f69 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -146,7 +146,7 @@ class AutotoolsPackage(PackageBase): if config_guess is not None: try: check_call([config_guess], stdout=PIPE, stderr=PIPE) - mod = stat(my_config_guess).st_mode & 0777 | S_IWUSR + mod = stat(my_config_guess).st_mode & 0o777 | S_IWUSR os.chmod(my_config_guess, mod) shutil.copyfile(config_guess, my_config_guess) return True diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index 3a42510245..622ef4d96c 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -22,6 +22,8 @@ # 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 __future__ import print_function + import os import re import sys @@ -186,7 +188,7 @@ def display_specs(specs, **kwargs): # Traverse the index and print out each package for i, (architecture, compiler) in enumerate(sorted(index)): if i > 0: - print + print() header = "%s{%s} / %s{%s}" % (spack.spec.architecture_color, architecture, spack.spec.compiler_color, @@ -205,7 +207,7 @@ def display_specs(specs, **kwargs): for abbrv, spec in zip(abbreviated, specs): prefix = gray_hash(spec, hlen) if hashes else '' - print prefix + (format % (abbrv, spec.prefix)) + print(prefix + (format % (abbrv, spec.prefix))) elif mode == 'deps': for spec in specs: diff --git a/lib/spack/spack/cmd/arch.py b/lib/spack/spack/cmd/arch.py index 5b9daf9dea..1079e7f215 100644 --- a/lib/spack/spack/cmd/arch.py +++ b/lib/spack/spack/cmd/arch.py @@ -22,6 +22,8 @@ # 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 __future__ import print_function + import spack.architecture as architecture description = "print architecture information about this machine" @@ -36,6 +38,6 @@ def setup_parser(subparser): def arch(parser, args): if args.platform: - print architecture.platform() + print(architecture.platform()) else: - print architecture.sys_type() + print(architecture.sys_type()) diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index a8bdcf692f..3115501439 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -81,7 +81,7 @@ _arguments['constraint'] = Args( _arguments['module_type'] = Args( '-m', '--module-type', choices=spack.modules.module_types.keys(), - default=spack.modules.module_types.keys()[0], + default=list(spack.modules.module_types.keys())[0], help='type of module files [default: %(default)s]') _arguments['yes_to_all'] = Args( diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 22f3b3f26a..6067d44c5e 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -22,8 +22,11 @@ # 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 __future__ import print_function + import argparse import sys +from six import iteritems import llnl.util.tty as tty import spack.compilers @@ -142,36 +145,36 @@ def compiler_info(args): tty.error("No compilers match spec %s" % cspec) else: for c in compilers: - print str(c.spec) + ":" - print "\tpaths:" + print(str(c.spec) + ":") + print("\tpaths:") for cpath in ['cc', 'cxx', 'f77', 'fc']: - print "\t\t%s = %s" % (cpath, getattr(c, cpath, None)) + print("\t\t%s = %s" % (cpath, getattr(c, cpath, None))) if c.flags: - print "\tflags:" - for flag, flag_value in c.flags.iteritems(): - print "\t\t%s = %s" % (flag, flag_value) + print("\tflags:") + for flag, flag_value in iteritems(c.flags): + print("\t\t%s = %s" % (flag, flag_value)) if len(c.environment) != 0: if len(c.environment['set']) != 0: - print "\tenvironment:" - print "\t set:" - for key, value in c.environment['set'].iteritems(): - print "\t %s = %s" % (key, value) + print("\tenvironment:") + print("\t set:") + for key, value in iteritems(c.environment['set']): + print("\t %s = %s" % (key, value)) if c.extra_rpaths: - print "\tExtra rpaths:" + print("\tExtra rpaths:") for extra_rpath in c.extra_rpaths: - print "\t\t%s" % extra_rpath - print "\tmodules = %s" % c.modules - print "\toperating system = %s" % c.operating_system + print("\t\t%s" % extra_rpath) + print("\tmodules = %s" % c.modules) + print("\toperating system = %s" % c.operating_system) def compiler_list(args): tty.msg("Available compilers") index = index_by(spack.compilers.all_compilers(scope=args.scope), lambda c: (c.spec.name, c.operating_system, c.target)) - ordered_sections = sorted(index.items(), key=lambda (k, v): k) + ordered_sections = sorted(index.items(), key=lambda item: item[0]) for i, (key, compilers) in enumerate(ordered_sections): if i >= 1: - print + print() name, os, target = key os_str = os if target: diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index b6669f33a2..037705f480 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -22,7 +22,6 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## - import argparse import llnl.util.tty as tty diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 42181b5502..c752ffb943 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -50,4 +50,4 @@ def dependents(parser, args): if deps: spack.cmd.display_specs(deps) else: - print "No dependents" + print("No dependents") diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index 49fc48700c..ed18940ac0 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -22,8 +22,11 @@ # 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 __future__ import print_function + import os import argparse + import llnl.util.tty as tty import spack.cmd import spack.build_environment as build_env @@ -64,7 +67,7 @@ def env(parser, args): if not cmd: # If no command act like the "env" command and print out env vars. for key, val in os.environ.items(): - print "%s=%s" % (key, val) + print("%s=%s" % (key, val)) else: # Otherwise execute the command with the new environment diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index d5ed9adf18..47f531fe84 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -22,6 +22,8 @@ # 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 __future__ import print_function + import re import os import sys @@ -175,12 +177,12 @@ def flake8(parser, args): file_list = changed_files() shutil.copy('.flake8', os.path.join(temp, '.flake8')) - print '=======================================================' - print 'flake8: running flake8 code checks on spack.' - print - print 'Modified files:' + print('=======================================================') + print('flake8: running flake8 code checks on spack.') + print() + print('Modified files:') for filename in file_list: - print " %s" % filename.strip() + print(" %s" % filename.strip()) print('=======================================================') # filter files into a temporary directory with exemptions added. @@ -196,7 +198,7 @@ def flake8(parser, args): if args.root_relative: # print results relative to repo root. - print output + print(output) else: # print results relative to current working directory def cwd_relative(path): @@ -204,16 +206,16 @@ def flake8(parser, args): os.path.join(spack.prefix, path.group(1)), os.getcwd()) for line in output.split('\n'): - print re.sub(r'^(.*): \[', cwd_relative, line) + print(re.sub(r'^(.*): \[', cwd_relative, line)) if flake8.returncode != 0: - print "Flake8 found errors." + print("Flake8 found errors.") sys.exit(1) else: - print "Flake8 checks were clean." + print("Flake8 checks were clean.") finally: if args.keep_temp: - print "temporary files are in ", temp + print("temporary files are in ", temp) else: shutil.rmtree(temp, ignore_errors=True) diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py index 414b6d78ec..ee401d8fb7 100644 --- a/lib/spack/spack/cmd/graph.py +++ b/lib/spack/spack/cmd/graph.py @@ -22,8 +22,9 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse +from __future__ import print_function +import argparse import llnl.util.tty as tty import spack @@ -96,5 +97,5 @@ def graph(parser, args): elif specs: # ascii is default: user doesn't need to provide it explicitly graph_ascii(specs[0], debug=spack.debug, deptype=deptype) for spec in specs[1:]: - print # extra line bt/w independent graphs + print() # extra line bt/w independent graphs graph_ascii(spec, debug=spack.debug) diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 1dd0ee4e78..799471ffcc 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -22,7 +22,10 @@ # 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 __future__ import print_function + import textwrap + from llnl.util.tty.colify import * import spack import spack.fetch_strategy as fs @@ -50,12 +53,12 @@ def print_text_info(pkg): """Print out a plain text description of a package.""" header = "{0}: ".format(pkg.build_system_class) - print header, pkg.name + print(header, pkg.name) whitespaces = ''.join([' '] * (len(header) - len("Homepage: "))) - print "Homepage:", whitespaces, pkg.homepage + print("Homepage:", whitespaces, pkg.homepage) - print - print "Safe versions: " + print() + print("Safe versions: ") if not pkg.versions: print(" None") @@ -63,20 +66,20 @@ def print_text_info(pkg): pad = padder(pkg.versions, 4) for v in reversed(sorted(pkg.versions)): f = fs.for_package_version(pkg, v) - print " %s%s" % (pad(v), str(f)) + print(" %s%s" % (pad(v), str(f))) - print - print "Variants:" + print() + print("Variants:") if not pkg.variants: - print " None" + print(" None") else: pad = padder(pkg.variants, 4) maxv = max(len(v) for v in sorted(pkg.variants)) fmt = "%%-%ss%%-10s%%s" % (maxv + 4) - print " " + fmt % ('Name', 'Default', 'Description') - print + print(" " + fmt % ('Name', 'Default', 'Description')) + print() for name in sorted(pkg.variants): v = pkg.variants[name] default = 'on' if v.default else 'off' @@ -85,26 +88,26 @@ def print_text_info(pkg): lines[1:] = [" " + (" " * maxv) + l for l in lines[1:]] desc = "\n".join(lines) - print " " + fmt % (name, default, desc) + print(" " + fmt % (name, default, desc)) - print - print "Installation Phases:" + print() + print("Installation Phases:") phase_str = '' for phase in pkg.phases: phase_str += " {0}".format(phase) - print phase_str + print(phase_str) for deptype in ('build', 'link', 'run'): - print - print "%s Dependencies:" % deptype.capitalize() + print() + print("%s Dependencies:" % deptype.capitalize()) deps = sorted(pkg.dependencies_of_type(deptype)) if deps: colify(deps, indent=4) else: - print " None" + print(" None") - print - print "Virtual Packages: " + print() + print("Virtual Packages: ") if pkg.provided: inverse_map = {} for spec, whens in pkg.provided.items(): @@ -113,17 +116,17 @@ def print_text_info(pkg): inverse_map[when] = set() inverse_map[when].add(spec) for when, specs in reversed(sorted(inverse_map.items())): - print " %s provides %s" % ( - when, ', '.join(str(s) for s in specs)) + print(" %s provides %s" % ( + when, ', '.join(str(s) for s in specs))) else: - print " None" + print(" None") - print - print "Description:" + print() + print("Description:") if pkg.__doc__: - print pkg.format_doc(indent=4) + print(pkg.format_doc(indent=4)) else: - print " None" + print(" None") def info(parser, args): diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index b5b699dccd..bcfb092945 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -22,12 +22,14 @@ # 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 __future__ import print_function + import argparse import cgi import fnmatch import re import sys -from StringIO import StringIO +from six import StringIO import llnl.util.tty as tty import spack @@ -123,42 +125,42 @@ def rst(pkgs): pkgs = [spack.repo.get(name) for name in pkg_names] print('.. _package-list:') - print('') + print() print('============') print('Package List') print('============') - print('') + print() print('This is a list of things you can install using Spack. It is') print('automatically generated based on the packages in the latest Spack') print('release.') - print('') + print() print('Spack currently has %d mainline packages:' % len(pkgs)) - print('') + print() print(rst_table('`%s`_' % p for p in pkg_names)) - print('') + print() # Output some text for each package. for pkg in pkgs: print('-----') - print('') + print() print('.. _%s:' % pkg.name) - print('') + print() # Must be at least 2 long, breaks for single letter packages like R. print('-' * max(len(pkg.name), 2)) print(pkg.name) print('-' * max(len(pkg.name), 2)) - print('') + print() print('Homepage:') print(' * `%s <%s>`__' % (cgi.escape(pkg.homepage), pkg.homepage)) - print('') + print() print('Spack package:') print(' * `%s/package.py <%s>`__' % (pkg.name, github_url(pkg))) - print('') + print() if pkg.versions: print('Versions:') print(' ' + ', '.join(str(v) for v in reversed(sorted(pkg.versions)))) - print('') + print() for deptype in spack.alldeps: deps = pkg.dependencies_of_type(deptype) @@ -166,11 +168,11 @@ def rst(pkgs): print('%s Dependencies' % deptype.capitalize()) print(' ' + ', '.join('%s_' % d if d in pkg_names else d for d in deps)) - print('') + print() print('Description:') print(pkg.format_doc(indent=2)) - print('') + print() def list(parser, args): diff --git a/lib/spack/spack/cmd/location.py b/lib/spack/spack/cmd/location.py index c82b7072f9..d1a7825630 100644 --- a/lib/spack/spack/cmd/location.py +++ b/lib/spack/spack/cmd/location.py @@ -22,8 +22,9 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse +from __future__ import print_function +import argparse import llnl.util.tty as tty import spack @@ -70,16 +71,16 @@ def setup_parser(subparser): def location(parser, args): if args.module_dir: - print spack.module_path + print(spack.module_path) elif args.spack_root: - print spack.prefix + print(spack.prefix) elif args.packages: - print spack.repo.first_repo().root + print(spack.repo.first_repo().root) elif args.stages: - print spack.stage_path + print(spack.stage_path) else: specs = spack.cmd.parse_specs(args.spec) @@ -91,14 +92,14 @@ def location(parser, args): if args.install_dir: # install_dir command matches against installed specs. spec = spack.cmd.disambiguate_spec(specs[0]) - print spec.prefix + print(spec.prefix) else: spec = specs[0] if args.package_dir: # This one just needs the spec name. - print spack.repo.dirname_for_package_name(spec.name) + print(spack.repo.dirname_for_package_name(spec.name)) else: # These versions need concretized specs. @@ -106,11 +107,11 @@ def location(parser, args): pkg = spack.repo.get(spec) if args.stage_dir: - print pkg.stage.path + print(pkg.stage.path) else: # args.build_dir is the default. if not pkg.stage.source_path: tty.die("Build directory does not exist yet. " "Run this to create it:", "spack stage " + " ".join(args.spec)) - print pkg.stage.source_path + print(pkg.stage.source_path) diff --git a/lib/spack/spack/cmd/md5.py b/lib/spack/spack/cmd/md5.py index 7940d1327b..fc205cc693 100644 --- a/lib/spack/spack/cmd/md5.py +++ b/lib/spack/spack/cmd/md5.py @@ -25,7 +25,7 @@ import argparse import hashlib import os -from urlparse import urlparse +from six.moves.urllib.parse import urlparse import llnl.util.tty as tty import spack.util.crypto diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index 2db75a0b1f..528fcbfc3f 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -141,7 +141,7 @@ def mirror_list(args): fmt = "%%-%ds%%s" % (max_len + 4) for name in mirrors: - print fmt % (name, mirrors[name]) + print(fmt % (name, mirrors[name])) def _read_specs_from_file(filename): @@ -152,7 +152,7 @@ def _read_specs_from_file(filename): s = Spec(string) s.package specs.append(s) - except SpackError, e: + except SpackError as e: tty.die("Parse error in %s, line %d:" % (args.file, i + 1), ">>> " + string, str(e)) return specs diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index 45104a9ff2..7b668586b5 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -22,6 +22,8 @@ # 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 __future__ import print_function + import os import argparse @@ -118,13 +120,13 @@ def pkg_diff(args): u1, u2 = diff_packages(args.rev1, args.rev2) if u1: - print "%s:" % args.rev1 + print("%s:" % args.rev1) colify(sorted(u1), indent=4) if u1: - print + print() if u2: - print "%s:" % args.rev2 + print("%s:" % args.rev2) colify(sorted(u2), indent=4) diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py index 1881654cac..dd75f148c2 100644 --- a/lib/spack/spack/cmd/repo.py +++ b/lib/spack/spack/cmd/repo.py @@ -22,6 +22,8 @@ # 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 __future__ import print_function + import os import llnl.util.tty as tty @@ -161,7 +163,7 @@ def repo_list(args): max_ns_len = max(len(r.namespace) for r in repos) for repo in repos: fmt = "%%-%ds%%s" % (max_ns_len + 4) - print fmt % (repo.namespace, repo.root) + print(fmt % (repo.namespace, repo.root)) def repo(parser, args): diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index 9eea404bc7..d89707f230 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -22,8 +22,9 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse +from __future__ import print_function +import argparse import spack import spack.cmd import spack.cmd.common.arguments as arguments @@ -69,20 +70,20 @@ def spec(parser, args): # With -y, just print YAML to output. if args.yaml: spec.concretize() - print spec.to_yaml() + print(spec.to_yaml()) continue # Print some diagnostic info by default. - print "Input spec" - print "--------------------------------" - print spec.tree(**kwargs) + print("Input spec") + print("--------------------------------") + print(spec.tree(**kwargs)) - print "Normalized" - print "--------------------------------" + print("Normalized") + print("--------------------------------") spec.normalize() - print spec.tree(**kwargs) + print(spec.tree(**kwargs)) - print "Concretized" - print "--------------------------------" + print("Concretized") + print("--------------------------------") spec.concretize() - print spec.tree(**kwargs) + print(spec.tree(**kwargs)) diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py index c569a1bc88..9384e3a9e6 100644 --- a/lib/spack/spack/cmd/test.py +++ b/lib/spack/spack/cmd/test.py @@ -22,12 +22,14 @@ # 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 __future__ import print_function + import sys import os import re import argparse import pytest -from StringIO import StringIO +from six import StringIO from llnl.util.filesystem import * from llnl.util.tty.colify import colify @@ -79,7 +81,7 @@ def do_list(args, unknown_args): output_lines.append( os.path.basename(name).replace('.py', '')) else: - print indent + name + print(indent + name) if args.list: colify(output_lines) diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py index dacca2489b..f65ef14406 100644 --- a/lib/spack/spack/cmd/versions.py +++ b/lib/spack/spack/cmd/versions.py @@ -22,6 +22,8 @@ # 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 __future__ import print_function + from llnl.util.tty.colify import colify import llnl.util.tty as tty import spack @@ -47,10 +49,10 @@ def versions(parser, args): tty.msg("Remote versions (not yet checksummed):") if not remote_versions: if not fetched_versions: - print " Found no versions for %s" % pkg.name + print(" Found no versions for %s" % pkg.name) tty.debug("Check the list_url and list_depth attribute on the " "package to help Spack find versions.") else: - print " Found no unckecksummed versions for %s" % pkg.name + print(" Found no unckecksummed versions for %s" % pkg.name) else: colify(sorted(remote_versions, reverse=True), indent=2) diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py index 9e9c7cbcb4..90af900d0d 100644 --- a/lib/spack/spack/compiler.py +++ b/lib/spack/spack/compiler.py @@ -265,11 +265,11 @@ class Compiler(object): full_path, prefix, suffix = key version = detect_version(full_path) return (version, prefix, suffix, full_path) - except ProcessError, e: + except ProcessError as e: tty.debug( "Couldn't get version for compiler %s" % full_path, e) return None - except Exception, e: + except Exception as e: # Catching "Exception" here is fine because it just # means something went wrong running a candidate executable. tty.debug("Error while executing candidate compiler %s" diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index a16caa3a6c..585df23320 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -335,7 +335,7 @@ def get_compiler_duplicates(compiler_spec, arch_spec): scope_to_compilers[scope] = compilers cfg_file_to_duplicates = dict() - for scope, compilers in scope_to_compilers.iteritems(): + for scope, compilers in scope_to_compilers.items(): config_file = config_scopes[scope].get_section_filename('compilers') cfg_file_to_duplicates[config_file] = compilers @@ -401,7 +401,7 @@ class CompilerDuplicateError(spack.error.SpackError): config_file_to_duplicates = get_compiler_duplicates( compiler_spec, arch_spec) duplicate_table = list( - (x, len(y)) for x, y in config_file_to_duplicates.iteritems()) + (x, len(y)) for x, y in config_file_to_duplicates.items()) descriptor = lambda num: 'time' if num == 1 else 'times' duplicate_msg = ( lambda cfgfile, count: "{0}: {1} {2}".format( diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 126db8b780..6ab796810b 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -34,6 +34,8 @@ TODO: make this customizable and allow users to configure concretization policies. """ from __future__ import print_function +from six import iteritems + import spack import spack.spec import spack.compilers @@ -241,7 +243,7 @@ class DefaultConcretizer(object): def concretize_architecture(self, spec): """If the spec is empty provide the defaults of the platform. If the - architecture is not a basestring, then check if either the platform, + architecture is not a string type, then check if either the platform, target or operating system are concretized. If any of the fields are changed then return True. If everything is concretized (i.e the architecture attribute is a namedtuple of classes) then return False. @@ -262,7 +264,7 @@ class DefaultConcretizer(object): while not spec.architecture.concrete and default_archs: arch = default_archs.pop(0) - replacement_fields = [k for k, v in arch.to_cmp_dict().iteritems() + replacement_fields = [k for k, v in iteritems(arch.to_cmp_dict()) if v and not getattr(spec.architecture, k)] for field in replacement_fields: setattr(spec.architecture, field, getattr(arch, field)) diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index 56c6421457..7c3d614aee 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -52,6 +52,8 @@ import copy import os import re import sys +from six import string_types +from six import iteritems import yaml import jsonschema @@ -108,7 +110,7 @@ def extend_with_default(validator_class): "patternProperties"] def set_defaults(validator, properties, instance, schema): - for property, subschema in properties.iteritems(): + for property, subschema in iteritems(properties): if "default" in subschema: instance.setdefault(property, subschema["default"]) for err in validate_properties( @@ -116,10 +118,10 @@ def extend_with_default(validator_class): yield err def set_pp_defaults(validator, properties, instance, schema): - for property, subschema in properties.iteritems(): + for property, subschema in iteritems(properties): if "default" in subschema: if isinstance(instance, dict): - for key, val in instance.iteritems(): + for key, val in iteritems(instance): if re.match(property, key) and val is None: instance[key] = subschema["default"] @@ -306,8 +308,8 @@ def _mark_overrides(data): elif isinstance(data, dict): marked = {} - for key, val in data.iteritems(): - if isinstance(key, basestring) and key.endswith(':'): + for key, val in iteritems(data): + if isinstance(key, string_types) and key.endswith(':'): key = syaml.syaml_str(key[:-1]) key.override = True marked[key] = _mark_overrides(val) @@ -348,7 +350,7 @@ def _merge_yaml(dest, source): # Source dict is merged into dest. elif they_are(dict): - for sk, sv in source.iteritems(): + for sk, sv in iteritems(source): if override(sk) or sk not in dest: # if sk ended with ::, or if it's new, completely override dest[sk] = copy.copy(sv) diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index c81512d682..c63da4cf2e 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -41,6 +41,8 @@ filesystem. """ import os import socket +from six import string_types +from six import iteritems from yaml.error import MarkedYAMLError, YAMLError @@ -260,7 +262,7 @@ class Database(object): raise ValueError("Invalid database format: %s" % format) try: - if isinstance(stream, basestring): + if isinstance(stream, string_types): with open(stream, 'r') as f: fdata = load(f) else: @@ -511,7 +513,7 @@ class Database(object): new_spec, path, installed, ref_count=0, explicit=explicit) # Connect dependencies from the DB to the new copy. - for name, dep in spec.dependencies_dict(_tracked_deps).iteritems(): + for name, dep in iteritems(spec.dependencies_dict(_tracked_deps)): dkey = dep.spec.dag_hash() new_spec._add_dependency(self._data[dkey].spec, dep.deptypes) self._data[dkey].ref_count += 1 diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 58eabb9e3b..db280cb5fd 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -51,6 +51,7 @@ import functools import inspect import os.path import re +from six import string_types import llnl.util.lang import spack @@ -174,7 +175,7 @@ class DirectiveMetaMixin(type): """ global __all__ - if isinstance(dicts, basestring): + if isinstance(dicts, string_types): dicts = (dicts, ) if not isinstance(dicts, collections.Sequence): message = "dicts arg must be list, tuple, or string. Found {0}" diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 28e6584fb2..ff23ced6eb 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -23,7 +23,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import os -import exceptions import shutil import glob import tempfile @@ -137,7 +136,7 @@ class DirectoryLayout(object): if os.path.exists(path): try: shutil.rmtree(path) - except exceptions.OSError as e: + except OSError as e: raise RemoveFailedError(spec, path, e) path = os.path.dirname(path) diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index 1333054518..76b8e132d4 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -291,7 +291,7 @@ class EnvironmentModifications(object): shell_options = '{shell_options}'.format(**info) source_file = '{source_command} {file} {concatenate_on_success}' - dump_cmd = "import os, json; print json.dumps(dict(os.environ))" + dump_cmd = "import os, json; print(json.dumps(dict(os.environ)))" dump_environment = 'python -c "%s"' % dump_cmd # Construct the command that will be executed diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index b6261a05f4..cd1ae5b25c 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -22,8 +22,11 @@ # 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 __future__ import print_function + import os import sys + import llnl.util.tty as tty import spack import inspect diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index d510db568f..0f97dda8b8 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -46,6 +46,9 @@ import re import shutil import copy from functools import wraps +from six import string_types +from six import with_metaclass + import llnl.util.tty as tty from llnl.util.filesystem import * import spack @@ -74,20 +77,19 @@ def _needs_stage(fun): return wrapper -class FetchStrategy(object): +class FSMeta(type): + """This metaclass registers all fetch strategies in a list.""" + def __init__(cls, name, bases, dict): + type.__init__(cls, name, bases, dict) + if cls.enabled: + all_strategies.append(cls) + +class FetchStrategy(with_metaclass(FSMeta, object)): """Superclass of all fetch strategies.""" enabled = False # Non-abstract subclasses should be enabled. required_attributes = None # Attributes required in version() args. - class __metaclass__(type): - - """This metaclass registers all fetch strategies in a list.""" - - def __init__(cls, name, bases, dict): - type.__init__(cls, name, bases, dict) - if cls.enabled: - all_strategies.append(cls) def __init__(self): # The stage is initialized late, so that fetch strategies can be @@ -319,7 +321,7 @@ class URLFetchStrategy(FetchStrategy): # top-level directory. We ignore hidden files to accomodate # these "semi-exploding" tarballs. files = os.listdir(tarball_container) - non_hidden = filter(lambda f: not f.startswith('.'), files) + non_hidden = [f for f in files if not f.startswith('.')] if len(non_hidden) == 1: expanded_dir = os.path.join(tarball_container, non_hidden[0]) if os.path.isdir(expanded_dir): @@ -461,7 +463,7 @@ class VCSFetchStrategy(FetchStrategy): patterns = kwargs.get('exclude', None) if patterns is not None: - if isinstance(patterns, basestring): + if isinstance(patterns, string_types): patterns = [patterns] for p in patterns: tar.add_default_arg('--exclude=%s' % p) diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py index 91230263f1..04e6cc7fca 100644 --- a/lib/spack/spack/graph.py +++ b/lib/spack/spack/graph.py @@ -63,6 +63,7 @@ can take a number of specs as input. """ from heapq import * +from six import iteritems from llnl.util.lang import * from llnl.util.tty.color import * @@ -562,7 +563,7 @@ def graph_dot(specs, deptype=None, static=False, out=None): continue # Add edges for each depends_on in the package. - for dep_name, dep in spec.package.dependencies.iteritems(): + for dep_name, dep in iteritems(spec.package.dependencies): deps.add((spec.name, dep_name)) # If the package provides something, add an edge for that. diff --git a/lib/spack/spack/hooks/case_consistency.py b/lib/spack/spack/hooks/case_consistency.py index faf38f7ae3..e9208ee9ff 100644 --- a/lib/spack/spack/hooks/case_consistency.py +++ b/lib/spack/spack/hooks/case_consistency.py @@ -23,6 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from __future__ import absolute_import + import os import re import platform diff --git a/lib/spack/spack/hooks/module_file_generation.py b/lib/spack/spack/hooks/module_file_generation.py index 445cea4e91..ff9617ff1c 100644 --- a/lib/spack/spack/hooks/module_file_generation.py +++ b/lib/spack/spack/hooks/module_file_generation.py @@ -23,15 +23,16 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import spack.modules +from six import iteritems def post_install(pkg): - for item, cls in spack.modules.module_types.iteritems(): + for item, cls in iteritems(spack.modules.module_types): generator = cls(pkg.spec) generator.write() def post_uninstall(pkg): - for item, cls in spack.modules.module_types.iteritems(): + for item, cls in iteritems(spack.modules.module_types): generator = cls(pkg.spec) generator.remove() diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py index a6ffded935..8c702f1111 100644 --- a/lib/spack/spack/modules.py +++ b/lib/spack/spack/modules.py @@ -46,6 +46,8 @@ import os.path import re import string import textwrap +from six import iteritems +from six import with_metaclass import llnl.util.tty as tty from llnl.util.filesystem import join_path, mkdirp @@ -213,7 +215,7 @@ def parse_config_options(module_generator): for x in arglist: yield (x, ) else: - for x in arglist.iteritems(): + for x in iteritems(arglist): yield x for method, arglist in environment_actions.items(): @@ -246,17 +248,17 @@ def format_env_var_name(name): return name.replace('-', '_').upper() -class EnvModule(object): - name = 'env_module' - formats = {} +class ModuleMeta(type): + """Metaclass registers modules in themodule_types dict.""" + def __init__(cls, name, bases, dict): + type.__init__(cls, name, bases, dict) + if cls.name != 'env_module' and cls.name in _module_config['enable']: + module_types[cls.name] = cls - class __metaclass__(type): - def __init__(cls, name, bases, dict): - type.__init__(cls, name, bases, dict) - if cls.name != 'env_module' and cls.name in _module_config[ - 'enable']: - module_types[cls.name] = cls +class EnvModule(with_metaclass(ModuleMeta, object)): + name = 'env_module' + formats = {} def __init__(self, spec=None): self.spec = spec diff --git a/lib/spack/spack/operating_systems/cnl.py b/lib/spack/spack/operating_systems/cnl.py index 7acab1cbcb..b5c759bbcb 100644 --- a/lib/spack/spack/operating_systems/cnl.py +++ b/lib/spack/spack/operating_systems/cnl.py @@ -54,7 +54,7 @@ class Cnl(OperatingSystem): # ensure all the version calls we made are cached in the parent # process, as well. This speeds up Spack a lot. - clist = reduce(lambda x, y: x + y, compiler_lists) + clist = [comp for cl in compiler_lists for comp in cl] return clist def find_compiler(self, cmp_cls, *paths): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 80d65bd739..6b71c0f1a9 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -42,6 +42,9 @@ import re import sys import textwrap import time +from six import StringIO +from six import string_types +from six import with_metaclass import llnl.util.lock import llnl.util.tty as tty @@ -56,7 +59,7 @@ import spack.mirror import spack.repository import spack.url import spack.util.web -from StringIO import StringIO + from llnl.util.filesystem import * from llnl.util.lang import * from llnl.util.link_tree import LinkTree @@ -238,7 +241,7 @@ def on_package_attributes(**attr_dict): return _execute_under_condition -class PackageBase(object): +class PackageBase(with_metaclass(PackageMeta, object)): """This is the superclass for all spack packages. ***The Package class*** @@ -475,7 +478,6 @@ class PackageBase(object): Package creators override functions like install() (all of them do this), clean() (some of them do this), and others to provide custom behavior. """ - __metaclass__ = PackageMeta # # These are default values for instance variables. # @@ -1115,6 +1117,13 @@ class PackageBase(object): finally: self.prefix_lock.release_write() + @contextlib.contextmanager + def _stage_and_write_lock(self): + """Prefix lock nested in a stage.""" + with self.stage: + with self._prefix_write_lock(): + yield + def do_install(self, keep_prefix=False, keep_stage=False, @@ -1233,7 +1242,7 @@ class PackageBase(object): self.stage.keep = keep_stage - with contextlib.nested(self.stage, self._prefix_write_lock()): + with self._stage_and_write_lock(): # Run the pre-install hook in the child process after # the directory is created. spack.hooks.pre_install(self) @@ -1265,9 +1274,10 @@ class PackageBase(object): input_stream=input_stream ) with redirection_context as log_redirection: - for phase_name, phase in zip(self.phases, self._InstallPhase_phases): # NOQA: ignore=E501 + for phase_name, phase in zip( + self.phases, self._InstallPhase_phases): tty.msg( - 'Executing phase : \'{0}\''.format(phase_name) # NOQA: ignore=E501 + 'Executing phase : \'{0}\''.format(phase_name) ) # Redirect stdout and stderr to daemon pipe with log_redirection: @@ -1355,7 +1365,7 @@ class PackageBase(object): """This function checks whether install succeeded.""" def check_paths(path_list, filetype, predicate): - if isinstance(path_list, basestring): + if isinstance(path_list, string_types): path_list = [path_list] for path in path_list: diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 63f90d9b50..3dc90a8eb9 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -22,6 +22,8 @@ # 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 six import string_types +from six import iteritems import spack import spack.error @@ -180,7 +182,7 @@ class PreferredPackages(object): variants = self.preferred.get(pkg, {}).get('variants', '') if variants: break - if not isinstance(variants, basestring): + if not isinstance(variants, string_types): variants = " ".join(variants) pkg = spack.repo.get(pkgname) spec = spack.spec.Spec("%s %s" % (pkgname, variants)) @@ -233,7 +235,7 @@ def spec_externals(spec): if (not pkg_paths) and (not pkg_modules): return [] - for external_spec, path in pkg_paths.iteritems(): + for external_spec, path in iteritems(pkg_paths): if not path: # skip entries without paths (avoid creating extra Specs) continue @@ -242,7 +244,7 @@ def spec_externals(spec): if external_spec.satisfies(spec): external_specs.append(external_spec) - for external_spec, module in pkg_modules.iteritems(): + for external_spec, module in iteritems(pkg_modules): if not module: continue diff --git a/lib/spack/spack/package_test.py b/lib/spack/spack/package_test.py index e366b5f0e5..54f424d45e 100644 --- a/lib/spack/spack/package_test.py +++ b/lib/spack/spack/package_test.py @@ -45,15 +45,15 @@ def compile_c_and_execute(source_file, include_flags, link_flags): def compare_output(current_output, blessed_output): """Compare blessed and current output of executables.""" if not (current_output == blessed_output): - print "Produced output does not match expected output." - print "Expected output:" - print '-' * 80 - print blessed_output - print '-' * 80 - print "Produced output:" - print '-' * 80 - print current_output - print '-' * 80 + print("Produced output does not match expected output.") + print("Expected output:") + print('-' * 80) + print(blessed_output) + print('-' * 80) + print("Produced output:") + print('-' * 80) + print(current_output) + print('-' * 80) raise RuntimeError("Ouput check failed.", "See spack_output.log for details") diff --git a/lib/spack/spack/parse.py b/lib/spack/spack/parse.py index e116175823..da11268bb2 100644 --- a/lib/spack/spack/parse.py +++ b/lib/spack/spack/parse.py @@ -25,6 +25,8 @@ import re import shlex import itertools +from six import string_types + import spack.error @@ -118,7 +120,7 @@ class Parser(object): def gettok(self): """Puts the next token in the input stream into self.next.""" try: - self.next = self.tokens.next() + self.next = next(self.tokens) except StopIteration: self.next = None @@ -159,7 +161,7 @@ class Parser(object): sys.exit(1) def setup(self, text): - if isinstance(text, basestring): + if isinstance(text, string_types): text = shlex.split(text) self.text = text self.push_tokens(self.lexer.lex(text)) diff --git a/lib/spack/spack/provider_index.py b/lib/spack/spack/provider_index.py index 0e771c6255..7dee838619 100644 --- a/lib/spack/spack/provider_index.py +++ b/lib/spack/spack/provider_index.py @@ -26,6 +26,7 @@ The ``virtual`` module contains utility classes for virtual dependencies. """ from itertools import product as iproduct +from six import iteritems from pprint import pformat import spack.util.spack_yaml as syaml @@ -97,7 +98,7 @@ class ProviderIndex(object): assert(not spec.virtual) pkg = spec.package - for provided_spec, provider_specs in pkg.provided.iteritems(): + for provided_spec, provider_specs in iteritems(pkg.provided): for provider_spec in provider_specs: # TODO: fix this comment. # We want satisfaction other than flags @@ -201,7 +202,7 @@ class ProviderIndex(object): def from_yaml(stream): try: yfile = syaml.load(stream) - except MarkedYAMLError, e: + except MarkedYAMLError as e: raise spack.spec.SpackYAMLError( "error parsing YAML ProviderIndex cache:", str(e)) @@ -288,7 +289,7 @@ def _transform(providers, transform_fun, out_mapping_type=dict): """ def mapiter(mappings): if isinstance(mappings, dict): - return mappings.iteritems() + return iteritems(mappings) else: return iter(mappings) diff --git a/lib/spack/spack/repository.py b/lib/spack/spack/repository.py index 1536ecb0e6..5486f7a9a4 100644 --- a/lib/spack/spack/repository.py +++ b/lib/spack/spack/repository.py @@ -26,7 +26,6 @@ import os import stat import shutil import errno -import exceptions import sys import inspect import imp @@ -558,7 +557,7 @@ class Repo(object): return yaml_data['repo'] - except exceptions.IOError: + except IOError: tty.die("Error reading %s when opening %s" % (self.config_file, self.root)) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 08b92cf705..8b0e560c8a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -97,13 +97,14 @@ expansion when it is the first character in an id typed on the command line. """ import base64 import collections -import csv import ctypes import hashlib import itertools from operator import attrgetter +from six import StringIO +from six import string_types +from six import iteritems -import cStringIO import llnl.util.tty as tty import spack import spack.architecture @@ -113,7 +114,7 @@ import spack.parse import spack.store import spack.util.spack_json as sjson import spack.util.spack_yaml as syaml -from cStringIO import StringIO + from llnl.util.filesystem import find_libraries from llnl.util.lang import * from llnl.util.tty.color import * @@ -222,7 +223,7 @@ def canonical_deptype(deptype): if deptype is None: return alldeps - elif isinstance(deptype, str): + elif isinstance(deptype, string_types): return special_types.get(deptype, (deptype,)) elif isinstance(deptype, (tuple, list)): @@ -270,7 +271,7 @@ class ArchSpec(object): spec_like = args[0] if isinstance(spec_like, ArchSpec): self._dup(spec_like) - elif isinstance(spec_like, basestring): + elif isinstance(spec_like, string_types): spec_fields = spec_like.split("-") if len(spec_fields) == 3: @@ -391,7 +392,7 @@ class ArchSpec(object): raise UnsatisfiableArchitectureSpecError(self, other) constrained = False - for attr, svalue in self.to_cmp_dict().iteritems(): + for attr, svalue in iteritems(self.to_cmp_dict()): ovalue = getattr(other, attr) if svalue is None and ovalue is not None: setattr(self, attr, ovalue) @@ -406,7 +407,7 @@ class ArchSpec(object): @property def concrete(self): - return all(v for k, v in self.to_cmp_dict().iteritems()) + return all(v for k, v in iteritems(self.to_cmp_dict())) def to_cmp_dict(self): """Returns a dictionary that can be used for field comparison.""" @@ -464,7 +465,7 @@ class CompilerSpec(object): arg = args[0] # If there is one argument, it's either another CompilerSpec # to copy or a string to parse - if isinstance(arg, basestring): + if isinstance(arg, string_types): c = SpecParser().parse_compiler(arg) self.name = c.name self.versions = c.versions @@ -728,7 +729,7 @@ class FlagMap(HashableMap): return clone def _cmp_key(self): - return tuple((k, tuple(v)) for k, v in sorted(self.iteritems())) + return tuple((k, tuple(v)) for k, v in sorted(iteritems(self))) def __str__(self): sorted_keys = filter( @@ -918,7 +919,7 @@ class Spec(object): return # Parse if the spec_like is a string. - if not isinstance(spec_like, basestring): + if not isinstance(spec_like, string_types): raise TypeError("Can't make spec out of %s" % type(spec_like)) spec_list = SpecParser().parse(spec_like) @@ -1018,9 +1019,9 @@ class Spec(object): if name in self.variants: raise DuplicateVariantError( "Cannot specify variant '%s' twice" % name) - if isinstance(value, basestring) and value.upper() == 'TRUE': + if isinstance(value, string_types) and value.upper() == 'TRUE': value = True - elif isinstance(value, basestring) and value.upper() == 'FALSE': + elif isinstance(value, string_types) and value.upper() == 'FALSE': value = False self.variants[name] = VariantSpec(name, value) @@ -1056,7 +1057,7 @@ class Spec(object): new_vals = tuple(kwargs.get(arg, None) for arg in arch_attrs) self.architecture = ArchSpec(*new_vals) else: - new_attrvals = [(a, v) for a, v in kwargs.iteritems() + new_attrvals = [(a, v) for a, v in iteritems(kwargs) if a in arch_attrs] for new_attr, new_value in new_attrvals: if getattr(self.architecture, new_attr): @@ -1219,7 +1220,7 @@ class Spec(object): # get initial values for kwargs depth = kwargs.get('depth', False) key_fun = kwargs.get('key', id) - if isinstance(key_fun, basestring): + if isinstance(key_fun, string_types): key_fun = attrgetter(key_fun) yield_root = kwargs.get('root', True) cover = kwargs.get('cover', 'nodes') @@ -1314,7 +1315,7 @@ class Spec(object): else: yaml_text = syaml.dump( self.to_node_dict(), default_flow_style=True, width=maxint) - sha = hashlib.sha1(yaml_text) + sha = hashlib.sha1(yaml_text.encode('utf-8')) b32_hash = base64.b32encode(sha.digest()).lower() if self.concrete: self._hash = b32_hash @@ -1421,7 +1422,7 @@ class Spec(object): formats so that reindex will work on old specs/databases. """ for dep_name, elt in dependency_dict.items(): - if isinstance(elt, basestring): + if isinstance(elt, string_types): # original format, elt is just the dependency hash. dag_hash, deptypes = elt, ['build', 'link'] elif isinstance(elt, tuple): @@ -2413,11 +2414,8 @@ class Spec(object): if query_parameters: # We have extra query parameters, which are comma separated # values - f = cStringIO.StringIO(query_parameters.pop()) - try: - query_parameters = next(csv.reader(f, skipinitialspace=True)) - except StopIteration: - query_parameters = [''] + csv = query_parameters.pop().strip() + query_parameters = re.split(r'\s*,\s*', csv) try: value = next( diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 91f77839d8..03b7f5ef33 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -29,18 +29,19 @@ import hashlib import shutil import tempfile import getpass -from urlparse import urljoin +from six import string_types +from six import iteritems +from six.moves.urllib.parse import urljoin import llnl.util.tty as tty import llnl.util.lock from llnl.util.filesystem import * -import spack.util.pattern as pattern - import spack import spack.config -import spack.fetch_strategy as fs import spack.error +import spack.fetch_strategy as fs +import spack.util.pattern as pattern from spack.version import * from spack.util.path import canonicalize_path from spack.util.crypto import prefix_bits, bit_length @@ -84,7 +85,7 @@ def get_tmp_root(): if _tmp_root is None: config = spack.config.get_config('config') candidates = config['build_stage'] - if isinstance(candidates, basestring): + if isinstance(candidates, string_types): candidates = [candidates] path = _first_accessible_path(candidates) @@ -188,7 +189,7 @@ class Stage(object): """ # TODO: fetch/stage coupling needs to be reworked -- the logic # TODO: here is convoluted and not modular enough. - if isinstance(url_or_fetch_strategy, basestring): + if isinstance(url_or_fetch_strategy, string_types): self.fetcher = fs.from_url(url_or_fetch_strategy) elif isinstance(url_or_fetch_strategy, fs.FetchStrategy): self.fetcher = url_or_fetch_strategy @@ -548,7 +549,7 @@ class ResourceStage(Stage): if not isinstance(placement, dict): placement = {'': placement} # Make the paths in the dictionary absolute and link - for key, value in placement.iteritems(): + for key, value in iteritems(placement): target_path = join_path( root_stage.source_path, resource.destination) destination_path = join_path(target_path, value) @@ -661,7 +662,7 @@ class DIYStage(object): def _get_mirrors(): """Get mirrors from spack configuration.""" config = spack.config.get_config('mirrors') - return [val for name, val in config.iteritems()] + return [val for name, val in iteritems(config)] def ensure_access(file=spack.stage_path): diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 304eb04a55..b57d39b441 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -22,19 +22,19 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import StringIO import argparse import codecs import collections import contextlib import unittest +from six import StringIO import llnl.util.filesystem import spack import spack.cmd import spack.cmd.install as install -FILE_REGISTRY = collections.defaultdict(StringIO.StringIO) +FILE_REGISTRY = collections.defaultdict(StringIO) # Monkey-patch open to write module files to a StringIO instance @@ -44,7 +44,7 @@ def mock_open(filename, mode, *args): message = 'test.test_install : unexpected opening mode for mock_open' raise RuntimeError(message) - FILE_REGISTRY[filename] = StringIO.StringIO() + FILE_REGISTRY[filename] = StringIO() try: yield FILE_REGISTRY[filename] diff --git a/lib/spack/spack/test/compilers.py b/lib/spack/spack/test/compilers.py index d0fc506f40..bc21ec886e 100644 --- a/lib/spack/spack/test/compilers.py +++ b/lib/spack/spack/test/compilers.py @@ -23,6 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import pytest +from six import iteritems import spack.spec import spack.compilers as compilers @@ -30,7 +31,7 @@ import spack.compilers as compilers @pytest.mark.usefixtures('config') class TestCompilers(object): - + def test_get_compiler_duplicates(self): # In this case there is only one instance of the specified compiler in # the test configuration (so it is not actually a duplicate), but the @@ -38,11 +39,11 @@ class TestCompilers(object): cfg_file_to_duplicates = compilers.get_compiler_duplicates( 'gcc@4.5.0', spack.spec.ArchSpec('cray-CNL-xeon')) assert len(cfg_file_to_duplicates) == 1 - cfg_file, duplicates = cfg_file_to_duplicates.iteritems().next() + cfg_file, duplicates = next(iteritems(cfg_file_to_duplicates)) assert len(duplicates) == 1 def test_all_compilers(self): all_compilers = compilers.all_compilers() - filtered = list(x for x in all_compilers if str(x.spec) == 'clang@3.3') - filtered = list(x for x in filtered if x.operating_system == 'SuSE11') + filtered = [x for x in all_compilers if str(x.spec) == 'clang@3.3'] + filtered = [x for x in filtered if x.operating_system == 'SuSE11'] assert len(filtered) == 1 diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index f344727674..2b7dc594ac 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -27,11 +27,12 @@ import copy import os import re import shutil +from six import StringIO -import cStringIO import llnl.util.filesystem import llnl.util.lang import ordereddict_backport + import py import pytest import spack @@ -56,11 +57,8 @@ def no_stdin_duplication(monkeypatch): """Duplicating stdin (or any other stream) returns an empty cStringIO object. """ - monkeypatch.setattr( - llnl.util.lang, - 'duplicate_stream', - lambda x: cStringIO.StringIO() - ) + monkeypatch.setattr(llnl.util.lang, 'duplicate_stream', + lambda x: StringIO()) @pytest.fixture(autouse=True) @@ -181,6 +179,7 @@ def config(configuration_dir): spack.config.clear_config_caches() + @pytest.fixture(scope='module') def database(tmpdir_factory, builtin_mock, config): """Creates a mock database with some packages installed note that @@ -312,7 +311,7 @@ def mock_archive(): "\ttouch $prefix/dummy_file\n" "EOF\n" ) - os.chmod(configure_path, 0755) + os.chmod(configure_path, 0o755) # Archive it current = tmpdir.chdir() archive_name = '{0}.tar.gz'.format(repo_name) diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py index ce7b07ed86..46dd4f1bc6 100644 --- a/lib/spack/spack/test/graph.py +++ b/lib/spack/spack/test/graph.py @@ -22,7 +22,7 @@ # 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 StringIO import StringIO +from six import StringIO from spack.spec import Spec from spack.graph import AsciiGraph, topological_sort, graph_dot diff --git a/lib/spack/spack/test/lock.py b/lib/spack/spack/test/lock.py index 4f62cd85e9..214797c1f6 100644 --- a/lib/spack/spack/test/lock.py +++ b/lib/spack/spack/test/lock.py @@ -283,7 +283,7 @@ class LockTest(unittest.TestCase): # ensure lock file exists the first time, so we open it read-only # to begin wtih. touch(self.lock_path) - os.chmod(self.lock_path, 0444) + os.chmod(self.lock_path, 0o444) lock = Lock(self.lock_path) self.assertTrue(lock._reads == 0) diff --git a/lib/spack/spack/test/make_executable.py b/lib/spack/spack/test/make_executable.py index 87a43a529a..1b3f384a8b 100644 --- a/lib/spack/spack/test/make_executable.py +++ b/lib/spack/spack/test/make_executable.py @@ -46,7 +46,7 @@ class MakeExecutableTest(unittest.TestCase): with open(make_exe, 'w') as f: f.write('#!/bin/sh\n') f.write('echo "$@"') - os.chmod(make_exe, 0700) + os.chmod(make_exe, 0o700) path_put_first('PATH', [self.tmpdir]) diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py index bb1b0006f8..0eb54cba2c 100644 --- a/lib/spack/spack/test/modules.py +++ b/lib/spack/spack/test/modules.py @@ -24,14 +24,14 @@ ############################################################################## import collections import contextlib +from six import StringIO -import cStringIO import pytest import spack.modules import spack.spec # Our "filesystem" for the tests below -FILE_REGISTRY = collections.defaultdict(cStringIO.StringIO) +FILE_REGISTRY = collections.defaultdict(StringIO) # Spec strings that will be used throughout the tests mpich_spec_string = 'mpich@3.0.4' mpileaks_spec_string = 'mpileaks' @@ -48,7 +48,7 @@ def stringio_open(monkeypatch): if not mode == 'w': raise RuntimeError('unexpected opening mode for stringio_open') - FILE_REGISTRY[filename] = cStringIO.StringIO() + FILE_REGISTRY[filename] = StringIO() try: yield FILE_REGISTRY[filename] diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py index fbcc70afe8..003936a77a 100644 --- a/lib/spack/spack/test/multimethod.py +++ b/lib/spack/spack/test/multimethod.py @@ -86,7 +86,7 @@ def test_default_works(builtin_mock): def test_target_match(builtin_mock): platform = spack.architecture.platform() - targets = platform.targets.values() + targets = list(platform.targets.values()) for target in targets[:-1]: pkg = spack.repo.get('multimethod target=' + target.name) assert pkg.different_by_target() == target.name diff --git a/lib/spack/spack/test/pattern.py b/lib/spack/spack/test/pattern.py index 0c772a0d2d..b76f88e670 100644 --- a/lib/spack/spack/test/pattern.py +++ b/lib/spack/spack/test/pattern.py @@ -86,6 +86,7 @@ class CompositeTest(unittest.TestCase): composite.append(self.Two()) composite.add() self.assertEqual(self.Base.counter, 3) + composite.pop() composite.subtract() self.assertEqual(self.Base.counter, 2) diff --git a/lib/spack/spack/test/provider_index.py b/lib/spack/spack/test/provider_index.py index a176d0c315..69a5c3cd40 100644 --- a/lib/spack/spack/test/provider_index.py +++ b/lib/spack/spack/test/provider_index.py @@ -37,7 +37,8 @@ Tests assume that mock packages provide this:: mpi@:10.0: set([zmpi])}, 'stuff': {stuff: set([externalvirtual])}} """ -import StringIO +from six import StringIO + import spack from spack.provider_index import ProviderIndex from spack.spec import Spec @@ -46,10 +47,10 @@ from spack.spec import Spec def test_yaml_round_trip(builtin_mock): p = ProviderIndex(spack.repo.all_package_names()) - ostream = StringIO.StringIO() + ostream = StringIO() p.to_yaml(ostream) - istream = StringIO.StringIO(ostream.getvalue()) + istream = StringIO(ostream.getvalue()) q = ProviderIndex.from_yaml(istream) assert p == q diff --git a/lib/spack/spack/test/python_version.py b/lib/spack/spack/test/python_version.py index 084eed7e33..ee0ff9d2c9 100644 --- a/lib/spack/spack/test/python_version.py +++ b/lib/spack/spack/test/python_version.py @@ -31,6 +31,8 @@ systems that ship with RHEL6/CentOS 6, which have Python 2.6 as the default version. Once those go away, we can likely drop 2.6 and increase the minimum supported Python 3 version, as well. """ +from __future__ import print_function + import os import sys import re diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index 2c414bd0c0..31d6203f7f 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -90,7 +90,7 @@ class TestSpecDag(object): names = ['mpileaks', 'callpath', 'dyninst', 'libdwarf', 'libelf', 'zmpi', 'fake'] - pairs = zip([0, 1, 2, 3, 4, 2, 3], names) + pairs = list(zip([0, 1, 2, 3, 4, 2, 3], names)) traversal = dag.traverse() assert [x.name for x in traversal] == names @@ -104,7 +104,7 @@ class TestSpecDag(object): names = ['mpileaks', 'callpath', 'dyninst', 'libdwarf', 'libelf', 'libelf', 'zmpi', 'fake', 'zmpi'] - pairs = zip([0, 1, 2, 3, 4, 3, 2, 3, 1], names) + pairs = list(zip([0, 1, 2, 3, 4, 3, 2, 3, 1], names)) traversal = dag.traverse(cover='edges') assert [x.name for x in traversal] == names @@ -118,7 +118,7 @@ class TestSpecDag(object): names = ['mpileaks', 'callpath', 'dyninst', 'libdwarf', 'libelf', 'libelf', 'zmpi', 'fake', 'zmpi', 'fake'] - pairs = zip([0, 1, 2, 3, 4, 3, 2, 3, 1, 2], names) + pairs = list(zip([0, 1, 2, 3, 4, 3, 2, 3, 1, 2], names)) traversal = dag.traverse(cover='paths') assert [x.name for x in traversal] == names @@ -132,7 +132,7 @@ class TestSpecDag(object): names = ['libelf', 'libdwarf', 'dyninst', 'fake', 'zmpi', 'callpath', 'mpileaks'] - pairs = zip([4, 3, 2, 3, 2, 1, 0], names) + pairs = list(zip([4, 3, 2, 3, 2, 1, 0], names)) traversal = dag.traverse(order='post') assert [x.name for x in traversal] == names @@ -146,7 +146,7 @@ class TestSpecDag(object): names = ['libelf', 'libdwarf', 'libelf', 'dyninst', 'fake', 'zmpi', 'callpath', 'zmpi', 'mpileaks'] - pairs = zip([4, 3, 3, 2, 3, 2, 1, 1, 0], names) + pairs = list(zip([4, 3, 3, 2, 3, 2, 1, 1, 0], names)) traversal = dag.traverse(cover='edges', order='post') assert [x.name for x in traversal] == names @@ -160,7 +160,7 @@ class TestSpecDag(object): names = ['libelf', 'libdwarf', 'libelf', 'dyninst', 'fake', 'zmpi', 'callpath', 'fake', 'zmpi', 'mpileaks'] - pairs = zip([4, 3, 3, 2, 3, 2, 1, 2, 1, 0], names) + pairs = list(zip([4, 3, 3, 2, 3, 2, 1, 2, 1, 0], names)) traversal = dag.traverse(cover='paths', order='post') assert [x.name for x in traversal] == names diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 89f4a16dfc..7502f23994 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -46,8 +46,8 @@ it's never been told about that version before. """ import os import re -from StringIO import StringIO -from urlparse import urlsplit, urlunsplit +from six import StringIO +from six.moves.urllib.parse import urlsplit, urlunsplit import llnl.util.tty as tty from llnl.util.tty.color import * @@ -486,7 +486,7 @@ def substitution_offsets(path): name_offsets = offsets[1::2] ver_offsets = [] - for i in xrange(0, len(name_parts), 2): + for i in range(0, len(name_parts), 2): vparts = re.split(ver, name_parts[i]) voffsets = cumsum(vparts, offsets[i], len) ver_offsets.extend(voffsets[1::2]) diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 7a960e88cb..372d0019e7 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -22,10 +22,10 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## - import os import re import subprocess +from six import string_types import llnl.util.tty as tty import spack @@ -129,7 +129,7 @@ class Executable(object): raise ValueError("Cannot use `str` as input stream.") def streamify(arg, mode): - if isinstance(arg, basestring): + if isinstance(arg, string_types): return open(arg, mode), True elif arg is str: return subprocess.PIPE, False diff --git a/lib/spack/spack/util/multiproc.py b/lib/spack/spack/util/multiproc.py index 6a25c45713..91bac57c26 100644 --- a/lib/spack/spack/util/multiproc.py +++ b/lib/spack/spack/util/multiproc.py @@ -28,7 +28,6 @@ than multiprocessing.Pool.apply() can. For example, apply() will fail to pickle functions if they're passed indirectly as parameters. """ from multiprocessing import Process, Pipe, Semaphore, Value -from itertools import izip __all__ = ['spawn', 'parmap', 'Barrier'] @@ -43,7 +42,7 @@ def spawn(f): def parmap(f, X): pipe = [Pipe() for x in X] proc = [Process(target=spawn(f), args=(c, x)) - for x, (p, c) in izip(X, pipe)] + for x, (p, c) in zip(X, pipe)] [p.start() for p in proc] [p.join() for p in proc] return [p.recv() for (p, c) in pipe] diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py index 9a5cdee411..1f2bfa88cf 100644 --- a/lib/spack/spack/util/naming.py +++ b/lib/spack/spack/util/naming.py @@ -27,7 +27,7 @@ from __future__ import absolute_import import string import itertools import re -from StringIO import StringIO +from six import StringIO import spack diff --git a/lib/spack/spack/util/pattern.py b/lib/spack/spack/util/pattern.py index b5731ccf08..7a1109f2d2 100644 --- a/lib/spack/spack/util/pattern.py +++ b/lib/spack/spack/util/pattern.py @@ -61,7 +61,7 @@ def composite(interface=None, method_list=None, container=list): # Retrieve the base class of the composite. Inspect its methods and # decide which ones will be overridden def no_special_no_private(x): - return inspect.ismethod(x) and not x.__name__.startswith('_') + return callable(x) and not x.__name__.startswith('_') # Patch the behavior of each of the methods in the previous list. # This is done associating an instance of the descriptor below to @@ -90,42 +90,25 @@ def composite(interface=None, method_list=None, container=list): return getter dictionary_for_type_call = {} + # Construct a dictionary with the methods explicitly passed as name if method_list is not None: - # python@2.7: method_list_dict = {name: IterateOver(name) for name - # in method_list} - method_list_dict = {} - for name in method_list: - method_list_dict[name] = IterateOver(name) - dictionary_for_type_call.update(method_list_dict) + dictionary_for_type_call.update( + (name, IterateOver(name)) for name in method_list) + # Construct a dictionary with the methods inspected from the interface if interface is not None: - ########## - # python@2.7: interface_methods = {name: method for name, method in - # inspect.getmembers(interface, predicate=no_special_no_private)} - interface_methods = {} - for name, method in inspect.getmembers( - interface, predicate=no_special_no_private): - interface_methods[name] = method - ########## - # python@2.7: interface_methods_dict = {name: IterateOver(name, - # method) for name, method in interface_methods.iteritems()} - interface_methods_dict = {} - for name, method in interface_methods.iteritems(): - interface_methods_dict[name] = IterateOver(name, method) - ########## - dictionary_for_type_call.update(interface_methods_dict) + dictionary_for_type_call.update( + (name, IterateOver(name, method)) + for name, method in inspect.getmembers( + interface, predicate=no_special_no_private)) + # Get the methods that are defined in the scope of the composite # class and override any previous definition - ########## - # python@2.7: cls_method = {name: method for name, method in - # inspect.getmembers(cls, predicate=inspect.ismethod)} - cls_method = {} - for name, method in inspect.getmembers( - cls, predicate=inspect.ismethod): - cls_method[name] = method - ########## - dictionary_for_type_call.update(cls_method) + dictionary_for_type_call.update( + (name, method) for name, method in inspect.getmembers( + cls, predicate=inspect.ismethod)) + # Generate the new class on the fly and return it # FIXME : inherit from interface if we start to use ABC classes? wrapper_class = type(cls.__name__, (cls, container), diff --git a/lib/spack/spack/util/prefix.py b/lib/spack/spack/util/prefix.py index 985d862269..bc6808f350 100644 --- a/lib/spack/spack/util/prefix.py +++ b/lib/spack/spack/util/prefix.py @@ -35,11 +35,11 @@ class Prefix(str): For example, you can do something like this:: prefix = Prefix('/usr') - print prefix.lib - print prefix.lib64 - print prefix.bin - print prefix.share - print prefix.man4 + print(prefix.lib) + print(prefix.lib64) + print(prefix.bin) + print(prefix.share) + print(prefix.man4) This program would print: @@ -52,7 +52,7 @@ class Prefix(str): Prefix objects behave identically to strings. In fact, they subclass str. So operators like + are legal: - print "foobar " + prefix + print("foobar " + prefix) This prints 'foobar /usr". All of this is meant to make custom installs easy. diff --git a/lib/spack/spack/util/spack_json.py b/lib/spack/spack/util/spack_json.py index 236eef8983..0090cf89ca 100644 --- a/lib/spack/spack/util/spack_json.py +++ b/lib/spack/spack/util/spack_json.py @@ -24,6 +24,9 @@ ############################################################################## """Simple wrapper around JSON to guarantee consistent use of load/dump. """ import json +from six import string_types +from six import iteritems + import spack.error __all__ = ['load', 'dump', 'SpackJSONError'] @@ -36,7 +39,7 @@ _json_dump_args = { def load(stream): """Spack JSON needs to be ordered to support specs.""" - if isinstance(stream, basestring): + if isinstance(stream, string_types): return _byteify(json.loads(stream, object_hook=_byteify), ignore_dicts=True) else: @@ -64,7 +67,7 @@ def _byteify(data, ignore_dicts=False): if isinstance(data, dict) and not ignore_dicts: return dict((_byteify(key, ignore_dicts=True), _byteify(value, ignore_dicts=True)) for key, value in - data.iteritems()) + iteritems(data)) # if it's anything else, return it in its original form return data diff --git a/lib/spack/spack/util/spack_yaml.py b/lib/spack/spack/util/spack_yaml.py index 9d4c607908..c49393af9c 100644 --- a/lib/spack/spack/util/spack_yaml.py +++ b/lib/spack/spack/util/spack_yaml.py @@ -137,7 +137,7 @@ class OrderedLineLoader(Loader): key = self.construct_object(key_node, deep=deep) try: hash(key) - except TypeError, exc: + except TypeError as exc: raise ConstructorError( "while constructing a mapping", node.start_mark, "found unacceptable key (%s)" % exc, key_node.start_mark) diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 935532266f..8791f72753 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -25,10 +25,20 @@ import re import os import sys -import urllib2 -import urlparse + +from six.moves.urllib.request import urlopen, Request +from six.moves.urllib.error import URLError from multiprocessing import Pool -from HTMLParser import HTMLParser, HTMLParseError + +try: + # Python 2 had these in the HTMLParser package. + from HTMLParser import HTMLParser, HTMLParseError +except ImportError: + # In Python 3, things moved to html.parser + from html.parser import HTMLParser + # Also, HTMLParseError is deprecated and never raised. + class HTMLParseError: + pass import llnl.util.tty as tty @@ -80,9 +90,9 @@ def _spider(args): # It would be nice to do this with the HTTP Accept header to avoid # one round-trip. However, most servers seem to ignore the header # if you ask for a tarball with Accept: text/html. - req = urllib2.Request(url) + req = Request(url) req.get_method = lambda: "HEAD" - resp = urllib2.urlopen(req, timeout=TIMEOUT) + resp = urlopen(req, timeout=TIMEOUT) if "Content-type" not in resp.headers: tty.debug("ignoring page " + url) @@ -95,7 +105,7 @@ def _spider(args): # Do the real GET request when we know it's just HTML. req.get_method = lambda: "GET" - response = urllib2.urlopen(req, timeout=TIMEOUT) + response = urlopen(req, timeout=TIMEOUT) response_url = response.geturl() # Read the page and and stick it in the map we'll return @@ -142,7 +152,7 @@ def _spider(args): pool.terminate() pool.join() - except urllib2.URLError as e: + except URLError as e: tty.debug(e) if raise_on_error: raise spack.error.NoNetworkConnectionError(str(e), url) diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 0d68a709e8..739a8c4924 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -47,6 +47,7 @@ import re import numbers from bisect import bisect_left from functools import wraps +from six import string_types from functools_backport import total_ordering from spack.util.spack_yaml import syaml_dict @@ -216,7 +217,7 @@ class Version(object): segments = [a_or_n(seg) for seg in version] wc = segments[0] - for i in xrange(1, len(separators)): + for i in range(1, len(separators)): wc += '(?:' + separators[i] + segments[i] # Add possible alpha or beta indicator at the end of each segemnt @@ -229,18 +230,24 @@ class Version(object): def __getitem__(self, idx): cls = type(self) + if isinstance(idx, numbers.Integral): return self.version[idx] + elif isinstance(idx, slice): # Currently len(self.separators) == len(self.version) - 1 extendend_separators = self.separators + ('',) string_arg = [] - for token, sep in zip(self.version, extendend_separators)[idx]: + + pairs = zip(self.version[idx], extendend_separators[idx]) + for token, sep in pairs: string_arg.append(str(token)) string_arg.append(str(sep)) + string_arg.pop() # We don't need the last separator string_arg = ''.join(string_arg) return cls(string_arg) + message = '{cls.__name__} indices must be integers' raise TypeError(message.format(cls=cls)) @@ -375,9 +382,9 @@ class Version(object): class VersionRange(object): def __init__(self, start, end): - if isinstance(start, basestring): + if isinstance(start, string_types): start = Version(start) - if isinstance(end, basestring): + if isinstance(end, string_types): end = Version(end) self.start = start @@ -568,7 +575,7 @@ class VersionList(object): def __init__(self, vlist=None): self.versions = [] if vlist is not None: - if isinstance(vlist, basestring): + if isinstance(vlist, string_types): vlist = _string_to_version(vlist) if type(vlist) == VersionList: self.versions = vlist.versions @@ -796,7 +803,7 @@ def ver(obj): """ if isinstance(obj, (list, tuple)): return VersionList(obj) - elif isinstance(obj, basestring): + elif isinstance(obj, string_types): return _string_to_version(obj) elif isinstance(obj, (int, float)): return _string_to_version(str(obj)) -- cgit v1.2.3-70-g09d2 From 0cd6555388ad6fafc110bc2aa60f256acf920bcd Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 7 Mar 2017 15:18:48 -0800 Subject: Resolve Python2/Python3 unicode issues by using str() - Remove ascii encoding assumption from spack_yaml - proc.communicate() returns bytes; convert to str before adding. - Fix various byte string/unicode issues for Python 2/3 support - Need to decode subprocess output as utf-8 in from_sourcing_files. - Fix comments in strify() --- lib/spack/spack/environment.py | 2 +- lib/spack/spack/stage.py | 2 +- lib/spack/spack/test/architecture.py | 4 ++-- lib/spack/spack/util/crypto.py | 8 +++++++- lib/spack/spack/util/executable.py | 4 ++-- lib/spack/spack/util/spack_json.py | 1 + lib/spack/spack/util/spack_yaml.py | 7 +------ 7 files changed, 15 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index 76b8e132d4..eadfa45efb 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -310,7 +310,7 @@ class EnvironmentModifications(object): proc.wait() if proc.returncode != 0: raise RuntimeError('sourcing files returned a non-zero exit code') - output = ''.join([line for line in proc.stdout]) + output = ''.join([line.decode('utf-8') for line in proc.stdout]) # Construct a dictionaries of the environment before and after # sourcing the files, so that we can diff them. diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 03b7f5ef33..cf294be93b 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -226,7 +226,7 @@ class Stage(object): self._lock = None if lock: if self.name not in Stage.stage_locks: - sha1 = hashlib.sha1(self.name).digest() + sha1 = hashlib.sha1(self.name.encode('utf-8')).digest() lock_id = prefix_bits(sha1, bit_length(sys.maxsize)) stage_lock_path = join_path(spack.stage_path, '.lock') diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py index fb4113361c..8f257cf0dc 100644 --- a/lib/spack/spack/test/architecture.py +++ b/lib/spack/spack/test/architecture.py @@ -138,8 +138,8 @@ def test_user_defaults(config): def test_user_input_combination(config): platform = spack.architecture.platform() - os_list = platform.operating_sys.keys() - target_list = platform.targets.keys() + os_list = list(platform.operating_sys.keys()) + target_list = list(platform.targets.keys()) additional = ["fe", "be", "frontend", "backend"] os_list.extend(additional) diff --git a/lib/spack/spack/util/crypto.py b/lib/spack/spack/util/crypto.py index d074716022..2965168056 100644 --- a/lib/spack/spack/util/crypto.py +++ b/lib/spack/spack/util/crypto.py @@ -22,6 +22,7 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import sys import hashlib """Set of acceptable hashes that Spack will use.""" @@ -104,11 +105,16 @@ class Checker(object): def prefix_bits(byte_array, bits): """Return the first bits of a byte array as an integer.""" + if sys.version_info < (3,): + b2i = ord # In Python 2, indexing byte_array gives str + else: + b2i = lambda b: b # In Python 3, indexing byte_array gives int + result = 0 n = 0 for i, b in enumerate(byte_array): n += 8 - result = (result << 8) | ord(b) + result = (result << 8) | b2i(b) if n >= bits: break diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 372d0019e7..1d7f019fdf 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -178,9 +178,9 @@ class Executable(object): if output is str or error is str: result = '' if output is str: - result += out + result += out.decode('utf-8') if error is str: - result += err + result += err.decode('utf-8') return result except OSError as e: diff --git a/lib/spack/spack/util/spack_json.py b/lib/spack/spack/util/spack_json.py index 0090cf89ca..6b26ad5a98 100644 --- a/lib/spack/spack/util/spack_json.py +++ b/lib/spack/spack/util/spack_json.py @@ -68,6 +68,7 @@ def _byteify(data, ignore_dicts=False): return dict((_byteify(key, ignore_dicts=True), _byteify(value, ignore_dicts=True)) for key, value in iteritems(data)) + # if it's anything else, return it in its original form return data diff --git a/lib/spack/spack/util/spack_yaml.py b/lib/spack/spack/util/spack_yaml.py index c49393af9c..a8b773ac0c 100644 --- a/lib/spack/spack/util/spack_yaml.py +++ b/lib/spack/spack/util/spack_yaml.py @@ -85,11 +85,6 @@ class OrderedLineLoader(Loader): def construct_yaml_str(self, node): value = self.construct_scalar(node) - try: - value = value.encode('ascii') - except UnicodeEncodeError: - pass - value = syaml_str(value) mark(value, node) @@ -181,7 +176,7 @@ class OrderedLineDumper(Dumper): # if it's a syaml_dict, preserve OrderedDict order. # Otherwise do the default thing. sort = not isinstance(mapping, syaml_dict) - mapping = mapping.items() + mapping = list(mapping.items()) if sort: mapping.sort() -- cgit v1.2.3-70-g09d2 From fe6f39b66287a4b3ecade2d776348d44920ec651 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 10 Mar 2017 22:28:01 -0800 Subject: Use key sorting instead of cmp() - Get rid of pkgsort() usage for preferred variants. - Concretization is now entirely based on key-based sorting. - Remove PreferredPackages class and various spec cmp() methods. - Replace with PackagePrefs class that implements a key function for sorting according to packages.yaml. - Clear package pref caches on config test. - Explicit compare methods instead of total_ordering in Version. - Our total_ordering backport wasn't making Python 3 happy for some reason. - Python 3's functools.total_ordering and spelling the operators out fixes the problem. - Fix unicode issues with spec hashes, json, & YAML - Try to use str everywhere and avoid unicode objects in python 2. --- lib/spack/external/functools_backport.py | 17 ++ lib/spack/llnl/util/lang.py | 6 + lib/spack/spack/__init__.py | 1 - lib/spack/spack/concretize.py | 176 +++++-------- lib/spack/spack/fetch_strategy.py | 1 - lib/spack/spack/package_prefs.py | 329 ++++++++++--------------- lib/spack/spack/parse.py | 5 +- lib/spack/spack/provider_index.py | 4 +- lib/spack/spack/spec.py | 51 +--- lib/spack/spack/stage.py | 1 + lib/spack/spack/test/concretize_preferences.py | 8 +- lib/spack/spack/test/conftest.py | 5 +- lib/spack/spack/test/directory_layout.py | 18 +- lib/spack/spack/test/spec_semantics.py | 2 +- lib/spack/spack/test/spec_yaml.py | 9 +- lib/spack/spack/util/spack_json.py | 30 ++- lib/spack/spack/util/spack_yaml.py | 7 +- lib/spack/spack/util/web.py | 1 + lib/spack/spack/version.py | 43 +++- 19 files changed, 318 insertions(+), 396 deletions(-) (limited to 'lib') diff --git a/lib/spack/external/functools_backport.py b/lib/spack/external/functools_backport.py index 19f0903c82..b3c913ffd7 100644 --- a/lib/spack/external/functools_backport.py +++ b/lib/spack/external/functools_backport.py @@ -28,3 +28,20 @@ def total_ordering(cls): opfunc.__doc__ = getattr(int, opname).__doc__ setattr(cls, opname, opfunc) return cls + + +@total_ordering +class reverse_order(object): + """Helper for creating key functions. + + This is a wrapper that inverts the sense of the natural + comparisons on the object. + """ + def __init__(self, value): + self.value = value + + def __eq__(self, other): + return other.value == self.value + + def __lt__(self, other): + return other.value < self.value diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index ad62063061..ec4c25fead 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -33,6 +33,12 @@ from six import string_types ignore_modules = [r'^\.#', '~$'] +class classproperty(property): + """classproperty decorator: like property but for classmethods.""" + def __get__(self, cls, owner): + return self.fget.__get__(None, owner)() + + def index_by(objects, *funcs): """Create a hierarchy of dictionaries by splitting the supplied set of objects on unique values of the supplied functions. diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index b522804d8d..345a804dfe 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -78,7 +78,6 @@ import spack.error import spack.config import spack.fetch_strategy from spack.file_cache import FileCache -from spack.package_prefs import PreferredPackages from spack.abi import ABI from spack.concretize import DefaultConcretizer from spack.version import Version diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 6ab796810b..6c230a151b 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -35,87 +35,77 @@ TODO: make this customizable and allow users to configure """ from __future__ import print_function from six import iteritems +from spack.version import * +from itertools import chain +from ordereddict_backport import OrderedDict +from functools_backport import reverse_order import spack import spack.spec import spack.compilers import spack.architecture import spack.error -from spack.version import * -from functools import partial -from itertools import chain from spack.package_prefs import * class DefaultConcretizer(object): - """This class doesn't have any state, it just provides some methods for concretization. You can subclass it to override just some of the default concretization strategies, or you can override all of them. """ - def _valid_virtuals_and_externals(self, spec): """Returns a list of candidate virtual dep providers and external - packages that coiuld be used to concretize a spec.""" + packages that coiuld be used to concretize a spec. + + Preferred specs come first in the list. + """ # First construct a list of concrete candidates to replace spec with. candidates = [spec] + pref_key = lambda spec: 0 # no-op pref key + if spec.virtual: - providers = spack.repo.providers_for(spec) - if not providers: - raise UnsatisfiableProviderSpecError(providers[0], spec) - spec_w_preferred_providers = find_spec( - spec, - lambda x: pkgsort().spec_has_preferred_provider( - x.name, spec.name)) - if not spec_w_preferred_providers: - spec_w_preferred_providers = spec - provider_cmp = partial(pkgsort().provider_compare, - spec_w_preferred_providers.name, - spec.name) - candidates = sorted(providers, cmp=provider_cmp) + candidates = spack.repo.providers_for(spec) + if not candidates: + raise UnsatisfiableProviderSpecError(candidates[0], spec) + + # Find nearest spec in the DAG (up then down) that has prefs. + spec_w_prefs = find_spec( + spec, lambda p: PackagePrefs.has_preferred_providers( + p.name, spec.name), + spec) # default to spec itself. + + # Create a key to sort candidates by the prefs we found + pref_key = PackagePrefs(spec_w_prefs.name, 'providers', spec.name) # For each candidate package, if it has externals, add those # to the usable list. if it's not buildable, then *only* add # the externals. - usable = [] + # + # Use an OrderedDict to avoid duplicates (use it like a set) + usable = OrderedDict() for cspec in candidates: if is_spec_buildable(cspec): - usable.append(cspec) + usable[cspec] = True + externals = spec_externals(cspec) for ext in externals: if ext.satisfies(spec): - usable.append(ext) + usable[ext] = True # If nothing is in the usable list now, it's because we aren't # allowed to build anything. if not usable: raise NoBuildError(spec) - def cmp_externals(a, b): - if a.name != b.name and (not a.external or a.external_module and - not b.external and b.external_module): - # We're choosing between different providers, so - # maintain order from provider sort - index_of_a = next(i for i in range(0, len(candidates)) - if a.satisfies(candidates[i])) - index_of_b = next(i for i in range(0, len(candidates)) - if b.satisfies(candidates[i])) - return index_of_a - index_of_b - - result = cmp_specs(a, b) - if result != 0: - return result - - # prefer external packages to internal packages. - if a.external is None or b.external is None: - return -cmp(a.external, b.external) - else: - return cmp(a.external, b.external) - - usable.sort(cmp=cmp_externals) - return usable + # Use a sort key to order the results + return sorted(usable, key=lambda spec: ( + not (spec.external or spec.external_module), # prefer externals + pref_key(spec), # respect prefs + spec.name, # group by name + reverse_order(spec.versions), # latest version + spec # natural order + )) - # XXX(deptypes): Look here. def choose_virtual_or_external(self, spec): """Given a list of candidate virtual and external packages, try to find one that is most ABI compatible. @@ -126,25 +116,16 @@ class DefaultConcretizer(object): # Find the nearest spec in the dag that has a compiler. We'll # use that spec to calibrate compiler compatibility. - abi_exemplar = find_spec(spec, lambda x: x.compiler) - if not abi_exemplar: - abi_exemplar = spec.root - - # Make a list including ABI compatibility of specs with the exemplar. - strict = [spack.abi.compatible(c, abi_exemplar) for c in candidates] - loose = [spack.abi.compatible(c, abi_exemplar, loose=True) - for c in candidates] - keys = zip(strict, loose, candidates) + abi_exemplar = find_spec(spec, lambda x: x.compiler, spec.root) # Sort candidates from most to least compatibility. - # Note: - # 1. We reverse because True > False. - # 2. Sort is stable, so c's keep their order. - keys.sort(key=lambda k: k[:2], reverse=True) - - # Pull the candidates back out and return them in order - candidates = [c for s, l, c in keys] - return candidates + # We reverse because True > False. + # Sort is stable, so candidates keep their order. + return sorted(candidates, + reverse=True, + key=lambda spec: ( + spack.abi.compatible(spec, abi_exemplar, loose=True), + spack.abi.compatible(spec, abi_exemplar))) def concretize_version(self, spec): """If the spec is already concrete, return. Otherwise take @@ -164,26 +145,12 @@ class DefaultConcretizer(object): if spec.versions.concrete: return False - # If there are known available versions, return the most recent - # version that satisfies the spec + # List of versions we could consider, in sorted order pkg = spec.package + usable = [v for v in pkg.versions + if any(v.satisfies(sv) for sv in spec.versions)] - # ---------- Produce prioritized list of versions - # Get list of preferences from packages.yaml - preferred = pkgsort() - # NOTE: pkgsort() == spack.package_prefs.PreferredPackages() - - yaml_specs = [ - x[0] for x in - preferred._spec_for_pkgname(spec.name, 'version', None)] - n = len(yaml_specs) - yaml_index = dict( - [(spc, n - index) for index, spc in enumerate(yaml_specs)]) - - # List of versions we could consider, in sorted order - unsorted_versions = [ - v for v in pkg.versions - if any(v.satisfies(sv) for sv in spec.versions)] + yaml_prefs = PackagePrefs(spec.name, 'version') # The keys below show the order of precedence of factors used # to select a version when concretizing. The item with @@ -191,12 +158,11 @@ class DefaultConcretizer(object): # # NOTE: When COMPARING VERSIONS, the '@develop' version is always # larger than other versions. BUT when CONCRETIZING, - # the largest NON-develop version is selected by - # default. - keys = [( + # the largest NON-develop version is selected by default. + keyfn = lambda v: ( # ------- Special direction from the user # Respect order listed in packages.yaml - yaml_index.get(v, -1), + -yaml_prefs(v), # The preferred=True flag (packages or packages.yaml or both?) pkg.versions.get(Version(v)).get('preferred', False), @@ -211,15 +177,11 @@ class DefaultConcretizer(object): # a) develop > everything (disabled by "not v.isdevelop() above) # b) numeric > non-numeric # c) Numeric or string comparison - v) for v in unsorted_versions] - keys.sort(reverse=True) - - # List of versions in complete sorted order - valid_versions = [x[-1] for x in keys] - # -------------------------- + v) + usable.sort(key=keyfn, reverse=True) - if valid_versions: - spec.versions = ver([valid_versions[0]]) + if usable: + spec.versions = ver([usable[0]]) else: # We don't know of any SAFE versions that match the given # spec. Grab the spec's versions and grab the highest @@ -278,16 +240,15 @@ class DefaultConcretizer(object): the package specification. """ changed = False - preferred_variants = pkgsort().spec_preferred_variants( - spec.package_class.name) + preferred_variants = PackagePrefs.preferred_variants(spec.name) for name, variant in spec.package_class.variants.items(): if name not in spec.variants: changed = True if name in preferred_variants: spec.variants[name] = preferred_variants.get(name) else: - spec.variants[name] = \ - spack.spec.VariantSpec(name, variant.default) + spec.variants[name] = spack.spec.VariantSpec( + name, variant.default) return changed def concretize_compiler(self, spec): @@ -329,12 +290,9 @@ class DefaultConcretizer(object): spec.compiler, spec.architecture) return False - # Find the another spec that has a compiler, or the root if none do + # Find another spec that has a compiler, or the root if none do other_spec = spec if spec.compiler else find_spec( - spec, lambda x: x.compiler) - - if not other_spec: - other_spec = spec.root + spec, lambda x: x.compiler, spec.root) other_compiler = other_spec.compiler assert(other_spec) @@ -353,9 +311,9 @@ class DefaultConcretizer(object): if not compiler_list: # No compiler with a satisfactory spec was found raise UnavailableCompilerVersionError(other_compiler) - cmp_compilers = partial( - pkgsort().compiler_compare, other_spec.name) - matches = sorted(compiler_list, cmp=cmp_compilers) + + ppk = PackagePrefs(other_spec.name, 'compiler') + matches = sorted(compiler_list, key=ppk) # copy concrete version into other_compiler try: @@ -420,7 +378,7 @@ class DefaultConcretizer(object): return ret -def find_spec(spec, condition): +def find_spec(spec, condition, default=None): """Searches the dag from spec in an intelligent order and looks for a spec that matches a condition""" # First search parents, then search children @@ -447,7 +405,7 @@ def find_spec(spec, condition): if condition(spec): return spec - return None # Nothing matched the condition. + return default # Nothing matched the condition; return default. def _compiler_concretization_failure(compiler_spec, arch): @@ -466,7 +424,7 @@ def _compiler_concretization_failure(compiler_spec, arch): class NoCompilersForArchError(spack.error.SpackError): def __init__(self, arch, available_os_targets): err_msg = ("No compilers found" - " for operating system %s and target %s." + " for operating system %s and target %s." "\nIf previous installations have succeeded, the" " operating system may have been updated." % (arch.platform_os, arch.target)) @@ -485,7 +443,6 @@ class NoCompilersForArchError(spack.error.SpackError): class UnavailableCompilerVersionError(spack.error.SpackError): - """Raised when there is no available compiler that satisfies a compiler spec.""" @@ -500,7 +457,6 @@ class UnavailableCompilerVersionError(spack.error.SpackError): class NoValidVersionError(spack.error.SpackError): - """Raised when there is no way to have a concrete version for a particular spec.""" diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 0f97dda8b8..38752b3fc1 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -90,7 +90,6 @@ class FetchStrategy(with_metaclass(FSMeta, object)): enabled = False # Non-abstract subclasses should be enabled. required_attributes = None # Attributes required in version() args. - def __init__(self): # The stage is initialized late, so that fetch strategies can be # constructed at package construction time. This is where things diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 3dc90a8eb9..f9dac2bef0 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -25,11 +25,22 @@ from six import string_types from six import iteritems +from llnl.util.lang import classproperty + import spack import spack.error from spack.version import * +_lesser_spec_types = {'compiler': spack.spec.CompilerSpec, + 'version': VersionList} + + +def _spec_type(component): + """Map from component name to spec type for package prefs.""" + return _lesser_spec_types.get(component, spack.spec.Spec) + + def get_packages_config(): """Wrapper around get_packages_config() to validate semantics.""" config = spack.config.get_config('packages') @@ -51,177 +62,141 @@ def get_packages_config(): return config -class PreferredPackages(object): - def __init__(self): - self.preferred = get_packages_config() - self._spec_for_pkgname_cache = {} +class PackagePrefs(object): + """Defines the sort order for a set of specs. + + Spack's package preference implementation uses PackagePrefss to + define sort order. The PackagePrefs class looks at Spack's + packages.yaml configuration and, when called on a spec, returns a key + that can be used to sort that spec in order of the user's + preferences. + + You can use it like this: + + # key function sorts CompilerSpecs for `mpich` in order of preference + kf = PackagePrefs('mpich', 'compiler') + compiler_list.sort(key=kf) + + Or like this: + + # key function to sort VersionLists for OpenMPI in order of preference. + kf = PackagePrefs('openmpi', 'version') + version_list.sort(key=kf) - # Given a package name, sort component (e.g, version, compiler, ...), and - # a second_key (used by providers), return the list - def _order_for_package(self, pkgname, component, second_key, - test_all=True): + Optionally, you can sort in order of preferred virtual dependency + providers. To do that, provide 'providers' and a third argument + denoting the virtual package (e.g., ``mpi``): + + kf = PackagePrefs('trilinos', 'providers', 'mpi') + provider_spec_list.sort(key=kf) + + """ + _packages_config_cache = None + _spec_cache = {} + + def __init__(self, pkgname, component, vpkg=None): + self.pkgname = pkgname + self.component = component + self.vpkg = vpkg + + def __call__(self, spec): + """Return a key object (an index) that can be used to sort spec. + + Sort is done in package order. We don't cache the result of + this function as Python's sort functions already ensure that the + key function is called at most once per sorted element. + """ + spec_order = self._specs_for_pkg( + self.pkgname, self.component, self.vpkg) + + # integer is the index of the first spec in order that satisfies + # spec, or it's a number larger than any position in the order. + return next( + (i for i, s in enumerate(spec_order) if spec.satisfies(s)), + len(spec_order)) + + @classproperty + @classmethod + def _packages_config(cls): + if cls._packages_config_cache is None: + cls._packages_config_cache = get_packages_config() + return cls._packages_config_cache + + @classmethod + def _order_for_package(cls, pkgname, component, vpkg=None, all=True): + """Given a package name, sort component (e.g, version, compiler, ...), + and an optional vpkg, return the list from the packages config. + """ pkglist = [pkgname] - if test_all: + if all: pkglist.append('all') + for pkg in pkglist: - order = self.preferred.get(pkg, {}).get(component, {}) - if isinstance(order, dict) and second_key: - order = order.get(second_key, {}) + pkg_entry = cls._packages_config.get(pkg) + if not pkg_entry: + continue + + order = pkg_entry.get(component) if not order: continue - return [str(s).strip() for s in order] + + # vpkg is one more level + if vpkg is not None: + order = order.get(vpkg) + + if order: + return [str(s).strip() for s in order] + return [] - # A generic sorting function. Given a package name and sort - # component, return less-than-0, 0, or greater-than-0 if - # a is respectively less-than, equal to, or greater than b. - def _component_compare(self, pkgname, component, a, b, - reverse_natural_compare, second_key): - if a is None: - return -1 - if b is None: - return 1 - orderlist = self._order_for_package(pkgname, component, second_key) - a_in_list = str(a) in orderlist - b_in_list = str(b) in orderlist - if a_in_list and not b_in_list: - return -1 - elif b_in_list and not a_in_list: - return 1 - - cmp_a = None - cmp_b = None - reverse = None - if not a_in_list and not b_in_list: - cmp_a = a - cmp_b = b - reverse = -1 if reverse_natural_compare else 1 - else: - cmp_a = orderlist.index(str(a)) - cmp_b = orderlist.index(str(b)) - reverse = 1 - - if cmp_a < cmp_b: - return -1 * reverse - elif cmp_a > cmp_b: - return 1 * reverse - else: - return 0 - - # A sorting function for specs. Similar to component_compare, but - # a and b are considered to match entries in the sorting list if they - # satisfy the list component. - def _spec_compare(self, pkgname, component, a, b, - reverse_natural_compare, second_key): - if not a or (not a.concrete and not second_key): - return -1 - if not b or (not b.concrete and not second_key): - return 1 - specs = self._spec_for_pkgname(pkgname, component, second_key) - a_index = None - b_index = None - reverse = -1 if reverse_natural_compare else 1 - for i, cspec in enumerate(specs): - if a_index is None and (cspec.satisfies(a) or a.satisfies(cspec)): - a_index = i - if b_index: - break - if b_index is None and (cspec.satisfies(b) or b.satisfies(cspec)): - b_index = i - if a_index: - break - - if a_index is not None and b_index is None: - return -1 - elif a_index is None and b_index is not None: - return 1 - elif a_index is not None and b_index == a_index: - return -1 * cmp(a, b) - elif (a_index is not None and b_index is not None and - a_index != b_index): - return cmp(a_index, b_index) - else: - return cmp(a, b) * reverse - - # Given a sort order specified by the pkgname/component/second_key, return - # a list of CompilerSpecs, VersionLists, or Specs for that sorting list. - def _spec_for_pkgname(self, pkgname, component, second_key): - key = (pkgname, component, second_key) - if key not in self._spec_for_pkgname_cache: - pkglist = self._order_for_package(pkgname, component, second_key) - if component == 'compiler': - self._spec_for_pkgname_cache[key] = \ - [spack.spec.CompilerSpec(s) for s in pkglist] - elif component == 'version': - self._spec_for_pkgname_cache[key] = \ - [VersionList(s) for s in pkglist] - else: - self._spec_for_pkgname_cache[key] = \ - [spack.spec.Spec(s) for s in pkglist] - return self._spec_for_pkgname_cache[key] - - def provider_compare(self, pkgname, provider_str, a, b): - """Return less-than-0, 0, or greater than 0 if a is respecively - less-than, equal-to, or greater-than b. A and b are possible - implementations of provider_str. One provider is less-than another - if it is preferred over the other. For example, - provider_compare('scorep', 'mpi', 'mvapich', 'openmpi') would - return -1 if mvapich should be preferred over openmpi for scorep.""" - return self._spec_compare(pkgname, 'providers', a, b, False, - provider_str) - - def spec_has_preferred_provider(self, pkgname, provider_str): - """Return True iff the named package has a list of preferred - providers""" - return bool(self._order_for_package(pkgname, 'providers', - provider_str, False)) - - def spec_preferred_variants(self, pkgname): - """Return a VariantMap of preferred variants and their values""" - for pkg in (pkgname, 'all'): - variants = self.preferred.get(pkg, {}).get('variants', '') + @classmethod + def _specs_for_pkg(cls, pkgname, component, vpkg=None): + """Given a sort order specified by the pkgname/component/second_key, + return a list of CompilerSpecs, VersionLists, or Specs for + that sorting list. + """ + key = (pkgname, component, vpkg) + + specs = cls._spec_cache.get(key) + if specs is None: + pkglist = cls._order_for_package(pkgname, component, vpkg) + spec_type = _spec_type(component) + specs = [spec_type(s) for s in pkglist] + cls._spec_cache[key] = specs + + return specs + + @classmethod + def clear_caches(cls): + cls._packages_config_cache = None + cls._spec_cache = {} + + @classmethod + def has_preferred_providers(cls, pkgname, vpkg): + """Whether specific package has a preferred vpkg providers.""" + return bool(cls._order_for_package(pkgname, 'providers', vpkg, False)) + + @classmethod + def preferred_variants(cls, pkg_name): + """Return a VariantMap of preferred variants/values for a spec.""" + for pkg in (pkg_name, 'all'): + variants = cls._packages_config.get(pkg, {}).get('variants', '') if variants: break + + # allow variants to be list or string if not isinstance(variants, string_types): variants = " ".join(variants) - pkg = spack.repo.get(pkgname) - spec = spack.spec.Spec("%s %s" % (pkgname, variants)) + # Only return variants that are actually supported by the package + pkg = spack.repo.get(pkg_name) + spec = spack.spec.Spec("%s %s" % (pkg_name, variants)) return dict((name, variant) for name, variant in spec.variants.items() if name in pkg.variants) - def version_compare(self, pkgname, a, b): - """Return less-than-0, 0, or greater than 0 if version a of pkgname is - respectively less-than, equal-to, or greater-than version b of - pkgname. One version is less-than another if it is preferred over - the other.""" - return self._spec_compare(pkgname, 'version', a, b, True, None) - - def variant_compare(self, pkgname, a, b): - """Return less-than-0, 0, or greater than 0 if variant a of pkgname is - respectively less-than, equal-to, or greater-than variant b of - pkgname. One variant is less-than another if it is preferred over - the other.""" - return self._component_compare(pkgname, 'variant', a, b, False, None) - - def architecture_compare(self, pkgname, a, b): - """Return less-than-0, 0, or greater than 0 if architecture a of pkgname - is respectively less-than, equal-to, or greater-than architecture b - of pkgname. One architecture is less-than another if it is preferred - over the other.""" - return self._component_compare(pkgname, 'architecture', a, b, - False, None) - - def compiler_compare(self, pkgname, a, b): - """Return less-than-0, 0, or greater than 0 if compiler a of pkgname is - respecively less-than, equal-to, or greater-than compiler b of - pkgname. One compiler is less-than another if it is preferred over - the other.""" - return self._spec_compare(pkgname, 'compiler', a, b, False, None) - def spec_externals(spec): - """Return a list of external specs (with external directory path filled in), + """Return a list of external specs (w/external directory path filled in), one for each known external installation.""" # break circular import. from spack.build_environment import get_path_from_module @@ -255,7 +230,8 @@ def spec_externals(spec): if external_spec.satisfies(spec): external_specs.append(external_spec) - return external_specs + # defensively copy returned specs + return [s.copy() for s in external_specs] def is_spec_buildable(spec): @@ -268,50 +244,5 @@ def is_spec_buildable(spec): return allpkgs[spec.name]['buildable'] -def cmp_specs(lhs, rhs): - # Package name sort order is not configurable, always goes alphabetical - if lhs.name != rhs.name: - return cmp(lhs.name, rhs.name) - - # Package version is second in compare order - pkgname = lhs.name - if lhs.versions != rhs.versions: - return pkgsort().version_compare( - pkgname, lhs.versions, rhs.versions) - - # Compiler is third - if lhs.compiler != rhs.compiler: - return pkgsort().compiler_compare( - pkgname, lhs.compiler, rhs.compiler) - - # Variants - if lhs.variants != rhs.variants: - return pkgsort().variant_compare( - pkgname, lhs.variants, rhs.variants) - - # Architecture - if lhs.architecture != rhs.architecture: - return pkgsort().architecture_compare( - pkgname, lhs.architecture, rhs.architecture) - - # Dependency is not configurable - lhash, rhash = hash(lhs), hash(rhs) - if lhash != rhash: - return -1 if lhash < rhash else 1 - - # Equal specs - return 0 - - -_pkgsort = None - - -def pkgsort(): - global _pkgsort - if _pkgsort is None: - _pkgsort = PreferredPackages() - return _pkgsort - - class VirtualInPackagesYAMLError(spack.error.SpackError): """Raised when a disallowed virtual is found in packages.yaml""" diff --git a/lib/spack/spack/parse.py b/lib/spack/spack/parse.py index da11268bb2..880bb09b4e 100644 --- a/lib/spack/spack/parse.py +++ b/lib/spack/spack/parse.py @@ -48,9 +48,8 @@ class Token: def is_a(self, type): return self.type == type - def __cmp__(self, other): - return cmp((self.type, self.value), - (other.type, other.value)) + def __eq__(self, other): + return (self.type == other.type) and (self.value == other.value) class Lexer(object): diff --git a/lib/spack/spack/provider_index.py b/lib/spack/spack/provider_index.py index 7dee838619..8d64d100b1 100644 --- a/lib/spack/spack/provider_index.py +++ b/lib/spack/spack/provider_index.py @@ -146,8 +146,8 @@ class ProviderIndex(object): if p_spec.satisfies(vspec, deps=False): providers.update(spec_set) - # Return providers in order - return sorted(providers) + # Return providers in order. Defensively copy. + return sorted(s.copy() for s in providers) # TODO: this is pretty darned nasty, and inefficient, but there # are not that many vdeps in most specs. diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 8b0e560c8a..b7a819cc46 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -96,6 +96,7 @@ specs to avoid ambiguity. Both are provided because ~ can cause shell expansion when it is the first character in an id typed on the command line. """ import base64 +import sys import collections import ctypes import hashlib @@ -732,8 +733,7 @@ class FlagMap(HashableMap): return tuple((k, tuple(v)) for k, v in sorted(iteritems(self))) def __str__(self): - sorted_keys = filter( - lambda flag: self[flag] != [], sorted(self.keys())) + sorted_keys = [k for k in sorted(self.keys()) if self[k] != []] cond_symbol = ' ' if len(sorted_keys) > 0 else '' return cond_symbol + ' '.join( str(key) + '=\"' + ' '.join( @@ -1316,7 +1316,11 @@ class Spec(object): yaml_text = syaml.dump( self.to_node_dict(), default_flow_style=True, width=maxint) sha = hashlib.sha1(yaml_text.encode('utf-8')) + b32_hash = base64.b32encode(sha.digest()).lower() + if sys.version_info[0] >= 3: + b32_hash = b32_hash.decode('utf-8') + if self.concrete: self._hash = b32_hash return b32_hash[:length] @@ -1567,14 +1571,12 @@ class Spec(object): a problem. """ # Make an index of stuff this spec already provides - # XXX(deptype): 'link' and 'run'? self_index = ProviderIndex(self.traverse(), restrict=True) changed = False done = False while not done: done = True - # XXX(deptype): 'link' and 'run'? for spec in list(self.traverse()): replacement = None if spec.virtual: @@ -1600,7 +1602,7 @@ class Spec(object): # Replace spec with the candidate and normalize copy = self.copy() - copy[spec.name]._dup(replacement.copy(deps=False)) + copy[spec.name]._dup(replacement, deps=False) try: # If there are duplicate providers or duplicate @@ -2327,9 +2329,6 @@ class Spec(object): self.external_module = other.external_module self.namespace = other.namespace - self.external = other.external - self.external_module = other.external_module - # If we copy dependencies, preserve DAG structure in the new spec if deps: deptypes = alldeps # by default copy all deptypes @@ -2343,6 +2342,7 @@ class Spec(object): # These fields are all cached results of expensive operations. # If we preserved the original structure, we can copy them # safely. If not, they need to be recomputed. + # TODO: dependency hashes can be copied more aggressively. if deps is True or deps == alldeps: self._hash = other._hash self._cmp_key_cache = other._cmp_key_cache @@ -2725,41 +2725,6 @@ class Spec(object): def dep_string(self): return ''.join("^" + dep.format() for dep in self.sorted_deps()) - def __cmp__(self, other): - from package_prefs import pkgsort - - # Package name sort order is not configurable, always goes alphabetical - if self.name != other.name: - return cmp(self.name, other.name) - - # Package version is second in compare order - pkgname = self.name - if self.versions != other.versions: - return pkgsort().version_compare( - pkgname, self.versions, other.versions) - - # Compiler is third - if self.compiler != other.compiler: - return pkgsort().compiler_compare( - pkgname, self.compiler, other.compiler) - - # Variants - if self.variants != other.variants: - return pkgsort().variant_compare( - pkgname, self.variants, other.variants) - - # Target - if self.architecture != other.architecture: - return pkgsort().architecture_compare( - pkgname, self.architecture, other.architecture) - - # Dependency is not configurable - if self._dependencies != other._dependencies: - return -1 if self._dependencies < other._dependencies else 1 - - # Equal specs - return 0 - def __str__(self): ret = self.format() + self.dep_string() return ret.strip() diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index cf294be93b..21db3d75c2 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -690,5 +690,6 @@ class RestageError(StageError): class ChdirError(StageError): """Raised when Spack can't change directories.""" + # Keep this in namespace for convenience FailedDownloadError = fs.FailedDownloadError diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index 54df4e1563..bf915064b2 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -27,7 +27,7 @@ import pytest import spack import spack.util.spack_yaml as syaml from spack.spec import Spec -from spack.package_prefs import PreferredPackages +import spack.package_prefs @pytest.fixture() @@ -41,7 +41,7 @@ def concretize_scope(config, tmpdir): # This is kind of weird, but that's how config scopes are # set in ConfigScope.__init__ spack.config.config_scopes.pop('concretize') - spack.package_prefs._pkgsort = PreferredPackages() + spack.package_prefs.PackagePrefs.clear_caches() # reset provider index each time, too spack.repo._provider_index = None @@ -55,7 +55,7 @@ def update_packages(pkgname, section, value): """Update config and reread package list""" conf = {pkgname: {section: value}} spack.config.update_config('packages', conf, 'concretize') - spack.package_prefs._pkgsort = PreferredPackages() + spack.package_prefs.PackagePrefs.clear_caches() def assert_variant_values(spec, **variants): @@ -146,7 +146,7 @@ all: spack.config.update_config('packages', conf, 'concretize') # should be no error for 'all': - spack.package_prefs._pkgsort = PreferredPackages() + spack.package_prefs.PackagePrefs.clear_caches() spack.package_prefs.get_packages_config() def test_external_mpi(self): diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 2b7dc594ac..fc1d6ecec2 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -168,16 +168,19 @@ def configuration_dir(tmpdir_factory, linux_os): def config(configuration_dir): """Hooks the mock configuration files into spack.config""" # Set up a mock config scope + spack.package_prefs.PackagePrefs.clear_caches() spack.config.clear_config_caches() real_scope = spack.config.config_scopes spack.config.config_scopes = ordereddict_backport.OrderedDict() spack.config.ConfigScope('site', str(configuration_dir.join('site'))) spack.config.ConfigScope('user', str(configuration_dir.join('user'))) Config = collections.namedtuple('Config', ['real', 'mock']) + yield Config(real=real_scope, mock=spack.config.config_scopes) + spack.config.config_scopes = real_scope spack.config.clear_config_caches() - + spack.package_prefs.PackagePrefs.clear_caches() @pytest.fixture(scope='module') diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index 2caadad0fe..3645947b17 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -92,23 +92,25 @@ def test_read_and_write_spec( # TODO: increase reuse of build dependencies. stored_deptypes = ('link', 'run') expected = spec.copy(deps=stored_deptypes) + assert expected.concrete assert expected == spec_from_file - assert expected.eq_dag # msg , spec_from_file + assert expected.eq_dag(spec_from_file) assert spec_from_file.concrete # Ensure that specs that come out "normal" are really normal. with open(spec_path) as spec_file: read_separately = Spec.from_yaml(spec_file.read()) - # TODO: revise this when build deps are in dag_hash - norm = read_separately.normalized().copy(deps=stored_deptypes) - assert norm == spec_from_file + # TODO: revise this when build deps are in dag_hash + norm = read_separately.normalized().copy(deps=stored_deptypes) + assert norm == spec_from_file + assert norm.eq_dag(spec_from_file) - # TODO: revise this when build deps are in dag_hash - conc = read_separately.concretized().copy(deps=stored_deptypes) - assert conc == spec_from_file + # TODO: revise this when build deps are in dag_hash + conc = read_separately.concretized().copy(deps=stored_deptypes) + assert conc == spec_from_file + assert conc.eq_dag(spec_from_file) - # Make sure the hash of the read-in spec is the same assert expected.dag_hash() == spec_from_file.dag_hash() # Ensure directories are properly removed diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 2f3b2b1b8d..f071bcc833 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -293,7 +293,7 @@ class TestSpecSematics(object): copy = spec.copy() for s in spec.traverse(): assert s.satisfies(copy[s.name]) - assert copy[s.name].satisfies(s) + assert copy[s.name].satisfies(s) def test_unsatisfiable_compiler_flag_mismatch(self): # No matchi in specs diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py index e913dc8412..0bcd2de3cf 100644 --- a/lib/spack/spack/test/spec_yaml.py +++ b/lib/spack/spack/test/spec_yaml.py @@ -27,6 +27,8 @@ YAML format preserves DAG informatoin in the spec. """ +from collections import Iterable, Mapping + import spack.util.spack_json as sjson import spack.util.spack_yaml as syaml from spack.spec import Spec @@ -78,8 +80,6 @@ def test_using_ordered_dict(builtin_mock): versions and processes. """ def descend_and_check(iterable, level=0): - from spack.util.spack_yaml import syaml_dict - from collections import Iterable, Mapping if isinstance(iterable, Mapping): assert isinstance(iterable, syaml_dict) return descend_and_check(iterable.values(), level=level + 1) @@ -95,7 +95,12 @@ def test_using_ordered_dict(builtin_mock): for spec in specs: dag = Spec(spec) dag.normalize() + from pprint import pprint + pprint(dag.to_node_dict()) + break + level = descend_and_check(dag.to_node_dict()) + # level just makes sure we are doing something here assert level >= 5 diff --git a/lib/spack/spack/util/spack_json.py b/lib/spack/spack/util/spack_json.py index 6b26ad5a98..82fa700821 100644 --- a/lib/spack/spack/util/spack_json.py +++ b/lib/spack/spack/util/spack_json.py @@ -23,6 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """Simple wrapper around JSON to guarantee consistent use of load/dump. """ +import sys import json from six import string_types from six import iteritems @@ -40,11 +41,11 @@ _json_dump_args = { def load(stream): """Spack JSON needs to be ordered to support specs.""" if isinstance(stream, string_types): - return _byteify(json.loads(stream, object_hook=_byteify), - ignore_dicts=True) + load = json.loads else: - return _byteify(json.load(stream, object_hook=_byteify), - ignore_dicts=True) + load = json.load + + return _strify(load(stream, object_hook=_strify), ignore_dicts=True) def dump(data, stream=None): @@ -55,18 +56,21 @@ def dump(data, stream=None): return json.dump(data, stream, **_json_dump_args) -def _byteify(data, ignore_dicts=False): - # if this is a unicode string, return its string representation - if isinstance(data, unicode): - return data.encode('utf-8') +def _strify(data, ignore_dicts=False): + # if this is a unicode string in python 2, return its string representation + if sys.version_info[0] < 3: + if isinstance(data, unicode): + return data.encode('utf-8') + # if this is a list of values, return list of byteified values if isinstance(data, list): - return [_byteify(item, ignore_dicts=True) for item in data] + return [_strify(item, ignore_dicts=True) for item in data] + # if this is a dictionary, return dictionary of byteified keys and values # but only if we haven't already byteified it if isinstance(data, dict) and not ignore_dicts: - return dict((_byteify(key, ignore_dicts=True), - _byteify(value, ignore_dicts=True)) for key, value in + return dict((_strify(key, ignore_dicts=True), + _strify(value, ignore_dicts=True)) for key, value in iteritems(data)) # if it's anything else, return it in its original form @@ -76,5 +80,5 @@ def _byteify(data, ignore_dicts=False): class SpackJSONError(spack.error.SpackError): """Raised when there are issues with JSON parsing.""" - def __init__(self, msg, yaml_error): - super(SpackJSONError, self).__init__(msg, str(yaml_error)) + def __init__(self, msg, json_error): + super(SpackJSONError, self).__init__(msg, str(json_error)) diff --git a/lib/spack/spack/util/spack_yaml.py b/lib/spack/spack/util/spack_yaml.py index a8b773ac0c..6533004392 100644 --- a/lib/spack/spack/util/spack_yaml.py +++ b/lib/spack/spack/util/spack_yaml.py @@ -86,7 +86,6 @@ class OrderedLineLoader(Loader): def construct_yaml_str(self, node): value = self.construct_scalar(node) value = syaml_str(value) - mark(value, node) return value @@ -149,11 +148,11 @@ class OrderedLineLoader(Loader): # register above new constructors OrderedLineLoader.add_constructor( - u'tag:yaml.org,2002:map', OrderedLineLoader.construct_yaml_map) + 'tag:yaml.org,2002:map', OrderedLineLoader.construct_yaml_map) OrderedLineLoader.add_constructor( - u'tag:yaml.org,2002:seq', OrderedLineLoader.construct_yaml_seq) + 'tag:yaml.org,2002:seq', OrderedLineLoader.construct_yaml_seq) OrderedLineLoader.add_constructor( - u'tag:yaml.org,2002:str', OrderedLineLoader.construct_yaml_str) + 'tag:yaml.org,2002:str', OrderedLineLoader.construct_yaml_str) class OrderedLineDumper(Dumper): diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 8791f72753..0d7d0d3792 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -36,6 +36,7 @@ try: except ImportError: # In Python 3, things moved to html.parser from html.parser import HTMLParser + # Also, HTMLParseError is deprecated and never raised. class HTMLParseError: pass diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 739a8c4924..c8395aeb29 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -49,7 +49,6 @@ from bisect import bisect_left from functools import wraps from six import string_types -from functools_backport import total_ordering from spack.util.spack_yaml import syaml_dict __all__ = ['Version', 'VersionRange', 'VersionList', 'ver'] @@ -112,7 +111,6 @@ def _numeric_lt(self0, other): """Compares two versions, knowing they're both numeric""" -@total_ordering class Version(object): """Class to represent versions""" @@ -330,9 +328,22 @@ class Version(object): return (other is not None and type(other) == Version and self.version == other.version) + @coerced def __ne__(self, other): return not (self == other) + @coerced + def __le__(self, other): + return self == other or self < other + + @coerced + def __ge__(self, other): + return not (self < other) + + @coerced + def __gt__(self, other): + return not (self == other) and not (self < other) + def __hash__(self): return hash(self.version) @@ -378,7 +389,6 @@ class Version(object): return VersionList() -@total_ordering class VersionRange(object): def __init__(self, start, end): @@ -421,9 +431,22 @@ class VersionRange(object): type(other) == VersionRange and self.start == other.start and self.end == other.end) + @coerced def __ne__(self, other): return not (self == other) + @coerced + def __le__(self, other): + return self == other or self < other + + @coerced + def __ge__(self, other): + return not (self < other) + + @coerced + def __gt__(self, other): + return not (self == other) and not (self < other) + @property def concrete(self): return self.start if self.start == self.end else None @@ -568,7 +591,6 @@ class VersionRange(object): return out -@total_ordering class VersionList(object): """Sorted, non-redundant list of Versions and VersionRanges.""" @@ -761,6 +783,7 @@ class VersionList(object): def __eq__(self, other): return other is not None and self.versions == other.versions + @coerced def __ne__(self, other): return not (self == other) @@ -768,6 +791,18 @@ class VersionList(object): def __lt__(self, other): return other is not None and self.versions < other.versions + @coerced + def __le__(self, other): + return self == other or self < other + + @coerced + def __ge__(self, other): + return not (self < other) + + @coerced + def __gt__(self, other): + return not (self == other) and not (self < other) + def __hash__(self): return hash(tuple(self.versions)) -- cgit v1.2.3-70-g09d2 From 7f3f4930249b580bd27891299d330f8dd272ecd3 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 25 Mar 2017 22:49:46 -0700 Subject: Fix concretization bugs with virtuals and deptypes. 1. Fix #2807: Can't depend on virtual and non-virtual package - This is tested by test_my_dep_depends_on_provider_of_my_virtual_dep in the concretize.py test. - This was actually working in the test suite, but it depended on the order the dependencies were resolved in. Resolving non-virtual then virtual worked, but virtual, then non-virtual did not. - Problem was that an unnecessary copy was made of a spec that already had some dependencies set up, and the copy lost half of some of the dependency relationships. This caused the "can'd depend on X twice error". - Fix by eliminating unnecessary copy and ensuring that dep parameter of _merge_dependency is always safe to own -- i.e. it's a defensive copy from somewhere else. 2. Fix bug and simplify concretization of deptypes. - deptypes weren't being accumulated; they were being set on each DependencySpec. This could cause concretization to get into an infinite loop. - Fixed by accumulating deptypes in DependencySpec.update_deptypes() - Also simplified deptype normalization logic: deptypes are now merged in constrain() like everything else -- there is no need to merge them specially or to look at dpeendents in _merge_dependency(). - Add some docstrings to deptype tests. --- lib/spack/spack/spec.py | 52 +++++++++++++++++++++++----------------- lib/spack/spack/test/spec_dag.py | 12 +++++++--- 2 files changed, 39 insertions(+), 25 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index b7a819cc46..fa88698ea9 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -581,8 +581,11 @@ class DependencySpec(object): self.deptypes = tuple(sorted(set(deptypes))) def update_deptypes(self, deptypes): - deptypes = tuple(sorted(set(deptypes))) + deptypes = set(deptypes) + deptypes.update(self.deptypes) + deptypes = tuple(sorted(deptypes)) changed = self.deptypes != deptypes + self.deptypes = deptypes return changed @@ -1801,6 +1804,8 @@ class Spec(object): dependency already in this spec. """ assert(vdep.virtual) + + # note that this defensively copies. providers = provider_index.providers_for(vdep) # If there is a provider for the vpkg, then use that instead of @@ -1830,6 +1835,10 @@ class Spec(object): provider_index): """Merge the dependency into this spec. + Caller should assume that this routine can owns the dep parameter + (i.e. it needs to be a copy of any internal structures like + dependencies on Package class objects). + This is the core of normalize(). There are some basic steps: * If dep is virtual, evaluate whether it corresponds to an @@ -1842,6 +1851,7 @@ class Spec(object): constraints into this spec. This method returns True if the spec was changed, False otherwise. + """ changed = False @@ -1854,7 +1864,8 @@ class Spec(object): dep = provider else: index = ProviderIndex([dep], restrict=True) - for vspec in (v for v in spec_deps.values() if v.virtual): + items = list(spec_deps.items()) + for name, vspec in items: if index.providers_for(vspec): vspec._replace_with(dep) del spec_deps[vspec.name] @@ -1865,29 +1876,23 @@ class Spec(object): raise UnsatisfiableProviderSpecError(required[0], dep) provider_index.update(dep) - # If the spec isn't already in the set of dependencies, clone - # it from the package description. + # If the spec isn't already in the set of dependencies, add it. + # Note: dep is always owned by this method. If it's from the + # caller, it's a copy from _evaluate_dependency_conditions. If it + # comes from a vdep, it's a defensive copy from _find_provider. if dep.name not in spec_deps: - spec_deps[dep.name] = dep.copy() + spec_deps[dep.name] = dep changed = True else: - dspec = spec_deps[dep.name] - if self.name not in dspec._dependents: - self._add_dependency(dspec, deptypes) - else: - dependent = dspec._dependents[self.name] - changed = dependent.update_deptypes(deptypes) - - # Constrain package information with spec info - try: - changed |= spec_deps[dep.name].constrain(dep) - - except UnsatisfiableSpecError as e: - e.message = "Invalid spec: '%s'. " - e.message += "Package %s requires %s %s, but spec asked for %s" - e.message %= (spec_deps[dep.name], dep.name, - e.constraint_type, e.required, e.provided) - raise e + # merge package/vdep information into spec + try: + changed |= spec_deps[dep.name].constrain(dep) + except UnsatisfiableSpecError as e: + e.message = "Invalid spec: '%s'. " + e.message += "Package %s requires %s %s, but spec asked for %s" + e.message %= (spec_deps[dep.name], dep.name, + e.constraint_type, e.required, e.provided) + raise e # Add merged spec to my deps and recurse dependency = spec_deps[dep.name] @@ -2097,6 +2102,9 @@ class Spec(object): changed = False for name in self.common_dependencies(other): changed |= self[name].constrain(other[name], deps=False) + if name in self._dependencies: + changed |= self._dependencies[name].update_deptypes( + other._dependencies[name].deptypes) # Update with additional constraints from other spec for name in other.dep_difference(self): diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index 31d6203f7f..af6a4efd95 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -63,8 +63,7 @@ def set_dependency(saved_deps): pkg = spack.repo.get(pkg_name) if pkg_name not in saved_deps: saved_deps[pkg_name] = (pkg, pkg.dependencies.copy()) - # Change dep spec - # XXX(deptype): handle deptypes. + pkg.dependencies[spec.name] = {Spec(pkg_name): spec} pkg.dependency_types[spec.name] = set(deptypes) return _mock @@ -609,6 +608,8 @@ class TestSpecDag(object): assert '^mpich2' in s2 def test_construct_spec_with_deptypes(self): + """Ensure that it is possible to construct a spec with explicit + dependency types.""" s = Spec('a', Spec('b', ['build'], Spec('c')), @@ -633,7 +634,12 @@ class TestSpecDag(object): assert s['f']._dependents['e'].deptypes == ('run',) def check_diamond_deptypes(self, spec): - """Validate deptypes in dt-diamond spec.""" + """Validate deptypes in dt-diamond spec. + + This ensures that concretization works properly when two packages + depend on the same dependency in different ways. + + """ assert spec['dt-diamond']._dependencies[ 'dt-diamond-left'].deptypes == ('build', 'link') -- cgit v1.2.3-70-g09d2 From 3f21f2b08810b39a17db85cca095b67efc4a249d Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 26 Mar 2017 18:02:56 -0700 Subject: Clean up tests and add Python3 to Travis. - Clean up spec_syntax tests: don't dependend on DB order. - spec_syntax hash parsing tests were strongly dependent on the order the DB was traversed. - Tests now specifically grab the specs they want from the mock DB. - Tests are more readable as a result. - Add Python3 versions to Travis tests. --- .travis.yml | 18 ++- lib/spack/spack/spec.py | 11 +- lib/spack/spack/test/spec_syntax.py | 233 +++++++++++++++++++++++------------- 3 files changed, 172 insertions(+), 90 deletions(-) (limited to 'lib') diff --git a/.travis.yml b/.travis.yml index 4cd3b14b9c..d7bdf9b2ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,22 @@ matrix: os: linux language: python env: TEST_SUITE=unit + - python: '3.3' + os: linux + language: python + env: TEST_SUITE=unit + - python: '3.4' + os: linux + language: python + env: TEST_SUITE=unit + - python: '3.5' + os: linux + language: python + env: TEST_SUITE=unit + - python: '3.6' + os: linux + language: python + env: TEST_SUITE=unit - python: '2.7' os: linux language: python @@ -45,6 +61,7 @@ addons: apt: packages: - gfortran + - mercurial - graphviz # Work around Travis's lack of support for Python on OSX @@ -60,7 +77,6 @@ install: - pip install --upgrade codecov - pip install --upgrade flake8 - pip install --upgrade sphinx - - pip install --upgrade mercurial before_script: # Need this for the git tests to succeed. diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index fa88698ea9..095b04f837 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -106,7 +106,6 @@ from six import StringIO from six import string_types from six import iteritems -import llnl.util.tty as tty import spack import spack.architecture import spack.compilers as compilers @@ -159,6 +158,7 @@ __all__ = [ 'UnsatisfiableDependencySpecError', 'AmbiguousHashError', 'InvalidHashError', + 'NoSuchHashError', 'RedundantSpecError'] # Valid pattern for an identifier in Spack @@ -2952,8 +2952,7 @@ class SpecParser(spack.parse.Parser): spec.dag_hash()[:len(self.token.value)] == self.token.value] if not matches: - tty.die("%s does not match any installed packages." % - self.token.value) + raise NoSuchHashError(self.token.value) if len(matches) != 1: raise AmbiguousHashError( @@ -3325,6 +3324,12 @@ class InvalidHashError(SpecError): % (hash, spec)) +class NoSuchHashError(SpecError): + def __init__(self, hash): + super(NoSuchHashError, self).__init__( + "No installed spec matches the hash: '%s'") + + class RedundantSpecError(SpecError): def __init__(self, spec, addition): super(RedundantSpecError, self).__init__( diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index fcb6cfa907..dfad4a019f 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -122,7 +122,7 @@ class TestSpecSyntax(object): def _check_raises(self, exc_type, items): for item in items: with pytest.raises(exc_type): - self.check_parse(item) + Spec(item) # ======================================================================== # Parse checks @@ -225,113 +225,174 @@ class TestSpecSyntax(object): errors = ['x@@1.2', 'x ^y@@1.2', 'x@1.2::', 'x::'] self._check_raises(SpecParseError, errors) + def _check_hash_parse(self, spec): + """Check several ways to specify a spec by hash.""" + # full hash + self.check_parse(str(spec), '/' + spec.dag_hash()) + + # partial hash + self.check_parse(str(spec), '/ ' + spec.dag_hash()[:5]) + + # name + hash + self.check_parse(str(spec), spec.name + '/' + spec.dag_hash()) + + # name + version + space + partial hash + self.check_parse( + str(spec), spec.name + '@' + str(spec.version) + + ' /' + spec.dag_hash()[:6]) + def test_spec_by_hash(self, database): specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements - - # Make sure the database is still the shape we expect - assert len(specs) > 3 + assert len(specs) # make sure something's in the DB - self.check_parse(str(specs[0]), '/' + hashes[0]) - self.check_parse(str(specs[1]), '/ ' + hashes[1][:5]) - self.check_parse(str(specs[2]), specs[2].name + '/' + hashes[2]) - self.check_parse(str(specs[3]), - specs[3].name + '@' + str(specs[3].version) + - ' /' + hashes[3][:6]) + for spec in specs: + self._check_hash_parse(spec) def test_dep_spec_by_hash(self, database): - specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements - - # Make sure the database is still the shape we expect - assert len(specs) > 10 - assert specs[4].name in specs[10] - assert specs[-1].name in specs[10] - - spec1 = sp.Spec(specs[10].name + '^/' + hashes[4]) - assert specs[4].name in spec1 and spec1[specs[4].name] == specs[4] - spec2 = sp.Spec(specs[10].name + '%' + str(specs[10].compiler) + - ' ^ / ' + hashes[-1]) - assert (specs[-1].name in spec2 and - spec2[specs[-1].name] == specs[-1] and - spec2.compiler == specs[10].compiler) - spec3 = sp.Spec(specs[10].name + '^/' + hashes[4][:4] + - '^ / ' + hashes[-1][:5]) - assert (specs[-1].name in spec3 and - spec3[specs[-1].name] == specs[-1] and - specs[4].name in spec3 and spec3[specs[4].name] == specs[4]) + mpileaks_zmpi = database.mock.db.query_one('mpileaks ^zmpi') + zmpi = database.mock.db.query_one('zmpi') + fake = database.mock.db.query_one('fake') - def test_multiple_specs_with_hash(self, database): - specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements - - assert len(specs) > 3 - - output = sp.parse(specs[0].name + '/' + hashes[0] + '/' + hashes[1]) - assert len(output) == 2 - output = sp.parse('/' + hashes[0] + '/' + hashes[1]) - assert len(output) == 2 - output = sp.parse('/' + hashes[0] + '/' + hashes[1] + - ' ' + specs[2].name) - assert len(output) == 3 - output = sp.parse('/' + hashes[0] + - ' ' + specs[1].name + ' ' + specs[2].name) - assert len(output) == 3 - output = sp.parse('/' + hashes[0] + ' ' + - specs[1].name + ' / ' + hashes[1]) - assert len(output) == 2 + assert 'fake' in mpileaks_zmpi + assert 'zmpi' in mpileaks_zmpi - def test_ambiguous_hash(self, database): - specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements + mpileaks_hash_fake = sp.Spec('mpileaks ^/' + fake.dag_hash()) + assert 'fake' in mpileaks_hash_fake + assert mpileaks_hash_fake['fake'] == fake + + mpileaks_hash_zmpi = sp.Spec( + 'mpileaks %' + str(mpileaks_zmpi.compiler) + + ' ^ / ' + zmpi.dag_hash()) + assert 'zmpi' in mpileaks_hash_zmpi + assert mpileaks_hash_zmpi['zmpi'] == zmpi + assert mpileaks_hash_zmpi.compiler == mpileaks_zmpi.compiler + + mpileaks_hash_fake_and_zmpi = sp.Spec( + 'mpileaks ^/' + fake.dag_hash()[:4] + '^ / ' + zmpi.dag_hash()[:5]) + assert 'zmpi' in mpileaks_hash_fake_and_zmpi + assert mpileaks_hash_fake_and_zmpi['zmpi'] == zmpi - # Make sure the database is as expected - assert hashes[1][:1] == hashes[2][:1] == 'b' + assert 'fake' in mpileaks_hash_fake_and_zmpi + assert mpileaks_hash_fake_and_zmpi['fake'] == fake - ambiguous_hashes = ['/b', - specs[1].name + '/b', - specs[0].name + '^/b', - specs[0].name + '^' + specs[1].name + '/b'] - self._check_raises(AmbiguousHashError, ambiguous_hashes) + def test_multiple_specs_with_hash(self, database): + mpileaks_zmpi = database.mock.db.query_one('mpileaks ^zmpi') + callpath_mpich2 = database.mock.db.query_one('callpath ^mpich2') + + # name + hash + separate hash + specs = sp.parse('mpileaks /' + mpileaks_zmpi.dag_hash() + + '/' + callpath_mpich2.dag_hash()) + assert len(specs) == 2 + + # 2 separate hashes + specs = sp.parse('/' + mpileaks_zmpi.dag_hash() + + '/' + callpath_mpich2.dag_hash()) + assert len(specs) == 2 + + # 2 separate hashes + name + specs = sp.parse('/' + mpileaks_zmpi.dag_hash() + + '/' + callpath_mpich2.dag_hash() + + ' callpath') + assert len(specs) == 3 + + # hash + 2 names + specs = sp.parse('/' + mpileaks_zmpi.dag_hash() + + ' callpath' + + ' callpath') + assert len(specs) == 3 + + # hash + name + hash + specs = sp.parse('/' + mpileaks_zmpi.dag_hash() + + ' callpath' + + ' / ' + callpath_mpich2.dag_hash()) + assert len(specs) == 2 + + def test_ambiguous_hash(self, database): + dbspecs = database.mock.db.query() + + def find_ambiguous(specs, keyfun): + """Return the first set of specs that's ambiguous under a + particular key function.""" + key_to_spec = {} + for spec in specs: + key = keyfun(spec) + speclist = key_to_spec.setdefault(key, []) + speclist.append(spec) + if len(speclist) > 1: + return (key, speclist) + + # If we fail here, we may need to guarantee that there are + # some ambiguos specs by adding more specs to the test DB + # until this succeeds. + raise RuntimeError("no ambiguous specs found for keyfun!") + + # ambiguity in first hash character + char, specs = find_ambiguous(dbspecs, lambda s: s.dag_hash()[0]) + self._check_raises(AmbiguousHashError, ['/' + char]) + + # ambiguity in first hash character AND spec name + t, specs = find_ambiguous(dbspecs, + lambda s: (s.name, s.dag_hash()[0])) + name, char = t + self._check_raises(AmbiguousHashError, [name + '/' + char]) def test_invalid_hash(self, database): - specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements + mpileaks_zmpi = database.mock.db.query_one('mpileaks ^zmpi') + zmpi = database.mock.db.query_one('zmpi') - # Make sure the database is as expected - assert (hashes[0] != hashes[3] and - hashes[1] != hashes[4] and len(specs) > 4) + mpileaks_mpich = database.mock.db.query_one('mpileaks ^mpich') + mpich = database.mock.db.query_one('mpich') - inputs = [specs[0].name + '/' + hashes[3], - specs[1].name + '^' + specs[4].name + '/' + hashes[0], - specs[1].name + '^' + specs[4].name + '/' + hashes[1]] - self._check_raises(InvalidHashError, inputs) + # name + incompatible hash + self._check_raises(InvalidHashError, [ + 'zmpi /' + mpich.dag_hash(), + 'mpich /' + zmpi.dag_hash()]) + + # name + dep + incompatible hash + self._check_raises(InvalidHashError, [ + 'mpileaks ^mpich /' + mpileaks_zmpi.dag_hash(), + 'mpileaks ^zmpi /' + mpileaks_mpich.dag_hash()]) def test_nonexistent_hash(self, database): - # This test uses database to make sure we don't accidentally access - # real installs, however unlikely + """Ensure we get errors for nonexistant hashes.""" specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements - # Make sure the database is as expected - assert 'abc123' not in [h[:6] for h in hashes] + # This hash shouldn't be in the test DB. What are the odds :) + no_such_hash = 'aaaaaaaaaaaaaaa' + hashes = [s._hash for s in specs] + assert no_such_hash not in [h[:len(no_such_hash)] for h in hashes] - nonexistant_hashes = ['/abc123', - specs[0].name + '/abc123'] - self._check_raises(SystemExit, nonexistant_hashes) + self._check_raises(NoSuchHashError, [ + '/' + no_such_hash, + 'mpileaks /' + no_such_hash]) def test_redundant_spec(self, database): - specs = database.mock.db.query() - hashes = [s._hash for s in specs] # Preserves order of elements + """Check that redundant spec constraints raise errors. + + TODO (TG): does this need to be an error? Or should concrete + specs only raise errors if constraints cause a contradiction? + + """ + mpileaks_zmpi = database.mock.db.query_one('mpileaks ^zmpi') + callpath_zmpi = database.mock.db.query_one('callpath ^zmpi') + dyninst = database.mock.db.query_one('dyninst') + + mpileaks_mpich2 = database.mock.db.query_one('mpileaks ^mpich2') + + redundant_specs = [ + # redudant compiler + '/' + mpileaks_zmpi.dag_hash() + '%' + str(mpileaks_zmpi.compiler), + + # redudant version + 'mpileaks/' + mpileaks_mpich2.dag_hash() + + '@' + str(mpileaks_mpich2.version), + + # redundant dependency + 'callpath /' + callpath_zmpi.dag_hash() + '^ libelf', - # Make sure the database is as expected - assert len(specs) > 3 + # redundant flags + '/' + dyninst.dag_hash() + ' cflags="-O3 -fPIC"'] - redundant_specs = ['/' + hashes[0] + '%' + str(specs[0].compiler), - specs[1].name + '/' + hashes[1] + - '@' + str(specs[1].version), - specs[2].name + '/' + hashes[2] + '^ libelf', - '/' + hashes[3] + ' cflags="-O3 -fPIC"'] self._check_raises(RedundantSpecError, redundant_specs) def test_duplicate_variant(self): -- cgit v1.2.3-70-g09d2 From a8bcc23fe7138a35c902e41f983408de6dbc874d Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 7 Mar 2017 09:31:15 -0800 Subject: Spack works with Python 3 - Update version guard in spack script to allow python 3 - Update min required version in the docs --- README.md | 3 ++- bin/spack | 4 ++-- lib/spack/docs/contribution_guide.rst | 2 +- lib/spack/docs/getting_started.rst | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/README.md b/README.md index 375aad4dd7..68c2939ec6 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,8 @@ See the [Feature Overview](http://spack.readthedocs.io/en/latest/features.html) for examples and highlights. -To install spack and install your first package: +To install spack and install your first package, make sure you have +Python (2 or 3). Then: $ git clone https://github.com/llnl/spack.git $ cd spack/bin diff --git a/bin/spack b/bin/spack index f33d219b8b..c737a0f178 100755 --- a/bin/spack +++ b/bin/spack @@ -27,9 +27,9 @@ from __future__ import print_function import sys -if (sys.version_info[0] > 2) or (sys.version_info[:2] < (2, 6)): +if sys.version_info[:2] < (2, 6): v_info = sys.version_info[:3] - sys.exit("Spack requires Python 2.6 or 2.7. " + sys.exit("Spack requires Python 2.6 or higher." "This is Python %d.%d.%d." % v_info) import os diff --git a/lib/spack/docs/contribution_guide.rst b/lib/spack/docs/contribution_guide.rst index e9cfe1fa54..a3b3197181 100644 --- a/lib/spack/docs/contribution_guide.rst +++ b/lib/spack/docs/contribution_guide.rst @@ -40,7 +40,7 @@ for the results of these tests after submitting a PR, we recommend that you run locally to speed up the review process. If you take a look in ``$SPACK_ROOT/.travis.yml``, you'll notice that we test -against Python 2.6 and 2.7. We currently perform 3 types of tests: +against Python 2.6, 2.7, and 3.3-3.6. We currently perform 3 types of tests: ^^^^^^^^^^ Unit Tests diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index 3c2610beb0..2460f7e54d 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -11,7 +11,7 @@ Prerequisites Spack has the following minimum requirements, which must be installed before Spack is run: -1. Python 2.6 or 2.7 +1. Python 2 (2.6 or 2.7) or 3 (3.3 - 3.6) 2. A C/C++ compiler 3. The ``git`` and ``curl`` commands. -- cgit v1.2.3-70-g09d2 From ee7753a597f7c180338330b4c269901f97e343bc Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 31 Mar 2017 22:41:48 +0200 Subject: test/versions.py: ported to pytest (#3635) --- lib/spack/spack/test/versions.py | 846 ++++++++++++++++++++------------------- 1 file changed, 443 insertions(+), 403 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index c1d427783c..71ea3af9e9 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -22,413 +22,453 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -""" -These version tests were taken from the RPM source code. +"""These version tests were taken from the RPM source code. We try to maintain compatibility with RPM's version semantics where it makes sense. """ -import unittest +import pytest from spack.version import * -class VersionsTest(unittest.TestCase): - - def assert_ver_lt(self, a, b): - a, b = ver(a), ver(b) - self.assertTrue(a < b) - self.assertTrue(a <= b) - self.assertTrue(a != b) - self.assertFalse(a == b) - self.assertFalse(a > b) - self.assertFalse(a >= b) - - def assert_ver_gt(self, a, b): - a, b = ver(a), ver(b) - self.assertTrue(a > b) - self.assertTrue(a >= b) - self.assertTrue(a != b) - self.assertFalse(a == b) - self.assertFalse(a < b) - self.assertFalse(a <= b) - - def assert_ver_eq(self, a, b): - a, b = ver(a), ver(b) - self.assertFalse(a > b) - self.assertTrue(a >= b) - self.assertFalse(a != b) - self.assertTrue(a == b) - self.assertFalse(a < b) - self.assertTrue(a <= b) - - def assert_in(self, needle, haystack): - self.assertTrue(ver(needle) in ver(haystack)) - - def assert_not_in(self, needle, haystack): - self.assertFalse(ver(needle) in ver(haystack)) - - def assert_canonical(self, canonical_list, version_list): - self.assertEqual(ver(canonical_list), ver(version_list)) - - def assert_overlaps(self, v1, v2): - self.assertTrue(ver(v1).overlaps(ver(v2))) - - def assert_no_overlap(self, v1, v2): - self.assertFalse(ver(v1).overlaps(ver(v2))) - - def assert_satisfies(self, v1, v2): - self.assertTrue(ver(v1).satisfies(ver(v2))) - - def assert_does_not_satisfy(self, v1, v2): - self.assertFalse(ver(v1).satisfies(ver(v2))) - - def check_intersection(self, expected, a, b): - self.assertEqual(ver(expected), ver(a).intersection(ver(b))) - - def check_union(self, expected, a, b): - self.assertEqual(ver(expected), ver(a).union(ver(b))) - - def test_two_segments(self): - self.assert_ver_eq('1.0', '1.0') - self.assert_ver_lt('1.0', '2.0') - self.assert_ver_gt('2.0', '1.0') - self.assert_ver_eq('develop', 'develop') - self.assert_ver_lt('1.0', 'develop') - self.assert_ver_gt('develop', '1.0') - - def test_three_segments(self): - self.assert_ver_eq('2.0.1', '2.0.1') - self.assert_ver_lt('2.0', '2.0.1') - self.assert_ver_gt('2.0.1', '2.0') - - def test_alpha(self): - # TODO: not sure whether I like this. 2.0.1a is *usually* - # TODO: less than 2.0.1, but special-casing it makes version - # TODO: comparison complicated. See version.py - self.assert_ver_eq('2.0.1a', '2.0.1a') - self.assert_ver_gt('2.0.1a', '2.0.1') - self.assert_ver_lt('2.0.1', '2.0.1a') - - def test_patch(self): - self.assert_ver_eq('5.5p1', '5.5p1') - self.assert_ver_lt('5.5p1', '5.5p2') - self.assert_ver_gt('5.5p2', '5.5p1') - self.assert_ver_eq('5.5p10', '5.5p10') - self.assert_ver_lt('5.5p1', '5.5p10') - self.assert_ver_gt('5.5p10', '5.5p1') - - def test_num_alpha_with_no_separator(self): - self.assert_ver_lt('10xyz', '10.1xyz') - self.assert_ver_gt('10.1xyz', '10xyz') - self.assert_ver_eq('xyz10', 'xyz10') - self.assert_ver_lt('xyz10', 'xyz10.1') - self.assert_ver_gt('xyz10.1', 'xyz10') - - def test_alpha_with_dots(self): - self.assert_ver_eq('xyz.4', 'xyz.4') - self.assert_ver_lt('xyz.4', '8') - self.assert_ver_gt('8', 'xyz.4') - self.assert_ver_lt('xyz.4', '2') - self.assert_ver_gt('2', 'xyz.4') - - def test_nums_and_patch(self): - self.assert_ver_lt('5.5p2', '5.6p1') - self.assert_ver_gt('5.6p1', '5.5p2') - self.assert_ver_lt('5.6p1', '6.5p1') - self.assert_ver_gt('6.5p1', '5.6p1') - - def test_rc_versions(self): - self.assert_ver_gt('6.0.rc1', '6.0') - self.assert_ver_lt('6.0', '6.0.rc1') - - def test_alpha_beta(self): - self.assert_ver_gt('10b2', '10a1') - self.assert_ver_lt('10a2', '10b2') - - def test_double_alpha(self): - self.assert_ver_eq('1.0aa', '1.0aa') - self.assert_ver_lt('1.0a', '1.0aa') - self.assert_ver_gt('1.0aa', '1.0a') - - def test_padded_numbers(self): - self.assert_ver_eq('10.0001', '10.0001') - self.assert_ver_eq('10.0001', '10.1') - self.assert_ver_eq('10.1', '10.0001') - self.assert_ver_lt('10.0001', '10.0039') - self.assert_ver_gt('10.0039', '10.0001') - - def test_close_numbers(self): - self.assert_ver_lt('4.999.9', '5.0') - self.assert_ver_gt('5.0', '4.999.9') - - def test_date_stamps(self): - self.assert_ver_eq('20101121', '20101121') - self.assert_ver_lt('20101121', '20101122') - self.assert_ver_gt('20101122', '20101121') - - def test_underscores(self): - self.assert_ver_eq('2_0', '2_0') - self.assert_ver_eq('2.0', '2_0') - self.assert_ver_eq('2_0', '2.0') - - def test_rpm_oddities(self): - self.assert_ver_eq('1b.fc17', '1b.fc17') - self.assert_ver_lt('1b.fc17', '1.fc17') - self.assert_ver_gt('1.fc17', '1b.fc17') - self.assert_ver_eq('1g.fc17', '1g.fc17') - self.assert_ver_gt('1g.fc17', '1.fc17') - self.assert_ver_lt('1.fc17', '1g.fc17') - - # Stuff below here is not taken from RPM's tests and is - # unique to spack - def test_version_ranges(self): - self.assert_ver_lt('1.2:1.4', '1.6') - self.assert_ver_gt('1.6', '1.2:1.4') - self.assert_ver_eq('1.2:1.4', '1.2:1.4') - self.assertNotEqual(ver('1.2:1.4'), ver('1.2:1.6')) - - self.assert_ver_lt('1.2:1.4', '1.5:1.6') - self.assert_ver_gt('1.5:1.6', '1.2:1.4') - - def test_contains(self): - self.assert_in('1.3', '1.2:1.4') - self.assert_in('1.2.5', '1.2:1.4') - self.assert_in('1.3.5', '1.2:1.4') - self.assert_in('1.3.5-7', '1.2:1.4') - self.assert_not_in('1.1', '1.2:1.4') - self.assert_not_in('1.5', '1.2:1.4') - - self.assert_in('1.4.2', '1.2:1.4') - self.assert_not_in('1.4.2', '1.2:1.4.0') - - self.assert_in('1.2.8', '1.2.7:1.4') - self.assert_in('1.2.7:1.4', ':') - self.assert_not_in('1.2.5', '1.2.7:1.4') - - self.assert_in('1.4.1', '1.2.7:1.4') - self.assert_not_in('1.4.1', '1.2.7:1.4.0') - - def test_in_list(self): - self.assert_in('1.2', ['1.5', '1.2', '1.3']) - self.assert_in('1.2.5', ['1.5', '1.2:1.3']) - self.assert_in('1.5', ['1.5', '1.2:1.3']) - self.assert_not_in('1.4', ['1.5', '1.2:1.3']) - - self.assert_in('1.2.5:1.2.7', [':']) - self.assert_in('1.2.5:1.2.7', ['1.5', '1.2:1.3']) - self.assert_not_in('1.2.5:1.5', ['1.5', '1.2:1.3']) - self.assert_not_in('1.1:1.2.5', ['1.5', '1.2:1.3']) - - def test_ranges_overlap(self): - self.assert_overlaps('1.2', '1.2') - self.assert_overlaps('1.2.1', '1.2.1') - self.assert_overlaps('1.2.1b', '1.2.1b') - - self.assert_overlaps('1.2:1.7', '1.6:1.9') - self.assert_overlaps(':1.7', '1.6:1.9') - self.assert_overlaps(':1.7', ':1.9') - self.assert_overlaps(':1.7', '1.6:') - self.assert_overlaps('1.2:', '1.6:1.9') - self.assert_overlaps('1.2:', ':1.9') - self.assert_overlaps('1.2:', '1.6:') - self.assert_overlaps(':', ':') - self.assert_overlaps(':', '1.6:1.9') - self.assert_overlaps('1.6:1.9', ':') - - def test_overlap_with_containment(self): - self.assert_in('1.6.5', '1.6') - self.assert_in('1.6.5', ':1.6') - - self.assert_overlaps('1.6.5', ':1.6') - self.assert_overlaps(':1.6', '1.6.5') - - self.assert_not_in(':1.6', '1.6.5') - self.assert_in('1.6.5', ':1.6') - - def test_lists_overlap(self): - self.assert_overlaps('1.2b:1.7,5', '1.6:1.9,1') - self.assert_overlaps('1,2,3,4,5', '3,4,5,6,7') - self.assert_overlaps('1,2,3,4,5', '5,6,7') - self.assert_overlaps('1,2,3,4,5', '5:7') - self.assert_overlaps('1,2,3,4,5', '3, 6:7') - self.assert_overlaps('1, 2, 4, 6.5', '3, 6:7') - self.assert_overlaps('1, 2, 4, 6.5', ':, 5, 8') - self.assert_overlaps('1, 2, 4, 6.5', ':') - self.assert_no_overlap('1, 2, 4', '3, 6:7') - self.assert_no_overlap('1,2,3,4,5', '6,7') - self.assert_no_overlap('1,2,3,4,5', '6:7') - - def test_canonicalize_list(self): - self.assert_canonical(['1.2', '1.3', '1.4'], - ['1.2', '1.3', '1.3', '1.4']) - - self.assert_canonical(['1.2', '1.3:1.4'], - ['1.2', '1.3', '1.3:1.4']) - - self.assert_canonical(['1.2', '1.3:1.4'], - ['1.2', '1.3:1.4', '1.4']) - - self.assert_canonical(['1.3:1.4'], - ['1.3:1.4', '1.3', '1.3.1', '1.3.9', '1.4']) - - self.assert_canonical(['1.3:1.4'], - ['1.3', '1.3.1', '1.3.9', '1.4', '1.3:1.4']) - - self.assert_canonical(['1.3:1.5'], - ['1.3', '1.3.1', '1.3.9', '1.4:1.5', '1.3:1.4']) - - self.assert_canonical(['1.3:1.5'], - ['1.3, 1.3.1,1.3.9,1.4:1.5,1.3:1.4']) - - self.assert_canonical(['1.3:1.5'], - ['1.3, 1.3.1,1.3.9,1.4 : 1.5 , 1.3 : 1.4']) - - self.assert_canonical([':'], - [':,1.3, 1.3.1,1.3.9,1.4 : 1.5 , 1.3 : 1.4']) - - def test_intersection(self): - self.check_intersection('2.5', - '1.0:2.5', '2.5:3.0') - self.check_intersection('2.5:2.7', - '1.0:2.7', '2.5:3.0') - self.check_intersection('0:1', ':', '0:1') - - self.check_intersection(['1.0', '2.5:2.7'], - ['1.0:2.7'], ['2.5:3.0', '1.0']) - self.check_intersection(['2.5:2.7'], - ['1.1:2.7'], ['2.5:3.0', '1.0']) - self.check_intersection(['0:1'], [':'], ['0:1']) - - def test_intersect_with_containment(self): - self.check_intersection('1.6.5', '1.6.5', ':1.6') - self.check_intersection('1.6.5', ':1.6', '1.6.5') - - self.check_intersection('1.6:1.6.5', ':1.6.5', '1.6') - self.check_intersection('1.6:1.6.5', '1.6', ':1.6.5') - - def test_union_with_containment(self): - self.check_union(':1.6', '1.6.5', ':1.6') - self.check_union(':1.6', ':1.6', '1.6.5') - - self.check_union(':1.6', ':1.6.5', '1.6') - self.check_union(':1.6', '1.6', ':1.6.5') - - self.check_union(':', '1.0:', ':2.0') - - self.check_union('1:4', '1:3', '2:4') - self.check_union('1:4', '2:4', '1:3') - - # Tests successor/predecessor case. - self.check_union('1:4', '1:2', '3:4') - - def test_basic_version_satisfaction(self): - self.assert_satisfies('4.7.3', '4.7.3') - - self.assert_satisfies('4.7.3', '4.7') - self.assert_satisfies('4.7.3b2', '4.7') - self.assert_satisfies('4.7b6', '4.7') - - self.assert_satisfies('4.7.3', '4') - self.assert_satisfies('4.7.3b2', '4') - self.assert_satisfies('4.7b6', '4') - - self.assert_does_not_satisfy('4.8.0', '4.9') - self.assert_does_not_satisfy('4.8', '4.9') - self.assert_does_not_satisfy('4', '4.9') - - def test_basic_version_satisfaction_in_lists(self): - self.assert_satisfies(['4.7.3'], ['4.7.3']) - - self.assert_satisfies(['4.7.3'], ['4.7']) - self.assert_satisfies(['4.7.3b2'], ['4.7']) - self.assert_satisfies(['4.7b6'], ['4.7']) - - self.assert_satisfies(['4.7.3'], ['4']) - self.assert_satisfies(['4.7.3b2'], ['4']) - self.assert_satisfies(['4.7b6'], ['4']) - - self.assert_does_not_satisfy(['4.8.0'], ['4.9']) - self.assert_does_not_satisfy(['4.8'], ['4.9']) - self.assert_does_not_satisfy(['4'], ['4.9']) - - def test_version_range_satisfaction(self): - self.assert_satisfies('4.7b6', '4.3:4.7') - self.assert_satisfies('4.3.0', '4.3:4.7') - self.assert_satisfies('4.3.2', '4.3:4.7') - - self.assert_does_not_satisfy('4.8.0', '4.3:4.7') - self.assert_does_not_satisfy('4.3', '4.4:4.7') - - self.assert_satisfies('4.7b6', '4.3:4.7') - self.assert_does_not_satisfy('4.8.0', '4.3:4.7') - - def test_version_range_satisfaction_in_lists(self): - self.assert_satisfies(['4.7b6'], ['4.3:4.7']) - self.assert_satisfies(['4.3.0'], ['4.3:4.7']) - self.assert_satisfies(['4.3.2'], ['4.3:4.7']) - - self.assert_does_not_satisfy(['4.8.0'], ['4.3:4.7']) - self.assert_does_not_satisfy(['4.3'], ['4.4:4.7']) - - self.assert_satisfies(['4.7b6'], ['4.3:4.7']) - self.assert_does_not_satisfy(['4.8.0'], ['4.3:4.7']) - - def test_satisfaction_with_lists(self): - self.assert_satisfies('4.7', '4.3, 4.6, 4.7') - self.assert_satisfies('4.7.3', '4.3, 4.6, 4.7') - self.assert_satisfies('4.6.5', '4.3, 4.6, 4.7') - self.assert_satisfies('4.6.5.2', '4.3, 4.6, 4.7') - - self.assert_does_not_satisfy('4', '4.3, 4.6, 4.7') - self.assert_does_not_satisfy('4.8.0', '4.2, 4.3:4.7') - - self.assert_satisfies('4.8.0', '4.2, 4.3:4.8') - self.assert_satisfies('4.8.2', '4.2, 4.3:4.8') - - def test_formatted_strings(self): - versions = '1.2.3', '1_2_3', '1-2-3' - for item in versions: - v = Version(item) - self.assertEqual(v.dotted, '1.2.3') - self.assertEqual(v.dashed, '1-2-3') - self.assertEqual(v.underscored, '1_2_3') - self.assertEqual(v.joined, '123') - - def test_repr_and_str(self): - - def check_repr_and_str(vrs): - a = Version(vrs) - self.assertEqual(repr(a), 'Version(\'' + vrs + '\')') - b = eval(repr(a)) - self.assertEqual(a, b) - self.assertEqual(str(a), vrs) - self.assertEqual(str(a), str(b)) - - check_repr_and_str('1.2.3') - check_repr_and_str('R2016a') - check_repr_and_str('R2016a.2-3_4') - - def test_get_item(self): - a = Version('0.1_2-3') - self.assertTrue(isinstance(a[1], int)) - # Test slicing - b = a[0:2] - self.assertTrue(isinstance(b, Version)) - self.assertEqual(b, Version('0.1')) - self.assertEqual(repr(b), 'Version(\'0.1\')') - self.assertEqual(str(b), '0.1') - b = a[0:3] - self.assertTrue(isinstance(b, Version)) - self.assertEqual(b, Version('0.1_2')) - self.assertEqual(repr(b), 'Version(\'0.1_2\')') - self.assertEqual(str(b), '0.1_2') - b = a[1:] - self.assertTrue(isinstance(b, Version)) - self.assertEqual(b, Version('1_2-3')) - self.assertEqual(repr(b), 'Version(\'1_2-3\')') - self.assertEqual(str(b), '1_2-3') - # Raise TypeError on tuples - self.assertRaises(TypeError, b.__getitem__, 1, 2) - -if __name__ == '__main__': - unittest.main() +def assert_ver_lt(a, b): + """Asserts the results of comparisons when 'a' is less than 'b'.""" + a, b = ver(a), ver(b) + assert a < b + assert a <= b + assert a != b + assert not a == b + assert not a > b + assert not a >= b + + +def assert_ver_gt(a, b): + """Asserts the results of comparisons when 'a' is greater than 'b'.""" + a, b = ver(a), ver(b) + assert a > b + assert a >= b + assert a != b + assert not a == b + assert not a < b + assert not a <= b + + +def assert_ver_eq(a, b): + """Asserts the results of comparisons when 'a' is equal to 'b'.""" + a, b = ver(a), ver(b) + assert not a > b + assert a >= b + assert not a != b + assert a == b + assert not a < b + assert a <= b + + +def assert_in(needle, haystack): + """Asserts that 'needle' is in 'haystack'.""" + assert ver(needle) in ver(haystack) + + +def assert_not_in(needle, haystack): + """Asserts that 'needle' is not in 'haystack'.""" + assert ver(needle) not in ver(haystack) + + +def assert_canonical(canonical_list, version_list): + """Asserts that a redundant list is reduced to canonical form.""" + assert ver(canonical_list) == ver(version_list) + + +def assert_overlaps(v1, v2): + """Asserts that two version ranges overlaps.""" + assert ver(v1).overlaps(ver(v2)) + + +def assert_no_overlap(v1, v2): + """Asserts that two version ranges do not overlap.""" + assert not ver(v1).overlaps(ver(v2)) + + +def assert_satisfies(v1, v2): + """Asserts that 'v1' satisfies 'v2'.""" + assert ver(v1).satisfies(ver(v2)) + + +def assert_does_not_satisfy(v1, v2): + """Asserts that 'v1' does not satisfy 'v2'.""" + assert not ver(v1).satisfies(ver(v2)) + + +def check_intersection(expected, a, b): + """Asserts that 'a' intersect 'b' == 'expected'.""" + assert ver(expected) == ver(a).intersection(ver(b)) + + +def check_union(expected, a, b): + """Asserts that 'a' union 'b' == 'expected'.""" + assert ver(expected) == ver(a).union(ver(b)) + + +def test_two_segments(): + assert_ver_eq('1.0', '1.0') + assert_ver_lt('1.0', '2.0') + assert_ver_gt('2.0', '1.0') + assert_ver_eq('develop', 'develop') + assert_ver_lt('1.0', 'develop') + assert_ver_gt('develop', '1.0') + + +def test_three_segments(): + assert_ver_eq('2.0.1', '2.0.1') + assert_ver_lt('2.0', '2.0.1') + assert_ver_gt('2.0.1', '2.0') + + +def test_alpha(): + # TODO: not sure whether I like this. 2.0.1a is *usually* + # TODO: less than 2.0.1, but special-casing it makes version + # TODO: comparison complicated. See version.py + assert_ver_eq('2.0.1a', '2.0.1a') + assert_ver_gt('2.0.1a', '2.0.1') + assert_ver_lt('2.0.1', '2.0.1a') + + +def test_patch(): + assert_ver_eq('5.5p1', '5.5p1') + assert_ver_lt('5.5p1', '5.5p2') + assert_ver_gt('5.5p2', '5.5p1') + assert_ver_eq('5.5p10', '5.5p10') + assert_ver_lt('5.5p1', '5.5p10') + assert_ver_gt('5.5p10', '5.5p1') + + +def test_num_alpha_with_no_separator(): + assert_ver_lt('10xyz', '10.1xyz') + assert_ver_gt('10.1xyz', '10xyz') + assert_ver_eq('xyz10', 'xyz10') + assert_ver_lt('xyz10', 'xyz10.1') + assert_ver_gt('xyz10.1', 'xyz10') + + +def test_alpha_with_dots(): + assert_ver_eq('xyz.4', 'xyz.4') + assert_ver_lt('xyz.4', '8') + assert_ver_gt('8', 'xyz.4') + assert_ver_lt('xyz.4', '2') + assert_ver_gt('2', 'xyz.4') + + +def test_nums_and_patch(): + assert_ver_lt('5.5p2', '5.6p1') + assert_ver_gt('5.6p1', '5.5p2') + assert_ver_lt('5.6p1', '6.5p1') + assert_ver_gt('6.5p1', '5.6p1') + + +def test_rc_versions(): + assert_ver_gt('6.0.rc1', '6.0') + assert_ver_lt('6.0', '6.0.rc1') + + +def test_alpha_beta(): + assert_ver_gt('10b2', '10a1') + assert_ver_lt('10a2', '10b2') + + +def test_double_alpha(): + assert_ver_eq('1.0aa', '1.0aa') + assert_ver_lt('1.0a', '1.0aa') + assert_ver_gt('1.0aa', '1.0a') + + +def test_padded_numbers(): + assert_ver_eq('10.0001', '10.0001') + assert_ver_eq('10.0001', '10.1') + assert_ver_eq('10.1', '10.0001') + assert_ver_lt('10.0001', '10.0039') + assert_ver_gt('10.0039', '10.0001') + + +def test_close_numbers(): + assert_ver_lt('4.999.9', '5.0') + assert_ver_gt('5.0', '4.999.9') + + +def test_date_stamps(): + assert_ver_eq('20101121', '20101121') + assert_ver_lt('20101121', '20101122') + assert_ver_gt('20101122', '20101121') + + +def test_underscores(): + assert_ver_eq('2_0', '2_0') + assert_ver_eq('2.0', '2_0') + assert_ver_eq('2_0', '2.0') + + +def test_rpm_oddities(): + assert_ver_eq('1b.fc17', '1b.fc17') + assert_ver_lt('1b.fc17', '1.fc17') + assert_ver_gt('1.fc17', '1b.fc17') + assert_ver_eq('1g.fc17', '1g.fc17') + assert_ver_gt('1g.fc17', '1.fc17') + assert_ver_lt('1.fc17', '1g.fc17') + + +# Stuff below here is not taken from RPM's tests and is +# unique to spack +def test_version_ranges(): + assert_ver_lt('1.2:1.4', '1.6') + assert_ver_gt('1.6', '1.2:1.4') + assert_ver_eq('1.2:1.4', '1.2:1.4') + assert ver('1.2:1.4') != ver('1.2:1.6') + + assert_ver_lt('1.2:1.4', '1.5:1.6') + assert_ver_gt('1.5:1.6', '1.2:1.4') + + +def test_contains(): + assert_in('1.3', '1.2:1.4') + assert_in('1.2.5', '1.2:1.4') + assert_in('1.3.5', '1.2:1.4') + assert_in('1.3.5-7', '1.2:1.4') + assert_not_in('1.1', '1.2:1.4') + assert_not_in('1.5', '1.2:1.4') + + assert_in('1.4.2', '1.2:1.4') + assert_not_in('1.4.2', '1.2:1.4.0') + + assert_in('1.2.8', '1.2.7:1.4') + assert_in('1.2.7:1.4', ':') + assert_not_in('1.2.5', '1.2.7:1.4') + + assert_in('1.4.1', '1.2.7:1.4') + assert_not_in('1.4.1', '1.2.7:1.4.0') + + +def test_in_list(): + assert_in('1.2', ['1.5', '1.2', '1.3']) + assert_in('1.2.5', ['1.5', '1.2:1.3']) + assert_in('1.5', ['1.5', '1.2:1.3']) + assert_not_in('1.4', ['1.5', '1.2:1.3']) + + assert_in('1.2.5:1.2.7', [':']) + assert_in('1.2.5:1.2.7', ['1.5', '1.2:1.3']) + assert_not_in('1.2.5:1.5', ['1.5', '1.2:1.3']) + assert_not_in('1.1:1.2.5', ['1.5', '1.2:1.3']) + + +def test_ranges_overlap(): + assert_overlaps('1.2', '1.2') + assert_overlaps('1.2.1', '1.2.1') + assert_overlaps('1.2.1b', '1.2.1b') + + assert_overlaps('1.2:1.7', '1.6:1.9') + assert_overlaps(':1.7', '1.6:1.9') + assert_overlaps(':1.7', ':1.9') + assert_overlaps(':1.7', '1.6:') + assert_overlaps('1.2:', '1.6:1.9') + assert_overlaps('1.2:', ':1.9') + assert_overlaps('1.2:', '1.6:') + assert_overlaps(':', ':') + assert_overlaps(':', '1.6:1.9') + assert_overlaps('1.6:1.9', ':') + + +def test_overlap_with_containment(): + assert_in('1.6.5', '1.6') + assert_in('1.6.5', ':1.6') + + assert_overlaps('1.6.5', ':1.6') + assert_overlaps(':1.6', '1.6.5') + + assert_not_in(':1.6', '1.6.5') + assert_in('1.6.5', ':1.6') + + +def test_lists_overlap(): + assert_overlaps('1.2b:1.7,5', '1.6:1.9,1') + assert_overlaps('1,2,3,4,5', '3,4,5,6,7') + assert_overlaps('1,2,3,4,5', '5,6,7') + assert_overlaps('1,2,3,4,5', '5:7') + assert_overlaps('1,2,3,4,5', '3, 6:7') + assert_overlaps('1, 2, 4, 6.5', '3, 6:7') + assert_overlaps('1, 2, 4, 6.5', ':, 5, 8') + assert_overlaps('1, 2, 4, 6.5', ':') + assert_no_overlap('1, 2, 4', '3, 6:7') + assert_no_overlap('1,2,3,4,5', '6,7') + assert_no_overlap('1,2,3,4,5', '6:7') + + +def test_canonicalize_list(): + assert_canonical(['1.2', '1.3', '1.4'], ['1.2', '1.3', '1.3', '1.4']) + + assert_canonical(['1.2', '1.3:1.4'], ['1.2', '1.3', '1.3:1.4']) + + assert_canonical(['1.2', '1.3:1.4'], ['1.2', '1.3:1.4', '1.4']) + + assert_canonical(['1.3:1.4'], ['1.3:1.4', '1.3', '1.3.1', '1.3.9', '1.4']) + + assert_canonical(['1.3:1.4'], ['1.3', '1.3.1', '1.3.9', '1.4', '1.3:1.4']) + + assert_canonical( + ['1.3:1.5'], ['1.3', '1.3.1', '1.3.9', '1.4:1.5', '1.3:1.4'] + ) + + assert_canonical(['1.3:1.5'], ['1.3, 1.3.1,1.3.9,1.4:1.5,1.3:1.4']) + + assert_canonical(['1.3:1.5'], ['1.3, 1.3.1,1.3.9,1.4 : 1.5 , 1.3 : 1.4']) + + assert_canonical([':'], [':,1.3, 1.3.1,1.3.9,1.4 : 1.5 , 1.3 : 1.4']) + + +def test_intersection(): + check_intersection('2.5', '1.0:2.5', '2.5:3.0') + check_intersection('2.5:2.7', '1.0:2.7', '2.5:3.0') + check_intersection('0:1', ':', '0:1') + + check_intersection(['1.0', '2.5:2.7'], ['1.0:2.7'], ['2.5:3.0', '1.0']) + check_intersection(['2.5:2.7'], ['1.1:2.7'], ['2.5:3.0', '1.0']) + check_intersection(['0:1'], [':'], ['0:1']) + + +def test_intersect_with_containment(): + check_intersection('1.6.5', '1.6.5', ':1.6') + check_intersection('1.6.5', ':1.6', '1.6.5') + + check_intersection('1.6:1.6.5', ':1.6.5', '1.6') + check_intersection('1.6:1.6.5', '1.6', ':1.6.5') + + +def test_union_with_containment(): + check_union(':1.6', '1.6.5', ':1.6') + check_union(':1.6', ':1.6', '1.6.5') + + check_union(':1.6', ':1.6.5', '1.6') + check_union(':1.6', '1.6', ':1.6.5') + + check_union(':', '1.0:', ':2.0') + + check_union('1:4', '1:3', '2:4') + check_union('1:4', '2:4', '1:3') + + # Tests successor/predecessor case. + check_union('1:4', '1:2', '3:4') + + +def test_basic_version_satisfaction(): + assert_satisfies('4.7.3', '4.7.3') + + assert_satisfies('4.7.3', '4.7') + assert_satisfies('4.7.3b2', '4.7') + assert_satisfies('4.7b6', '4.7') + + assert_satisfies('4.7.3', '4') + assert_satisfies('4.7.3b2', '4') + assert_satisfies('4.7b6', '4') + + assert_does_not_satisfy('4.8.0', '4.9') + assert_does_not_satisfy('4.8', '4.9') + assert_does_not_satisfy('4', '4.9') + + +def test_basic_version_satisfaction_in_lists(): + assert_satisfies(['4.7.3'], ['4.7.3']) + + assert_satisfies(['4.7.3'], ['4.7']) + assert_satisfies(['4.7.3b2'], ['4.7']) + assert_satisfies(['4.7b6'], ['4.7']) + + assert_satisfies(['4.7.3'], ['4']) + assert_satisfies(['4.7.3b2'], ['4']) + assert_satisfies(['4.7b6'], ['4']) + + assert_does_not_satisfy(['4.8.0'], ['4.9']) + assert_does_not_satisfy(['4.8'], ['4.9']) + assert_does_not_satisfy(['4'], ['4.9']) + + +def test_version_range_satisfaction(): + assert_satisfies('4.7b6', '4.3:4.7') + assert_satisfies('4.3.0', '4.3:4.7') + assert_satisfies('4.3.2', '4.3:4.7') + + assert_does_not_satisfy('4.8.0', '4.3:4.7') + assert_does_not_satisfy('4.3', '4.4:4.7') + + assert_satisfies('4.7b6', '4.3:4.7') + assert_does_not_satisfy('4.8.0', '4.3:4.7') + + +def test_version_range_satisfaction_in_lists(): + assert_satisfies(['4.7b6'], ['4.3:4.7']) + assert_satisfies(['4.3.0'], ['4.3:4.7']) + assert_satisfies(['4.3.2'], ['4.3:4.7']) + + assert_does_not_satisfy(['4.8.0'], ['4.3:4.7']) + assert_does_not_satisfy(['4.3'], ['4.4:4.7']) + + assert_satisfies(['4.7b6'], ['4.3:4.7']) + assert_does_not_satisfy(['4.8.0'], ['4.3:4.7']) + + +def test_satisfaction_with_lists(): + assert_satisfies('4.7', '4.3, 4.6, 4.7') + assert_satisfies('4.7.3', '4.3, 4.6, 4.7') + assert_satisfies('4.6.5', '4.3, 4.6, 4.7') + assert_satisfies('4.6.5.2', '4.3, 4.6, 4.7') + + assert_does_not_satisfy('4', '4.3, 4.6, 4.7') + assert_does_not_satisfy('4.8.0', '4.2, 4.3:4.7') + + assert_satisfies('4.8.0', '4.2, 4.3:4.8') + assert_satisfies('4.8.2', '4.2, 4.3:4.8') + + +def test_formatted_strings(): + versions = '1.2.3', '1_2_3', '1-2-3' + for item in versions: + v = Version(item) + assert v.dotted == '1.2.3' + assert v.dashed == '1-2-3' + assert v.underscored == '1_2_3' + assert v.joined == '123' + + +def test_repr_and_str(): + + def check_repr_and_str(vrs): + a = Version(vrs) + assert repr(a) == 'Version(\'' + vrs + '\')' + b = eval(repr(a)) + assert a == b + assert str(a) == vrs + assert str(a) == str(b) + + check_repr_and_str('1.2.3') + check_repr_and_str('R2016a') + check_repr_and_str('R2016a.2-3_4') + + +def test_get_item(): + a = Version('0.1_2-3') + assert isinstance(a[1], int) + # Test slicing + b = a[0:2] + assert isinstance(b, Version) + assert b == Version('0.1') + assert repr(b) == 'Version(\'0.1\')' + assert str(b) == '0.1' + b = a[0:3] + assert isinstance(b, Version) + assert b == Version('0.1_2') + assert repr(b) == 'Version(\'0.1_2\')' + assert str(b) == '0.1_2' + b = a[1:] + assert isinstance(b, Version) + assert b == Version('1_2-3') + assert repr(b) == 'Version(\'1_2-3\')' + assert str(b) == '1_2-3' + # Raise TypeError on tuples + with pytest.raises(TypeError): + b.__getitem__(1, 2) -- cgit v1.2.3-70-g09d2 From 0c44dd28bb85b874ddd109974ff3585b78d85ec4 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 31 Mar 2017 22:42:04 +0200 Subject: test/package_sanity.py: ported to pytest (#3474) --- lib/spack/spack/test/package_sanity.py | 67 +++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py index c75d7cdcc7..ac318f94dc 100644 --- a/lib/spack/spack/test/package_sanity.py +++ b/lib/spack/spack/test/package_sanity.py @@ -22,49 +22,48 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -"""\ -This test does sanity checks on Spack's builtin package database. -""" -import unittest +"""This test does sanity checks on Spack's builtin package database.""" + import re import spack from spack.repository import RepoPath -class PackageSanityTest(unittest.TestCase): +def check_db(): + """Get all packages in a DB to make sure they work.""" + for name in spack.repo.all_package_names(): + spack.repo.get(name) + + +def test_get_all_packages(): + """Get all packages once and make sure that works.""" + check_db() + - def check_db(self): - """Get all packages in a DB to make sure they work.""" - for name in spack.repo.all_package_names(): - spack.repo.get(name) +def test_get_all_mock_packages(): + """Get the mock packages once each too.""" + db = RepoPath(spack.mock_packages_path) + spack.repo.swap(db) + check_db() + spack.repo.swap(db) - def test_get_all_packages(self): - """Get all packages once and make sure that works.""" - self.check_db() - def test_get_all_mock_packages(self): - """Get the mock packages once each too.""" - db = RepoPath(spack.mock_packages_path) - spack.repo.swap(db) - self.check_db() - spack.repo.swap(db) +def test_url_versions(): + """Check URLs for regular packages, if they are explicitly defined.""" + for pkg in spack.repo.all_packages(): + for v, vattrs in pkg.versions.items(): + if 'url' in vattrs: + # If there is a url for the version check it. + v_url = pkg.url_for_version(v) + assert vattrs['url'] == v_url - def test_url_versions(self): - """Check URLs for regular packages, if they are explicitly defined.""" - for pkg in spack.repo.all_packages(): - for v, vattrs in pkg.versions.items(): - if 'url' in vattrs: - # If there is a url for the version check it. - v_url = pkg.url_for_version(v) - self.assertEqual(vattrs['url'], v_url) - def test_all_versions_are_lowercase(self): - """Spack package names must be lowercase, and use `-` instead of `_`. - """ - errors = [] - for name in spack.repo.all_package_names(): - if re.search(r'[_A-Z]', name): - errors.append(name) +def test_all_versions_are_lowercase(): + """Spack package names must be lowercase, and use `-` instead of `_`.""" + errors = [] + for name in spack.repo.all_package_names(): + if re.search(r'[_A-Z]', name): + errors.append(name) - self.assertEqual([], errors) + assert len(errors) == 0 -- cgit v1.2.3-70-g09d2 From 12c1216c34f70b95ee41eaa7aa4cc0942dc4d17c Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Fri, 31 Mar 2017 17:51:09 -0700 Subject: fix flake8 ignore syntax (use E instead of ignore) (#3651) --- lib/spack/spack/cmd/flake8.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 47f531fe84..19724142bb 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -129,7 +129,7 @@ def filter_file(source, dest, output=False): for code, patterns in errors.items(): for pattern in patterns: if pattern.search(line): - line += (" # NOQA: ignore=%d" % code) + line += (" # NOQA: E%d" % code) break oline = line + '\n' -- cgit v1.2.3-70-g09d2 From fb98f9ee19a1ddcbde3a1447f8f847e5c1c62286 Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Sat, 1 Apr 2017 12:29:06 +0200 Subject: fix annoying 'fatal: Not a git repository' error message (#3657) fix annoying 'fatal: Not a git repository' error message produced by 'spack list' when Spack is not run from a Git repository (#3657) --- lib/spack/spack/cmd/pkg.py | 7 +++++-- lib/spack/spack/hooks/case_consistency.py | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index 7b668586b5..12dcb81792 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -73,13 +73,16 @@ def setup_parser(subparser): help="revision to compare to rev1 (default is HEAD)") -def get_git(): +def get_git(fatal=True): # cd to spack prefix to do git operations os.chdir(spack.prefix) # If this is a non-git version of spack, give up. if not os.path.isdir('.git'): - tty.die("No git repo in %s. Can't use 'spack pkg'" % spack.prefix) + if fatal: + tty.die("No git repo in %s. Can't use 'spack pkg'" % spack.prefix) + else: + return None return which("git", required=True) diff --git a/lib/spack/spack/hooks/case_consistency.py b/lib/spack/spack/hooks/case_consistency.py index e9208ee9ff..2b88291666 100644 --- a/lib/spack/spack/hooks/case_consistency.py +++ b/lib/spack/spack/hooks/case_consistency.py @@ -31,6 +31,7 @@ import platform from llnl.util.filesystem import * import spack +from spack.cmd.pkg import get_git from spack.util.executable import * @@ -61,8 +62,8 @@ def git_case_consistency_check(path): """ with working_dir(path): # Don't bother fixing case if Spack isn't in a git repository - git = which('git') - if not git: + git = get_git(fatal=False) + if git is None: return try: -- cgit v1.2.3-70-g09d2 From 28d6d375b46273779e377b844ddb80739f393514 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 31 Mar 2017 20:19:18 -0500 Subject: Fix Python 3 support in spack versions - Add missing import, fixes spack versions in Python 2 - Fix spack versions in Python 3 --- lib/spack/spack/url.py | 2 +- lib/spack/spack/util/web.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 7502f23994..38ff74f7bc 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -513,7 +513,7 @@ def wildcard_version(path): name_parts = re.split(name_re, path) # Even elements in the array did *not* match the name - for i in xrange(0, len(name_parts), 2): + for i in range(0, len(name_parts), 2): # Split each part by things that look like versions. vparts = re.split(v.wildcard(), name_parts[i]) diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 0d7d0d3792..09bf2c34e1 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -28,6 +28,7 @@ import sys from six.moves.urllib.request import urlopen, Request from six.moves.urllib.error import URLError +from six.moves.urllib.parse import urljoin from multiprocessing import Pool try: @@ -38,7 +39,7 @@ except ImportError: from html.parser import HTMLParser # Also, HTMLParseError is deprecated and never raised. - class HTMLParseError: + class HTMLParseError(Exception): pass import llnl.util.tty as tty @@ -110,7 +111,7 @@ def _spider(args): response_url = response.geturl() # Read the page and and stick it in the map we'll return - page = response.read() + page = response.read().decode('utf-8') pages[response_url] = page # Parse out the links in the page @@ -120,7 +121,7 @@ def _spider(args): while link_parser.links: raw_link = link_parser.links.pop() - abs_link = urlparse.urljoin(response_url, raw_link.strip()) + abs_link = urljoin(response_url, raw_link.strip()) links.add(abs_link) -- cgit v1.2.3-70-g09d2 From 221f17971634e43950f90333776589c4d0bf0ce3 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 1 Apr 2017 14:03:54 -0700 Subject: Add better tests for web.py; fix some bugs found with spidering. - _spider in web.py was actually failing to spider deeper than a certain point. - Fixed multiprocessing pools to not use daemons and to allow recursive spawning. - Added detailed tests for spidering and for finding archive versions. - left some xfail URL finding exercises for the reader. - Fix noqa annotations for some @when decorators --- lib/spack/spack/package.py | 10 +- lib/spack/spack/test/data/web/1.html | 10 ++ lib/spack/spack/test/data/web/2.html | 12 ++ lib/spack/spack/test/data/web/3.html | 11 ++ lib/spack/spack/test/data/web/4.html | 11 ++ lib/spack/spack/test/data/web/index.html | 10 ++ lib/spack/spack/test/web.py | 165 +++++++++++++++++++++ lib/spack/spack/util/web.py | 89 +++++++---- .../repos/builtin/packages/autogen/package.py | 2 +- var/spack/repos/builtin/packages/boost/package.py | 2 +- var/spack/repos/builtin/packages/cmake/package.py | 2 +- .../repos/builtin/packages/elfutils/package.py | 6 +- var/spack/repos/builtin/packages/gcc/package.py | 2 +- var/spack/repos/builtin/packages/gdal/package.py | 2 +- var/spack/repos/builtin/packages/hwloc/package.py | 2 +- var/spack/repos/builtin/packages/hydra/package.py | 2 +- var/spack/repos/builtin/packages/mpich/package.py | 2 +- .../repos/builtin/packages/openmpi/package.py | 2 +- .../repos/builtin/packages/openssl/package.py | 2 +- var/spack/repos/builtin/packages/pango/package.py | 2 +- .../repos/builtin/packages/patchelf/package.py | 2 +- .../repos/builtin/packages/py-nose/package.py | 2 - .../builtin/packages/py-scikit-learn/package.py | 2 - var/spack/repos/builtin/packages/python/package.py | 7 +- .../repos/builtin/packages/qt-creator/package.py | 2 +- var/spack/repos/builtin/packages/qt/package.py | 10 +- .../repos/builtin/packages/util-linux/package.py | 2 +- 27 files changed, 306 insertions(+), 67 deletions(-) create mode 100644 lib/spack/spack/test/data/web/1.html create mode 100644 lib/spack/spack/test/data/web/2.html create mode 100644 lib/spack/spack/test/data/web/3.html create mode 100644 lib/spack/spack/test/data/web/4.html create mode 100644 lib/spack/spack/test/data/web/index.html create mode 100644 lib/spack/spack/test/web.py (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 6b71c0f1a9..177b4c908b 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -570,7 +570,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.list_url = None if not hasattr(self, 'list_depth'): - self.list_depth = 1 + self.list_depth = 0 # Set default licensing information if not hasattr(self, 'license_required'): @@ -966,6 +966,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.stage.expand_archive() self.stage.chdir_to_source() + def patch(self): + """Default patch implementation is a no-op.""" + pass + def do_patch(self): """Calls do_stage(), then applied patches to the expanded tarball if they haven't been applied already.""" @@ -1686,9 +1690,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): try: return spack.util.web.find_versions_of_archive( - *self.all_urls, - list_url=self.list_url, - list_depth=self.list_depth) + self.all_urls, self.list_url, self.list_depth) except spack.error.NoNetworkConnectionError as e: tty.die("Package.fetch_versions couldn't connect to:", e.url, e.message) diff --git a/lib/spack/spack/test/data/web/1.html b/lib/spack/spack/test/data/web/1.html new file mode 100644 index 0000000000..ef49c38cdb --- /dev/null +++ b/lib/spack/spack/test/data/web/1.html @@ -0,0 +1,10 @@ + + + This is page 1. + + + list_depth=2 follows this. + + foo-1.0.0.tar.gz + + diff --git a/lib/spack/spack/test/data/web/2.html b/lib/spack/spack/test/data/web/2.html new file mode 100644 index 0000000000..64c843f25b --- /dev/null +++ b/lib/spack/spack/test/data/web/2.html @@ -0,0 +1,12 @@ + + + This is page 2. + + + list_depth=3 follows this. + list_depth=3 follows this too. + + foo-2.0.0.tar.gz + foo-2.0.0b2.tar.gz + + diff --git a/lib/spack/spack/test/data/web/3.html b/lib/spack/spack/test/data/web/3.html new file mode 100644 index 0000000000..e530206035 --- /dev/null +++ b/lib/spack/spack/test/data/web/3.html @@ -0,0 +1,11 @@ + + + This is page 3. + + + This link is already visited. + + foo-3.0.tar.gz + foo-3.0a1.tar.gz + + diff --git a/lib/spack/spack/test/data/web/4.html b/lib/spack/spack/test/data/web/4.html new file mode 100644 index 0000000000..b5fe850f4d --- /dev/null +++ b/lib/spack/spack/test/data/web/4.html @@ -0,0 +1,11 @@ + + + This is page 4. + + + This page is terminal and has no links to other pages. + + foo-4.5.tar.gz. + foo-4.1-rc5.tar.gz. + + diff --git a/lib/spack/spack/test/data/web/index.html b/lib/spack/spack/test/data/web/index.html new file mode 100644 index 0000000000..3985deeb35 --- /dev/null +++ b/lib/spack/spack/test/data/web/index.html @@ -0,0 +1,10 @@ + + + This is the root page. + + + list_depth=1 follows this. + + foo-0.0.0.tar.gz + + diff --git a/lib/spack/spack/test/web.py b/lib/spack/spack/test/web.py new file mode 100644 index 0000000000..9a7f4d9f8b --- /dev/null +++ b/lib/spack/spack/test/web.py @@ -0,0 +1,165 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## +"""Tests for web.py.""" +import pytest +import os + +import spack +from spack.util.web import spider, find_versions_of_archive +from spack.version import * + + +web_data_path = os.path.join(spack.test_path, 'data', 'web') + +root = 'file://' + web_data_path + '/index.html' +root_tarball = 'file://' + web_data_path + '/foo-0.0.0.tar.gz' + +page_1 = 'file://' + os.path.join(web_data_path, '1.html') +page_2 = 'file://' + os.path.join(web_data_path, '2.html') +page_3 = 'file://' + os.path.join(web_data_path, '3.html') +page_4 = 'file://' + os.path.join(web_data_path, '4.html') + + +def test_spider_0(): + pages, links = spider(root, depth=0) + + assert root in pages + assert page_1 not in pages + assert page_2 not in pages + assert page_3 not in pages + assert page_4 not in pages + + assert "This is the root page." in pages[root] + + assert root not in links + assert page_1 in links + assert page_2 not in links + assert page_3 not in links + assert page_4 not in links + + +def test_spider_1(): + pages, links = spider(root, depth=1) + + assert root in pages + assert page_1 in pages + assert page_2 not in pages + assert page_3 not in pages + assert page_4 not in pages + + assert "This is the root page." in pages[root] + assert "This is page 1." in pages[page_1] + + assert root not in links + assert page_1 in links + assert page_2 in links + assert page_3 not in links + assert page_4 not in links + + +def test_spider_2(): + pages, links = spider(root, depth=2) + + assert root in pages + assert page_1 in pages + assert page_2 in pages + assert page_3 not in pages + assert page_4 not in pages + + assert "This is the root page." in pages[root] + assert "This is page 1." in pages[page_1] + assert "This is page 2." in pages[page_2] + + assert root not in links + assert page_1 in links + assert page_1 in links + assert page_2 in links + assert page_3 in links + assert page_4 in links + + +def test_spider_3(): + pages, links = spider(root, depth=3) + + assert root in pages + assert page_1 in pages + assert page_2 in pages + assert page_3 in pages + assert page_4 in pages + + assert "This is the root page." in pages[root] + assert "This is page 1." in pages[page_1] + assert "This is page 2." in pages[page_2] + assert "This is page 3." in pages[page_3] + assert "This is page 4." in pages[page_4] + + assert root in links # circular link on page 3 + assert page_1 in links + assert page_1 in links + assert page_2 in links + assert page_3 in links + assert page_4 in links + + +def test_find_versions_of_archive_0(): + versions = find_versions_of_archive(root_tarball, root, list_depth=0) + assert ver('0.0.0') in versions + + +def test_find_versions_of_archive_1(): + versions = find_versions_of_archive(root_tarball, root, list_depth=1) + assert ver('0.0.0') in versions + assert ver('1.0.0') in versions + + +def test_find_versions_of_archive_2(): + versions = find_versions_of_archive(root_tarball, root, list_depth=2) + assert ver('0.0.0') in versions + assert ver('1.0.0') in versions + assert ver('2.0.0') in versions + + +@pytest.mark.xfail +def test_find_exotic_versions_of_archive_2(): + versions = find_versions_of_archive(root_tarball, root, list_depth=2) + # up for grabs to make this better. + assert ver('2.0.0b2') in versions + + +def test_find_versions_of_archive_3(): + versions = find_versions_of_archive(root_tarball, root, list_depth=3) + assert ver('0.0.0') in versions + assert ver('1.0.0') in versions + assert ver('2.0.0') in versions + assert ver('3.0') in versions + assert ver('4.5') in versions + + +@pytest.mark.xfail +def test_find_exotic_versions_of_archive_3(): + versions = find_versions_of_archive(root_tarball, root, list_depth=3) + assert ver('2.0.0b2') in versions + assert ver('3.0a1') in versions + assert ver('4.5-rc5') in versions diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 09bf2c34e1..8e2dd34635 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -25,11 +25,12 @@ import re import os import sys +import traceback from six.moves.urllib.request import urlopen, Request from six.moves.urllib.error import URLError from six.moves.urllib.parse import urljoin -from multiprocessing import Pool +import multiprocessing.pool try: # Python 2 had these in the HTMLParser package. @@ -67,25 +68,42 @@ class LinkParser(HTMLParser): self.links.append(val) -def _spider(args): - """_spider(url, depth, max_depth) +class NonDaemonProcess(multiprocessing.Process): + """Process tha allows sub-processes, so pools can have sub-pools.""" + def _get_daemon(self): + return False - Fetches URL and any pages it links to up to max_depth. depth should - initially be 1, and max_depth includes the root. This function will - print out a warning only if the root can't be fetched; it ignores - errors with pages that the root links to. + def _set_daemon(self, value): + pass - This will return a list of the pages fetched, in no particular order. + daemon = property(_get_daemon, _set_daemon) + + +class NonDaemonPool(multiprocessing.pool.Pool): + """Pool that uses non-daemon processes""" + Process = NonDaemonProcess - Takes args as a tuple b/c it's intended to be used by a multiprocessing - pool. Firing off all the child links at once makes the fetch MUCH - faster for pages with lots of children. - """ - url, visited, root, opener, depth, max_depth, raise_on_error = args +def _spider(url, visited, root, depth, max_depth, raise_on_error): + """Fetches URL and any pages it links to up to max_depth. + + depth should initially be zero, and max_depth is the max depth of + links to follow from the root. + + Prints out a warning only if the root can't be fetched; it ignores + errors with pages that the root links to. + + Returns a tuple of: + - pages: dict of pages visited (URL) mapped to their full text. + - links: set of links encountered while visiting the pages. + """ pages = {} # dict from page URL -> text content. links = set() # set of all links seen on visited pages. + # root may end with index.html -- chop that off. + if root.endswith('/index.html'): + root = re.sub('/index.html$', '', root) + try: # Make a HEAD request first to check the content type. This lets # us ignore tarballs and gigantic files. @@ -139,17 +157,19 @@ def _spider(args): # If we're not at max depth, follow links. if depth < max_depth: - subcalls.append((abs_link, visited, root, None, + subcalls.append((abs_link, visited, root, depth + 1, max_depth, raise_on_error)) visited.add(abs_link) if subcalls: + pool = NonDaemonPool(processes=len(subcalls)) try: - pool = Pool(processes=len(subcalls)) - results = pool.map(_spider, subcalls) + results = pool.map(_spider_wrapper, subcalls) + for sub_pages, sub_links in results: pages.update(sub_pages) links.update(sub_links) + finally: pool.terminate() pool.join() @@ -171,46 +191,53 @@ def _spider(args): except Exception as e: # Other types of errors are completely ignored, except in debug mode. - tty.debug("Error in _spider: %s" % e) + tty.debug("Error in _spider: %s:%s" % (type(e), e), + traceback.format_exc()) return pages, links -def spider(root_url, **kwargs): +def _spider_wrapper(args): + """Wrapper for using spider with multiprocessing.""" + return _spider(*args) + + +def spider(root_url, depth=0): + """Gets web pages from a root URL. - If depth is specified (e.g., depth=2), then this will also fetches pages - linked from the root and its children up to depth. + + If depth is specified (e.g., depth=2), then this will also follow + up to levels of links from the root. This will spawn processes to fetch the children, for much improved performance over a sequential fetch. + """ - max_depth = kwargs.setdefault('depth', 1) - pages, links = _spider((root_url, set(), root_url, None, - 1, max_depth, False)) + pages, links = _spider(root_url, set(), root_url, 0, depth, False) return pages, links -def find_versions_of_archive(*archive_urls, **kwargs): +def find_versions_of_archive(archive_urls, list_url=None, list_depth=0): """Scrape web pages for new versions of a tarball. Arguments: archive_urls: - URLs for different versions of a package. Typically these - are just the tarballs from the package file itself. By - default, this searches the parent directories of archives. + URL or sequence of URLs for different versions of a + package. Typically these are just the tarballs from the package + file itself. By default, this searches the parent directories + of archives. Keyword Arguments: list_url: - URL for a listing of archives. Spack wills scrape these pages for download links that look like the archive URL. list_depth: - Max depth to follow links on list_url pages. + Max depth to follow links on list_url pages. Default 0. """ - list_url = kwargs.get('list_url', None) - list_depth = kwargs.get('list_depth', 1) + if not isinstance(archive_urls, (list, tuple)): + archive_urls = [archive_urls] # Generate a list of list_urls based on archive urls and any # explicitly listed list_url in the package diff --git a/var/spack/repos/builtin/packages/autogen/package.py b/var/spack/repos/builtin/packages/autogen/package.py index 0bfe6159c9..e79af636b5 100644 --- a/var/spack/repos/builtin/packages/autogen/package.py +++ b/var/spack/repos/builtin/packages/autogen/package.py @@ -34,7 +34,7 @@ class Autogen(AutotoolsPackage): homepage = "https://www.gnu.org/software/autogen/index.html" url = "https://ftp.gnu.org/gnu/autogen/rel5.18.12/autogen-5.18.12.tar.gz" list_url = "https://ftp.gnu.org/gnu/autogen" - list_depth = 2 + list_depth = 1 version('5.18.12', '551d15ccbf5b5fc5658da375d5003389') diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index 6f891de664..7570987ad8 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -40,7 +40,7 @@ class Boost(Package): homepage = "http://www.boost.org" url = "http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2" list_url = "http://sourceforge.net/projects/boost/files/boost/" - list_depth = 2 + list_depth = 1 version('1.63.0', '1c837ecd990bb022d07e7aab32b09847') version('1.62.0', '5fb94629535c19e48703bdb2b2e9490f') diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py index 4ff9615016..1dd480d675 100644 --- a/var/spack/repos/builtin/packages/cmake/package.py +++ b/var/spack/repos/builtin/packages/cmake/package.py @@ -31,7 +31,7 @@ class Cmake(Package): homepage = 'https://www.cmake.org' url = 'https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz' list_url = 'https://cmake.org/files/' - list_depth = 2 + list_depth = 1 version('3.7.2', '79bd7e65cd81ea3aa2619484ad6ff25a') version('3.7.1', 'd031d5a06e9f1c5367cdfc56fbd2a1c8') diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index 960b9985ad..2594d73c37 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -37,10 +37,10 @@ class Elfutils(AutotoolsPackage): url = "https://sourceware.org/elfutils/ftp/0.168/elfutils-0.168.tar.bz2" list_url = "https://sourceware.org/elfutils/ftp" - list_depth = 2 + list_depth = 1 - version('0.168','52adfa40758d0d39e5d5c57689bf38d6') - version('0.163','77ce87f259987d2e54e4d87b86cbee41', preferred=True) + version('0.168', '52adfa40758d0d39e5d5c57689bf38d6') + version('0.163', '77ce87f259987d2e54e4d87b86cbee41', preferred=True) provides('elf@1') diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index 1fddb77299..ffb85ec15e 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -37,7 +37,7 @@ class Gcc(AutotoolsPackage): url = "http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2" list_url = 'http://ftp.gnu.org/gnu/gcc/' - list_depth = 2 + list_depth = 1 version('6.3.0', '677a7623c7ef6ab99881bc4e048debb6') version('6.2.0', '9768625159663b300ae4de2f4745fcc4') diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py index b52b1f1038..dc58cc8993 100644 --- a/var/spack/repos/builtin/packages/gdal/package.py +++ b/var/spack/repos/builtin/packages/gdal/package.py @@ -38,7 +38,7 @@ class Gdal(Package): homepage = "http://www.gdal.org/" url = "http://download.osgeo.org/gdal/2.1.2/gdal-2.1.2.tar.xz" list_url = "http://download.osgeo.org/gdal/" - list_depth = 2 + list_depth = 1 version('2.1.2', 'ae85b78888514c75e813d658cac9478e') version('2.0.2', '940208e737c87d31a90eaae43d0efd65') diff --git a/var/spack/repos/builtin/packages/hwloc/package.py b/var/spack/repos/builtin/packages/hwloc/package.py index 0030d5ffde..6efa2dfbd9 100644 --- a/var/spack/repos/builtin/packages/hwloc/package.py +++ b/var/spack/repos/builtin/packages/hwloc/package.py @@ -42,7 +42,7 @@ class Hwloc(AutotoolsPackage): homepage = "http://www.open-mpi.org/projects/hwloc/" url = "http://www.open-mpi.org/software/hwloc/v1.9/downloads/hwloc-1.9.tar.gz" list_url = "http://www.open-mpi.org/software/hwloc/" - list_depth = 3 + list_depth = 2 version('1.11.6', 'b4e95eadd2fbdb6d40bbd96be6f03c84') version('1.11.5', '8f5fe6a9be2eb478409ad5e640b2d3ba') diff --git a/var/spack/repos/builtin/packages/hydra/package.py b/var/spack/repos/builtin/packages/hydra/package.py index 4461adae2e..fd894b68ee 100644 --- a/var/spack/repos/builtin/packages/hydra/package.py +++ b/var/spack/repos/builtin/packages/hydra/package.py @@ -34,6 +34,6 @@ class Hydra(AutotoolsPackage): homepage = "http://www.mpich.org" url = "http://www.mpich.org/static/downloads/3.2/hydra-3.2.tar.gz" list_url = "http://www.mpich.org/static/downloads/" - list_depth = 2 + list_depth = 1 version('3.2', '4d670916695bf7e3a869cc336a881b39') diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index 09fc683874..819fc95d5b 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -32,7 +32,7 @@ class Mpich(AutotoolsPackage): homepage = "http://www.mpich.org" url = "http://www.mpich.org/static/downloads/3.0.4/mpich-3.0.4.tar.gz" list_url = "http://www.mpich.org/static/downloads/" - list_depth = 2 + list_depth = 1 version('3.2', 'f414cfa77099cd1fa1a5ae4e22db508a') version('3.1.4', '2ab544607986486562e076b83937bba2') diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 3480311aed..7c07c515fa 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -61,7 +61,7 @@ class Openmpi(AutotoolsPackage): homepage = "http://www.open-mpi.org" url = "https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2" list_url = "http://www.open-mpi.org/software/ompi/" - list_depth = 3 + list_depth = 2 version('2.1.0', '4838a5973115c44e14442c01d3f21d52') version('2.0.2', 'ecd99aa436a1ca69ce936a96d6a3fa48') diff --git a/var/spack/repos/builtin/packages/openssl/package.py b/var/spack/repos/builtin/packages/openssl/package.py index 1432ac76fc..53e94ed445 100644 --- a/var/spack/repos/builtin/packages/openssl/package.py +++ b/var/spack/repos/builtin/packages/openssl/package.py @@ -37,7 +37,7 @@ class Openssl(Package): # URL must remain http:// so Spack can bootstrap curl url = "http://www.openssl.org/source/openssl-1.0.1h.tar.gz" list_url = "https://www.openssl.org/source/old/" - list_depth = 2 + list_depth = 1 version('1.1.0e', '51c42d152122e474754aea96f66928c6') version('1.1.0d', '711ce3cd5f53a99c0e12a7d5804f0f63') diff --git a/var/spack/repos/builtin/packages/pango/package.py b/var/spack/repos/builtin/packages/pango/package.py index 0f082527b9..cc6565dae3 100644 --- a/var/spack/repos/builtin/packages/pango/package.py +++ b/var/spack/repos/builtin/packages/pango/package.py @@ -33,7 +33,7 @@ class Pango(AutotoolsPackage): homepage = "http://www.pango.org" url = "http://ftp.gnome.org/pub/GNOME/sources/pango/1.40/pango-1.40.3.tar.xz" list_url = "http://ftp.gnome.org/pub/gnome/sources/pango/" - list_depth = 2 + list_depth = 1 version('1.40.3', 'abba8b5ce728520c3a0f1535eab19eac3c14aeef7faa5aded90017ceac2711d3') version('1.40.1', 'e27af54172c72b3ac6be53c9a4c67053e16c905e02addcf3a603ceb2005c1a40') diff --git a/var/spack/repos/builtin/packages/patchelf/package.py b/var/spack/repos/builtin/packages/patchelf/package.py index 1d429361b6..d36366f557 100644 --- a/var/spack/repos/builtin/packages/patchelf/package.py +++ b/var/spack/repos/builtin/packages/patchelf/package.py @@ -33,7 +33,7 @@ class Patchelf(AutotoolsPackage): url = "http://nixos.org/releases/patchelf/patchelf-0.8/patchelf-0.8.tar.gz" list_url = "http://nixos.org/releases/patchelf/" - list_depth = 2 + list_depth = 1 version('0.9', '3c265508526760f233620f35d79c79fc') version('0.8', '407b229e6a681ffb0e2cdd5915cb2d01') diff --git a/var/spack/repos/builtin/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py index 2b27ed4f1d..f3f08029a4 100644 --- a/var/spack/repos/builtin/packages/py-nose/package.py +++ b/var/spack/repos/builtin/packages/py-nose/package.py @@ -31,8 +31,6 @@ class PyNose(PythonPackage): homepage = "https://pypi.python.org/pypi/nose" url = "https://pypi.io/packages/source/n/nose/nose-1.3.4.tar.gz" - list_url = "https://pypi.python.org/pypi/nose/" - list_depth = 2 import_modules = [ 'nose', 'nose.ext', 'nose.plugins', 'nose.sphinx', 'nose.tools' diff --git a/var/spack/repos/builtin/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py index e61a90f352..844453944a 100644 --- a/var/spack/repos/builtin/packages/py-scikit-learn/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py @@ -30,8 +30,6 @@ class PyScikitLearn(PythonPackage): homepage = "https://pypi.python.org/pypi/scikit-learn" url = "https://pypi.io/packages/source/s/scikit-learn/scikit-learn-0.18.1.tar.gz" - list_url = "https://pypi.python.org/pypi/scikit-learn" - list_depth = 2 version('0.18.1', '6b0ff1eaa5010043895dd63d1e3c60c9') version('0.15.2', 'd9822ad0238e17b382a3c756ea94fe0d') diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index d4d6f713ba..6e0b5b8dc8 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -42,7 +42,7 @@ class Python(Package): homepage = "http://www.python.org" url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz" list_url = "https://www.python.org/downloads/" - list_depth = 2 + list_depth = 1 version('3.6.0', '3f7062ccf8be76491884d0e47ac8b251') version('3.5.2', '3fe8434643a78630c61c6464fe2e7e72') @@ -99,11 +99,6 @@ class Python(Package): r'\1setup.py\2 --no-user-cfg \3\6' ) - @when('@:2.6,3.0:3.3') - def patch(self): - # See https://github.com/LLNL/spack/issues/1490 - pass - def install(self, spec, prefix): # TODO: The '--no-user-cfg' option for Python installation is only in # Python v2.7 and v3.4+ (see https://bugs.python.org/issue1180) and diff --git a/var/spack/repos/builtin/packages/qt-creator/package.py b/var/spack/repos/builtin/packages/qt-creator/package.py index 347cf4d6ee..abd619530f 100644 --- a/var/spack/repos/builtin/packages/qt-creator/package.py +++ b/var/spack/repos/builtin/packages/qt-creator/package.py @@ -32,7 +32,7 @@ class QtCreator(Package): url = 'http://download.qt.io/official_releases/qtcreator/4.1/4.1.0/qt-creator-opensource-src-4.1.0.tar.gz' list_url = 'http://download.qt.io/official_releases/qtcreator/' - list_depth = 3 + list_depth = 2 version('4.1.0', '657727e4209befa4bf5889dff62d9e0a') diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index 60c5f15ece..b27bc3fe07 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -33,7 +33,7 @@ class Qt(Package): homepage = 'http://qt.io' url = 'http://download.qt.io/archive/qt/5.7/5.7.0/single/qt-everywhere-opensource-src-5.7.0.tar.gz' list_url = 'http://download.qt.io/archive/qt/' - list_depth = 4 + list_depth = 3 version('5.7.1', '031fb3fd0c3cc0f1082644492683f18d') version('5.7.0', '9a46cce61fc64c20c3ac0a0e0fa41b42') @@ -251,7 +251,7 @@ class Qt(Package): # Don't disable all the database drivers, but should # really get them into spack at some point. - @when('@3') + @when('@3') # noqa: F811 def configure(self): # A user reported that this was necessary to link Qt3 on ubuntu. # However, if LD_LIBRARY_PATH is not set the qt build fails, check @@ -268,7 +268,7 @@ class Qt(Package): '-release', '-fast') - @when('@4') + @when('@4') # noqa: F811 def configure(self): configure('-fast', '-{0}gtkstyle'.format('' if '+gtk' in self.spec else 'no-'), @@ -276,7 +276,7 @@ class Qt(Package): '-arch', str(self.spec.architecture.target), *self.common_config_args) - @when('@5.0:5.6') + @when('@5.0:5.6') # noqa: F811 def configure(self): webkit_args = [] if '+webkit' in self.spec else ['-skip', 'qtwebkit'] configure('-no-eglfs', @@ -284,7 +284,7 @@ class Qt(Package): '-{0}gtkstyle'.format('' if '+gtk' in self.spec else 'no-'), *(webkit_args + self.common_config_args)) - @when('@5.7:') + @when('@5.7:') # noqa: F811 def configure(self): config_args = self.common_config_args diff --git a/var/spack/repos/builtin/packages/util-linux/package.py b/var/spack/repos/builtin/packages/util-linux/package.py index 5bbaa995f8..2fc413a98e 100644 --- a/var/spack/repos/builtin/packages/util-linux/package.py +++ b/var/spack/repos/builtin/packages/util-linux/package.py @@ -31,7 +31,7 @@ class UtilLinux(AutotoolsPackage): homepage = "http://freecode.com/projects/util-linux" url = "https://www.kernel.org/pub/linux/utils/util-linux/v2.29/util-linux-2.29.1.tar.gz" list_url = "https://www.kernel.org/pub/linux/utils/util-linux" - list_depth = 2 + list_depth = 1 version('2.29.1', 'c7d5c111ef6bc5df65659e0b523ac9d9') version('2.25', 'f6d7fc6952ec69c4dc62c8d7c59c1d57') -- cgit v1.2.3-70-g09d2 From 0e785e0500e73e35a61097d0b14b6fdce10d1e86 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 1 Apr 2017 15:31:55 -0700 Subject: Add epigraph in docs. --- lib/spack/docs/index.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 4dffe6f091..2e99e96a3e 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -4,9 +4,13 @@ contain the root `toctree` directive. =================== -Spack Documentation +Spack =================== +.. epigraph:: + + `These are docs for the Spack package manager. For sphere packing, see` `pyspack `_. + Spack is a package management tool designed to support multiple versions and configurations of software on a wide variety of platforms and environments. It was designed for large supercomputing centers, -- cgit v1.2.3-70-g09d2 From ffef681377a2140040b4d65a991b9f75e56f9252 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Sun, 2 Apr 2017 20:40:09 +0200 Subject: new directive: conflicts() (#3125) * Add conflicts() directive * openblas: added conflicts for intel@16 refs #3119 * added brief docs and unit tests --- lib/spack/docs/packaging_guide.rst | 22 +++++++++++ lib/spack/spack/directives.py | 27 +++++++++++++ lib/spack/spack/spec.py | 24 +++++++++++ lib/spack/spack/test/concretize.py | 27 ++++++++++++- .../packages/conflict-parent/package.py | 46 ++++++++++++++++++++++ .../builtin.mock/packages/conflict/package.py | 46 ++++++++++++++++++++++ .../repos/builtin/packages/openblas/package.py | 2 + 7 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 var/spack/repos/builtin.mock/packages/conflict-parent/package.py create mode 100644 var/spack/repos/builtin.mock/packages/conflict/package.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 1a64c7db4a..18541179b2 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -1560,6 +1560,28 @@ Python's ``setup_dependent_environment`` method also sets up some other variables, creates a directory, and sets up the ``PYTHONPATH`` so that dependent packages can find their dependencies at build time. +.. _packaging_conflicts: + +--------- +Conflicts +--------- + +Sometimes packages have known bugs, or limitations, that would prevent them +to build e.g. against other dependencies or with certain compilers. Spack +makes it possible to express such constraints with the ``conflicts`` directive. + +Adding the following to a package: + +.. code-block:: python + + conflicts('%intel', when='@1.2') + +we express the fact that the current package *cannot be built* with the Intel +compiler when we are trying to install version "1.2". The ``when`` argument can +be omitted, in which case the conflict will always be active. +Conflicts are always evaluated after the concretization step has been performed, +and if any match is found a detailed error message is shown to the user. + .. _packaging_extensions: ---------- diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index db280cb5fd..e2219d1f49 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -263,6 +263,33 @@ def _depends_on(pkg, spec, when=None, type=None): conditions[when_spec] = dep_spec +@directive('conflicts') +def conflicts(conflict_spec, when=None): + """Allows a package to define a conflict, i.e. a concretized configuration + that is known to be non-valid. + + For example a package that is known not to be buildable with intel + compilers can declare: + + conflicts('%intel') + + To express the same constraint only when the 'foo' variant is activated: + + conflicts('%intel', when='+foo') + + :param conflict_spec: constraint defining the known conflict + :param when: optional constraint that triggers the conflict + """ + def _execute(pkg): + # If when is not specified the conflict always holds + condition = pkg.name if when is None else when + when_spec = parse_anonymous_spec(condition, pkg.name) + + when_spec_list = pkg.conflicts.setdefault(conflict_spec, []) + when_spec_list.append(when_spec) + return _execute + + @directive(('dependencies', 'dependency_types')) def depends_on(spec, when=None, type=None): """Creates a dict of deps with specs defining when they apply. diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 095b04f837..b6089c7849 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1707,6 +1707,18 @@ class Spec(object): # Mark everything in the spec as concrete, as well. self._mark_concrete() + # Now that the spec is concrete we should check if + # there are declared conflicts + matches = [] + for x in self.traverse(): + for conflict_spec, when_list in x.package.conflicts.items(): + if x.satisfies(conflict_spec): + for when_spec in when_list: + if x.satisfies(when_spec): + matches.append((x, conflict_spec, when_spec)) + if matches: + raise ConflictsInSpecError(self, matches) + def _mark_concrete(self, value=True): """Mark this spec and its dependencies as concrete. @@ -3336,3 +3348,15 @@ class RedundantSpecError(SpecError): "Attempting to add %s to spec %s which is already concrete." " This is likely the result of adding to a spec specified by hash." % (addition, spec)) + + +class ConflictsInSpecError(SpecError, RuntimeError): + def __init__(self, spec, matches): + message = 'Conflicts in concretized spec "{0}"\n'.format( + spec.short_spec + ) + long_message = 'List of matching conflicts:\n\n' + match_fmt = '{0}. "{1}" conflicts with "{2}" in spec "{3}"\n' + for idx, (s, c, w) in enumerate(matches): + long_message += match_fmt.format(idx + 1, c, w, s) + super(ConflictsInSpecError, self).__init__(message, long_message) diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index f4021a89ee..3b383584ce 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -26,7 +26,7 @@ import pytest import spack import spack.architecture from spack.concretize import find_spec -from spack.spec import Spec, CompilerSpec +from spack.spec import Spec, CompilerSpec, ConflictsInSpecError, SpecError from spack.version import ver @@ -82,6 +82,10 @@ def check_concretize(abstract_spec): 'mpileaks ^mpi', 'mpileaks ^mpi@:1.1', 'mpileaks ^mpi@2:', 'mpileaks ^mpi@2.1', 'mpileaks ^mpi@2.2', 'mpileaks ^mpi@2.2', 'mpileaks ^mpi@:1', 'mpileaks ^mpi@1.2:2' + # conflict not triggered + 'conflict', + 'conflict%clang~foo', + 'conflict-parent%gcc' ] ) def spec(request): @@ -89,6 +93,19 @@ def spec(request): return request.param +@pytest.fixture( + params=[ + 'conflict%clang', + 'conflict%clang+foo', + 'conflict-parent%clang', + 'conflict-parent@0.9^conflict~foo' + ] +) +def conflict_spec(request): + """Spec to be concretized""" + return request.param + + @pytest.mark.usefixtures('config', 'builtin_mock') class TestConcretize(object): def test_concretize(self, spec): @@ -372,3 +389,11 @@ class TestConcretize(object): s.concretize() assert s['mpileaks'].satisfies('%clang') assert s['dyninst'].satisfies('%gcc') + + def test_conflicts_in_spec(self, conflict_spec): + # Check that an exception is raised an caught by the appropriate + # exception types. + for exc_type in (ConflictsInSpecError, RuntimeError, SpecError): + s = Spec(conflict_spec) + with pytest.raises(exc_type): + s.concretize() diff --git a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py new file mode 100644 index 0000000000..37805537a2 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py @@ -0,0 +1,46 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 ConflictParent(Package): + homepage = 'https://github.com/tgamblin/callpath' + url = 'http://github.com/tgamblin/callpath-1.0.tar.gz' + + version(0.8, 'foobarbaz') + version(0.9, 'foobarbaz') + version(1.0, 'foobarbaz') + + depends_on('conflict') + + conflicts('^conflict~foo', when='@0.9') + + def install(self, spec, prefix): + configure("--prefix=%s" % prefix) + make() + make("install") + + def setup_environment(self, senv, renv): + renv.set('FOOBAR', self.name) diff --git a/var/spack/repos/builtin.mock/packages/conflict/package.py b/var/spack/repos/builtin.mock/packages/conflict/package.py new file mode 100644 index 0000000000..a6ba4b5c58 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/conflict/package.py @@ -0,0 +1,46 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Conflict(Package): + homepage = 'https://github.com/tgamblin/callpath' + url = 'http://github.com/tgamblin/callpath-1.0.tar.gz' + + version(0.8, 'foobarbaz') + version(0.9, 'foobarbaz') + version(1.0, 'foobarbaz') + + variant('foo', default=True, description='') + + conflicts('%clang', when='+foo') + + def install(self, spec, prefix): + configure("--prefix=%s" % prefix) + make() + make("install") + + def setup_environment(self, senv, renv): + renv.set('FOOBAR', self.name) diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index bfa5a16b42..6e16174563 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -59,6 +59,8 @@ class Openblas(MakefilePackage): parallel = False + conflicts('%intel@16', when='@0.2.15:0.2.19') + @run_before('edit') def check_compilers(self): # As of 06/2016 there is no mechanism to specify that packages which -- cgit v1.2.3-70-g09d2 From 50df071ad9a1b936ffbb4121036a36ed5ab38ffa Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 3 Apr 2017 17:34:16 -0500 Subject: Overhaul Spack's URL parsing (#2972) * Remove fake URLs from Spack * Ignore long lines for URLs that start with ftp: * Preliminary changes to version regexes * New redesign of version regexes * Allow letters in version-only * Fix detection of versions that end in Final * Rearrange a few regexes and add examples * Add tests for common download repositories * Add test cases for common tarball naming schemes * Finalize version regexes * spack url test -> spack url summary * Clean up comments * Rearrange suffix checks * Use query strings for name detection * Remove no longer necessary url_for_version functions * Strip off extraneous information after package name * Add one more test * Dot in square brackets does not need to be escaped * Move renaming outside of parse_name_offset * Fix versions for a couple more packages * Fix flake8 and doc tests * Correctly parse Python, Lua, and Bio++ package names * Use effective URLs for mfem * Add checksummed version to mitos * Remove url_for_version from STAR-CCM+ package * Revert changes to version numbers with underscores and dashes * Fix name detection for tbb * Correctly parse Ruby gems * Reverted mfem back to shortened URLs. * Updated instructions for better security * Remove preferred=True from newest version * Add tests for new `spack url list` flags * Add tests for strip_name_suffixes * Add unit tests for version separators * Fix bugs related to parseable name but in parseable version * Remove dead code, update docstring * Ignore 'binary' at end of version string * Remove platform from version * Flip libedit version numbers * Re-support weird NCO alpha/beta versions * Rebase and remove one new fake URL * Add / to beginning of regex to avoid picking up similarly named packages * Ignore weird tar versions * Fix bug in url parse --spider when no versions found * Less strict version matching for spack versions * Don't rename Python packages * Be a little more selective, version must begin with a digit * Re-add fake URLs * Fix up several other packages * Ignore more file endings * Add parsing support for Miniconda * Update tab completion * XFAILS are now PASSES for 2 web tests --- lib/spack/docs/developer_guide.rst | 8 +- lib/spack/spack/cmd/create.py | 25 +- lib/spack/spack/cmd/flake8.py | 2 +- lib/spack/spack/cmd/url.py | 92 ++- lib/spack/spack/cmd/versions.py | 2 +- lib/spack/spack/test/cmd/url.py | 21 +- lib/spack/spack/test/url_extrapolate.py | 101 --- lib/spack/spack/test/url_parse.py | 794 +++++++++++++++------ lib/spack/spack/test/url_substitution.py | 84 ++- lib/spack/spack/test/web.py | 3 - lib/spack/spack/url.py | 513 +++++++++---- lib/spack/spack/util/naming.py | 45 ++ lib/spack/spack/util/web.py | 12 +- lib/spack/spack/version.py | 29 - share/spack/spack-completion.bash | 9 +- .../repos/builtin/packages/automake/package.py | 2 +- .../repos/builtin/packages/bib2xhtml/package.py | 3 - var/spack/repos/builtin/packages/bison/package.py | 2 +- .../repos/builtin/packages/blast-plus/package.py | 5 - var/spack/repos/builtin/packages/boost/package.py | 10 +- .../repos/builtin/packages/bowtie2/package.py | 7 +- var/spack/repos/builtin/packages/cddlib/package.py | 18 +- var/spack/repos/builtin/packages/cdo/package.py | 10 +- .../repos/builtin/packages/cfitsio/package.py | 1 + var/spack/repos/builtin/packages/cppad/package.py | 5 +- .../repos/builtin/packages/cryptopp/package.py | 1 + var/spack/repos/builtin/packages/dakota/package.py | 4 - .../repos/builtin/packages/exonerate/package.py | 2 +- var/spack/repos/builtin/packages/ferret/package.py | 11 +- .../repos/builtin/packages/gdk-pixbuf/package.py | 4 +- var/spack/repos/builtin/packages/go/package.py | 7 - var/spack/repos/builtin/packages/gource/package.py | 4 - var/spack/repos/builtin/packages/ibmisc/package.py | 4 +- var/spack/repos/builtin/packages/icet/package.py | 6 +- .../repos/builtin/packages/image-magick/package.py | 3 - var/spack/repos/builtin/packages/jdk/package.py | 4 +- .../repos/builtin/packages/libedit/package.py | 8 +- var/spack/repos/builtin/packages/libgd/package.py | 4 - .../repos/builtin/packages/libsodium/package.py | 1 + .../repos/builtin/packages/libxstream/package.py | 4 +- var/spack/repos/builtin/packages/meep/package.py | 2 + var/spack/repos/builtin/packages/metis/package.py | 20 +- var/spack/repos/builtin/packages/mfem/package.py | 23 +- var/spack/repos/builtin/packages/mitos/package.py | 5 +- var/spack/repos/builtin/packages/moab/package.py | 2 +- var/spack/repos/builtin/packages/mxml/package.py | 3 - var/spack/repos/builtin/packages/nettle/package.py | 2 +- .../repos/builtin/packages/nextflow/package.py | 5 +- var/spack/repos/builtin/packages/oce/package.py | 5 +- .../repos/builtin/packages/octopus/package.py | 8 +- .../repos/builtin/packages/openjpeg/package.py | 4 - var/spack/repos/builtin/packages/panda/package.py | 4 +- .../repos/builtin/packages/parmetis/package.py | 12 +- var/spack/repos/builtin/packages/prank/package.py | 2 +- .../repos/builtin/packages/py-autopep8/package.py | 13 +- var/spack/repos/builtin/packages/py-cdo/package.py | 5 +- .../repos/builtin/packages/py-markdown/package.py | 4 - .../repos/builtin/packages/py-proj/package.py | 5 +- .../repos/builtin/packages/py-pypar/package.py | 3 - .../repos/builtin/packages/py-rtree/package.py | 17 +- var/spack/repos/builtin/packages/r-lava/package.py | 2 +- var/spack/repos/builtin/packages/root/package.py | 6 +- var/spack/repos/builtin/packages/rose/package.py | 7 +- .../repos/builtin/packages/rust-bindgen/package.py | 4 +- var/spack/repos/builtin/packages/scorep/package.py | 11 +- var/spack/repos/builtin/packages/scotch/package.py | 9 +- var/spack/repos/builtin/packages/silo/package.py | 5 +- .../builtin/packages/star-ccm-plus/package.py | 5 +- .../repos/builtin/packages/sublime-text/package.py | 4 +- var/spack/repos/builtin/packages/tcl/package.py | 5 +- var/spack/repos/builtin/packages/tetgen/package.py | 2 +- .../repos/builtin/packages/tinyxml/package.py | 4 + var/spack/repos/builtin/packages/tk/package.py | 5 +- .../repos/builtin/packages/trilinos/package.py | 10 +- var/spack/repos/builtin/packages/unison/package.py | 2 +- var/spack/repos/builtin/packages/voropp/package.py | 11 +- var/spack/repos/builtin/packages/vtk/package.py | 1 + .../repos/builtin/packages/xsdktrilinos/package.py | 10 +- var/spack/repos/builtin/packages/yorick/package.py | 10 +- var/spack/repos/builtin/packages/zoltan/package.py | 5 +- 80 files changed, 1325 insertions(+), 807 deletions(-) delete mode 100644 lib/spack/spack/test/url_extrapolate.py (limited to 'lib') diff --git a/lib/spack/docs/developer_guide.rst b/lib/spack/docs/developer_guide.rst index 0ce4029950..ea8d50c6ca 100644 --- a/lib/spack/docs/developer_guide.rst +++ b/lib/spack/docs/developer_guide.rst @@ -447,16 +447,16 @@ the string that it detected to be the name and version. The ``--incorrect-name`` and ``--incorrect-version`` flags can be used to print URLs that were not being parsed correctly. -"""""""""""""""""" -``spack url test`` -"""""""""""""""""" +""""""""""""""""""""" +``spack url summary`` +""""""""""""""""""""" This command attempts to parse every URL for every package in Spack and prints a summary of how many of them are being correctly parsed. It also prints a histogram showing which regular expressions are being matched and how frequently: -.. command-output:: spack url test +.. command-output:: spack url summary This command is essential for anyone adding or changing the regular expressions that parse names and versions. By running this command diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index cc90669158..906c7e1aec 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -31,13 +31,13 @@ import llnl.util.tty as tty import spack import spack.cmd import spack.cmd.checksum -import spack.url import spack.util.web from llnl.util.filesystem import mkdirp from spack.repository import Repo from spack.spec import Spec from spack.util.executable import which from spack.util.naming import * +from spack.url import * description = "create a new package file" @@ -382,6 +382,10 @@ class BuildSystemGuesser: can take a peek at the fetched tarball and discern the build system it uses """ + def __init__(self): + """Sets the default build system.""" + self.build_system = 'generic' + def __call__(self, stage, url): """Try to guess the type of build system used by a project based on the contents of its archive or the URL it was downloaded from.""" @@ -427,14 +431,11 @@ class BuildSystemGuesser: # Determine the build system based on the files contained # in the archive. - build_system = 'generic' for pattern, bs in clues: if any(re.search(pattern, l) for l in lines): - build_system = bs + self.build_system = bs break - self.build_system = build_system - def get_name(args): """Get the name of the package based on the supplied arguments. @@ -458,9 +459,9 @@ def get_name(args): elif args.url: # Try to guess the package name based on the URL try: - name = spack.url.parse_name(args.url) + name = parse_name(args.url) tty.msg("This looks like a URL for {0}".format(name)) - except spack.url.UndetectableNameError: + except UndetectableNameError: tty.die("Couldn't guess a name for this package.", " Please report this bug. In the meantime, try running:", " `spack create --name `") @@ -515,11 +516,16 @@ def get_versions(args, name): if args.url: # Find available versions - url_dict = spack.util.web.find_versions_of_archive(args.url) + try: + url_dict = spack.util.web.find_versions_of_archive(args.url) + except UndetectableVersionError: + # Use fake versions + tty.warn("Couldn't detect version in: {0}".format(args.url)) + return versions, guesser if not url_dict: # If no versions were found, revert to what the user provided - version = spack.url.parse_version(args.url) + version = parse_version(args.url) url_dict = {version: args.url} versions = spack.cmd.checksum.get_checksums( @@ -611,6 +617,7 @@ def create(parser, args): url = get_url(args) versions, guesser = get_versions(args, name) build_system = get_build_system(args, guesser) + name = simplify_name(name) # Create the package template object PackageClass = templates[build_system] diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 19724142bb..a6dc941190 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -70,7 +70,7 @@ exemptions = { # exemptions applied to all files. r'.py$': { # Exempt lines with URLs from overlong line errors. - 501: [r'(https?|file)\:'] + 501: [r'(https?|ftp|file)\:'] }, } diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py index 6823f0febd..1128e08a43 100644 --- a/lib/spack/spack/cmd/url.py +++ b/lib/spack/spack/cmd/url.py @@ -31,6 +31,7 @@ import spack from llnl.util import tty from spack.url import * from spack.util.web import find_versions_of_archive +from spack.util.naming import simplify_name description = "debugging tool for url parsing" @@ -65,20 +66,27 @@ def setup_parser(subparser): excl_args.add_argument( '-n', '--incorrect-name', action='store_true', help='only list urls for which the name was incorrectly parsed') + excl_args.add_argument( + '-N', '--correct-name', action='store_true', + help='only list urls for which the name was correctly parsed') excl_args.add_argument( '-v', '--incorrect-version', action='store_true', help='only list urls for which the version was incorrectly parsed') + excl_args.add_argument( + '-V', '--correct-version', action='store_true', + help='only list urls for which the version was correctly parsed') - # Test + # Summary sp.add_parser( - 'test', help='print a summary of how well we are parsing package urls') + 'summary', + help='print a summary of how well we are parsing package urls') def url(parser, args): action = { - 'parse': url_parse, - 'list': url_list, - 'test': url_test + 'parse': url_parse, + 'list': url_list, + 'summary': url_summary } action[args.subcommand](args) @@ -116,6 +124,10 @@ def url_parse(args): tty.msg('Spidering for versions:') versions = find_versions_of_archive(url) + if not versions: + print(' Found no versions for {0}'.format(name)) + return + max_len = max(len(str(v)) for v in versions) for v in sorted(versions): @@ -145,7 +157,7 @@ def url_list(args): return len(urls) -def url_test(args): +def url_summary(args): # Collect statistics on how many URLs were correctly parsed total_urls = 0 correct_names = 0 @@ -205,19 +217,19 @@ def url_test(args): correct_versions, total_urls, correct_versions / total_urls)) print() - tty.msg('Statistics on name regular expresions:') + tty.msg('Statistics on name regular expressions:') print() - print(' Index Count Regular Expresion') + print(' Index Count Regular Expression') for ni in name_regex_dict: print(' {0:>3}: {1:>6} r{2!r}'.format( ni, name_count_dict[ni], name_regex_dict[ni])) print() - tty.msg('Statistics on version regular expresions:') + tty.msg('Statistics on version regular expressions:') print() - print(' Index Count Regular Expresion') + print(' Index Count Regular Expression') for vi in version_regex_dict: print(' {0:>3}: {1:>6} r{2!r}'.format( vi, version_count_dict[vi], version_regex_dict[vi])) @@ -257,22 +269,38 @@ def url_list_parsing(args, urls, url, pkg): :rtype: set """ if url: - if args.incorrect_name: - # Only add URLs whose name was incorrectly parsed + if args.correct_name or args.incorrect_name: + # Attempt to parse the name try: name = parse_name(url) - if not name_parsed_correctly(pkg, name): + if (args.correct_name and + name_parsed_correctly(pkg, name)): + # Add correctly parsed URLs + urls.add(url) + elif (args.incorrect_name and + not name_parsed_correctly(pkg, name)): + # Add incorrectly parsed URLs urls.add(url) except UndetectableNameError: - urls.add(url) - elif args.incorrect_version: - # Only add URLs whose version was incorrectly parsed + if args.incorrect_name: + # Add incorrectly parsed URLs + urls.add(url) + elif args.correct_version or args.incorrect_version: + # Attempt to parse the version try: version = parse_version(url) - if not version_parsed_correctly(pkg, version): + if (args.correct_version and + version_parsed_correctly(pkg, version)): + # Add correctly parsed URLs + urls.add(url) + elif (args.incorrect_version and + not version_parsed_correctly(pkg, version)): + # Add incorrectly parsed URLs urls.add(url) except UndetectableVersionError: - urls.add(url) + if args.incorrect_version: + # Add incorrectly parsed URLs + urls.add(url) else: urls.add(url) @@ -289,6 +317,8 @@ def name_parsed_correctly(pkg, name): """ pkg_name = pkg.name + name = simplify_name(name) + # After determining a name, `spack create` determines a build system. # Some build systems prepend a special string to the front of the name. # Since this can't be guessed from the URL, it would be unfair to say @@ -311,9 +341,33 @@ def version_parsed_correctly(pkg, version): :returns: True if the name was correctly parsed, else False :rtype: bool """ + version = remove_separators(version) + # If the version parsed from the URL is listed in a version() # directive, we assume it was correctly parsed for pkg_version in pkg.versions: - if str(pkg_version) == str(version): + pkg_version = remove_separators(pkg_version) + if pkg_version == version: return True return False + + +def remove_separators(version): + """Removes separator characters ('.', '_', and '-') from a version. + + A version like 1.2.3 may be displayed as 1_2_3 in the URL. + Make sure 1.2.3, 1-2-3, 1_2_3, and 123 are considered equal. + Unfortunately, this also means that 1.23 and 12.3 are equal. + + :param version: A version + :type version: str or Version + :returns: The version with all separator characters removed + :rtype: str + """ + version = str(version) + + version = version.replace('.', '') + version = version.replace('_', '') + version = version.replace('-', '') + + return version diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py index f65ef14406..a6f6805fb0 100644 --- a/lib/spack/spack/cmd/versions.py +++ b/lib/spack/spack/cmd/versions.py @@ -53,6 +53,6 @@ def versions(parser, args): tty.debug("Check the list_url and list_depth attribute on the " "package to help Spack find versions.") else: - print(" Found no unckecksummed versions for %s" % pkg.name) + print(" Found no unchecksummed versions for %s" % pkg.name) else: colify(sorted(remote_versions, reverse=True), indent=2) diff --git a/lib/spack/spack/test/cmd/url.py b/lib/spack/spack/test/cmd/url.py index 4c60d814ce..3bc0bc7820 100644 --- a/lib/spack/spack/test/cmd/url.py +++ b/lib/spack/spack/test/cmd/url.py @@ -48,11 +48,12 @@ def test_name_parsed_correctly(): assert name_parsed_correctly(MyPackage('r-devtools', []), 'devtools') assert name_parsed_correctly(MyPackage('py-numpy', []), 'numpy') assert name_parsed_correctly(MyPackage('octave-splines', []), 'splines') + assert name_parsed_correctly(MyPackage('imagemagick', []), 'ImageMagick') # noqa + assert name_parsed_correctly(MyPackage('th-data', []), 'TH.data') # Expected False assert not name_parsed_correctly(MyPackage('', []), 'hdf5') assert not name_parsed_correctly(MyPackage('hdf5', []), '') - assert not name_parsed_correctly(MyPackage('imagemagick', []), 'ImageMagick') # noqa assert not name_parsed_correctly(MyPackage('yaml-cpp', []), 'yamlcpp') assert not name_parsed_correctly(MyPackage('yamlcpp', []), 'yaml-cpp') assert not name_parsed_correctly(MyPackage('r-py-parser', []), 'parser') @@ -64,6 +65,8 @@ def test_version_parsed_correctly(): assert version_parsed_correctly(MyPackage('', ['1.2.3']), '1.2.3') assert version_parsed_correctly(MyPackage('', ['5.4a', '5.4b']), '5.4a') assert version_parsed_correctly(MyPackage('', ['5.4a', '5.4b']), '5.4b') + assert version_parsed_correctly(MyPackage('', ['1.63.0']), '1_63_0') + assert version_parsed_correctly(MyPackage('', ['0.94h']), '094h') # Expected False assert not version_parsed_correctly(MyPackage('', []), '1.2.3') @@ -95,7 +98,7 @@ def test_url_list(parser): colored_urls = url_list(args) assert colored_urls == total_urls - # The following two options should print fewer URLs than the default. + # The following options should print fewer URLs than the default. # If they print the same number of URLs, something is horribly broken. # If they say we missed 0 URLs, something is probably broken too. args = parser.parse_args(['list', '--incorrect-name']) @@ -106,11 +109,19 @@ def test_url_list(parser): incorrect_version_urls = url_list(args) assert 0 < incorrect_version_urls < total_urls + args = parser.parse_args(['list', '--correct-name']) + correct_name_urls = url_list(args) + assert 0 < correct_name_urls < total_urls -def test_url_test(parser): - args = parser.parse_args(['test']) + args = parser.parse_args(['list', '--correct-version']) + correct_version_urls = url_list(args) + assert 0 < correct_version_urls < total_urls + + +def test_url_summary(parser): + args = parser.parse_args(['summary']) (total_urls, correct_names, correct_versions, - name_count_dict, version_count_dict) = url_test(args) + name_count_dict, version_count_dict) = url_summary(args) assert 0 < correct_names <= sum(name_count_dict.values()) <= total_urls # noqa assert 0 < correct_versions <= sum(version_count_dict.values()) <= total_urls # noqa diff --git a/lib/spack/spack/test/url_extrapolate.py b/lib/spack/spack/test/url_extrapolate.py deleted file mode 100644 index 5f5cf555ae..0000000000 --- a/lib/spack/spack/test/url_extrapolate.py +++ /dev/null @@ -1,101 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 -############################################################################## -"""Tests ability of spack to extrapolate URL versions from -existing versions. -""" -import unittest - -import spack.url as url - - -class UrlExtrapolateTest(unittest.TestCase): - - def check_url(self, base, version, new_url): - self.assertEqual(url.substitute_version(base, version), new_url) - - def test_libelf_version(self): - base = "http://www.mr511.de/software/libelf-0.8.13.tar.gz" - self.check_url(base, '0.8.13', base) - self.check_url( - base, '0.8.12', "http://www.mr511.de/software/libelf-0.8.12.tar.gz") - self.check_url( - base, '0.3.1', "http://www.mr511.de/software/libelf-0.3.1.tar.gz") - self.check_url( - base, '1.3.1b', "http://www.mr511.de/software/libelf-1.3.1b.tar.gz") - - def test_libdwarf_version(self): - base = "http://www.prevanders.net/libdwarf-20130729.tar.gz" - self.check_url(base, '20130729', base) - self.check_url( - base, '8.12', "http://www.prevanders.net/libdwarf-8.12.tar.gz") - - def test_dyninst_version(self): - # Dyninst has a version twice in the URL. - base = "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1.2/DyninstAPI-8.1.2.tgz" - self.check_url(base, '8.1.2', base) - self.check_url(base, '8.2', - "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.2/DyninstAPI-8.2.tgz") - self.check_url(base, '8.3.1', - "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.3.1/DyninstAPI-8.3.1.tgz") - - def test_partial_version_prefix(self): - # Test now with a partial prefix earlier in the URL -- this is - # hard to figure out so Spack only substitutes the last - # instance of the version. - base = "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1/DyninstAPI-8.1.2.tgz" - self.check_url(base, '8.1.2', base) - self.check_url(base, '8.1.4', - "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1/DyninstAPI-8.1.4.tgz") - self.check_url(base, '8.2', - "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1/DyninstAPI-8.2.tgz") - self.check_url(base, '8.3.1', - "http://www.dyninst.org/sites/default/files/downloads/dyninst/8.1/DyninstAPI-8.3.1.tgz") - - def test_scalasca_partial_version(self): - # Note that this probably doesn't actually work, but sites are - # inconsistent about their directory structure, so it's not - # clear what is right. This test is for consistency and to - # document behavior. If you figure out a good way to handle - # this case, fix the tests too. - self.check_url('http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-4.3-TP1.tar.gz', '8.3.1', - 'http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-8.3.1.tar.gz') - self.check_url('http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-4.3-TP1.tar.gz', '8.3.1', - 'http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-8.3.1.tar.gz') - - def test_mpileaks_version(self): - self.check_url('https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz', '2.1.3', - 'https://github.com/hpc/mpileaks/releases/download/v2.1.3/mpileaks-2.1.3.tar.gz') - - def test_gcc(self): - self.check_url('http://open-source-box.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2', '4.7', - 'http://open-source-box.org/gcc/gcc-4.7/gcc-4.7.tar.bz2') - self.check_url('http://open-source-box.org/gcc/gcc-4.4.7/gcc-4.4.7.tar.bz2', '4.4.7', - 'http://open-source-box.org/gcc/gcc-4.4.7/gcc-4.4.7.tar.bz2') - - def test_github_raw(self): - self.check_url('https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '2.0.7', - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true') - self.check_url('https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '4.7', - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v4.7.tgz?raw=true') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 8913de94d0..2af7c6ae0b 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -22,246 +22,667 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -"""\ -This file has a bunch of versions tests taken from the excellent version -detection in Homebrew. -""" +"""Tests Spack's ability to parse the name and version of a package +based on its URL.""" + +import os import unittest -import spack.url as url +from spack.url import * -class UrlParseTest(unittest.TestCase): +class UrlStripVersionSuffixesTest(unittest.TestCase): + """Tests for spack.url.strip_version_suffixes""" - def assert_not_detected(self, string): - self.assertRaises( - url.UndetectableVersionError, url.parse_name_and_version, string) + def check(self, before, after): + stripped = strip_version_suffixes(before) + self.assertEqual(stripped, after) - def check(self, name, v, string, **kwargs): - # Make sure correct name and version are extracted. - parsed_name, parsed_v = url.parse_name_and_version(string) - self.assertEqual(parsed_name, name) - self.assertEqual(parsed_v, url.Version(v)) + def test_no_suffix(self): + self.check('rgb-1.0.6', + 'rgb-1.0.6') - # Some URLs (like boost) are special and need to override the - # built-in functionality. - if kwargs.get('no_check_url', False): - return + def test_misleading_prefix(self): + self.check('jpegsrc.v9b', + 'jpegsrc.v9b') + self.check('turbolinux702', + 'turbolinux702') + self.check('converge_install_2.3.16', + 'converge_install_2.3.16') - # Make sure Spack formulates the right URL when we try to - # build one with a specific version. - self.assertEqual(string, url.substitute_version(string, v)) + # Download type - def test_wwwoffle_version(self): - self.check( - 'wwwoffle', '2.9h', - 'http://www.gedanken.demon.co.uk/download-wwwoffle/wwwoffle-2.9h.tgz') + def test_src(self): + self.check('apache-ant-1.9.7-src', + 'apache-ant-1.9.7') + self.check('go1.7.4.src', + 'go1.7.4') + + def test_source(self): + self.check('bowtie2-2.2.5-source', + 'bowtie2-2.2.5') + self.check('grib_api-1.17.0-Source', + 'grib_api-1.17.0') + + def test_full(self): + self.check('julia-0.4.3-full', + 'julia-0.4.3') + + def test_bin(self): + self.check('apache-maven-3.3.9-bin', + 'apache-maven-3.3.9') + + def test_binary(self): + self.check('Jmol-14.8.0-binary', + 'Jmol-14.8.0') + + def test_gem(self): + self.check('rubysl-date-2.0.9.gem', + 'rubysl-date-2.0.9') + + def test_tar(self): + self.check('gromacs-4.6.1-tar', + 'gromacs-4.6.1') + + def test_sh(self): + self.check('Miniconda2-4.3.11-Linux-x86_64.sh', + 'Miniconda2-4.3.11') + + # Download version + + def test_stable(self): + self.check('libevent-2.0.21-stable', + 'libevent-2.0.21') + + def test_final(self): + self.check('2.6.7-final', + '2.6.7') + + def test_rel(self): + self.check('v1.9.5.1rel', + 'v1.9.5.1') + + def test_orig(self): + self.check('dash_0.5.5.1.orig', + 'dash_0.5.5.1') + + def test_plus(self): + self.check('ncbi-blast-2.6.0+-src', + 'ncbi-blast-2.6.0') + + # License + + def test_gpl(self): + self.check('cppad-20170114.gpl', + 'cppad-20170114') + + # OS + + def test_linux(self): + self.check('astyle_2.04_linux', + 'astyle_2.04') + + def test_unix(self): + self.check('install-tl-unx', + 'install-tl') + + def test_macos(self): + self.check('astyle_1.23_macosx', + 'astyle_1.23') + self.check('haxe-2.08-osx', + 'haxe-2.08') + + # PyPI + + def test_wheel(self): + self.check('entrypoints-0.2.2-py2.py3-none-any.whl', + 'entrypoints-0.2.2') + self.check('numpy-1.12.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl', # noqa + 'numpy-1.12.0') + + def test_exe(self): + self.check('PyYAML-3.12.win-amd64-py3.5.exe', + 'PyYAML-3.12') + + # Combinations of multiple patterns + + def test_complex_all(self): + self.check('p7zip_9.04_src_all', + 'p7zip_9.04') + + def test_complex_run(self): + self.check('cuda_8.0.44_linux.run', + 'cuda_8.0.44') + + def test_complex_file(self): + self.check('ack-2.14-single-file', + 'ack-2.14') + + def test_complex_jar(self): + self.check('antlr-3.4-complete.jar', + 'antlr-3.4') + + def test_complex_oss(self): + self.check('tbb44_20160128oss_src_0', + 'tbb44_20160128') + + def test_complex_darwin(self): + self.check('ghc-7.0.4-x86_64-apple-darwin', + 'ghc-7.0.4') + self.check('ghc-7.0.4-i386-apple-darwin', + 'ghc-7.0.4') + + def test_complex_arch(self): + self.check('VizGlow_v2.2alpha17-R21November2016-Linux-x86_64-Install', + 'VizGlow_v2.2alpha17-R21November2016') + self.check('jdk-8u92-linux-x64', + 'jdk-8u92') + self.check('cuda_6.5.14_linux_64.run', + 'cuda_6.5.14') + + def test_complex_with(self): + self.check('mafft-7.221-with-extensions-src', + 'mafft-7.221') + self.check('spark-2.0.0-bin-without-hadoop', + 'spark-2.0.0') + + def test_complex_public(self): + self.check('dakota-6.3-public.src', + 'dakota-6.3') + + def test_complex_universal(self): + self.check('synergy-1.3.6p2-MacOSX-Universal', + 'synergy-1.3.6p2') + + +class UrlStripNameSuffixesTest(unittest.TestCase): + """Tests for spack.url.strip_name_suffixes""" + + def check(self, before, version, after): + stripped = strip_name_suffixes(before, version) + self.assertEqual(stripped, after) + + def test_no_suffix(self): + self.check('rgb-1.0.6', '1.0.6', + 'rgb') + self.check('nauty26r7', '26r7', + 'nauty') + + # Download type + + def test_install(self): + self.check('converge_install_2.3.16', '2.3.16', + 'converge') + + def test_src(self): + self.check('jpegsrc.v9b', '9b', + 'jpeg') + + def test_std(self): + self.check('ghostscript-fonts-std-8.11', '8.11', + 'ghostscript-fonts') + + # Download version + + def test_snapshot(self): + self.check('gts-snapshot-121130', '121130', + 'gts') + + def test_distrib(self): + self.check('zoltan_distrib_v3.83', '3.83', + 'zoltan') + + # VCS - def test_version_sourceforge_download(self): + def test_bazaar(self): + self.check('libvterm-0+bzr681', '681', + 'libvterm') + + # License + + def test_gpl(self): + self.check('PyQt-x11-gpl-4.11.3', '4.11.3', + 'PyQt-x11') + + +class UrlParseOffsetTest(unittest.TestCase): + + def check(self, name, noffset, ver, voffset, path): + # Make sure parse_name_offset and parse_name_version are working + v, vstart, vlen, vi, vre = parse_version_offset(path) + n, nstart, nlen, ni, nre = parse_name_offset(path, v) + + self.assertEqual(n, name) + self.assertEqual(v, ver) + self.assertEqual(nstart, noffset) + self.assertEqual(vstart, voffset) + + def test_name_in_path(self): self.check( - 'foo-bar', '1.21', - 'http://sourceforge.net/foo_bar-1.21.tar.gz/download') + 'antlr', 25, '2.7.7', 40, + 'https://github.com/antlr/antlr/tarball/v2.7.7') + + def test_name_in_stem(self): self.check( - 'foo-bar', '1.21', - 'http://sf.net/foo_bar-1.21.tar.gz/download') + 'gmp', 32, '6.0.0a', 36, + 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2') - def test_no_version(self): - self.assert_not_detected('http://example.com/blah.tar') - self.assert_not_detected('foo') + def test_name_in_suffix(self): + # Don't think I've ever seen one of these before + # We don't look for it, so it would probably fail anyway + pass - def test_version_all_dots(self): + def test_version_in_path(self): self.check( - 'foo-bar-la', '1.14', 'http://example.com/foo.bar.la.1.14.zip') + 'nextflow', 31, '0.20.1', 59, + 'https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow') - def test_version_underscore_separator(self): + def test_version_in_stem(self): self.check( - 'grc', '1.1', - 'http://example.com/grc_1.1.tar.gz') - - def test_boost_version_style(self): + 'zlib', 24, '1.2.10', 29, + 'http://zlib.net/fossils/zlib-1.2.10.tar.gz') + self.check( + 'slepc', 51, '3.6.2', 57, + 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz') self.check( - 'boost', '1.39.0', - 'http://example.com/boost_1_39_0.tar.bz2', - no_check_url=True) + 'cloog', 61, '0.18.1', 67, + 'http://www.bastoul.net/cloog/pages/download/count.php3?url=./cloog-0.18.1.tar.gz') + self.check( + 'libxc', 58, '2.2.2', 64, + 'http://www.tddft.org/programs/octopus/down.php?file=libxc/libxc-2.2.2.tar.gz') - def test_erlang_version_style(self): + def test_version_in_suffix(self): + self.check( + 'swiftsim', 36, '0.3.0', 76, + 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0') self.check( - 'otp', 'R13B', - 'http://erlang.org/download/otp_src_R13B.tar.gz') + 'sionlib', 30, '1.7.1', 59, + 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') - def test_another_erlang_version_style(self): + def test_regex_in_name(self): self.check( - 'otp', 'R15B01', - 'https://github.com/erlang/otp/tarball/OTP_R15B01') + 'voro++', 40, '0.4.6', 47, + 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz') + + +class UrlParseNameAndVersionTest(unittest.TestCase): + + def assert_not_detected(self, string): + self.assertRaises( + UndetectableVersionError, parse_name_and_version, string) + + def check(self, name, v, string, **kwargs): + # Make sure correct name and version are extracted. + parsed_name, parsed_v = parse_name_and_version(string) + self.assertEqual(parsed_name, name) + self.assertEqual(parsed_v, Version(v)) + + # Make sure Spack formulates the right URL when we try to + # build one with a specific version. + self.assertEqual(string, substitute_version(string, v)) + + # Common Repositories - def test_yet_another_erlang_version_style(self): + def test_github_downloads(self): + # name/archive/ver.ver self.check( - 'otp', 'R15B03-1', - 'https://github.com/erlang/otp/tarball/OTP_R15B03-1') + 'nco', '4.6.2', + 'https://github.com/nco/nco/archive/4.6.2.tar.gz') + # name/archive/vver.ver + self.check( + 'vim', '8.0.0134', + 'https://github.com/vim/vim/archive/v8.0.0134.tar.gz') + # name/archive/name-ver.ver + self.check( + 'oce', '0.18', + 'https://github.com/tpaviot/oce/archive/OCE-0.18.tar.gz') + # name/releases/download/vver/name-ver.ver + self.check( + 'libmesh', '1.0.0', + 'https://github.com/libMesh/libmesh/releases/download/v1.0.0/libmesh-1.0.0.tar.bz2') + # name/tarball/vver.ver + self.check( + 'git', '2.7.1', + 'https://github.com/git/git/tarball/v2.7.1') + # name/zipball/vver.ver + self.check( + 'git', '2.7.1', + 'https://github.com/git/git/zipball/v2.7.1') - def test_p7zip_version_style(self): + def test_gitlab_downloads(self): + # name/repository/archive.ext?ref=vver.ver + self.check( + 'swiftsim', '0.3.0', + 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0') + # name/repository/archive.ext?ref=name-ver.ver self.check( - 'p7zip', '9.04', - 'http://kent.dl.sourceforge.net/sourceforge/p7zip/p7zip_9.04_src_all.tar.bz2') + 'icet', '1.2.3', + 'https://gitlab.kitware.com/icet/icet/repository/archive.tar.gz?ref=IceT-1.2.3') - def test_new_github_style(self): + def test_bitbucket_downloads(self): + # name/get/ver.ver self.check( - 'libnet', '1.1.4', - 'https://github.com/sam-github/libnet/tarball/libnet-1.1.4') + 'eigen', '3.2.7', + 'https://bitbucket.org/eigen/eigen/get/3.2.7.tar.bz2') + # name/get/vver.ver + self.check( + 'hoomd-blue', '1.3.3', + 'https://bitbucket.org/glotzer/hoomd-blue/get/v1.3.3.tar.bz2') + # name/downloads/name-ver.ver + self.check( + 'dolfin', '2016.1.0', + 'https://bitbucket.org/fenics-project/dolfin/downloads/dolfin-2016.1.0.tar.gz') - def test_gloox_beta_style(self): + def test_sourceforge_downloads(self): + # name-ver.ver self.check( - 'gloox', '1.0-beta7', - 'http://camaya.net/download/gloox-1.0-beta7.tar.bz2') + 'libpng', '1.6.27', + 'http://download.sourceforge.net/libpng/libpng-1.6.27.tar.gz') + self.check( + 'lcms2', '2.6', + 'http://downloads.sourceforge.net/project/lcms/lcms/2.6/lcms2-2.6.tar.gz') + self.check( + 'modules', '3.2.10', + 'http://prdownloads.sourceforge.net/modules/modules-3.2.10.tar.gz') + # name-ver.ver.ext/download + self.check( + 'glew', '2.0.0', + 'https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download') - def test_sphinx_beta_style(self): + def test_cran_downloads(self): + # name.name_ver.ver-ver.ver self.check( - 'sphinx', '1.10-beta', - 'http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz') + 'TH.data', '1.0-8', + 'https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz') + self.check( + 'knitr', '1.14', + 'https://cran.rstudio.com/src/contrib/knitr_1.14.tar.gz') + self.check( + 'devtools', '1.12.0', + 'https://cloud.r-project.org/src/contrib/devtools_1.12.0.tar.gz') - def test_astyle_verson_style(self): + def test_pypi_downloads(self): + # name.name_name-ver.ver + self.check( + '3to2', '1.1.1', + 'https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip') self.check( - 'astyle', '1.23', - 'http://kent.dl.sourceforge.net/sourceforge/astyle/astyle_1.23_macosx.tar.gz') + 'mpmath', '0.19', + 'https://pypi.python.org/packages/source/m/mpmath/mpmath-all-0.19.tar.gz') + self.check( + 'pandas', '0.16.0', + 'https://pypi.python.org/packages/source/p/pandas/pandas-0.16.0.tar.gz#md5=bfe311f05dc0c351f8955fbd1e296e73') + self.check( + 'sphinx_rtd_theme', '0.1.10a0', + 'https://pypi.python.org/packages/da/6b/1b75f13d8aa3333f19c6cdf1f0bc9f52ea739cae464fbee050307c121857/sphinx_rtd_theme-0.1.10a0.tar.gz') + self.check( + 'backports.ssl_match_hostname', '3.5.0.1', + 'https://pypi.io/packages/source/b/backports.ssl_match_hostname/backports.ssl_match_hostname-3.5.0.1.tar.gz') - def test_version_dos2unix(self): + def test_bazaar_downloads(self): self.check( - 'dos2unix', '3.1', - 'http://www.sfr-fresh.com/linux/misc/dos2unix-3.1.tar.gz') + 'libvterm', '681', + 'http://www.leonerd.org.uk/code/libvterm/libvterm-0+bzr681.tar.gz') - def test_version_internal_dash(self): + # Common Tarball Formats + + def test_version_only(self): + # ver.ver + self.check( + 'eigen', '3.2.7', + 'https://bitbucket.org/eigen/eigen/get/3.2.7.tar.bz2') + # ver.ver-ver + self.check( + 'ImageMagick', '7.0.2-7', + 'https://github.com/ImageMagick/ImageMagick/archive/7.0.2-7.tar.gz') + # vver.ver self.check( - 'foo-arse', '1.1-2', - 'http://example.com/foo-arse-1.1-2.tar.gz') + 'CGNS', '3.3.0', + 'https://github.com/CGNS/CGNS/archive/v3.3.0.tar.gz') + # vver_ver + self.check( + 'luafilesystem', '1_6_3', + 'https://github.com/keplerproject/luafilesystem/archive/v1_6_3.tar.gz') - def test_version_single_digit(self): + def test_no_separators(self): + # namever + self.check( + 'turbolinux', '702', + 'file://{0}/turbolinux702.tar.gz'.format(os.getcwd())) self.check( - 'foo-bar', '45', - 'http://example.com/foo_bar.45.tar.gz') + 'nauty', '26r7', + 'http://pallini.di.uniroma1.it/nauty26r7.tar.gz') - def test_noseparator_single_digit(self): + def test_dashes_only(self): + # name-name-ver-ver + self.check( + 'Trilinos', '12-10-1', + 'https://github.com/trilinos/Trilinos/archive/trilinos-release-12-10-1.tar.gz') + self.check( + 'panda', '2016-03-07', + 'http://comopt.ifi.uni-heidelberg.de/software/PANDA/downloads/panda-2016-03-07.tar') self.check( - 'foo-bar', '45', - 'http://example.com/foo_bar45.tar.gz') + 'gts', '121130', + 'http://gts.sourceforge.net/tarballs/gts-snapshot-121130.tar.gz') + self.check( + 'cdd', '061a', + 'http://www.cs.mcgill.ca/~fukuda/download/cdd/cdd-061a.tar.gz') - def test_version_developer_that_hates_us_format(self): + def test_underscores_only(self): + # name_name_ver_ver + self.check( + 'tinyxml', '2_6_2', + 'https://sourceforge.net/projects/tinyxml/files/tinyxml/2.6.2/tinyxml_2_6_2.tar.gz') + self.check( + 'boost', '1_55_0', + 'http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2') self.check( - 'foo-bar-la', '1.2.3', - 'http://example.com/foo-bar-la.1.2.3.tar.gz') + 'yorick', '2_2_04', + 'https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz') + # name_namever_ver + self.check( + 'tbb', '44_20160413', + 'https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160413oss_src.tgz') - def test_version_regular(self): + def test_dots_only(self): + # name.name.ver.ver + self.check( + 'prank', '150803', + 'http://wasabiapp.org/download/prank/prank.source.150803.tgz') + self.check( + 'jpeg', '9b', + 'http://www.ijg.org/files/jpegsrc.v9b.tar.gz') + self.check( + 'openjpeg', '2.1', + 'https://github.com/uclouvain/openjpeg/archive/version.2.1.tar.gz') + # name.namever.ver + self.check( + 'atlas', '3.11.34', + 'http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.34/atlas3.11.34.tar.bz2') self.check( - 'foo-bar', '1.21', - 'http://example.com/foo_bar-1.21.tar.gz') + 'visit', '2.10.1', + 'http://portal.nersc.gov/project/visit/releases/2.10.1/visit2.10.1.tar.gz') + self.check( + 'geant', '4.10.01.p03', + 'http://geant4.cern.ch/support/source/geant4.10.01.p03.tar.gz') + self.check( + 'tcl', '8.6.5', + 'http://prdownloads.sourceforge.net/tcl/tcl8.6.5-src.tar.gz') - def test_version_gitlab(self): + def test_dash_dot(self): + # name-name-ver.ver + # digit in name self.check( - 'vtk', '7.0.0', - 'https://gitlab.kitware.com/vtk/vtk/repository/' - 'archive.tar.bz2?ref=v7.0.0') + 'm4', '1.4.17', + 'https://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz') + # letter in version self.check( - 'icet', '1.2.3', - 'https://gitlab.kitware.com/icet/icet/repository/' - 'archive.tar.gz?ref=IceT-1.2.3') + 'gmp', '6.0.0a', + 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2') + # version starts with 'v' + self.check( + 'LaunchMON', '1.0.2', + 'https://github.com/LLNL/LaunchMON/releases/download/v1.0.2/launchmon-v1.0.2.tar.gz') + # name-ver-ver.ver self.check( - 'foo', '42.1337', - 'http://example.com/org/foo/repository/' - 'archive.zip?ref=42.1337bar') + 'libedit', '20150325-3.1', + 'http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz') - def test_version_github(self): + def test_dash_underscore(self): + # name-name-ver_ver self.check( - 'yajl', '1.0.5', - 'http://github.com/lloyd/yajl/tarball/1.0.5') + 'icu4c', '57_1', + 'http://download.icu-project.org/files/icu4c/57.1/icu4c-57_1-src.tgz') - def test_version_github_with_high_patch_number(self): + def test_underscore_dot(self): + # name_name_ver.ver self.check( - 'yajl', '1.2.34', - 'http://github.com/lloyd/yajl/tarball/v1.2.34') + 'superlu_dist', '4.1', + 'http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_dist_4.1.tar.gz') + self.check( + 'pexsi', '0.9.0', + 'https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v0.9.0.tar.gz') + # name_name.ver.ver + self.check( + 'fer', '696', + 'ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v696.tar.gz') - def test_yet_another_version(self): + def test_dash_dot_dash_dot(self): + # name-name-ver.ver-ver.ver + self.check( + 'sowing', '1.1.23-p1', + 'http://ftp.mcs.anl.gov/pub/petsc/externalpackages/sowing-1.1.23-p1.tar.gz') self.check( - 'mad', '0.15.1b', - 'http://example.com/mad-0.15.1b.tar.gz') + 'bib2xhtml', '3.0-15-gf506', + 'http://www.spinellis.gr/sw/textproc/bib2xhtml/bib2xhtml-v3.0-15-gf506.tar.gz') + # namever.ver-ver.ver + self.check( + 'go', '1.4-bootstrap-20161024', + 'https://storage.googleapis.com/golang/go1.4-bootstrap-20161024.tar.gz') - def test_lame_version_style(self): + def test_underscore_dash_dot(self): + # name_name-ver.ver + self.check( + 'the_silver_searcher', '0.32.0', + 'http://geoff.greer.fm/ag/releases/the_silver_searcher-0.32.0.tar.gz') self.check( - 'lame', '398-2', - 'http://kent.dl.sourceforge.net/sourceforge/lame/lame-398-2.tar.gz') + 'sphinx_rtd_theme', '0.1.10a0', + 'https://pypi.python.org/packages/source/s/sphinx_rtd_theme/sphinx_rtd_theme-0.1.10a0.tar.gz') - def test_ruby_version_style(self): + def test_dot_underscore_dot_dash_dot(self): + # name.name_ver.ver-ver.ver self.check( - 'ruby', '1.9.1-p243', - 'ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz') + 'TH.data', '1.0-8', + 'https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz') + self.check( + 'XML', '3.98-1.4', + 'https://cran.r-project.org/src/contrib/XML_3.98-1.4.tar.gz') - def test_omega_version_style(self): + def test_dash_dot_underscore_dot(self): + # name-name-ver.ver_ver.ver + self.check( + 'pypar', '2.1.5_108', + 'https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-2.1.5_108.tgz') + # name-namever.ver_ver.ver self.check( - 'omega', '0.80.2', - 'http://www.alcyone.com/binaries/omega/omega-0.80.2-src.tar.gz') + 'STAR-CCM+', '11.06.010_02', + 'file://{0}/STAR-CCM+11.06.010_02_linux-x86_64.tar.gz'.format(os.getcwd())) - def test_rc_style(self): + # Weird URLS + + def test_version_in_path(self): + # github.com/repo/name/releases/download/name-vver/name self.check( - 'libvorbis', '1.2.2rc1', - 'http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2') + 'nextflow', '0.20.1', + 'https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow') - def test_dash_rc_style(self): + def test_suffix_queries(self): self.check( - 'js', '1.8.0-rc1', - 'http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz') + 'swiftsim', '0.3.0', + 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0') + self.check( + 'sionlib', '1.7.1', + 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') - def test_angband_version_style(self): + def test_stem_queries(self): + self.check( + 'slepc', '3.6.2', + 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz') self.check( - 'angband', '3.0.9b', - 'http://rephial.org/downloads/3.0/angband-3.0.9b-src.tar.gz') + 'otf', '1.12.5salmon', + 'http://wwwpub.zih.tu-dresden.de/%7Emlieber/dcount/dcount.php?package=otf&get=OTF-1.12.5salmon.tar.gz') - def test_stable_suffix(self): + def test_single_character_name(self): self.check( - 'libevent', '1.4.14b', - 'http://www.monkey.org/~provos/libevent-1.4.14b-stable.tar.gz') + 'R', '3.3.2', + 'https://cloud.r-project.org/src/base/R-3/R-3.3.2.tar.gz') + + def test_single_digit_version(self): + pass - def test_debian_style_1(self): + def test_name_starts_with_digit(self): self.check( - 'sl', '3.03', - 'http://ftp.de.debian.org/debian/pool/main/s/sl/sl_3.03.orig.tar.gz') + '3to2', '1.1.1', + 'https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip') - def test_debian_style_2(self): + def plus_in_name(self): self.check( - 'mmv', '1.01b', - 'http://ftp.de.debian.org/debian/pool/main/m/mmv/mmv_1.01b.orig.tar.gz') + 'gtk+', '2.24.31', + 'http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.31.tar.xz') + self.check( + 'voro++', '0.4.6', + 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz') + + def test_no_version(self): + self.assert_not_detected('http://www.netlib.org/blas/blast-forum/cblas.tgz') + self.assert_not_detected('http://www.netlib.org/voronoi/triangle.zip') - def test_imagemagick_style(self): + def test_download_php(self): + # Name comes before download.php + self.check( + 'sionlib', '1.7.1', + 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') + # Ignore download.php + self.check( + 'slepc', '3.6.2', + 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz') self.check( - 'imagemagick', '6.7.5-7', + 'ScientificPython', '2.8.1', + 'https://sourcesup.renater.fr/frs/download.php/file/4411/ScientificPython-2.8.1.tar.gz') - 'http://downloads.sf.net/project/machomebrew/mirror/ImageMagick-6.7.5-7.tar.bz2') + def test_gloox_beta_style(self): + self.check( + 'gloox', '1.0-beta7', + 'http://camaya.net/download/gloox-1.0-beta7.tar.bz2') - def test_dash_version_dash_style(self): + def test_sphinx_beta_style(self): self.check( - 'antlr', '3.4', - 'http://www.antlr.org/download/antlr-3.4-complete.jar') + 'sphinx', '1.10-beta', + 'http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz') - def test_apache_version_style(self): + def test_ruby_version_style(self): self.check( - 'apache-cassandra', '1.2.0-rc2', - 'http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz') + 'ruby', '1.9.1-p243', + 'ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz') - def test_jpeg_style(self): + def test_rc_style(self): self.check( - 'jpegsrc', '8d', - 'http://www.ijg.org/files/jpegsrc.v8d.tar.gz') + 'libvorbis', '1.2.2rc1', + 'http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2') - def test_pypy_version(self): + def test_dash_rc_style(self): self.check( - 'pypy', '1.4.1', - 'http://pypy.org/download/pypy-1.4.1-osx.tar.bz2') + 'js', '1.8.0-rc1', + 'http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz') - def test_openssl_version(self): + def test_apache_version_style(self): self.check( - 'openssl', '0.9.8s', - 'http://www.openssl.org/source/openssl-0.9.8s.tar.gz') + 'apache-cassandra', '1.2.0-rc2', + 'http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz') def test_xaw3d_version(self): self.check( - 'xaw3d', '1.5E', + 'Xaw3d', '1.5E', 'ftp://ftp.visi.com/users/hawkeyd/X/Xaw3d-1.5E.tar.gz') def test_fann_version(self): @@ -269,16 +690,6 @@ class UrlParseTest(unittest.TestCase): 'fann', '2.1.0beta', 'http://downloads.sourceforge.net/project/fann/fann/2.1.0beta/fann-2.1.0beta.zip') - def test_iges_version(self): - self.check( - 'grads', '2.0.1', - 'ftp://iges.org/grads/2.0/grads-2.0.1-bin-darwin9.8-intel.tar.gz') - - def test_haxe_version(self): - self.check( - 'haxe', '2.08', - 'http://haxe.org/file/haxe-2.08-osx.tar.gz') - def test_imap_version(self): self.check( 'imap', '2007f', @@ -289,26 +700,6 @@ class UrlParseTest(unittest.TestCase): 'suite3270', '3.3.12ga7', 'http://sourceforge.net/projects/x3270/files/x3270/3.3.12ga7/suite3270-3.3.12ga7-src.tgz') - def test_synergy_version(self): - self.check( - 'synergy', '1.3.6p2', - 'http://synergy.googlecode.com/files/synergy-1.3.6p2-MacOSX-Universal.zip') - - def test_mvapich2_19_version(self): - self.check( - 'mvapich2', '1.9', - 'http://mvapich.cse.ohio-state.edu/download/mvapich2/mv2/mvapich2-1.9.tgz') - - def test_mvapich2_20_version(self): - self.check( - 'mvapich2', '2.0', - 'http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.0.tar.gz') - - def test_hdf5_version(self): - self.check( - 'hdf5', '1.8.13', - 'http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.8.13.tar.bz2') - def test_scalasca_version(self): self.check( 'cube', '4.2.3', @@ -317,55 +708,20 @@ class UrlParseTest(unittest.TestCase): 'cube', '4.3-TP1', 'http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-4.3-TP1.tar.gz') - def test_mpileaks_version(self): - self.check( - 'mpileaks', '1.0', - 'https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz') - self.check( - 'mpileaks', '1.0', - 'https://github.com/hpc/mpileaks/releases/download/1.0/mpileaks-1.0.tar.gz') - - def test_gcc_version(self): - self.check( - 'gcc', '4.4.7', - 'http://open-source-box.org/gcc/gcc-4.4.7/gcc-4.4.7.tar.bz2') - - def test_gcc_version_precedence(self): - # prefer the version in the tarball, not in the url prefix. - self.check( - 'gcc', '4.4.7', - 'http://open-source-box.org/gcc/gcc-4.9.2/gcc-4.4.7.tar.bz2') - def test_github_raw_url(self): self.check( - 'powerparser', '2.0.7', + 'CLAMR', '2.0.7', 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true') - def test_r_xml_version(self): + def test_luaposix_version(self): self.check( - 'xml', '3.98-1.4', - 'https://cran.r-project.org/src/contrib/XML_3.98-1.4.tar.gz') + 'luaposix', '33.4.0', + 'https://github.com/luaposix/luaposix/archive/release-v33.4.0.tar.gz') def test_nco_version(self): self.check( 'nco', '4.6.2-beta03', 'https://github.com/nco/nco/archive/4.6.2-beta03.tar.gz') - self.check( 'nco', '4.6.3-alpha04', 'https://github.com/nco/nco/archive/4.6.3-alpha04.tar.gz') - - def test_yorick_version(self): - self.check( - 'yorick', '2_2_04', - 'https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz') - - def test_luaposix_version(self): - self.check( - 'luaposix', '33.4.0', - 'https://github.com/luaposix/luaposix/archive/release-v33.4.0.tar.gz') - - def test_sionlib_version(self): - self.check( - 'sionlib', '1.7.1', - 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') diff --git a/lib/spack/spack/test/url_substitution.py b/lib/spack/spack/test/url_substitution.py index ea6374e3d2..449a3b29bf 100644 --- a/lib/spack/spack/test/url_substitution.py +++ b/lib/spack/spack/test/url_substitution.py @@ -22,44 +22,64 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -"""\ -This test does sanity checks on substituting new versions into URLs -""" +"""Tests Spack's ability to substitute a different version into a URL.""" + +import os import unittest -import spack.url as url +from spack.url import substitute_version + + +class UrlSubstitutionTest(unittest.TestCase): + def check(self, base, version, new_url): + self.assertEqual(substitute_version(base, version), new_url) -base = "https://comp.llnl.gov/linear_solvers/download/hypre-2.9.0b.tar.gz" -stem = "https://comp.llnl.gov/linear_solvers/download/hypre-" + def test_same_version(self): + # Ensures that substituting the same version results in the same URL + self.check( + 'http://www.mr511.de/software/libelf-0.8.13.tar.gz', '0.8.13', + 'http://www.mr511.de/software/libelf-0.8.13.tar.gz') + def test_different_version(self): + # Test a completely different version syntax + self.check( + 'http://www.prevanders.net/libdwarf-20130729.tar.gz', '8.12', + 'http://www.prevanders.net/libdwarf-8.12.tar.gz') -class PackageSanityTest(unittest.TestCase): + def test_double_version(self): + # Test a URL where the version appears twice + # It should get substituted both times + self.check( + 'https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz', '2.1.3', + 'https://github.com/hpc/mpileaks/releases/download/v2.1.3/mpileaks-2.1.3.tar.gz') - def test_hypre_url_substitution(self): - self.assertEqual(url.substitute_version(base, '2.9.0b'), base) - self.assertEqual( - url.substitute_version(base, '2.8.0b'), stem + "2.8.0b.tar.gz") - self.assertEqual( - url.substitute_version(base, '2.7.0b'), stem + "2.7.0b.tar.gz") - self.assertEqual( - url.substitute_version(base, '2.6.0b'), stem + "2.6.0b.tar.gz") - self.assertEqual( - url.substitute_version(base, '1.14.0b'), stem + "1.14.0b.tar.gz") - self.assertEqual( - url.substitute_version(base, '1.13.0b'), stem + "1.13.0b.tar.gz") - self.assertEqual( - url.substitute_version(base, '2.0.0'), stem + "2.0.0.tar.gz") - self.assertEqual( - url.substitute_version(base, '1.6.0'), stem + "1.6.0.tar.gz") + def test_partial_version_prefix(self): + # Test now with a partial prefix earlier in the URL + # This is hard to figure out so Spack only substitutes + # the last instance of the version + self.check( + 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2', '2.2.0', + 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.2.0.tar.bz2') + self.check( + 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2', '2.2', + 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.2.tar.bz2') - def test_otf2_url_substitution(self): - base = "http://www.vi-hps.org/upload/packages/otf2/otf2-1.4.tar.gz" + def test_no_separator(self): + # No separator between the name and version of the package + self.check( + 'file://{0}/turbolinux702.tar.gz'.format(os.getcwd()), '703', + 'file://{0}/turbolinux703.tar.gz'.format(os.getcwd())) - self.assertEqual(url.substitute_version(base, '1.4'), base) + def test_github_raw(self): + self.check( + 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '2.0.7', + 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true') + self.check( + 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '4.7', + 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v4.7.tgz?raw=true') - self.assertEqual( - url.substitute_version(base, '1.3.1'), - "http://www.vi-hps.org/upload/packages/otf2/otf2-1.3.1.tar.gz") - self.assertEqual( - url.substitute_version(base, '1.2.1'), - "http://www.vi-hps.org/upload/packages/otf2/otf2-1.2.1.tar.gz") + def test_regex(self): + # Package name contains regex characters + self.check( + 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz', '1.2.3', + 'http://math.lbl.gov/voro++/download/dir/voro++-1.2.3.tar.gz') diff --git a/lib/spack/spack/test/web.py b/lib/spack/spack/test/web.py index 9a7f4d9f8b..9fa95a8d18 100644 --- a/lib/spack/spack/test/web.py +++ b/lib/spack/spack/test/web.py @@ -23,7 +23,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """Tests for web.py.""" -import pytest import os import spack @@ -141,7 +140,6 @@ def test_find_versions_of_archive_2(): assert ver('2.0.0') in versions -@pytest.mark.xfail def test_find_exotic_versions_of_archive_2(): versions = find_versions_of_archive(root_tarball, root, list_depth=2) # up for grabs to make this better. @@ -157,7 +155,6 @@ def test_find_versions_of_archive_3(): assert ver('4.5') in versions -@pytest.mark.xfail def test_find_exotic_versions_of_archive_3(): versions = find_versions_of_archive(root_tarball, root, list_depth=3) assert ver('2.0.0b2') in versions diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 38ff74f7bc..174f7d0b3c 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -71,7 +71,7 @@ def find_list_url(url): url_types = [ # e.g. https://github.com/llnl/callpath/archive/v1.0.1.tar.gz - (r'^(https://github.com/[^/]+/[^/]+)/archive/', + (r'(.*github\.com/[^/]+/[^/]+)/archive/', lambda m: m.group(1) + '/releases')] for pattern, fun in url_types: @@ -101,6 +101,177 @@ def strip_query_and_fragment(path): return (path, '') # Ignore URL parse errors here +def strip_version_suffixes(path): + """Some tarballs contain extraneous information after the version: + + * ``bowtie2-2.2.5-source`` + * ``libevent-2.0.21-stable`` + * ``cuda_8.0.44_linux.run`` + + These strings are not part of the version number and should be ignored. + This function strips those suffixes off and returns the remaining string. + The goal is that the version is always the last thing in ``path``: + + * ``bowtie2-2.2.5`` + * ``libevent-2.0.21`` + * ``cuda_8.0.44`` + + :param str path: The filename or URL for the package + :return: The ``path`` with any extraneous suffixes removed + :rtype: str + """ + # NOTE: This could be done with complicated regexes in parse_version_offset + # NOTE: The problem is that we would have to add these regexes to the end + # NOTE: of every single version regex. Easier to just strip them off + # NOTE: permanently + + suffix_regexes = [ + # Download type + '[Ii]nstall', + 'all', + 'src(_0)?', + '[Ss]ources?', + 'file', + 'full', + 'single', + 'public', + 'with[a-zA-Z_-]+', + 'bin', + 'binary', + 'run', + '[Uu]niversal', + 'jar', + 'complete', + 'oss', + 'gem', + 'tar', + 'sh', + + # Download version + 'stable', + '[Ff]inal', + 'rel', + 'orig', + 'dist', + '\+', + + # License + 'gpl', + + # Arch + # Needs to come before and after OS, appears in both orders + 'ia32', + 'intel', + 'amd64', + 'x64', + 'x86_64', + 'x86', + 'i[36]86', + 'ppc64(le)?', + 'armv?(7l|6l|64)', + + # OS + '[Ll]inux(_64)?', + '[Uu]ni?x', + '[Ss]un[Oo][Ss]', + '[Mm]ac[Oo][Ss][Xx]?', + '[Oo][Ss][Xx]', + '[Dd]arwin(64)?', + '[Aa]pple', + '[Ww]indows', + '[Ww]in(64|32)?', + '[Cc]ygwin(64|32)?', + '[Mm]ingw', + + # Arch + # Needs to come before and after OS, appears in both orders + 'ia32', + 'intel', + 'amd64', + 'x64', + 'x86_64', + 'x86', + 'i[36]86', + 'ppc64(le)?', + 'armv?(7l|6l|64)?', + + # PyPI + '[._-]py[23].*\.whl', + '[._-]cp[23].*\.whl', + '[._-]win.*\.exe', + ] + + for regex in suffix_regexes: + # Remove the suffix from the end of the path + # This may be done multiple times + path = re.sub(r'[._-]?' + regex + '$', '', path) + + return path + + +def strip_name_suffixes(path, version): + """Most tarballs contain a package name followed by a version number. + However, some also contain extraneous information in-between the name + and version: + + * ``rgb-1.0.6`` + * ``converge_install_2.3.16`` + * ``jpegsrc.v9b`` + + These strings are not part of the package name and should be ignored. + This function strips the version number and any extraneous suffixes + off and returns the remaining string. The goal is that the name is + always the last thing in ``path``: + + * ``rgb`` + * ``converge`` + * ``jpeg`` + + :param str path: The filename or URL for the package + :param str version: The version detected for this URL + :return: The ``path`` with any extraneous suffixes removed + :rtype: str + """ + # NOTE: This could be done with complicated regexes in parse_name_offset + # NOTE: The problem is that we would have to add these regexes to every + # NOTE: single name regex. Easier to just strip them off permanently + + suffix_regexes = [ + # Strip off the version and anything after it + + # name-ver + # name_ver + # name.ver + r'[._-]v?' + str(version) + '.*', + + # namever + str(version) + '.*', + + # Download type + 'install', + 'src', + '(open)?[Ss]ources?', + '[._-]std', + + # Download version + 'snapshot', + 'distrib', + + # VCS + '0\+bzr', + + # License + 'gpl', + ] + + for regex in suffix_regexes: + # Remove the suffix from the end of the path + # This may be done multiple times + path = re.sub('[._-]?' + regex + '$', '', path) + + return path + + def split_url_extension(path): """Some URLs have a query string, e.g.: @@ -125,7 +296,7 @@ def split_url_extension(path): prefix, ext, suffix = path, '', '' # Strip off sourceforge download suffix. - match = re.search(r'((?:sourceforge.net|sf.net)/.*)(/download)$', path) + match = re.search(r'((?:sourceforge\.net|sf\.net)/.*)(/download)$', path) if match: prefix, suffix = match.groups() @@ -189,8 +360,20 @@ def parse_version_offset(path): path, ext, suffix = split_url_extension(path) # stem: Everything from path after the final '/' - stem = os.path.basename(path) - offset = len(path) - len(stem) + original_stem = os.path.basename(path) + + # Try to strip off anything after the version number + stem = strip_version_suffixes(original_stem) + + # Assumptions: + # + # 1. version always comes after the name + # 2. separators include '-', '_', and '.' + # 3. names can contain A-Z, a-z, 0-9, '+', separators + # 4. versions can contain A-Z, a-z, 0-9, separators + # 5. versions always start with a digit + # 6. versions are often prefixed by a 'v' character + # 7. separators are most reliable to determine name/version boundaries # List of the following format: # @@ -202,87 +385,118 @@ def parse_version_offset(path): # The first regex that matches string will be used to determine # the version of the package. Thefore, hyperspecific regexes should # come first while generic, catch-all regexes should come last. + # With that said, regular expressions are slow, so if possible, put + # ones that only catch one or two URLs at the bottom. version_regexes = [ - # GitHub tarballs, e.g. v1.2.3 - (r'github.com/.+/(?:zip|tar)ball/v?((\d+\.)+\d+)$', path), + # 1st Pass: Simplest case + # Assume name contains no digits and version contains no letters + # e.g. libpng-1.6.27 + (r'^[a-zA-Z+._-]+[._-]v?(\d[\d._-]*)$', stem), - # e.g. https://github.com/sam-github/libnet/tarball/libnet-1.1.4 - (r'github.com/.+/(?:zip|tar)ball/.*-((\d+\.)+\d+)$', path), + # 2nd Pass: Version only + # Assume version contains no letters - # e.g. https://github.com/isaacs/npm/tarball/v0.2.5-1 - (r'github.com/.+/(?:zip|tar)ball/v?((\d+\.)+\d+-(\d+))$', path), + # ver + # e.g. 3.2.7, 7.0.2-7, v3.3.0, v1_6_3 + (r'^v?(\d[\d._-]*)$', stem), - # e.g. https://github.com/petdance/ack/tarball/1.93_02 - (r'github.com/.+/(?:zip|tar)ball/v?((\d+\.)+\d+_(\d+))$', path), + # 3rd Pass: No separator characters are used + # Assume name contains no digits - # Yorick is very special. - # e.g. https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz - (r'github.com/[^/]+/yorick/archive/y_(\d+(?:_\d+)*)$', path), + # namever + # e.g. turbolinux702, nauty26r7 + (r'^[a-zA-Z+]*(\d[\da-zA-Z]*)$', stem), - # e.g. https://github.com/hpc/lwgrp/archive/v1.0.1.tar.gz - (r'github.com/[^/]+/[^/]+/archive/(?:release-)?v?(\w+(?:[.-]\w+)*)$', path), # noqa + # 4th Pass: A single separator character is used + # Assume name contains no digits - # e.g. https://github.com/erlang/otp/tarball/OTP_R15B01 (erlang style) - (r'[-_](R\d+[AB]\d*(-\d+)?)', path), + # name-name-ver-ver + # e.g. panda-2016-03-07, gts-snapshot-121130, cdd-061a + (r'^[a-zA-Z+-]*(\d[\da-zA-Z-]*)$', stem), - # e.g., https://github.com/hpc/libcircle/releases/download/0.2.1-rc.1/libcircle-0.2.1-rc.1.tar.gz - # e.g., - # https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - (r'github.com/[^/]+/[^/]+/releases/download/v?([^/]+)/.*$', path), + # name_name_ver_ver + # e.g. tinyxml_2_6_2, boost_1_55_0, tbb2017_20161128, v1_6_3 + (r'^[a-zA-Z+_]*(\d[\da-zA-Z_]*)$', stem), - # GitLab syntax: - # {baseUrl}{/organization}{/projectName}/repository/archive.{fileEnding}?ref={gitTag} - # as with github releases, we hope a version can be found in the - # git tag - # Search dotted versions: - # e.g., https://gitlab.kitware.com/vtk/vtk/repository/archive.tar.bz2?ref=v7.0.0 - # e.g., https://example.com/org/repo/repository/archive.tar.bz2?ref=SomePrefix-2.1.1 - # e.g., http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1 - (r'\?ref=(?:.*-|v)*((\d+\.)+\d+).*$', suffix), - (r'\?version=((\d+\.)+\d+)', suffix), + # name.name.ver.ver + # e.g. prank.source.150803, jpegsrc.v9b, atlas3.11.34, geant4.10.01.p03 + (r'^[a-zA-Z+.]*(\d[\da-zA-Z.]*)$', stem), - # e.g. boost_1_39_0 - (r'((\d+_)+\d+)$', stem), + # 5th Pass: Two separator characters are used + # Name may contain digits, version may contain letters - # e.g. foobar-4.5.1-1 - # e.g. ruby-1.9.1-p243 - (r'-((\d+\.)*\d\.\d+-(p|rc|RC)?\d+)(?:[-._](?:bin|dist|stable|src|sources))?$', stem), # noqa + # name-name-ver.ver + # e.g. m4-1.4.17, gmp-6.0.0a, launchmon-v1.0.2 + (r'^[a-zA-Z\d+-]+-v?(\d[\da-zA-Z.]*)$', stem), - # e.g. lame-398-1 - (r'-((\d)+-\d)', stem), + # name-name-ver_ver + # e.g. icu4c-57_1 + (r'^[a-zA-Z\d+-]+-v?(\d[\da-zA-Z_]*)$', stem), - # e.g. foobar_1.2-3 or 3.98-1.4 - (r'_((\d+\.)+\d+(-(\d+(\.\d+)?))?[a-z]?)', stem), + # name_name_ver.ver + # e.g. superlu_dist_4.1, pexsi_v0.9.0 + (r'^[a-zA-Z\d+_]+_v?(\d[\da-zA-Z.]*)$', stem), - # e.g. foobar-4.5.1 - (r'-((\d+\.)*\d+)$', stem), + # name_name.ver.ver + # e.g. fer_source.v696 + (r'^[a-zA-Z\d+_]+\.v?(\d[\da-zA-Z.]*)$', stem), - # e.g. foobar-4.5.1b, foobar4.5RC, foobar.v4.5.1b - (r'[-._]?v?((\d+\.)*\d+[-._]?([a-z]|rc|RC|tp|TP?)\d*)$', stem), + # name-name-ver.ver-ver.ver + # e.g. sowing-1.1.23-p1, bib2xhtml-v3.0-15-gf506, 4.6.3-alpha04 + (r'^(?:[a-zA-Z\d+-]+-)?v?(\d[\da-zA-Z.-]*)$', stem), - # e.g. foobar-4.5.0-beta1, or foobar-4.50-beta - (r'-((\d+\.)*\d+-beta(\d+)?)$', stem), + # namever.ver-ver.ver + # e.g. go1.4-bootstrap-20161024 + (r'^[a-zA-Z+]+v?(\d[\da-zA-Z.-]*)$', stem), - # e.g. foobar4.5.1 - (r'((\d+\.)*\d+)$', stem), + # 6th Pass: All three separator characters are used + # Name may contain digits, version may contain letters - # e.g. foobar-4.5.0-bin - (r'-((\d+\.)+\d+[a-z]?)[-._](bin|dist|stable|src|sources?)$', stem), + # name_name-ver.ver + # e.g. the_silver_searcher-0.32.0, sphinx_rtd_theme-0.1.10a0 + (r'^[a-zA-Z\d+_]+-v?(\d[\da-zA-Z.]*)$', stem), - # e.g. dash_0.5.5.1.orig.tar.gz (Debian style) - (r'_((\d+\.)+\d+[a-z]?)[.]orig$', stem), + # name.name_ver.ver-ver.ver + # e.g. TH.data_1.0-8, XML_3.98-1.4 + (r'^[a-zA-Z\d+.]+_v?(\d[\da-zA-Z.-]*)$', stem), - # e.g. http://www.openssl.org/source/openssl-0.9.8s.tar.gz - (r'-v?([^-]+(-alpha|-beta)?)', stem), + # name-name-ver.ver_ver.ver + # e.g. pypar-2.1.5_108 + (r'^[a-zA-Z\d+-]+-v?(\d[\da-zA-Z._]*)$', stem), - # e.g. astyle_1.23_macosx.tar.gz - (r'_([^_]+(_alpha|_beta)?)', stem), + # name.name_name-ver.ver + # e.g. tap.py-1.6, backports.ssl_match_hostname-3.5.0.1 + (r'^[a-zA-Z\d+._]+-v?(\d[\da-zA-Z.]*)$', stem), - # e.g. http://mirrors.jenkins-ci.org/war/1.486/jenkins.war - (r'\/(\d\.\d+)\/', path), + # name-namever.ver_ver.ver + # e.g. STAR-CCM+11.06.010_02 + (r'^[a-zA-Z+-]+(\d[\da-zA-Z._]*)$', stem), - # e.g. http://www.ijg.org/files/jpegsrc.v8d.tar.gz - (r'\.v(\d+[a-z]?)', stem) + # 7th Pass: Specific VCS + + # bazaar + # e.g. libvterm-0+bzr681 + (r'bzr(\d[\da-zA-Z._-]*)$', stem), + + # 8th Pass: Version in path + + # github.com/repo/name/releases/download/vver/name + # e.g. https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow + (r'github\.com/[^/]+/[^/]+/releases/download/[a-zA-Z+._-]*v?(\d[\da-zA-Z._-]*)/', path), # noqa + + # 9th Pass: Query strings + + # e.g. http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0 + (r'\?ref=[a-zA-Z+._-]*v?(\d[\da-zA-Z._-]*)$', suffix), + + # e.g. http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1 + (r'\?version=v?(\d[\da-zA-Z._-]*)$', suffix), + + # e.g. http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz + (r'\?filename=[a-zA-Z\d+-]+-v?(\d[\da-zA-Z.]*)$', stem), + + # e.g. http://wwwpub.zih.tu-dresden.de/%7Emlieber/dcount/dcount.php?package=otf&get=OTF-1.12.5salmon.tar.gz + (r'\?package=[a-zA-Z\d+-]+&get=[a-zA-Z\d+-]+-v?(\d[\da-zA-Z.]*)$', stem), # noqa ] for i, version_regex in enumerate(version_regexes): @@ -292,9 +506,15 @@ def parse_version_offset(path): version = match.group(1) start = match.start(1) - # if we matched from the basename, then add offset in. + # If we matched from the stem or suffix, we need to add offset + offset = 0 if match_string is stem: - start += offset + offset = len(path) - len(original_stem) + elif match_string is suffix: + offset = len(path) + if ext: + offset += len(ext) + 1 # .tar.gz is converted to tar.gz + start += offset return version, start, len(version), i, regex @@ -342,7 +562,7 @@ def parse_name_offset(path, v=None): except UndetectableVersionError: # Not all URLs contain a version. We still want to be able # to determine a name if possible. - v = '' + v = 'unknown' # path: The prefix of the URL, everything before the ext and suffix # ext: The file extension @@ -350,8 +570,10 @@ def parse_name_offset(path, v=None): path, ext, suffix = split_url_extension(path) # stem: Everything from path after the final '/' - stem = os.path.basename(path) - offset = len(path) - len(stem) + original_stem = os.path.basename(path) + + # Try to strip off anything after the package name + stem = strip_name_suffixes(original_stem, v) # List of the following format: # @@ -363,26 +585,45 @@ def parse_name_offset(path, v=None): # The first regex that matches string will be used to determine # the name of the package. Thefore, hyperspecific regexes should # come first while generic, catch-all regexes should come last. + # With that said, regular expressions are slow, so if possible, put + # ones that only catch one or two URLs at the bottom. name_regexes = [ - (r'/sourceforge/([^/]+)/', path), - (r'github.com/[^/]+/[^/]+/releases/download/%s/(.*)-%s$' % - (v, v), path), - (r'/([^/]+)/(tarball|zipball)/', path), - (r'/([^/]+)[_.-](bin|dist|stable|src|sources)[_.-]%s' % v, path), - (r'github.com/[^/]+/([^/]+)/archive', path), - (r'github.com/[^/]+/([^/]+)/releases', path), - (r'[^/]+/([^/]+)/repository/archive', path), # gitlab - (r'([^/]+)/download.php', path), - - (r'([^/]+)[_.-]v?%s' % v, stem), # prefer the stem - (r'([^/]+)%s' % v, stem), - - # accept the path if name is not in stem. - (r'/([^/]+)[_.-]v?%s' % v, path), - (r'/([^/]+)%s' % v, path), - - (r'^([^/]+)[_.-]v?%s' % v, path), - (r'^([^/]+)%s' % v, path) + # 1st Pass: Common repositories + + # GitHub: github.com/repo/name/ + # e.g. https://github.com/nco/nco/archive/4.6.2.tar.gz + (r'github\.com/[^/]+/([^/]+)', path), + + # GitLab: gitlab.*/repo/name/ + # e.g. http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0 + (r'gitlab[^/]+/[^/]+/([^/]+)', path), + + # Bitbucket: bitbucket.org/repo/name/ + # e.g. https://bitbucket.org/glotzer/hoomd-blue/get/v1.3.3.tar.bz2 + (r'bitbucket\.org/[^/]+/([^/]+)', path), + + # PyPI: pypi.(python.org|io)/packages/source/first-letter/name/ + # e.g. https://pypi.python.org/packages/source/m/mpmath/mpmath-all-0.19.tar.gz + # e.g. https://pypi.io/packages/source/b/backports.ssl_match_hostname/backports.ssl_match_hostname-3.5.0.1.tar.gz + (r'pypi\.(?:python\.org|io)/packages/source/[A-Za-z\d]/([^/]+)', path), + + # 2nd Pass: Query strings + + # ?filename=name-ver.ver + # e.g. http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz + (r'\?filename=([A-Za-z\d+-]+)$', stem), + + # ?package=name + # e.g. http://wwwpub.zih.tu-dresden.de/%7Emlieber/dcount/dcount.php?package=otf&get=OTF-1.12.5salmon.tar.gz + (r'\?package=([A-Za-z\d+-]+)', stem), + + # download.php + # e.g. http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1 + (r'([^/]+)/download.php$', path), + + # 3rd Pass: Name followed by version in archive + + (r'^([A-Za-z\d+\._-]+)$', stem), ] for i, name_regex in enumerate(name_regexes): @@ -392,13 +633,15 @@ def parse_name_offset(path, v=None): name = match.group(1) start = match.start(1) - # if we matched from the basename, then add offset in. + # If we matched from the stem or suffix, we need to add offset + offset = 0 if match_string is stem: - start += offset - - # package names should be lowercase and separated by dashes. - name = name.lower() - name = re.sub('[_.]', '-', name) + offset = len(path) - len(original_stem) + elif match_string is suffix: + offset = len(path) + if ext: + offset += len(ext) + 1 # .tar.gz is converted to tar.gz + start += offset return name, start, len(name), i, regex @@ -431,6 +674,9 @@ def parse_name_and_version(path): The version of the package :rtype: tuple + + :raises UndetectableVersionError: If the URL does not match any regexes + :raises UndetectableNameError: If the URL does not match any regexes """ ver = parse_version(path) name = parse_name(path, ver) @@ -457,6 +703,22 @@ def cumsum(elts, init=0, fn=lambda x: x): return sums +def find_all(substring, string): + """Returns a list containing the indices of + every occurrence of substring in string.""" + + occurrences = [] + index = 0 + while index < len(string): + index = string.find(substring, index) + if index == -1: + break + occurrences.append(index) + index += len(substring) + + return occurrences + + def substitution_offsets(path): """This returns offsets for substituting versions and names in the provided path. It is a helper for :func:`substitute_version`. @@ -468,65 +730,34 @@ def substitution_offsets(path): except UndetectableNameError: return (None, -1, -1, (), ver, vs, vl, (vs,)) except UndetectableVersionError: - return (None, -1, -1, (), None, -1, -1, ()) - - # protect extensions like bz2 from getting inadvertently - # considered versions. - path = comp.strip_extension(path) - - # Construct a case-insensitive regular expression for the package name. - name_re = '(%s)' % insensitize(name) - - # Split the string apart by things that match the name so that if the - # name contains numbers or things that look like versions, we don't - # accidentally substitute them with a version. - name_parts = re.split(name_re, path) - - offsets = cumsum(name_parts, 0, len) - name_offsets = offsets[1::2] + try: + name, ns, nl, ni, nregex = parse_name_offset(path) + return (name, ns, nl, (ns,), None, -1, -1, ()) + except UndetectableNameError: + return (None, -1, -1, (), None, -1, -1, ()) - ver_offsets = [] - for i in range(0, len(name_parts), 2): - vparts = re.split(ver, name_parts[i]) - voffsets = cumsum(vparts, offsets[i], len) - ver_offsets.extend(voffsets[1::2]) + # Find the index of every occurrence of name and ver in path + name_offsets = find_all(name, path) + ver_offsets = find_all(ver, path) - return (name, ns, nl, tuple(name_offsets), - ver, vs, vl, tuple(ver_offsets)) + return (name, ns, nl, name_offsets, + ver, vs, vl, ver_offsets) def wildcard_version(path): """Find the version in the supplied path, and return a regular expression that will match this path with any version in its place. """ - # Get name and version, so we can treat them specially - name, v = parse_name_and_version(path) + # Get version so we can replace it with a wildcard + version = parse_version(path) - path, ext, suffix = split_url_extension(path) + # Split path by versions + vparts = path.split(str(version)) + + # Replace each version with a generic capture group to find versions + # and escape everything else so it's not interpreted as a regex + result = '(\d.*)'.join(re.escape(vp) for vp in vparts) - # Construct a case-insensitive regular expression for the package name. - name_re = '(%s)' % insensitize(name) - - # Split the string apart by things that match the name so that if the - # name contains numbers or things that look like versions, we don't - # catch them with the version wildcard. - name_parts = re.split(name_re, path) - - # Even elements in the array did *not* match the name - for i in range(0, len(name_parts), 2): - # Split each part by things that look like versions. - vparts = re.split(v.wildcard(), name_parts[i]) - - # Replace each version with a generic capture group to find versions. - # And escape everything else so it's not interpreted as a regex - vgroup = '(%s)' % v.wildcard() - name_parts[i] = vgroup.join(re.escape(vp) for vp in vparts) - - # Put it all back together with original name matches intact. - result = ''.join(name_parts) - if ext: - result += '.' + ext - result += suffix return result diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py index 1f2bfa88cf..cd35008aed 100644 --- a/lib/spack/spack/util/naming.py +++ b/lib/spack/spack/util/naming.py @@ -39,6 +39,7 @@ __all__ = [ 'validate_fully_qualified_module_name', 'validate_module_name', 'possible_spack_module_names', + 'simplify_name', 'NamespaceTrie'] # Valid module names can contain '-' but can't start with it. @@ -108,6 +109,50 @@ def possible_spack_module_names(python_mod_name): return results +def simplify_name(name): + """Simplifies a name which may include uppercase letters, periods, + underscores, and pluses. In general, we want our package names to + only contain lowercase letters, digits, and dashes. + + :param str name: The original name of the package + :return: The new name of the package + :rtype: str + """ + # Convert CamelCase to Dashed-Names + # e.g. ImageMagick -> Image-Magick + # e.g. SuiteSparse -> Suite-Sparse + # name = re.sub('([a-z])([A-Z])', r'\1-\2', name) + + # Rename Intel downloads + # e.g. l_daal, l_ipp, l_mkl -> daal, ipp, mkl + if name.startswith('l_'): + name = name[2:] + + # Convert UPPERCASE to lowercase + # e.g. SAMRAI -> samrai + name = name.lower() + + # Replace '_' and '.' with '-' + # e.g. backports.ssl_match_hostname -> backports-ssl-match-hostname + name = name.replace('_', '-') + name = name.replace('.', '-') + + # Replace "++" with "pp" and "+" with "-plus" + # e.g. gtk+ -> gtk-plus + # e.g. voro++ -> voropp + name = name.replace('++', 'pp') + name = name.replace('+', '-plus') + + # Simplify Lua package names + # We don't want "lua" to occur multiple times in the name + name = re.sub('^(lua)([^-])', r'\1-\2', name) + + # Simplify Bio++ package names + name = re.sub('^(bpp)([^-])', r'\1-\2', name) + + return name + + def valid_module_name(mod_name): """Return whether mod_name is valid for use in Spack.""" return bool(re.match(_valid_module_re, mod_name)) diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 8e2dd34635..f803c6cea3 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -268,6 +268,14 @@ def find_versions_of_archive(archive_urls, list_url=None, list_depth=0): # part, not the full path. url_regex = os.path.basename(url_regex) + # We need to add a / to the beginning of the regex to prevent + # Spack from picking up similarly named packages like: + # https://cran.r-project.org/src/contrib/pls_2.6-0.tar.gz + # https://cran.r-project.org/src/contrib/enpls_5.7.tar.gz + # https://cran.r-project.org/src/contrib/autopls_1.3.tar.gz + # https://cran.r-project.org/src/contrib/matrixpls_1.0.4.tar.gz + url_regex = '/' + url_regex + # We need to add a $ anchor to the end of the regex to prevent # Spack from picking up signature files like: # .asc @@ -275,7 +283,9 @@ def find_versions_of_archive(archive_urls, list_url=None, list_depth=0): # .sha256 # .sig # However, SourceForge downloads still need to end in '/download'. - regexes.append(url_regex + '(\/download)?$') + url_regex += '(\/download)?$' + + regexes.append(url_regex) # Build a dict version -> URL from any links that match the wildcards. versions = {} diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index c8395aeb29..89fcc9aaa7 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -194,35 +194,6 @@ class Version(object): nother = len(other.version) return nother <= nself and self.version[:nother] == other.version - def wildcard(self): - """Create a regex that will match variants of this version string.""" - def a_or_n(seg): - if type(seg) == int: - return r'[0-9]+' - else: - return r'[a-zA-Z]+' - - version = self.version - - # Use a wildcard for separators, in case a version is written - # two different ways (e.g., boost writes 1_55_0 and 1.55.0) - sep_re = '[_.-]' - separators = ('',) + (sep_re,) * len(self.separators) - - version += (version[-1],) * 2 - separators += (sep_re,) * 2 - - segments = [a_or_n(seg) for seg in version] - - wc = segments[0] - for i in range(1, len(separators)): - wc += '(?:' + separators[i] + segments[i] - - # Add possible alpha or beta indicator at the end of each segemnt - # We treat these specially b/c they're so common. - wc += '(?:[a-z]|alpha|beta)?)?' * (len(segments) - 1) - return wc - def __iter__(self): return iter(self.version) diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 726e1c81cb..819dcc06ab 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -732,20 +732,21 @@ function _spack_url { then compgen -W "-h --help" -- "$cur" else - compgen -W "list parse test" -- "$cur" + compgen -W "list parse summary" -- "$cur" fi } function _spack_url_list { - compgen -W "-h --help -c --color -e --extrapolation -n --incorrect-name - -v --incorrect-version" -- "$cur" + compgen -W "-h --help -c --color -e --extrapolation + -n --incorrect-name -N --correct-name + -v --incorrect-version -V --correct-version" -- "$cur" } function _spack_url_parse { compgen -W "-h --help -s --spider" -- "$cur" } -function _spack_url_test { +function _spack_url_summary { compgen -W "-h --help" -- "$cur" } diff --git a/var/spack/repos/builtin/packages/automake/package.py b/var/spack/repos/builtin/packages/automake/package.py index 8643f5d836..4f022e5cad 100644 --- a/var/spack/repos/builtin/packages/automake/package.py +++ b/var/spack/repos/builtin/packages/automake/package.py @@ -29,7 +29,7 @@ class Automake(AutotoolsPackage): """Automake -- make file builder part of autotools""" homepage = 'http://www.gnu.org/software/automake/' - url = 'http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz' + url = 'http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz' version('1.15', '716946a105ca228ab545fc37a70df3a3') version('1.14.1', 'd052a3e884631b9c7892f2efce542d75') diff --git a/var/spack/repos/builtin/packages/bib2xhtml/package.py b/var/spack/repos/builtin/packages/bib2xhtml/package.py index b356038180..56038eea18 100644 --- a/var/spack/repos/builtin/packages/bib2xhtml/package.py +++ b/var/spack/repos/builtin/packages/bib2xhtml/package.py @@ -33,9 +33,6 @@ class Bib2xhtml(Package): version('3.0-15-gf506', 'a26ba02fe0053bbbf2277bdf0acf8645') - def url_for_version(self, v): - return ('http://www.spinellis.gr/sw/textproc/bib2xhtml/bib2xhtml-v%s.tar.gz' % v) - def install(self, spec, prefix): # Add the bst include files to the install directory bst_include = join_path(prefix.share, 'bib2xhtml') diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py index 133fcc5fc3..e9bfa32b39 100644 --- a/var/spack/repos/builtin/packages/bison/package.py +++ b/var/spack/repos/builtin/packages/bison/package.py @@ -31,7 +31,7 @@ class Bison(AutotoolsPackage): generalized LR (GLR) parser employing LALR(1) parser tables.""" homepage = "http://www.gnu.org/software/bison/" - url = "http://ftp.gnu.org/gnu/bison/bison-3.0.tar.gz" + url = "http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz" version('3.0.4', 'a586e11cd4aff49c3ff6d3b6a4c9ccf8') version('2.7', 'ded660799e76fb1667d594de1f7a0da9') diff --git a/var/spack/repos/builtin/packages/blast-plus/package.py b/var/spack/repos/builtin/packages/blast-plus/package.py index 02db14f478..53f09c03a3 100644 --- a/var/spack/repos/builtin/packages/blast-plus/package.py +++ b/var/spack/repos/builtin/packages/blast-plus/package.py @@ -39,14 +39,9 @@ from spack import * class BlastPlus(AutotoolsPackage): """Basic Local Alignment Search Tool.""" - homepage = "http://blast.ncbi.nlm.nih.gov/" url = "https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.6.0/ncbi-blast-2.6.0+-src.tar.gz" - def url_for_version(self, version): - url = "https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/{0}/ncbi-blast-{0}+-src.tar.gz" - return url.format(version) - version('2.6.0', 'c8ce8055b10c4d774d995f88c7cc6225') version('2.2.30', 'f8e9a5eb368173142fe6867208b73715') diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index 7570987ad8..06df688ea1 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -141,14 +141,8 @@ class Boost(Package): patch('xl_1_62_0_le.patch', when='@1.62.0%xl') def url_for_version(self, version): - """ - Handle Boost's weird URLs, - which write the version two different ways. - """ - parts = [str(p) for p in Version(version)] - dots = ".".join(parts) - underscores = "_".join(parts) - return "http://downloads.sourceforge.net/project/boost/boost/%s/boost_%s.tar.bz2" % (dots, underscores) + url = "http://downloads.sourceforge.net/project/boost/boost/{0}/boost_{1}.tar.bz2" + return url.format(version.dotted, version.underscored) def determine_toolset(self, spec): if spec.satisfies("platform=darwin"): diff --git a/var/spack/repos/builtin/packages/bowtie2/package.py b/var/spack/repos/builtin/packages/bowtie2/package.py index 6dbcea8dd0..dc850d817f 100644 --- a/var/spack/repos/builtin/packages/bowtie2/package.py +++ b/var/spack/repos/builtin/packages/bowtie2/package.py @@ -29,7 +29,10 @@ from glob import glob class Bowtie2(Package): """Bowtie 2 is an ultrafast and memory-efficient tool for aligning sequencing reads to long reference sequences""" + homepage = "bowtie-bio.sourceforge.net/bowtie2/index.shtml" + url = "http://downloads.sourceforge.net/project/bowtie-bio/bowtie2/2.3.1/bowtie2-2.3.1-source.zip" + version('2.3.1', 'b4efa22612e98e0c23de3d2c9f2f2478') version('2.2.5', '51fa97a862d248d7ee660efc1147c75f') @@ -38,10 +41,6 @@ class Bowtie2(Package): patch('bowtie2-2.2.5.patch', when='@2.2.5', level=0) patch('bowtie2-2.3.1.patch', when='@2.3.1', level=0) - def url_for_version(self, version): - url="http://downloads.sourceforge.net/project/bowtie-bio/bowtie2/{0}/bowtie2-{0}-source.zip" - return url.format(version) - def install(self, spec, prefix): make() mkdirp(prefix.bin) diff --git a/var/spack/repos/builtin/packages/cddlib/package.py b/var/spack/repos/builtin/packages/cddlib/package.py index 50dc5ad472..002c302599 100644 --- a/var/spack/repos/builtin/packages/cddlib/package.py +++ b/var/spack/repos/builtin/packages/cddlib/package.py @@ -31,19 +31,9 @@ class Cddlib(AutotoolsPackage): Method of Motzkin et al. for generating all vertices (i.e. extreme points) and extreme rays of a general convex polyhedron in R^d given by a system of linear inequalities""" - homepage = "https://www.inf.ethz.ch/personal/fukudak/cdd_home/" - # This is the original download url. It is currently down [2016-08-23], - # but should be reinstated or updated once the issue is resolved. - # url = "ftp://ftp.ifor.math.ethz.ch/pub/fukuda/cdd/cddlib-094h.tar.gz" - url = "http://pkgs.fedoraproject.org/lookaside/pkgs/cddlib/cddlib-094h.tar.gz/1467d270860bbcb26d3ebae424690e7c/cddlib-094h.tar.gz" - def url_for_version(self, version): - # Since the commit id is part of the version, we can't - # auto-generate the string, and we need to explicitly list all - # known versions here. Currently, there is only one version. - if str(version) == '0.94h': - return "http://pkgs.fedoraproject.org/lookaside/pkgs/cddlib/cddlib-094h.tar.gz/1467d270860bbcb26d3ebae424690e7c/cddlib-094h.tar.gz" - raise InstallError("Unsupported version %s" % str(version)) + homepage = "https://www.inf.ethz.ch/personal/fukudak/cdd_home/" + url = "ftp://ftp.math.ethz.ch/users/fukudak/cdd/cddlib-094h.tar.gz" version('0.94h', '1467d270860bbcb26d3ebae424690e7c') @@ -51,3 +41,7 @@ class Cddlib(AutotoolsPackage): depends_on("gmp") depends_on("libtool", type="build") + + def url_for_version(self, version): + url = "ftp://ftp.math.ethz.ch/users/fukudak/cdd/cddlib-{0}.tar.gz" + return url.format(version.joined) diff --git a/var/spack/repos/builtin/packages/cdo/package.py b/var/spack/repos/builtin/packages/cdo/package.py index 775dc31cf3..90039d4479 100644 --- a/var/spack/repos/builtin/packages/cdo/package.py +++ b/var/spack/repos/builtin/packages/cdo/package.py @@ -30,9 +30,13 @@ class Cdo(Package): Climate and NWP model Data. """ homepage = "https://code.zmaw.de/projects/cdo" + url = "https://code.zmaw.de/attachments/download/12760/cdo-1.7.2.tar.gz" + list_url = "https://code.zmaw.de/projects/cdo/files" - version('1.7.2', 'f08e4ce8739a4f2b63fc81a24db3ee31', url='https://code.zmaw.de/attachments/download/12760/cdo-1.7.2.tar.gz') - version('1.6.9', 'bf0997bf20e812f35e10188a930e24e2', url='https://code.zmaw.de/attachments/download/10198/cdo-1.6.9.tar.gz') + version('1.7.2', 'f08e4ce8739a4f2b63fc81a24db3ee31', + url='https://code.zmaw.de/attachments/download/12760/cdo-1.7.2.tar.gz') + version('1.6.9', 'bf0997bf20e812f35e10188a930e24e2', + url='https://code.zmaw.de/attachments/download/10198/cdo-1.6.9.tar.gz') variant('szip', default=True, description='Enable szip compression for GRIB1') variant('hdf5', default=False, description='Enable HDF5 support') @@ -54,7 +58,7 @@ class Cdo(Package): depends_on('proj', when='+proj') depends_on('curl', when='+curl') depends_on('fftw', when='+fftw') - depends_on('magics', when='+magics') + depends_on('magics', when='+magics') def install(self, spec, prefix): config_args = ["--prefix=" + prefix, diff --git a/var/spack/repos/builtin/packages/cfitsio/package.py b/var/spack/repos/builtin/packages/cfitsio/package.py index 811b3ca9bc..b382f87f5b 100644 --- a/var/spack/repos/builtin/packages/cfitsio/package.py +++ b/var/spack/repos/builtin/packages/cfitsio/package.py @@ -31,6 +31,7 @@ class Cfitsio(AutotoolsPackage): """ homepage = 'http://heasarc.gsfc.nasa.gov/fitsio/' + url = 'http://heasarc.gsfc.nasa.gov/FTP/software/fitsio/c/cfitsio3410.tar.gz' version('3.410', '8a4a66fcdd816aae41768baa0b025552') version('3.370', 'abebd2d02ba5b0503c633581e3bfa116') diff --git a/var/spack/repos/builtin/packages/cppad/package.py b/var/spack/repos/builtin/packages/cppad/package.py index 1ec31bbeef..e17a070294 100644 --- a/var/spack/repos/builtin/packages/cppad/package.py +++ b/var/spack/repos/builtin/packages/cppad/package.py @@ -29,16 +29,13 @@ class Cppad(CMakePackage): """A Package for Differentiation of C++ Algorithms.""" homepage = "https://www.coin-or.org/CppAD/" + url = "http://www.coin-or.org/download/source/CppAD/cppad-20170114.gpl.tgz" version('20170114', '565a534dc813fa1289764222cd8c11ea') version('develop', git='https://github.com/coin-or/CppAD.git') depends_on('cmake', type='build') - def url_for_version(self, version): - """Handle version-based custom URLs.""" - return "http://www.coin-or.org/download/source/CppAD/cppad-%s.gpl.tgz" % (version) - def cmake_args(self): # This package does not obey CMAKE_INSTALL_PREFIX args = [ diff --git a/var/spack/repos/builtin/packages/cryptopp/package.py b/var/spack/repos/builtin/packages/cryptopp/package.py index c92f262a9a..142bd4f253 100644 --- a/var/spack/repos/builtin/packages/cryptopp/package.py +++ b/var/spack/repos/builtin/packages/cryptopp/package.py @@ -36,6 +36,7 @@ class Cryptopp(Package): """ homepage = "http://www.cryptopp.com" + url = "http://www.cryptopp.com/cryptopp563.zip" version('5.6.3', '3c5b70e2ec98b7a24988734446242d07') version('5.6.2', '7ed022585698df48e65ce9218f6c6a67') diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py index e8f7d0889b..c40229f83b 100644 --- a/var/spack/repos/builtin/packages/dakota/package.py +++ b/var/spack/repos/builtin/packages/dakota/package.py @@ -46,7 +46,6 @@ class Dakota(Package): homepage = 'https://dakota.sandia.gov/' url = 'https://dakota.sandia.gov/sites/default/files/distributions/public/dakota-6.3-public.src.tar.gz' - _url_str = 'https://dakota.sandia.gov/sites/default/files/distributions/public/dakota-{version}-public.src.tar.gz' version('6.3', '05a58d209fae604af234c894c3f73f6d') @@ -64,9 +63,6 @@ class Dakota(Package): depends_on('boost') depends_on('cmake', type='build') - def url_for_version(self, version): - return Dakota._url_str.format(version=version) - def install(self, spec, prefix): options = [] options.extend(std_cmake_args) diff --git a/var/spack/repos/builtin/packages/exonerate/package.py b/var/spack/repos/builtin/packages/exonerate/package.py index 7921e64058..2615d859d6 100644 --- a/var/spack/repos/builtin/packages/exonerate/package.py +++ b/var/spack/repos/builtin/packages/exonerate/package.py @@ -29,7 +29,7 @@ class Exonerate(Package): """Pairwise sequence alignment of DNA and proteins""" homepage = "http://www.ebi.ac.uk/about/vertebrate-genomics/software/exonerate" - url = "http://ftp.ebi.ac.uk/pub/software/vertebrategenomics/exonerate/exonerate-2.2.0.tar.gz" + url = "http://ftp.ebi.ac.uk/pub/software/vertebrategenomics/exonerate/exonerate-2.4.0.tar.gz" version('2.4.0', '126fbade003b80b663a1d530c56f1904') diff --git a/var/spack/repos/builtin/packages/ferret/package.py b/var/spack/repos/builtin/packages/ferret/package.py index 15ddfcee16..4dcff54b8f 100644 --- a/var/spack/repos/builtin/packages/ferret/package.py +++ b/var/spack/repos/builtin/packages/ferret/package.py @@ -31,11 +31,10 @@ class Ferret(Package): """Ferret is an interactive computer visualization and analysis environment designed to meet the needs of oceanographers and meteorologists analyzing large and complex gridded data sets.""" - homepage = "http://ferret.noaa.gov/Ferret/" - url = "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.tar.gz" + homepage = "http://ferret.pmel.noaa.gov/Ferret/home" + url = "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v696.tar.gz" - version('6.96', '51722027c864369f41bab5751dfff8cc', - url="ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.tar.gz") + version('6.96', '51722027c864369f41bab5751dfff8cc') depends_on("hdf5~mpi~fortran") depends_on("netcdf~mpi") @@ -43,6 +42,10 @@ class Ferret(Package): depends_on("readline") depends_on("zlib") + def url_for_version(self, version): + return "ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v{0}.tar.gz".format( + version.joined) + def patch(self): hdf5_prefix = self.spec['hdf5'].prefix netcdff_prefix = self.spec['netcdf-fortran'].prefix diff --git a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py index 1159744721..2f3a0b0bd7 100644 --- a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py +++ b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py @@ -32,7 +32,9 @@ class GdkPixbuf(AutotoolsPackage): GTK+ 2 but it was split off into a separate package in preparation for the change to GTK+ 3.""" homepage = "https://developer.gnome.org/gdk-pixbuf/" - url = "http://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/2.31/gdk-pixbuf-2.31.1.tar.xz" + url = "http://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/2.31/gdk-pixbuf-2.31.2.tar.xz" + list_url = "http://ftp.acc.umu.se/pub/gnome/sources/gdk-pixbuf/" + list_depth = 2 version('2.31.2', '6be6bbc4f356d4b79ab4226860ab8523') diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index 6559e90496..c095140c68 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -89,13 +89,6 @@ class Go(Package): r'# \1\2\3', ) - @when('@1.5.0:') - def patch(self): - pass - - def url_for_version(self, version): - return "https://storage.googleapis.com/golang/go{0}.src.tar.gz".format(version) - def install(self, spec, prefix): bash = which('bash') with working_dir('src'): diff --git a/var/spack/repos/builtin/packages/gource/package.py b/var/spack/repos/builtin/packages/gource/package.py index 21994ad42c..7d12697d63 100644 --- a/var/spack/repos/builtin/packages/gource/package.py +++ b/var/spack/repos/builtin/packages/gource/package.py @@ -52,10 +52,6 @@ class Gource(AutotoolsPackage): parallel = False force_autoreconf = True - def url_for_version(self, version): - tmp = 'https://github.com/acaudwell/Gource/releases/download/gource-{0}/gource-{0}.tar.gz' # NOQA: ignore=E501 - return tmp.format(version.dotted) - def configure_args(self): spec = self.spec return [ diff --git a/var/spack/repos/builtin/packages/ibmisc/package.py b/var/spack/repos/builtin/packages/ibmisc/package.py index f325205507..181ae6d92b 100644 --- a/var/spack/repos/builtin/packages/ibmisc/package.py +++ b/var/spack/repos/builtin/packages/ibmisc/package.py @@ -29,9 +29,9 @@ class Ibmisc(CMakePackage): """Misc. reusable utilities used by IceBin.""" homepage = "https://github.com/citibeth/ibmisc" - url = "https://github.com/citibeth/ibmisc/tarball/123" + url = "https://github.com/citibeth/ibmisc/archive/v0.1.0.tar.gz" - version('0.1.0', '12f2a32432a11db48e00217df18e59fa') + version('0.1.0', '18c63db3e466c5a6fc2db3f903d06ecb') variant('everytrace', default=False, description='Report errors through Everytrace') diff --git a/var/spack/repos/builtin/packages/icet/package.py b/var/spack/repos/builtin/packages/icet/package.py index f8260f1951..ca3251ac40 100644 --- a/var/spack/repos/builtin/packages/icet/package.py +++ b/var/spack/repos/builtin/packages/icet/package.py @@ -30,7 +30,7 @@ class Icet(CMakePackage): sort-last parallel rendering library.""" homepage = "http://icet.sandia.gov" - url = "https://example.com/icet-1.2.3.tar.gz" + url = "https://gitlab.kitware.com/icet/icet/repository/archive.tar.bz2?ref=IceT-2.1.1" version('develop', branch='master', git='https://gitlab.kitware.com/icet/icet.git') @@ -38,9 +38,5 @@ class Icet(CMakePackage): depends_on('mpi') - def url_for_version(self, version): - return ("https://gitlab.kitware.com/icet/icet/repository/" - "archive.tar.bz2?ref=IceT-{0}".format(version.dotted)) - def cmake_args(self): return ['-DICET_USE_OPENGL:BOOL=OFF'] diff --git a/var/spack/repos/builtin/packages/image-magick/package.py b/var/spack/repos/builtin/packages/image-magick/package.py index 9efb0cd368..e32f1967e2 100644 --- a/var/spack/repos/builtin/packages/image-magick/package.py +++ b/var/spack/repos/builtin/packages/image-magick/package.py @@ -45,9 +45,6 @@ class ImageMagick(Package): depends_on('ghostscript') depends_on('ghostscript-fonts') - def url_for_version(self, version): - return "https://github.com/ImageMagick/ImageMagick/archive/{0}.tar.gz".format(version) - def install(self, spec, prefix): gs_font_dir = join_path(spec['ghostscript-fonts'].prefix.share, "font") configure('--prefix={0}'.format(prefix), diff --git a/var/spack/repos/builtin/packages/jdk/package.py b/var/spack/repos/builtin/packages/jdk/package.py index 518a469435..8df01f4b67 100644 --- a/var/spack/repos/builtin/packages/jdk/package.py +++ b/var/spack/repos/builtin/packages/jdk/package.py @@ -45,10 +45,10 @@ class Jdk(Package): '-H', # specify required License Agreement cookie 'Cookie: oraclelicense=accept-securebackup-cookie'] - version('8u66-linux-x64', '88f31f3d642c3287134297b8c10e61bf', + version('8u66', '88f31f3d642c3287134297b8c10e61bf', url="http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.tar.gz", curl_options=curl_options) - version('8u92-linux-x64', '65a1cc17ea362453a6e0eb4f13be76e4', + version('8u92', '65a1cc17ea362453a6e0eb4f13be76e4', url="http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-linux-x64.tar.gz", curl_options=curl_options) diff --git a/var/spack/repos/builtin/packages/libedit/package.py b/var/spack/repos/builtin/packages/libedit/package.py index 5dcee61cab..6887d67101 100644 --- a/var/spack/repos/builtin/packages/libedit/package.py +++ b/var/spack/repos/builtin/packages/libedit/package.py @@ -30,7 +30,11 @@ class Libedit(AutotoolsPackage): homepage = "http://thrysoee.dk/editline/" url = "http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz" - version('3.1', '43cdb5df3061d78b5e9d59109871b4f6', - url="http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz") + version('3.1-20160903', '0467d27684c453a351fbcefebbcb16a3') + version('3.1-20150325', '43cdb5df3061d78b5e9d59109871b4f6') depends_on('ncurses') + + def url_for_version(self, version): + url = "http://thrysoee.dk/editline/libedit-{0}-{1}.tar.gz" + return url.format(version[-1], version.up_to(-1)) diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py index adce0b7515..c70d8b56fd 100644 --- a/var/spack/repos/builtin/packages/libgd/package.py +++ b/var/spack/repos/builtin/packages/libgd/package.py @@ -56,7 +56,3 @@ class Libgd(AutotoolsPackage): depends_on('libpng') depends_on('libtiff') depends_on('fontconfig') - - def url_for_version(self, version): - url = "https://github.com/libgd/libgd/releases/download/gd-{0}/libgd-{0}.tar.gz" - return url.format(version) diff --git a/var/spack/repos/builtin/packages/libsodium/package.py b/var/spack/repos/builtin/packages/libsodium/package.py index a7e3ab10ae..6d21d65345 100644 --- a/var/spack/repos/builtin/packages/libsodium/package.py +++ b/var/spack/repos/builtin/packages/libsodium/package.py @@ -30,6 +30,7 @@ class Libsodium(AutotoolsPackage): decryption, signatures, password hashing and more.""" homepage = "https://download.libsodium.org/doc/" url = "https://download.libsodium.org/libsodium/releases/libsodium-1.0.11.tar.gz" + list_url = "https://download.libsodium.org/libsodium/releases/old" version('1.0.11', 'b58928d035064b2a46fb564937b83540') version('1.0.10', 'ea89dcbbda0b2b6ff6a1c476231870dd') diff --git a/var/spack/repos/builtin/packages/libxstream/package.py b/var/spack/repos/builtin/packages/libxstream/package.py index 3201b58620..0996e6b9e8 100644 --- a/var/spack/repos/builtin/packages/libxstream/package.py +++ b/var/spack/repos/builtin/packages/libxstream/package.py @@ -31,9 +31,9 @@ class Libxstream(Package): conditions.''' homepage = 'https://github.com/hfp/libxstream' - url = 'https://github.com/hfp/libxstream.git' + url = 'https://github.com/hfp/libxstream/archive/0.9.0.tar.gz' - version('0.9.0', git='https://github.com/hfp/libxstream.git') + version('0.9.0', 'fd74b7cf5f145ff4925d91be2809571c') def patch(self): kwargs = {'ignore_absent': False, 'backup': True, 'string': True} diff --git a/var/spack/repos/builtin/packages/meep/package.py b/var/spack/repos/builtin/packages/meep/package.py index 2c1018e711..00b9c4ea09 100644 --- a/var/spack/repos/builtin/packages/meep/package.py +++ b/var/spack/repos/builtin/packages/meep/package.py @@ -30,6 +30,8 @@ class Meep(Package): software package developed at MIT to model electromagnetic systems.""" homepage = "http://ab-initio.mit.edu/wiki/index.php/Meep" + url = "http://ab-initio.mit.edu/meep/meep-1.3.tar.gz" + list_url = "http://ab-initio.mit.edu/meep/old" version('1.3', '18a5b9e18008627a0411087e0bb60db5') version('1.2.1', '9be2e743c3a832ae922de9d955d016c5') diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py index f15d544b7b..c927c22a1b 100644 --- a/var/spack/repos/builtin/packages/metis/package.py +++ b/var/spack/repos/builtin/packages/metis/package.py @@ -37,7 +37,8 @@ class Metis(Package): partitioning schemes.""" homepage = "http://glaros.dtc.umn.edu/gkhome/metis/metis/overview" - base_url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis" + url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.1.0.tar.gz" + list_url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/OLD" version('5.1.0', '5465e67079419a69e0116de24fce58fe') version('5.0.2', 'acb521a4e8c2e6dd559a7f9abd0468c5') @@ -55,12 +56,11 @@ class Metis(Package): patch('install_gklib_defs_rename.patch', when='@5:') def url_for_version(self, version): - verdir = 'OLD/' if version < Version('4.0.3') else '' - return '%s/%smetis-%s.tar.gz' % (Metis.base_url, verdir, version) - - @when('@:4') - def patch(self): - pass + url = "http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis" + if version < Version('4.0.3'): + url += "/OLD" + url += "/metis-{0}.tar.gz".format(version) + return url @when('@5:') def patch(self): @@ -84,7 +84,7 @@ class Metis(Package): filter_file('#define MAX_JBUFS 128', '#define MAX_JBUFS 24', join_path(source_path, 'GKlib', 'error.c')) - @when('@:4') + @when('@:4') # noqa: F811 def install(self, spec, prefix): # Process library spec and options if any('+{0}'.format(v) in spec for v in ['gdb', 'int64', 'real64']): @@ -175,7 +175,7 @@ class Metis(Package): Executable(test_bin('mesh2dual'))(test_graph('metis.mesh')) """ - @when('@5:') + @when('@5:') # noqa: F811 def install(self, spec, prefix): source_directory = self.stage.source_path build_directory = join_path(source_directory, 'build') @@ -187,7 +187,7 @@ class Metis(Package): if '+shared' in spec: options.append('-DSHARED:BOOL=ON') else: - # Remove all RPATH options + # Remove all RPATH options # (RPATHxxx options somehow trigger cmake to link dynamically) rpath_options = [] for o in options: diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index a25583e164..b3fe5197a0 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -31,15 +31,32 @@ class Mfem(Package): homepage = 'http://www.mfem.org' url = 'https://github.com/mfem/mfem' + # mfem is downloaded from a URL shortener at request of upstream + # author Tzanio Kolev . See here: + # https://github.com/mfem/mfem/issues/53 + # + # The following procedure should be used to verify security when a + # new verison is added: + # + # 1. Verify that no checksums on old versions have changed. + # + # 2. Verify that the shortened URL for the new version is listed at: + # http://mfem.org/download/ + # + # 3. Use http://getlinkinfo.com or similar to verify that the + # underling download link for the latest version comes has the + # prefix: http://mfem.github.io/releases + # + # If this quick verification procedure fails, additional discussion + # will be required to verify the new version. + version('3.2', '2938c3deed4ec4f7fd5b5f5cfe656845282e86e2dcd477d292390058b7b94340', - url='http://goo.gl/Y9T75B', preferred=True, extension='.tar.gz') + url='http://goo.gl/Y9T75B', extension='.tar.gz') version('3.1', '841ea5cf58de6fae4de0f553b0e01ebaab9cd9c67fa821e8a715666ecf18fc57', url='http://goo.gl/xrScXn', extension='.tar.gz') -# version('3.1', git='https://github.com/mfem/mfem.git', -# commit='dbae60fe32e071989b52efaaf59d7d0eb2a3b574') variant('metis', default=False, description='Activate support for metis') variant('hypre', default=False, description='Activate support for hypre') diff --git a/var/spack/repos/builtin/packages/mitos/package.py b/var/spack/repos/builtin/packages/mitos/package.py index d577a1b285..4ccddb3592 100644 --- a/var/spack/repos/builtin/packages/mitos/package.py +++ b/var/spack/repos/builtin/packages/mitos/package.py @@ -30,13 +30,12 @@ class Mitos(Package): performance data to view with MemAxes""" homepage = "https://github.com/llnl/Mitos" - url = "https://github.com/llnl/Mitos" + url = "https://github.com/LLNL/Mitos/archive/v0.9.1.tar.gz" version('0.9.2', git='https://github.com/llnl/Mitos.git', commit='8cb143a2e8c00353ff531a781a9ca0992b0aaa3d') - - version('0.9.1', git='https://github.com/llnl/Mitos.git', tag='v0.9.1') + version('0.9.1', 'c6cb57f3cae54f5157affd97ef7ef79e') depends_on('dyninst@8.2.1:') depends_on('hwloc') diff --git a/var/spack/repos/builtin/packages/moab/package.py b/var/spack/repos/builtin/packages/moab/package.py index b783d7b81b..14925cfd3e 100644 --- a/var/spack/repos/builtin/packages/moab/package.py +++ b/var/spack/repos/builtin/packages/moab/package.py @@ -35,7 +35,7 @@ class Moab(Package): mesh in chunks rather than through individual entities, while also versatile enough to support individual entity access.""" homepage = "https://bitbucket.org/fathomteam/moab" - url = "http://ftp.mcs.anl.gov/pub/fathom/moab-4.6.3.tar.gz" + url = "http://ftp.mcs.anl.gov/pub/fathom/moab-4.9.1.tar.gz" version('4.9.1', '19cc2189fa266181ad9109b18d0b2ab8') version('4.9.0', '40695d0a159040683cfa05586ad4a7c2') diff --git a/var/spack/repos/builtin/packages/mxml/package.py b/var/spack/repos/builtin/packages/mxml/package.py index cd53c67dff..435fd748b3 100644 --- a/var/spack/repos/builtin/packages/mxml/package.py +++ b/var/spack/repos/builtin/packages/mxml/package.py @@ -41,9 +41,6 @@ class Mxml(AutotoolsPackage): version('2.6', '68977789ae64985dddbd1a1a1652642e') version('2.5', 'f706377fba630b39fa02fd63642b17e5') - def url_for_version(self, version): - return "https://github.com/michaelrsweet/mxml/releases/download/release-{0}/mxml-{0}.tar.gz".format(version) - # module swap PrgEnv-intel PrgEnv-$COMP # (Can use whatever compiler you want to use) # Case statement to change CC and CXX flags diff --git a/var/spack/repos/builtin/packages/nettle/package.py b/var/spack/repos/builtin/packages/nettle/package.py index 2b6693a18c..e9df8489c9 100644 --- a/var/spack/repos/builtin/packages/nettle/package.py +++ b/var/spack/repos/builtin/packages/nettle/package.py @@ -30,7 +30,7 @@ class Nettle(AutotoolsPackage): that is designed to fit easily in many contexts.""" homepage = "https://www.lysator.liu.se/~nisse/nettle/" - url = "http://ftp.gnu.org/gnu/nettle/nettle-2.7.1.tar.gz" + url = "http://ftp.gnu.org/gnu/nettle/nettle-3.2.tar.gz" version('3.2', 'afb15b4764ebf1b4e6d06c62bd4d29e4') version('2.7.1', '003d5147911317931dd453520eb234a5') diff --git a/var/spack/repos/builtin/packages/nextflow/package.py b/var/spack/repos/builtin/packages/nextflow/package.py index 563ecd9b40..05f21f70b7 100644 --- a/var/spack/repos/builtin/packages/nextflow/package.py +++ b/var/spack/repos/builtin/packages/nextflow/package.py @@ -29,6 +29,7 @@ class Nextflow(Package): """Data-driven computational pipelines""" homepage = "http://www.nextflow.io" + url = "https://github.com/nextflow-io/nextflow/releases/download/v0.24.1/nextflow" version('0.24.1', '80ec8c4fe8e766e0bdd1371a50410d1d', expand=False) @@ -39,10 +40,6 @@ class Nextflow(Package): depends_on('jdk') - def url_for_version(self, version): - base_url = 'https://github.com/nextflow-io/nextflow/releases/download/v{0}/nextflow' - return base_url.format(version) - def install(self, spec, prefix): mkdirp(prefix.bin) install("nextflow", join_path(prefix.bin, "nextflow")) diff --git a/var/spack/repos/builtin/packages/oce/package.py b/var/spack/repos/builtin/packages/oce/package.py index c3488c137a..950621da40 100644 --- a/var/spack/repos/builtin/packages/oce/package.py +++ b/var/spack/repos/builtin/packages/oce/package.py @@ -32,6 +32,7 @@ class Oce(Package): Open CASCADE library. """ homepage = "https://github.com/tpaviot/oce" + url = "https://github.com/tpaviot/oce/archive/OCE-0.18.tar.gz" version('0.18', '226e45e77c16a4a6e127c71fefcd171410703960ae75c7ecc7eb68895446a993') version('0.17.2', 'bf2226be4cd192606af677cf178088e5') @@ -46,10 +47,6 @@ class Oce(Package): depends_on('cmake@2.8:', type='build') depends_on('tbb', when='+tbb') - def url_for_version(self, version): - return 'https://github.com/tpaviot/oce/archive/OCE-%s.tar.gz' % ( - version.dotted) - # There is a bug in OCE which appears with Clang (version?) or GCC 6.0 # and has to do with compiler optimization, see # https://github.com/tpaviot/oce/issues/576 diff --git a/var/spack/repos/builtin/packages/octopus/package.py b/var/spack/repos/builtin/packages/octopus/package.py index 88350f50bc..8999b081e3 100644 --- a/var/spack/repos/builtin/packages/octopus/package.py +++ b/var/spack/repos/builtin/packages/octopus/package.py @@ -30,17 +30,11 @@ class Octopus(Package): theory code.""" homepage = "http://www.tddft.org/programs/octopus/" - base_url = "http://www.tddft.org/programs/octopus/down.php?file=" + url = "http://www.tddft.org/programs/octopus/down.php?file=6.0/octopus-6.0.tar.gz" version('6.0', '5d1168c2a8d7fd9cb9492eaebaa7182e') version('5.0.1', '2b6392ab67b843f9d4ca7413fc07e822') - # Sample url is: - # "http://www.tddft.org/programs/octopus/down.php?file=5.0.1/octopus-5.0.1.tar.gz" - def url_for_version(self, version): - return '{0}/{1}/octopus-{1}.tar.gz'.format(Octopus.base_url, - version.dotted) - variant('scalapack', default=False, description='Compile with Scalapack') variant('metis', default=True, diff --git a/var/spack/repos/builtin/packages/openjpeg/package.py b/var/spack/repos/builtin/packages/openjpeg/package.py index 9790c52e7d..b22de4452a 100644 --- a/var/spack/repos/builtin/packages/openjpeg/package.py +++ b/var/spack/repos/builtin/packages/openjpeg/package.py @@ -43,7 +43,3 @@ class Openjpeg(CMakePackage): version('2.0', 'cdf266530fee8af87454f15feb619609') version('1.5.2', '545f98923430369a6b046ef3632ef95c') version('1.5.1', 'd774e4b5a0db5f0f171c4fc0aabfa14e') - - def url_for_version(self, version): - fmt = 'https://github.com/uclouvain/openjpeg/archive/version.{0}.tar.gz' - return fmt.format(version.dotted) diff --git a/var/spack/repos/builtin/packages/panda/package.py b/var/spack/repos/builtin/packages/panda/package.py index e30c2c869d..fb14bd5643 100644 --- a/var/spack/repos/builtin/packages/panda/package.py +++ b/var/spack/repos/builtin/packages/panda/package.py @@ -29,9 +29,9 @@ from spack import * class Panda(Package): """PANDA: Parallel AdjaceNcy Decomposition Algorithm""" homepage = "http://comopt.ifi.uni-heidelberg.de/software/PANDA/index.html" - url = "http://comopt.ifi.uni-heidelberg.de/software/PANDA/downloads/current_panda.tar" + url = "http://comopt.ifi.uni-heidelberg.de/software/PANDA/downloads/panda-2016-03-07.tar" - version('current', 'b06dc312ee56e13eefea9c915b70fcef') + version('2016-03-07', 'b06dc312ee56e13eefea9c915b70fcef') # Note: Panda can also be built without MPI support diff --git a/var/spack/repos/builtin/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py index 0e6cd5390a..b07c796dd7 100644 --- a/var/spack/repos/builtin/packages/parmetis/package.py +++ b/var/spack/repos/builtin/packages/parmetis/package.py @@ -33,7 +33,8 @@ class Parmetis(Package): computing fill-reducing orderings of sparse matrices.""" homepage = 'http://glaros.dtc.umn.edu/gkhome/metis/parmetis/overview' - base_url = 'http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis' + url = 'http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.3.tar.gz' + list_url = 'http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/OLD' version('4.0.3', 'f69c479586bf6bb7aff6a9bc0c739628') version('4.0.2', '0912a953da5bb9b5e5e10542298ffdce') @@ -54,8 +55,11 @@ class Parmetis(Package): patch('pkg-parmetis-82409d68aa1d6cbc70740d0f35024aae17f7d5cb.patch') def url_for_version(self, version): - verdir = 'OLD/' if version < Version('3.2.0') else '' - return '%s/%sparmetis-%s.tar.gz' % (Parmetis.base_url, verdir, version) + url = 'http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis' + if version < Version('3.2.0'): + url += '/OLD' + url += '/parmetis-{0}.tar.gz'.format(version) + return url def install(self, spec, prefix): source_directory = self.stage.source_path @@ -72,7 +76,7 @@ class Parmetis(Package): if '+shared' in spec: options.append('-DSHARED:BOOL=ON') else: - # Remove all RPATH options + # Remove all RPATH options # (RPATHxxx options somehow trigger cmake to link dynamically) rpath_options = [] for o in options: diff --git a/var/spack/repos/builtin/packages/prank/package.py b/var/spack/repos/builtin/packages/prank/package.py index d627e8a0b6..09b73e795f 100644 --- a/var/spack/repos/builtin/packages/prank/package.py +++ b/var/spack/repos/builtin/packages/prank/package.py @@ -29,7 +29,7 @@ class Prank(Package): """A powerful multiple sequence alignment browser.""" homepage = "http://wasabiapp.org/software/prank/" - url = "http://wasabiapp.org/download/prank/prank.source.140603.tgz" + url = "http://wasabiapp.org/download/prank/prank.source.150803.tgz" version('150803', '71ac2659e91c385c96473712c0a23e8a') diff --git a/var/spack/repos/builtin/packages/py-autopep8/package.py b/var/spack/repos/builtin/packages/py-autopep8/package.py index c892e2979c..6c92def415 100644 --- a/var/spack/repos/builtin/packages/py-autopep8/package.py +++ b/var/spack/repos/builtin/packages/py-autopep8/package.py @@ -30,10 +30,10 @@ class PyAutopep8(PythonPackage): PEP 8 style guide.""" homepage = "https://github.com/hhatto/autopep8" - url = "https://github.com/hhatto/autopep8/archive/v1.2.4.tar.gz" + url = "https://pypi.io/packages/source/a/autopep8/autopep8-1.2.4.tar.gz" - version('1.2.4', '0458db85159a9e1b45f3e71ce6c158da') - version('1.2.2', 'def3d023fc9dfd1b7113602e965ad8e1') + version('1.2.4', 'fcea19c0c5e505b425e2a78afb771f5c') + version('1.2.2', '3d97f9c89d14a0975bffd32a2c61c36c') extends('python', ignore='bin/pep8') depends_on('python@2.6:2.7,3.2:') @@ -41,10 +41,3 @@ class PyAutopep8(PythonPackage): depends_on('py-pycodestyle@1.5.7:1.7.0', type=('build', 'run')) depends_on('py-setuptools', type='build') - - def url_for_version(self, version): - url = "https://github.com/hhatto/autopep8/archive/{0}{1}.tar.gz" - if version >= Version('1.2.3'): - return url.format('v', version) - else: - return url.format('ver', version) diff --git a/var/spack/repos/builtin/packages/py-cdo/package.py b/var/spack/repos/builtin/packages/py-cdo/package.py index 3f1306a183..2bf4a2623c 100644 --- a/var/spack/repos/builtin/packages/py-cdo/package.py +++ b/var/spack/repos/builtin/packages/py-cdo/package.py @@ -30,10 +30,9 @@ class PyCdo(PythonPackage): Operators from Python.""" homepage = "https://pypi.python.org/pypi/cdo" - url = "https://pypi.python.org/packages/sources/c/cdo/cdo-1.3.2.tar.gz" + url = "https://pypi.io/packages/source/c/cdo/cdo-1.3.2.tar.gz" - version('1.3.2', '4b3686ec1b9b891f166c1c466c6db745', - url="https://pypi.python.org/packages/d6/13/908e7c1451e1f5fb68405f341cdcb3196a16952ebfe1f172cb788f864aa9/cdo-1.3.2.tar.gz") + version('1.3.2', '4b3686ec1b9b891f166c1c466c6db745') depends_on('cdo') diff --git a/var/spack/repos/builtin/packages/py-markdown/package.py b/var/spack/repos/builtin/packages/py-markdown/package.py index 23c8167021..af10f1c5d3 100644 --- a/var/spack/repos/builtin/packages/py-markdown/package.py +++ b/var/spack/repos/builtin/packages/py-markdown/package.py @@ -50,7 +50,3 @@ class PyMarkdown(PythonPackage): depends_on('py-setuptools', type='build') depends_on('python@2.7:2.8,3.2:3.4') - - def url_for_version(self, version): - base_url = "https://github.com/waylan/Python-Markdown/archive" - return "{0}/{1}-final.tar.gz".format(base_url, version) diff --git a/var/spack/repos/builtin/packages/py-proj/package.py b/var/spack/repos/builtin/packages/py-proj/package.py index 949aab88c3..cf230eb49f 100644 --- a/var/spack/repos/builtin/packages/py-proj/package.py +++ b/var/spack/repos/builtin/packages/py-proj/package.py @@ -32,9 +32,8 @@ class PyProj(PythonPackage): # This is not a tagged release of pyproj. # The changes in this "version" fix some bugs, especially with Python3 use. - version('1.9.5.1.1', 'd035e4bc704d136db79b43ab371b27d2', - url='https://www.github.com/jswhit/pyproj/tarball/0be612cc9f972e38b50a90c946a9b353e2ab140f') - + version('1.9.5.1.1', git='https://www.github.com/jswhit/pyproj.git', + commit='0be612cc9f972e38b50a90c946a9b353e2ab140f') version('1.9.5.1', 'a4b80d7170fc82aee363d7f980279835') depends_on('py-cython', type='build') diff --git a/var/spack/repos/builtin/packages/py-pypar/package.py b/var/spack/repos/builtin/packages/py-pypar/package.py index 6ba999c063..c95698d83d 100644 --- a/var/spack/repos/builtin/packages/py-pypar/package.py +++ b/var/spack/repos/builtin/packages/py-pypar/package.py @@ -38,6 +38,3 @@ class PyPypar(PythonPackage): depends_on('py-numpy', type=('build', 'run')) build_directory = 'source' - - def url_for_version(self, version): - return "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-%s.tgz" % version diff --git a/var/spack/repos/builtin/packages/py-rtree/package.py b/var/spack/repos/builtin/packages/py-rtree/package.py index 55f98ad19e..a3604b467d 100644 --- a/var/spack/repos/builtin/packages/py-rtree/package.py +++ b/var/spack/repos/builtin/packages/py-rtree/package.py @@ -28,22 +28,9 @@ from spack import * class PyRtree(PythonPackage): """Python interface to the RTREE.4 Library.""" homepage = "http://toblerity.org/rtree/" - url = "https://github.com/Toblerity/rtree/tarball/0.8.2" + url = "https://pypi.io/packages/source/R/Rtree/Rtree-0.8.3.tar.gz" - # Not an official release yet. But changes in here are required - # to work with Spack. As it does with all packages, Spack - # installs libspatialindex in a non-system location. Without the - # changes in this fork, py-rtree requires an environment variables - # to be set *at runtime*, in order to find libspatialindex. That - # is not feasible within the Spack worldview. - version('0.8.2.2', 'b1fe96a73153db49ea6ce45a063d82cb', - url='https://github.com/citibeth/rtree/tarball/95a678cc7350857a1bb631bc41254efcd1fc0a0d') - - version('0.8.2.1', '394696ca849dd9f3a5ef24fb02a41ef4', - url='https://github.com/citibeth/rtree/tarball/3a87d86f66a3955676b2507d3bf424ade938a22b') - - # Does not work with Spack - # version('0.8.2', '593c7ac6babc397b8ba58f1636c1e0a0') + version('0.8.3', 'a27cb05a85eed0a3605c45ebccc432f8') depends_on('py-setuptools', type='build') depends_on('libspatialindex') diff --git a/var/spack/repos/builtin/packages/r-lava/package.py b/var/spack/repos/builtin/packages/r-lava/package.py index c38f9003ea..263e859c48 100644 --- a/var/spack/repos/builtin/packages/r-lava/package.py +++ b/var/spack/repos/builtin/packages/r-lava/package.py @@ -29,7 +29,7 @@ class RLava(RPackage): """Estimation and simulation of latent variable models.""" homepage = "https://cran.r-project.org/package=lava" - url = "https://cran.r-project.org/src/contrib/lava_1.4.6.tar.gz" + url = "https://cran.r-project.org/src/contrib/lava_1.4.7.tar.gz" list_url = "https://cran.r-project.org/src/contrib/Archive/lava" version('1.4.7', '28039248a7039ba9281d172e4dbf9543') diff --git a/var/spack/repos/builtin/packages/root/package.py b/var/spack/repos/builtin/packages/root/package.py index a96d7f6bbc..a5939ace8f 100644 --- a/var/spack/repos/builtin/packages/root/package.py +++ b/var/spack/repos/builtin/packages/root/package.py @@ -30,7 +30,7 @@ import sys class Root(Package): """ROOT is a data analysis framework.""" homepage = "https://root.cern.ch" - url = "https://root.cern.ch/download/root_v6.07.02.source.tar.gz" + url = "https://root.cern.ch/download/root_v6.06.06.source.tar.gz" version('6.06.06', '4308449892210c8d36e36924261fea26') version('6.06.04', '55a2f98dd4cea79c9c4e32407c2d6d17') @@ -83,7 +83,3 @@ class Root(Package): spack_env.set('ROOTSYS', self.prefix) spack_env.set('ROOT_VERSION', 'v6') spack_env.prepend_path('PYTHONPATH', self.prefix.lib) - - def url_for_version(self, version): - """Handle ROOT's unusual version string.""" - return "https://root.cern.ch/download/root_v%s.source.tar.gz" % version diff --git a/var/spack/repos/builtin/packages/rose/package.py b/var/spack/repos/builtin/packages/rose/package.py index 02b09f0126..5f0d12427c 100644 --- a/var/spack/repos/builtin/packages/rose/package.py +++ b/var/spack/repos/builtin/packages/rose/package.py @@ -35,10 +35,11 @@ class Rose(Package): (Developed at Lawrence Livermore National Lab)""" homepage = "http://rosecompiler.org/" - url = "https://github.com/rose-compiler/edg4x-rose" + url = "https://github.com/rose-compiler/rose/archive/v0.9.7.tar.gz" + version('0.9.7', 'e14ce5250078df4b09f4f40559d46c75') version('master', branch='master', - git='https://github.com/rose-compiler/edg4x-rose.git') + git='https://github.com/rose-compiler/rose.git') patch('add_spack_compiler_recognition.patch') @@ -46,7 +47,7 @@ class Rose(Package): depends_on("automake@1.14", type='build') depends_on("libtool@2.4", type='build') depends_on("boost@1.54.0") - depends_on("jdk@8u25-linux-x64") + depends_on("jdk@8u25") def install(self, spec, prefix): # Bootstrap with autotools diff --git a/var/spack/repos/builtin/packages/rust-bindgen/package.py b/var/spack/repos/builtin/packages/rust-bindgen/package.py index c411bc15d1..00ccbb71cf 100644 --- a/var/spack/repos/builtin/packages/rust-bindgen/package.py +++ b/var/spack/repos/builtin/packages/rust-bindgen/package.py @@ -29,9 +29,9 @@ import os class RustBindgen(Package): """The rust programming language toolchain""" homepage = "http://www.rust-lang.org" - url = "https://github.com/crabtw/rust-bindgen" + url = "https://github.com/servo/rust-bindgen/archive/v0.20.5.tar.gz" - version('0.16', tag='0.16', git='https://github.com/crabtw/rust-bindgen') + version('0.20.5', '3e4d70a5bec540324fdd95bc9e82bebc') extends("rust") depends_on("llvm") diff --git a/var/spack/repos/builtin/packages/scorep/package.py b/var/spack/repos/builtin/packages/scorep/package.py index 6b3345d83b..1a5a591c3f 100644 --- a/var/spack/repos/builtin/packages/scorep/package.py +++ b/var/spack/repos/builtin/packages/scorep/package.py @@ -32,14 +32,11 @@ class Scorep(Package): """ homepage = "http://www.vi-hps.org/projects/score-p" - url = "http://www.vi-hps.org/upload/packages/scorep/scorep-1.2.3.tar.gz" + url = "http://www.vi-hps.org/upload/packages/scorep/scorep-2.0.2.tar.gz" - version('2.0.2', '8f00e79e1b5b96e511c5ebecd10b2888', - url='http://www.vi-hps.org/upload/packages/scorep/scorep-2.0.2.tar.gz') - version('1.4.2', '3b9a042b13bdd5836452354e6567f71e', - url='http://www.vi-hps.org/upload/packages/scorep/scorep-1.4.2.tar.gz') - version('1.3', '9db6f957b7f51fa01377a9537867a55c', - url='http://www.vi-hps.org/upload/packages/scorep/scorep-1.3.tar.gz') + version('2.0.2', '8f00e79e1b5b96e511c5ebecd10b2888') + version('1.4.2', '3b9a042b13bdd5836452354e6567f71e') + version('1.3', '9db6f957b7f51fa01377a9537867a55c') ########## # Dependencies for SCORE-P are quite tight. See the homepage for more diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py index b878349485..8efb629487 100644 --- a/var/spack/repos/builtin/packages/scotch/package.py +++ b/var/spack/repos/builtin/packages/scotch/package.py @@ -31,8 +31,7 @@ class Scotch(Package): partitioning, graph clustering, and sparse matrix ordering.""" homepage = "http://www.labri.fr/perso/pelegrin/scotch/" - url = "http://gforge.inria.fr/frs/download.php/latestfile/298/scotch_6.0.3.tar.gz" # noqa: E501 - base_url = "http://gforge.inria.fr/frs/download.php/latestfile/298" + url = "http://gforge.inria.fr/frs/download.php/latestfile/298/scotch_6.0.4.tar.gz" list_url = "http://gforge.inria.fr/frs/?group_id=248" version('6.0.4', 'd58b825eb95e1db77efe8c6ff42d329f') @@ -71,12 +70,10 @@ class Scotch(Package): # from the Scotch hosting site. These alternative archives include a # superset of the behavior in their default counterparts, so we choose to # always grab these versions for older Scotch versions for simplicity. - def url_for_version(self, version): - return super(Scotch, self).url_for_version(version) - @when('@:6.0.0') def url_for_version(self, version): - return '%s/scotch_%s_esmumps.tar.gz' % (Scotch.base_url, version) + url = "http://gforge.inria.fr/frs/download.php/latestfile/298/scotch_{0}_esmumps.tar.gz" + return url.format(version) def patch(self): self.configure() diff --git a/var/spack/repos/builtin/packages/silo/package.py b/var/spack/repos/builtin/packages/silo/package.py index 6a9326517b..eca5d1a605 100644 --- a/var/spack/repos/builtin/packages/silo/package.py +++ b/var/spack/repos/builtin/packages/silo/package.py @@ -30,7 +30,7 @@ class Silo(Package): data to binary, disk files.""" homepage = "http://wci.llnl.gov/simulation/computer-codes/silo" - base_url = "https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo" + url = "https://wci.llnl.gov/content/assets/docs/simulation/computer-codes/silo/silo-4.10.2/silo-4.10.2.tar.gz" version('4.10.2', '9ceac777a2f2469ac8cef40f4fab49c8') version('4.9', 'a83eda4f06761a86726e918fc55e782a') @@ -67,6 +67,3 @@ class Silo(Package): make() make('install') - - def url_for_version(self, version): - return '%s/silo-%s/silo-%s.tar.gz' % (Silo.base_url, version, version) diff --git a/var/spack/repos/builtin/packages/star-ccm-plus/package.py b/var/spack/repos/builtin/packages/star-ccm-plus/package.py index ba1516b62a..4197aec339 100644 --- a/var/spack/repos/builtin/packages/star-ccm-plus/package.py +++ b/var/spack/repos/builtin/packages/star-ccm-plus/package.py @@ -31,6 +31,7 @@ class StarCcmPlus(Package): """STAR-CCM+ (Computational Continuum Mechanics) CFD solver.""" homepage = "http://mdx.plm.automation.siemens.com/star-ccm-plus" + url = "file://{0}/STAR-CCM+11.06.010_02_linux-x86_64.tar.gz".format(os.getcwd()) version('11.06.010_02', 'd349c6ac8293d8e6e7a53533d695588f') @@ -40,10 +41,6 @@ class StarCcmPlus(Package): license_required = True license_vars = ['CDLMD_LICENSE_FILE', 'LM_LICENSE_FILE'] - def url_for_version(self, version): - return "file://{0}/STAR-CCM+{1}_linux-x86_64.tar.gz".format( - os.getcwd(), version) - def install(self, spec, prefix): # There is a known issue with the LaunchAnywhere application. # Specifically, it cannot handle long prompts or prompts diff --git a/var/spack/repos/builtin/packages/sublime-text/package.py b/var/spack/repos/builtin/packages/sublime-text/package.py index 81d8690db8..1cfb117a05 100644 --- a/var/spack/repos/builtin/packages/sublime-text/package.py +++ b/var/spack/repos/builtin/packages/sublime-text/package.py @@ -33,8 +33,8 @@ class SublimeText(Package): homepage = "http://www.sublimetext.com/" url = "https://download.sublimetext.com/sublime_text_3_build_3126_x64.tar.bz2" - version('3126', 'acc34252b0ea7dff1f581c5db1564dcb') - version('2.0.2', '699cd26d7fe0bada29eb1b2cd7b50e4b') + version('3_build_3126', 'acc34252b0ea7dff1f581c5db1564dcb') + version('2.0.2', '699cd26d7fe0bada29eb1b2cd7b50e4b') # Sublime text comes as a pre-compiled binary. # Since we can't link to Spack packages, we'll just have to diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index 79d4bc7544..8ddfc903b3 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -34,6 +34,7 @@ class Tcl(AutotoolsPackage): that is truly cross platform, easily deployed and highly extensible.""" homepage = "http://www.tcl.tk" + url = "http://prdownloads.sourceforge.net/tcl/tcl8.6.5-src.tar.gz" version('8.6.6', '5193aea8107839a79df8ac709552ecb7') version('8.6.5', '0e6426a4ca9401825fbc6ecf3d89a326') @@ -45,10 +46,6 @@ class Tcl(AutotoolsPackage): configure_directory = 'unix' - def url_for_version(self, version): - base_url = 'http://prdownloads.sourceforge.net/tcl' - return '{0}/tcl{1}-src.tar.gz'.format(base_url, version) - def setup_environment(self, spack_env, run_env): # When using Tkinter from within spack provided python+tk, python # will not be able to find Tcl/Tk unless TCL_LIBRARY is set. diff --git a/var/spack/repos/builtin/packages/tetgen/package.py b/var/spack/repos/builtin/packages/tetgen/package.py index 6e5ed79c36..2ccc9504e2 100644 --- a/var/spack/repos/builtin/packages/tetgen/package.py +++ b/var/spack/repos/builtin/packages/tetgen/package.py @@ -34,7 +34,7 @@ class Tetgen(Package): boundary conforming Delaunay meshes, and Voronoi paritions. """ - homepage = "http://www.tetgen.org" + homepage = "http://wias-berlin.de/software/tetgen/" version('1.5.0', '3b9fd9cdec121e52527b0308f7aad5c1', url='http://www.tetgen.org/1.5/src/tetgen1.5.0.tar.gz') version('1.4.3', 'd6a4bcdde2ac804f7ec66c29dcb63c18', url='http://www.tetgen.org/files/tetgen1.4.3.tar.gz') diff --git a/var/spack/repos/builtin/packages/tinyxml/package.py b/var/spack/repos/builtin/packages/tinyxml/package.py index 1789d9022e..9cb4b715df 100644 --- a/var/spack/repos/builtin/packages/tinyxml/package.py +++ b/var/spack/repos/builtin/packages/tinyxml/package.py @@ -34,6 +34,10 @@ class Tinyxml(CMakePackage): version('2.6.2', 'cba3f50dd657cb1434674a03b21394df9913d764') + def url_for_version(self, version): + url = "https://sourceforge.net/projects/tinyxml/files/tinyxml/{0}/tinyxml_{1}.tar.gz" + return url.format(version.dotted, version.underscored) + def patch(self): copyfile(join_path(os.path.dirname(__file__), "CMakeLists.txt"), "CMakeLists.txt") diff --git a/var/spack/repos/builtin/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py index 4d9651315a..fdcb29a785 100644 --- a/var/spack/repos/builtin/packages/tk/package.py +++ b/var/spack/repos/builtin/packages/tk/package.py @@ -33,6 +33,7 @@ class Tk(AutotoolsPackage): applications that run unchanged across Windows, Mac OS X, Linux and more.""" homepage = "http://www.tcl.tk" + url = "http://prdownloads.sourceforge.net/tcl/tk8.6.5-src.tar.gz" version('8.6.6', 'dd7dbb3a6523c42d05f6ab6e86096e99') version('8.6.5', '11dbbd425c3e0201f20d6a51482ce6c4') @@ -43,10 +44,6 @@ class Tk(AutotoolsPackage): configure_directory = 'unix' - def url_for_version(self, version): - base_url = "http://prdownloads.sourceforge.net/tcl" - return "{0}/tk{1}-src.tar.gz".format(base_url, version) - def setup_environment(self, spack_env, run_env): # When using Tkinter from within spack provided python+tk, python # will not be able to find Tcl/Tk unless TK_LIBRARY is set. diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index 3de72ea6c8..0e0d86fa3c 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -44,7 +44,7 @@ class Trilinos(CMakePackage): A unique design feature of Trilinos is its focus on packages. """ homepage = "https://trilinos.org/" - base_url = "https://github.com/trilinos/Trilinos/archive" + url = "https://github.com/trilinos/Trilinos/archive/trilinos-release-12-10-1.tar.gz" version('develop', git='https://github.com/trilinos/Trilinos.git', tag='develop') @@ -63,10 +63,6 @@ class Trilinos(CMakePackage): version('11.14.2', 'e7c3cdbbfe3279a8a68838b873ad6d51') version('11.14.1', 'b7760b142eef66c79ed13de7c9560f81') - def url_for_version(self, version): - return '%s/trilinos-release-%s.tar.gz' % \ - (Trilinos.base_url, version.dashed) - variant('xsdkflags', default=False, description='Compile using the default xSDK configuration') variant('metis', default=True, @@ -125,6 +121,10 @@ class Trilinos(CMakePackage): patch('umfpack_from_suitesparse.patch', when='@:12.8.1') + def url_for_version(self, version): + url = "https://github.com/trilinos/Trilinos/archive/trilinos-release-{0}.tar.gz" + return url.format(version.dashed) + # 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'): diff --git a/var/spack/repos/builtin/packages/unison/package.py b/var/spack/repos/builtin/packages/unison/package.py index 181e1e6410..aa890ea869 100644 --- a/var/spack/repos/builtin/packages/unison/package.py +++ b/var/spack/repos/builtin/packages/unison/package.py @@ -34,7 +34,7 @@ class Unison(Package): other.""" homepage = "https://www.cis.upenn.edu/~bcpierce/unison/" - url = "https://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.3.tar.gz" + url = "https://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.4.tar.gz" version('2.48.4', '5334b78c7e68169df7de95f4c6c4b60f') diff --git a/var/spack/repos/builtin/packages/voropp/package.py b/var/spack/repos/builtin/packages/voropp/package.py index 0e39769927..0fc84ef252 100644 --- a/var/spack/repos/builtin/packages/voropp/package.py +++ b/var/spack/repos/builtin/packages/voropp/package.py @@ -31,19 +31,10 @@ class Voropp(MakefilePackage): scientific fields.""" homepage = "http://math.lbl.gov/voro++/about.html" - - # This url is wrong but it passes the test the ++ make the url parser fail, - # the correct url is constructed by url_for_version that has to be used in - # any case due to the difference between the package name and the url - url = "http://math.lbl.gov/voropp/download/dir/voropp-0.4.6.tar.gz" + url = "http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz" version('0.4.6', '2338b824c3b7b25590e18e8df5d68af9') - def url_for_version(self, version): - url = "http://math.lbl.gov/voro++/download/dir/voro++-{0}.tar.gz".format( # noqa: E501 - str(version)) - return url - def edit(self, spec, prefix): filter_file(r'CC=g\+\+', 'CC={0}'.format(self.compiler.cxx), diff --git a/var/spack/repos/builtin/packages/vtk/package.py b/var/spack/repos/builtin/packages/vtk/package.py index c577949c3a..dafeae6dbb 100644 --- a/var/spack/repos/builtin/packages/vtk/package.py +++ b/var/spack/repos/builtin/packages/vtk/package.py @@ -33,6 +33,7 @@ class Vtk(CMakePackage): homepage = "http://www.vtk.org" url = "http://www.vtk.org/files/release/7.1/VTK-7.1.0.tar.gz" + list_url = "http://www.vtk.org/download/" version('7.1.0', 'a7e814c1db503d896af72458c2d0228f') version('7.0.0', '5fe35312db5fb2341139b8e4955c367d') diff --git a/var/spack/repos/builtin/packages/xsdktrilinos/package.py b/var/spack/repos/builtin/packages/xsdktrilinos/package.py index ea49054435..7e88b2f9eb 100644 --- a/var/spack/repos/builtin/packages/xsdktrilinos/package.py +++ b/var/spack/repos/builtin/packages/xsdktrilinos/package.py @@ -32,16 +32,12 @@ class Xsdktrilinos(CMakePackage): Trilinos. """ homepage = "https://trilinos.org/" - base_url = "https://github.com/trilinos/xSDKTrilinos/archive" + url = "https://github.com/trilinos/xSDKTrilinos/archive/trilinos-release-12-8-1.tar.gz" version('develop', git='https://github.com/trilinos/xSDKTrilinos.git', tag='master') version('12.8.1', '9cc338ded17d1e10ea6c0dc18b22dcd4') version('12.6.4', '44c4c54ccbac73bb8939f68797b9454a') - def url_for_version(self, version): - return '%s/trilinos-release-%s.tar.gz' % \ - (Xsdktrilinos.base_url, version.dashed) - variant('hypre', default=True, description='Compile with Hypre preconditioner') variant('petsc', default=True, @@ -59,6 +55,10 @@ class Xsdktrilinos(CMakePackage): depends_on('trilinos@12.8.1', when='@12.8.1') depends_on('trilinos@develop', when='@develop') + def url_for_version(self, version): + url = "https://github.com/trilinos/xSDKTrilinos/archive/trilinos-release-{0}.tar.gz" + return url.format(version.dashed) + def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/yorick/package.py b/var/spack/repos/builtin/packages/yorick/package.py index 52a4d8787d..9cbd417e4e 100644 --- a/var/spack/repos/builtin/packages/yorick/package.py +++ b/var/spack/repos/builtin/packages/yorick/package.py @@ -31,7 +31,7 @@ import glob class Yorick(Package): """Yorick is an interpreted programming language for scientific simulations or calculations, postprocessing or steering large simulation codes, - interactive scientific graphics, and reading, writing, or translating + interactive scientific graphics, and reading, writing, or translating files of numbers. Yorick includes an interactive graphics package, and a binary file package capable of translating to and from the raw numeric formats of all modern computers. Yorick is written in ANSI C and runs on @@ -39,9 +39,9 @@ class Yorick(Package): """ homepage = "http://dhmunro.github.io/yorick-doc/" - url = "https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz" + url = "https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz" - version('2.2.04', md5='1b5b0da6ad81b2d9dba64d991ec17939') + version('2.2.04', '1b5b0da6ad81b2d9dba64d991ec17939') version('master', branch='master', git='https://github.com/dhmunro/yorick.git') version('f90-plugin', branch='f90-plugin', @@ -51,6 +51,10 @@ class Yorick(Package): depends_on('libx11', when='+X') + def url_for_version(self, version): + url = "https://github.com/dhmunro/yorick/archive/y_{0}.tar.gz" + return url.format(version.underscored) + def install(self, spec, prefix): os.environ['FORTRAN_LINKAGE'] = '-Df_linkage' diff --git a/var/spack/repos/builtin/packages/zoltan/package.py b/var/spack/repos/builtin/packages/zoltan/package.py index 21c90a05e4..b6720b7b1e 100644 --- a/var/spack/repos/builtin/packages/zoltan/package.py +++ b/var/spack/repos/builtin/packages/zoltan/package.py @@ -41,7 +41,7 @@ class Zoltan(Package): """ homepage = "http://www.cs.sandia.gov/zoltan" - base_url = "http://www.cs.sandia.gov/~kddevin/Zoltan_Distributions" + url = "http://www.cs.sandia.gov/~kddevin/Zoltan_Distributions/zoltan_distrib_v3.83.tar.gz" version('3.83', '1ff1bc93f91e12f2c533ddb01f2c095f') version('3.8', '9d8fba8a990896881b85351d4327c4a9') @@ -56,9 +56,6 @@ class Zoltan(Package): depends_on('mpi', when='+mpi') - def url_for_version(self, version): - return '%s/zoltan_distrib_v%s.tar.gz' % (Zoltan.base_url, version) - def install(self, spec, prefix): # FIXME: The older Zoltan versions fail to compile the F90 MPI wrappers # because of some complicated generic type problem. -- cgit v1.2.3-70-g09d2 From 508c96d04661dfc7139fd76cf9e4da61777a7c15 Mon Sep 17 00:00:00 2001 From: Justin Cook Date: Tue, 4 Apr 2017 06:50:44 -0500 Subject: Update getting_started.rst (#3685) Fixed typo referring to .bashrc file --- lib/spack/docs/getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index 2460f7e54d..971d42cea0 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -774,7 +774,7 @@ This problem is related to OpenSSL, and in some cases might be solved by installing a new version of ``git`` and ``openssl``: #. Run ``spack install git`` -#. Add the output of ``spack module loads git`` to your ``.bahsrc``. +#. Add the output of ``spack module loads git`` to your ``.bashrc``. If this doesn't work, it is also possible to disable checking of SSL certificates by using: -- cgit v1.2.3-70-g09d2 From 20f388cebdc57dd246732c8295187342ec878f6b Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 4 Apr 2017 16:03:11 +0200 Subject: Fixes #3675: Abinit: invalid spec on concretization #(3686) --- lib/spack/spack/spec.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index b6089c7849..deb650a990 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2248,7 +2248,7 @@ class Spec(object): # If we need to descend into dependencies, do it, otherwise we're done. if deps: deps_strict = strict - if self.concrete and not other.name: + if self._concrete and not other.name: # We're dealing with existing specs deps_strict = True return self.satisfies_dependencies(other, strict=deps_strict) -- cgit v1.2.3-70-g09d2 From 0038ea84a1c5e105cdc171b04c7369cdf9b5bd9f Mon Sep 17 00:00:00 2001 From: scheibelp Date: Tue, 4 Apr 2017 15:03:52 -0700 Subject: Avoid null reference in arch concretization (#2596) Fixes #2587 The concretizer falls back on using the root architecture (followed by the default system architecture) to fill in unspecified arch properties for a spec. It failed to check cases where the root could be None. --- lib/spack/spack/concretize.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 6c230a151b..2a5ce65fa4 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -222,9 +222,10 @@ class DefaultConcretizer(object): spec.architecture = spack.spec.ArchSpec(sys_arch) spec_changed = True - default_archs = [root_arch, sys_arch] - while not spec.architecture.concrete and default_archs: - arch = default_archs.pop(0) + default_archs = list(x for x in [root_arch, sys_arch] if x) + for arch in default_archs: + if spec.architecture.concrete: + break replacement_fields = [k for k, v in iteritems(arch.to_cmp_dict()) if v and not getattr(spec.architecture, k)] @@ -232,6 +233,9 @@ class DefaultConcretizer(object): setattr(spec.architecture, field, getattr(arch, field)) spec_changed = True + if not spec.architecture.concrete: + raise InsufficientArchitectureInfoError(spec, default_archs) + return spec_changed def concretize_variants(self, spec): @@ -466,6 +470,17 @@ class NoValidVersionError(spack.error.SpackError): % (spec.name, spec.versions)) +class InsufficientArchitectureInfoError(spack.error.SpackError): + + """Raised when details on architecture cannot be collected from the + system""" + + def __init__(self, spec, archs): + super(InsufficientArchitectureInfoError, self).__init__( + "Cannot determine necessary architecture information for '%s': %s" + % (spec.name, str(archs))) + + class NoBuildError(spack.error.SpackError): """Raised when a package is configured with the buildable option False, but no satisfactory external versions can be found""" -- cgit v1.2.3-70-g09d2 From 95c3cff6be794881980e5c218567f7cc5fbd5ed3 Mon Sep 17 00:00:00 2001 From: Paul Hopkins Date: Thu, 3 Nov 2016 07:49:51 +0000 Subject: Allow installation directory layout to be configured using either hash length parameter or spec formatting. --- lib/spack/docs/config_yaml.rst | 37 +++++++++++++++++++++++++++ lib/spack/spack/directory_layout.py | 44 +++++++++++++++++++------------- lib/spack/spack/schema/config.py | 2 ++ lib/spack/spack/spec.py | 4 +-- lib/spack/spack/store.py | 4 ++- lib/spack/spack/test/directory_layout.py | 43 ++++++++++++++++++++++++++++++- 6 files changed, 112 insertions(+), 22 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/config_yaml.rst b/lib/spack/docs/config_yaml.rst index 56aa6ed0a1..197bf5c530 100644 --- a/lib/spack/docs/config_yaml.rst +++ b/lib/spack/docs/config_yaml.rst @@ -42,6 +42,43 @@ or with braces to distinguish the variable from surrounding characters: The location where Spack will install packages and their dependencies. Default is ``$spack/opt/spack``. +--------------------------------------------------- +``install_hash_length`` and ``install_path_scheme`` +--------------------------------------------------- + +The default Spack installation path can be very long and can create +problems for scripts with hardcoded shebangs. There are two parameters +to help with that. Firstly, the ``install_hash_length`` parameter can +set the length of the hash in the installation path from 1 to 32. The +default path uses the full 32 characters. + +Secondly, it is +also possible to modify the entire installation scheme. By default +Spack uses +``${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}`` +where the tokens that are available for use in this directive are the +same as those understood by the ``Spec.format`` method. Using this parameter it +is possible to use a different package layout or reduce the depth of +the installation paths. For example + + .. code-block:: yaml + + config: + install_path_scheme: '${PACKAGE}/${VERSION}/${HASH:7}' + +would install packages into sub-directories using only the package +name, version and a hash length of 7 characters. + +When using either parameter to set the hash length it only affects the +representation of the hash in the installation directory. You +should be aware that the smaller the hash length the more likely +naming conflicts will occur. These parameters are independent of those +used to configure module names. + +.. warning:: Modifying the installation hash length or path scheme after + packages have been installed will prevent Spack from being + able to find the old installation directories. + -------------------- ``module_roots`` -------------------- diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 28e6584fb2..b84ee3be5b 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -28,6 +28,7 @@ import shutil import glob import tempfile import yaml +import re from llnl.util.filesystem import join_path, mkdirp @@ -150,24 +151,31 @@ class DirectoryLayout(object): class YamlDirectoryLayout(DirectoryLayout): - """Lays out installation directories like this:: + """By default lays out installation directories like this:: / / -/ - --- + -- The hash here is a SHA-1 hash for the full DAG plus the build spec. TODO: implement the build spec. - To avoid special characters (like ~) in the directory name, - only enabled variants are included in the install path. - Disabled variants are omitted. + The installation directory scheme can be modified with the + arguments hash_len and path_scheme. """ def __init__(self, root, **kwargs): super(YamlDirectoryLayout, self).__init__(root) self.metadata_dir = kwargs.get('metadata_dir', '.spack') - self.hash_len = kwargs.get('hash_len', None) + self.hash_len = kwargs.get('hash_len') + self.path_scheme = kwargs.get('path_scheme') or ( + "${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}") # NOQA: E501 + if self.hash_len is not None: + if re.search('\${HASH:\d+}', self.path_scheme): + raise InvalidDirectoryLayoutParametersError( + "Conflicting options for installation layout hash length") + self.path_scheme = self.path_scheme.replace( + "${HASH}", "${HASH:%d}" % self.hash_len) self.spec_file_name = 'spec.yaml' self.extension_file_name = 'extensions.yaml' @@ -188,16 +196,7 @@ class YamlDirectoryLayout(DirectoryLayout): if spec.external: return spec.external - dir_name = "%s-%s-%s" % ( - spec.name, - spec.version, - spec.dag_hash(self.hash_len)) - - path = join_path( - spec.architecture, - "%s-%s" % (spec.compiler.name, spec.compiler.version), - dir_name) - + path = spec.format(self.path_scheme) return path def write_spec(self, spec, path): @@ -285,8 +284,9 @@ class YamlDirectoryLayout(DirectoryLayout): if not os.path.isdir(self.root): return [] - pattern = join_path( - self.root, '*', '*', '*', self.metadata_dir, self.spec_file_name) + path_elems = ["*"] * len(self.path_scheme.split(os.sep)) + path_elems += [self.metadata_dir, self.spec_file_name] + pattern = join_path(self.root, *path_elems) spec_files = glob.glob(pattern) return [self.read_spec(s) for s in spec_files] @@ -447,6 +447,14 @@ class SpecReadError(DirectoryLayoutError): """Raised when directory layout can't read a spec.""" +class InvalidDirectoryLayoutParametersError(DirectoryLayoutError): + """Raised when a invalid directory layout parameters are supplied""" + + def __init__(self, message, long_msg=None): + super(InvalidDirectoryLayoutParametersError, self).__init__( + message, long_msg) + + class InvalidExtensionSpecError(DirectoryLayoutError): """Raised when an extension file has a bad spec in it.""" diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py index e51fa69afe..7a41c0e14a 100644 --- a/lib/spack/spack/schema/config.py +++ b/lib/spack/spack/schema/config.py @@ -41,6 +41,8 @@ schema = { 'additionalProperties': False, 'properties': { 'install_tree': {'type': 'string'}, + 'install_hash_length': {'type': 'integer', 'minimum': 1}, + 'install_path_scheme': {'type': 'string'}, 'build_stage': { 'oneOf': [ {'type': 'string'}, diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 9fc2c99e4a..b2fae9fd8e 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2687,7 +2687,7 @@ class Spec(object): write(fmt % str(self.variants), '+') elif named_str == 'ARCHITECTURE': if self.architecture and str(self.architecture): - write(fmt % str(self.architecture) + ' ', ' arch=') + write(fmt % str(self.architecture), ' arch=') elif named_str == 'SHA1': if self.dependencies: out.write(fmt % str(self.dag_hash(7))) @@ -2703,7 +2703,7 @@ class Spec(object): hashlen = int(hashlen) else: hashlen = None - out.write('/' + fmt % (self.dag_hash(hashlen))) + out.write(fmt % (self.dag_hash(hashlen))) named = False diff --git a/lib/spack/spack/store.py b/lib/spack/spack/store.py index 3f559315d2..4a5c8d18a7 100644 --- a/lib/spack/spack/store.py +++ b/lib/spack/spack/store.py @@ -72,4 +72,6 @@ db = Database(root) # This controls how spack lays out install prefixes and # stage directories. # -layout = YamlDirectoryLayout(root) +layout = YamlDirectoryLayout(root, + hash_len=config.get('install_hash_length'), + path_scheme=config.get('install_path_scheme')) diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index 2caadad0fe..1987bb3a44 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -29,7 +29,8 @@ import os import pytest import spack -from spack.directory_layout import YamlDirectoryLayout +from spack.directory_layout import (YamlDirectoryLayout, + InvalidDirectoryLayoutParametersError) from spack.repository import RepoPath from spack.spec import Spec @@ -43,6 +44,46 @@ def layout_and_dir(tmpdir): yield YamlDirectoryLayout(str(tmpdir)), str(tmpdir) +def test_yaml_directory_layout_parameters( + tmpdir, config +): + """This tests the various parameters that can be used to configure + the install location """ + spec = Spec('python') + spec.concretize() + + # Ensure default layout matches expected spec format + layout_default = YamlDirectoryLayout(str(tmpdir)) + path_default = layout_default.relative_path_for_spec(spec) + assert(path_default == + spec.format("${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}")) # NOQA: ignore=E501 + + # Test hash_length parameter works correctly + layout_10 = YamlDirectoryLayout(str(tmpdir), hash_len=10) + path_10 = layout_10.relative_path_for_spec(spec) + layout_7 = YamlDirectoryLayout(str(tmpdir), hash_len=7) + path_7 = layout_7.relative_path_for_spec(spec) + + assert(len(path_default) - len(path_10) == 22) + assert(len(path_default) - len(path_7) == 25) + + # Test path_scheme + arch, compiler, package7 = path_7.split('/') + scheme_package7 = "${PACKAGE}-${VERSION}-${HASH:7}" + + layout_package7 = YamlDirectoryLayout(str(tmpdir), + path_scheme=scheme_package7) + path_package7 = layout_package7.relative_path_for_spec(spec) + + assert(package7 == path_package7) + + # Ensure conflicting parameters caught + with pytest.raises(InvalidDirectoryLayoutParametersError): + YamlDirectoryLayout(str(tmpdir), + hash_len=20, + path_scheme=scheme_package7) + + def test_read_and_write_spec( layout_and_dir, config, builtin_mock ): -- cgit v1.2.3-70-g09d2 From df150b3e9299448e05c2598944496d2182c06c96 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 5 Apr 2017 18:00:42 -0500 Subject: spack create MakefilePackage (#3710) * spack create MakefilePackage * Change default Perl template to match other build systems --- lib/spack/spack/cmd/create.py | 61 +++++++++++++++++------------- lib/spack/spack/test/build_system_guess.py | 3 ++ 2 files changed, 38 insertions(+), 26 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 906c7e1aec..d839cc91ad 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -141,10 +141,6 @@ class AutotoolsPackageTemplate(PackageTemplate): base_class_name = 'AutotoolsPackage' - dependencies = """\ - # FIXME: Add dependencies if required. - # depends_on('foo')""" - body = """\ def configure_args(self): # FIXME: Add arguments other than --prefix @@ -233,7 +229,7 @@ class PythonPackageTemplate(PackageTemplate): body = """\ def build_args(self, spec, prefix): # FIXME: Add arguments other than --prefix - # FIXME: If not needed delete the function + # FIXME: If not needed delete this function args = [] return args""" @@ -275,16 +271,14 @@ class PerlmakePackageTemplate(PackageTemplate): dependencies = """\ # FIXME: Add dependencies if required: - # depends_on('perl-foo') - # depends_on('barbaz', type=('build', 'link', 'run'))""" + # depends_on('perl-foo', type=('build', 'run'))""" body = """\ - # FIXME: If non-standard arguments are used for configure step: - # def configure_args(self): - # return ['my', 'configure', 'args'] - - # FIXME: in unusual cases, it may be necessary to override methods for - # configure(), build(), check() or install().""" + def configure_args(self): + # FIXME: Add non-standard arguments + # FIXME: If not needed delete this function + args = [] + return args""" def __init__(self, name, *args): # If the user provided `--name perl-cpp`, don't rename it perl-perl-cpp @@ -303,8 +297,7 @@ class PerlbuildPackageTemplate(PerlmakePackageTemplate): depends_on('perl-module-build', type='build') # FIXME: Add additional dependencies if required: - # depends_on('perl-foo') - # depends_on('barbaz', type=('build', 'link', 'run'))""" + # depends_on('perl-foo', type=('build', 'run'))""" class OctavePackageTemplate(PackageTemplate): @@ -336,6 +329,19 @@ class OctavePackageTemplate(PackageTemplate): super(OctavePackageTemplate, self).__init__(name, *args) +class MakefilePackageTemplate(PackageTemplate): + """Provides appropriate overrides for Makefile packages""" + + base_class_name = 'MakefilePackage' + + body = """\ + def edit(self, spec, prefix): + # FIXME: Edit the Makefile if necessary + # FIXME: If not needed delete this function + # makefile = FileFilter('Makefile') + # makefile.filter('CC = .*', 'CC = cc')""" + + templates = { 'autotools': AutotoolsPackageTemplate, 'autoreconf': AutoreconfPackageTemplate, @@ -347,6 +353,7 @@ templates = { 'perlmake': PerlmakePackageTemplate, 'perlbuild': PerlbuildPackageTemplate, 'octave': OctavePackageTemplate, + 'makefile': MakefilePackageTemplate, 'generic': PackageTemplate } @@ -401,16 +408,17 @@ class BuildSystemGuesser: # uses. If the regular expression matches a file contained in the # archive, the corresponding build system is assumed. clues = [ - (r'/configure$', 'autotools'), - (r'/configure.(in|ac)$', 'autoreconf'), - (r'/Makefile.am$', 'autoreconf'), - (r'/CMakeLists.txt$', 'cmake'), - (r'/SConstruct$', 'scons'), - (r'/setup.py$', 'python'), - (r'/NAMESPACE$', 'r'), - (r'/WORKSPACE$', 'bazel'), - (r'/Build.PL$', 'perlbuild'), - (r'/Makefile.PL$', 'perlmake'), + ('/configure$', 'autotools'), + ('/configure.(in|ac)$', 'autoreconf'), + ('/Makefile.am$', 'autoreconf'), + ('/CMakeLists.txt$', 'cmake'), + ('/SConstruct$', 'scons'), + ('/setup.py$', 'python'), + ('/NAMESPACE$', 'r'), + ('/WORKSPACE$', 'bazel'), + ('/Build.PL$', 'perlbuild'), + ('/Makefile.PL$', 'perlmake'), + ('/(GNU)?[Mm]akefile$', 'makefile'), ] # Peek inside the compressed file. @@ -466,6 +474,8 @@ def get_name(args): " Please report this bug. In the meantime, try running:", " `spack create --name `") + name = simplify_name(name) + if not valid_fully_qualified_module_name(name): tty.die("Package name can only contain a-z, 0-9, and '-'") @@ -617,7 +627,6 @@ def create(parser, args): url = get_url(args) versions, guesser = get_versions(args, name) build_system = get_build_system(args, guesser) - name = simplify_name(name) # Create the package template object PackageClass = templates[build_system] diff --git a/lib/spack/spack/test/build_system_guess.py b/lib/spack/spack/test/build_system_guess.py index e6fb84b37d..9ea76e7bfc 100644 --- a/lib/spack/spack/test/build_system_guess.py +++ b/lib/spack/spack/test/build_system_guess.py @@ -40,6 +40,9 @@ import spack.stage ('WORKSPACE', 'bazel'), ('Makefile.PL', 'perlmake'), ('Build.PL', 'perlbuild'), + ('GNUmakefile', 'makefile'), + ('makefile', 'makefile'), + ('Makefile', 'makefile'), ('foobar', 'generic') ] ) -- cgit v1.2.3-70-g09d2 From 715ac8b7e67b094c094ec290729c5257cd565a0c Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Wed, 5 Apr 2017 18:34:17 -0700 Subject: Update copyright on the docs. (#3718) --- lib/spack/docs/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index 69ec2a0b33..76ff0f921b 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -1,6 +1,6 @@ # flake8: noqa ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. @@ -160,7 +160,7 @@ master_doc = 'index' # General information about the project. project = u'Spack' -copyright = u'2013-2015, Lawrence Livermore National Laboratory.' +copyright = u'2013-2017, Lawrence Livermore National Laboratory.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the -- cgit v1.2.3-70-g09d2 From a526bcaf117c1dd83c9fdd0fd85464aba57bb064 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 6 Apr 2017 13:44:43 -0700 Subject: Correct uninstall -d to uninstall -R in tutorial (#3740) -d was changed to -R as of PR #1917 --- lib/spack/docs/tutorial_sc16_spack_basics.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/tutorial_sc16_spack_basics.rst b/lib/spack/docs/tutorial_sc16_spack_basics.rst index ed58c7c5cf..8d9a8fbaea 100644 --- a/lib/spack/docs/tutorial_sc16_spack_basics.rst +++ b/lib/spack/docs/tutorial_sc16_spack_basics.rst @@ -1030,7 +1030,7 @@ We can uninstall packages by spec using the same syntax as install. We can uninstall packages by referring only to their hash. -We can use either ``-f`` (force) or ``-d`` (remove dependents as well) to +We can use either ``-f`` (force) or ``-R`` (remove dependents as well) to remove packages that are required by another installed package. .. code-block:: console @@ -1044,7 +1044,7 @@ remove packages that are required by another installed package. ==> Error: You can use spack uninstall --dependents to uninstall these dependencies as well - $ spack uninstall -d /4blb + $ spack uninstall -R /4blb ==> The following packages will be uninstalled : -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- -- cgit v1.2.3-70-g09d2 From 84208523f9d4f6d35bbf732e4276d583a37ff911 Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Thu, 6 Apr 2017 14:25:13 -0700 Subject: set_executable can set S_IX{GRP,OTH} (#3742) `set_executable` now checks if a user/group.other had read permission on a file and if it does then it sets the corresponding executable bit. See #1483. --- lib/spack/llnl/util/filesystem.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 8922010e70..71d5096523 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -394,8 +394,14 @@ def traverse_tree(source_root, dest_root, rel_path='', **kwargs): def set_executable(path): - st = os.stat(path) - os.chmod(path, st.st_mode | stat.S_IEXEC) + mode = os.stat(path).st_mode + if mode & stat.S_IRUSR: + mode |= stat.S_IXUSR + if mode & stat.S_IRGRP: + mode |= stat.S_IXGRP + if mode & stat.S_IROTH: + mode |= stat.S_IXOTH + os.chmod(path, mode) def remove_dead_links(root): -- cgit v1.2.3-70-g09d2 From 10c395b2f510eb9ce1036222d30ef99d9aa26212 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 7 Apr 2017 11:18:34 +0200 Subject: Abinit: a few modernizations for the package and its dependencies (#3699) * libxc: added libs interface * hdf5: added libs interface, added conflicts * abinit: modernized package to use build interface * netcdf-fortran: added libs interface * abinit: added version 8.2.2 --- lib/spack/spack/spec.py | 6 +- var/spack/repos/builtin/packages/abinit/package.py | 134 ++++++++++----------- var/spack/repos/builtin/packages/hdf5/package.py | 87 ++++++++++--- var/spack/repos/builtin/packages/libxc/package.py | 27 +++++ .../builtin/packages/netcdf-fortran/package.py | 13 ++ 5 files changed, 180 insertions(+), 87 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 534bc6c2d3..adddb87428 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -901,16 +901,12 @@ class SpecBuildInterface(ObjectWrapper): ) is_virtual = Spec.is_virtual(name) - self._query_to_package = QueryState( + self.last_query = QueryState( name=name, extra_parameters=query_parameters, isvirtual=is_virtual ) - @property - def last_query(self): - return self._query_to_package - @key_ordering class Spec(object): diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py index 1798059ee7..fe1c7ec778 100644 --- a/var/spack/repos/builtin/packages/abinit/package.py +++ b/var/spack/repos/builtin/packages/abinit/package.py @@ -28,13 +28,15 @@ from spack import * -class Abinit(Package): +class Abinit(AutotoolsPackage): """ABINIT is a package whose main program allows one to find the total energy, charge density and electronic structure of systems made of electrons and nuclei (molecules and periodic solids) within Density Functional Theory (DFT), using pseudopotentials and a planewave - or wavelet basis. ABINIT also includes options to optimize the geometry - according to the DFT forces and stresses, or to perform molecular dynamics + or wavelet basis. + + ABINIT also includes options to optimize the geometry according to the + DFT forces and stresses, or to perform molecular dynamics simulations using these forces, or to generate dynamical matrices, Born effective charges, and dielectric tensors, based on Density-Functional Perturbation Theory, and many more properties. Excited states can be @@ -44,11 +46,12 @@ class Abinit(Package): programs are provided. """ - homepage = "http://www.abinit.org" - url = "http://ftp.abinit.org/abinit-8.0.8b.tar.gz" + homepage = 'http://www.abinit.org' + url = 'http://ftp.abinit.org/abinit-8.0.8b.tar.gz' + version('8.2.2', '5f25250e06fdc0815c224ffd29858860') # Versions before 8.0.8b are not supported. - version("8.0.8b", "abc9e303bfa7f9f43f95598f87d84d5d") + version('8.0.8b', 'abc9e303bfa7f9f43f95598f87d84d5d') variant('mpi', default=True, description='Builds with MPI support. Requires MPI2+') @@ -57,7 +60,7 @@ class Abinit(Package): variant('scalapack', default=False, description='Enables scalapack support. Requires MPI') # variant('elpa', default=False, - # description='Uses elpa instead of scalapack. Requires MPI') + # description='Uses elpa instead of scalapack. Requires MPI') # TODO: To be tested. # It was working before the last `git pull` but now all tests crash. @@ -71,111 +74,108 @@ class Abinit(Package): # Add dependencies # currently one cannot forward options to virtual packages, see #1712. - # depends_on("blas", when="~openmp") - # depends_on("blas+openmp", when="+openmp") + # depends_on('blas', when='~openmp') + # depends_on('blas+openmp', when='+openmp') depends_on('blas') - depends_on("lapack") + depends_on('lapack') # Require MPI2+ - depends_on("mpi@2:", when="+mpi") + depends_on('mpi@2:', when='+mpi') - depends_on("scalapack", when="+scalapack+mpi") - # depends_on("elpa", when="+elpa+mpi~openmp") - # depends_on("elpa+openmp", when="+elpa+mpi+openmp") + depends_on('scalapack', when='+scalapack+mpi') - depends_on("fftw+float", when="~openmp") - depends_on("fftw+float+openmp", when="+openmp") + # depends_on('elpa~openmp', when='+elpa+mpi~openmp') + # depends_on('elpa+openmp', when='+elpa+mpi+openmp') - depends_on("netcdf-fortran", when="+hdf5") - depends_on("hdf5+mpi", when='+mpi+hdf5') # required for NetCDF-4 support + depends_on('fftw+float', when='~openmp') + depends_on('fftw+float+openmp', when='+openmp') + + depends_on('netcdf-fortran', when='+hdf5') + depends_on('hdf5+mpi', when='+mpi+hdf5') # required for NetCDF-4 support # pin libxc version - depends_on("libxc@2.2.1") + depends_on("libxc@2.2.2") - def validate(self, spec): - """ - Checks if incompatible variants have been activated at the same time + # Cannot ask for +scalapack if it does not depend on MPI + conflicts('+scalapack', when='~mpi') - :param spec: spec of the package - :raises RuntimeError: in case of inconsistencies - """ - error = 'you cannot ask for \'+{variant}\' when \'+mpi\' is not active' + # Elpa is a substitute for scalapack and needs mpi + # conflicts('+elpa', when='~mpi') + # conflicts('+elpa', when='+scalapack') - if '+scalapack' in spec and '~mpi' in spec: - raise RuntimeError(error.format(variant='scalapack')) + def configure_args(self): - if '+elpa' in spec and ('~mpi' in spec or '~scalapack' in spec): - raise RuntimeError(error.format(variant='elpa')) + spec = self.spec - def install(self, spec, prefix): - self.validate(spec) - - options = ['--prefix=%s' % prefix] + options = [] oapp = options.append if '+mpi' in spec: # MPI version: # let the configure script auto-detect MPI support from mpi_prefix - oapp("--with-mpi-prefix=%s" % spec["mpi"].prefix) - oapp("--enable-mpi=yes") - oapp("--enable-mpi-io=yes") + oapp('--with-mpi-prefix={0}'.format(spec['mpi'].prefix)) + oapp('--enable-mpi=yes') + oapp('--enable-mpi-io=yes') # Activate OpenMP in Abinit Fortran code. if '+openmp' in spec: oapp('--enable-openmp=yes') - # BLAS/LAPACK + # BLAS/LAPACK/SCALAPACK-ELPA + linalg = spec['lapack'].libs + spec['blas'].libs if '+scalapack' in spec: - oapp("--with-linalg-flavor=custom+scalapack") - linalg = (spec['scalapack'].libs + - spec['lapack'].libs + spec['blas'].libs) + oapp('--with-linalg-flavor=custom+scalapack') + linalg = spec['scalapack'].libs + linalg # elif '+elpa' in spec: else: - oapp("--with-linalg-flavor=custom") - linalg = spec['lapack'].libs + spec['blas'].libs + oapp('--with-linalg-flavor=custom') - oapp("--with-linalg-libs=%s" % linalg.ld_flags) + oapp('--with-linalg-libs={0}'.format(linalg.ld_flags)) # FFTW3: use sequential or threaded version if +openmp - fftflavor, fftlibs = "fftw3", "-lfftw3 -lfftw3f" + fftflavor, fftlibs = 'fftw3', '-lfftw3 -lfftw3f' if '+openmp' in spec: - fftflavor = "fftw3-threads" - fftlibs = "-lfftw3_omp -lfftw3 -lfftw3f" + fftflavor = 'fftw3-threads' + fftlibs = '-lfftw3_omp -lfftw3 -lfftw3f' options.extend([ - "--with-fft-flavor=%s" % fftflavor, - "--with-fft-incs=-I%s" % spec["fftw"].prefix.include, - "--with-fft-libs=-L%s %s" % (spec["fftw"].prefix.lib, fftlibs), + '--with-fft-flavor=%s' % fftflavor, + '--with-fft-incs=-I%s' % spec['fftw'].prefix.include, + '--with-fft-libs=-L%s %s' % (spec['fftw'].prefix.lib, fftlibs), ]) - oapp("--with-dft-flavor=atompaw+libxc") + oapp('--with-dft-flavor=atompaw+libxc') # LibXC library + libxc = spec['libxc:fortran'] options.extend([ - "with_libxc_incs=-I%s" % spec["libxc"].prefix.include, - "with_libxc_libs=-L%s -lxcf90 -lxc" % spec["libxc"].prefix.lib, + 'with_libxc_incs={0}'.format(libxc.cppflags), + 'with_libxc_libs={0}'.format(libxc.libs.ld_flags + ' -lm') ]) # Netcdf4/HDF5 - if "+hdf5" in spec: - oapp("--with-trio-flavor=netcdf") + if '+hdf5' in spec: + oapp('--with-trio-flavor=netcdf') # Since version 8, Abinit started to use netcdf4 + hdf5 and we have - # to link with -lhdf5_hl -lhdf5 - hdf_libs = "-L%s -lhdf5_hl -lhdf5" % spec["hdf5"].prefix.lib + # to link with the high level HDF5 library + hdf5 = spec['hdf5:hl'] + netcdff = spec['netcdf-fortran:shared'] options.extend([ - "--with-netcdf-incs=-I%s" % ( - spec["netcdf-fortran"].prefix.include), - "--with-netcdf-libs=-L%s -lnetcdff -lnetcdf %s" % ( - spec["netcdf-fortran"].prefix.lib, hdf_libs), + '--with-netcdf-incs={0}'.format(netcdff.cppflags), + '--with-netcdf-libs={0}'.format( + netcdff.libs.ld_flags + ' ' + hdf5.libs.ld_flags + ), ]) else: # In Spack we do our best to avoid building any internally provided # dependencies, such as netcdf3 in this case. - oapp("--with-trio-flavor=none") + oapp('--with-trio-flavor=none') - configure(*options) - make() + return options - # make("check") - # make("tests_in") - make("install") + def check(self): + """This method is called after the build phase if tests have been + explicitly activated by user. + """ + make('check') + make('tests_in') diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 15139db645..27ec1b3bc4 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -70,23 +70,82 @@ class Hdf5(AutotoolsPackage): depends_on('szip', when='+szip') depends_on('zlib@1.1.2:') - @run_before('configure') - def validate(self): - """ - Checks if incompatible variants have been activated at the same time + # According to ./configure --help thread-safe capabilities are: + # "Not compatible with the high-level library, Fortran, or C++ wrappers." + # (taken from hdf5@1.10.0patch1) + conflicts('+threadsafe', when='+cxx') + conflicts('+threadsafe', when='+fortran') - :param spec: spec of the package - :raises RuntimeError: in case of inconsistencies + @property + def libs(self): + """Hdf5 can be queried for the following parameters: + + - "hl": high-level interface + - "cxx": C++ APIs + - "fortran": fortran APIs + + :return: list of matching libraries """ + query_parameters = self.spec.last_query.extra_parameters + + shared = '+shared' in self.spec + + # This map contains a translation from query_parameters + # to the libraries needed + query2libraries = { + tuple(): ['libhdf5'], + ('cxx', 'fortran', 'hl'): [ + 'libhdf5hl_fortran', + 'libhdf5_hl_cpp', + 'libhdf5_hl', + 'libhdf5_fortran', + 'libhdf5', + ], + ('cxx', 'hl'): [ + 'libhdf5_hl_cpp', + 'libhdf5_hl', + 'libhdf5', + ], + ('fortran', 'hl'): [ + 'libhdf5hl_fortran', + 'libhdf5_hl', + 'libhdf5_fortran', + 'libhdf5', + ], + ('hl',): [ + 'libhdf5_hl', + 'libhdf5', + ], + ('cxx', 'fortran'): [ + 'libhdf5_fortran', + 'libhdf5_cpp', + 'libhdf5', + ], + ('cxx',): [ + 'libhdf5_cpp', + 'libhdf5', + ], + ('fortran',): [ + 'libhdf5_fortran', + 'libhdf5', + ] + } + + # Turn the query into the appropriate key + key = tuple(sorted(query_parameters)) + libraries = query2libraries[key] + + return find_libraries( + libraries, root=self.prefix, shared=shared, recurse=True + ) + + @run_before('configure') + def fortran_check(self): spec = self.spec if '+fortran' in spec and not self.compiler.fc: msg = 'cannot build a fortran variant without a fortran compiler' raise RuntimeError(msg) - if '+threadsafe' in spec and ('+cxx' in spec or '+fortran' in spec): - msg = 'cannot use variant +threadsafe with either +cxx or +fortran' - raise RuntimeError(msg) - def configure_args(self): spec = self.spec # Handle compilation after spec validation @@ -156,11 +215,9 @@ class Hdf5(AutotoolsPackage): return ["--with-zlib=%s" % spec['zlib'].prefix] + extra_args - def configure(self, spec, prefix): - # Run the default autotools package configure - super(Hdf5, self).configure(spec, prefix) - - if '@:1.8.14' in spec: + @run_after('configure') + def patch_postdeps(self): + if '@:1.8.14' in self.spec: # On Ubuntu14, HDF5 1.8.12 (and maybe other versions) # mysteriously end up with "-l -l" in the postdeps in the # libtool script. Patch this by removing the spurious -l's. diff --git a/var/spack/repos/builtin/packages/libxc/package.py b/var/spack/repos/builtin/packages/libxc/package.py index d773395e6c..ab9f75eac4 100644 --- a/var/spack/repos/builtin/packages/libxc/package.py +++ b/var/spack/repos/builtin/packages/libxc/package.py @@ -36,6 +36,33 @@ class Libxc(Package): version('2.2.2', 'd9f90a0d6e36df6c1312b6422280f2ec') version('2.2.1', '38dc3a067524baf4f8521d5bb1cd0b8f') + @property + def libs(self): + """Libxc can be queried for the following parameters: + + - "static": returns the static library version of libxc + (by default the shared version is returned) + + :return: list of matching libraries + """ + query_parameters = self.spec.last_query.extra_parameters + + libraries = ['libxc'] + + # Libxc installs both shared and static libraries. + # If a client ask for static explicitly then return + # the static libraries + shared = False if 'static' in query_parameters else True + + # Libxc has a fortran90 interface: give clients the + # possibility to query for it + if 'fortran' in query_parameters: + libraries = ['libxcf90'] + libraries + + return find_libraries( + libraries, root=self.prefix, shared=shared, recurse=True + ) + def install(self, spec, prefix): # Optimizations for the Intel compiler, suggested by CP2K optflags = '-O2' diff --git a/var/spack/repos/builtin/packages/netcdf-fortran/package.py b/var/spack/repos/builtin/packages/netcdf-fortran/package.py index a2556d8783..3f6a5bbf04 100644 --- a/var/spack/repos/builtin/packages/netcdf-fortran/package.py +++ b/var/spack/repos/builtin/packages/netcdf-fortran/package.py @@ -35,3 +35,16 @@ class NetcdfFortran(AutotoolsPackage): version('4.4.3', 'bfd4ae23a34635b273d3eb0d91cbde9e') depends_on('netcdf') + + @property + def libs(self): + libraries = ['libnetcdff'] + + # This package installs both shared and static libraries. Permit + # clients to query which one they want. + query_parameters = self.spec.last_query.extra_parameters + shared = 'shared' in query_parameters + + return find_libraries( + libraries, root=self.prefix, shared=shared, recurse=True + ) -- cgit v1.2.3-70-g09d2 From 8e4ada5e99a7e00324fcfd3f70d5a7d80909e85e Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 10 Apr 2017 07:25:48 -0500 Subject: Make it more clear that version ranges are inclusive (#3759) --- lib/spack/docs/packaging_guide.rst | 127 ++++++++++++++++++++++++------------- 1 file changed, 84 insertions(+), 43 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 18541179b2..0e8ddfa68f 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -1438,75 +1438,116 @@ so you can rely on it for your libdwarf build. Dependency specs ^^^^^^^^^^^^^^^^ -``depends_on`` doesn't just take the name of another package. It -takes a full spec. This means that you can restrict the versions or +``depends_on`` doesn't just take the name of another package. It can +take a full spec as well. This means that you can restrict the versions or other configuration options of ``libelf`` that ``libdwarf`` will build -with. Here's an example. Suppose that in the ``libdwarf`` package -you write: +with. For example, suppose that in the ``libdwarf`` package you write: .. code-block:: python - depends_on("libelf@0.8:") + depends_on('libelf@0.8') -Now ``libdwarf`` will require a version of ``libelf`` version ``0.8`` -or higher in order to build. If some versions of ``libelf`` are -installed but they are all older than this, then Spack will build a -new version of ``libelf`` that satisfies the spec's version -constraint, and it will build ``libdwarf`` with that one. You could -just as easily provide a version range: +Now ``libdwarf`` will require ``libelf`` at *exactly* version ``0.8``. +You can also specify a requirement for a particular variant or for +specific compiler flags: .. code-block:: python - depends_on("libelf@0.8.2:0.8.4:") - -Or a requirement for a particular variant or compiler flags: - -.. code-block:: python - - depends_on("libelf@0.8+debug") + depends_on('libelf@0.8+debug') depends_on('libelf debug=True') depends_on('libelf cppflags="-fPIC"') Both users *and* package authors can use the same spec syntax to refer -to different package configurations. Users use the spec syntax on the +to different package configurations. Users use the spec syntax on the command line to find installed packages or to install packages with particular constraints, and package authors can use specs to describe relationships between packages. -Additionally, dependencies may be specified for specific use cases: +^^^^^^^^^^^^^^ +Version Ranges +^^^^^^^^^^^^^^ + +Although some packages require a specific version for their dependencies, +most can be built with a range of version. For example, if you are +writing a package for a legacy Python module that only works with Python +2.4 through 2.6, this would look like: + +.. code-block:: python + + depends_on('python@2.4:2.6') + +Version ranges in Spack are *inclusive*, so ``2.4:2.6`` means any version +greater than or equal to ``2.4`` and up to and including ``2.6``. If you +want to specify that a package works with any version of Python 3, this +would look like: + +.. code-block:: python + + depends_on('python@3:') + +Here we leave out the upper bound. If you want to say that a package +requires Python 2, you can similarly leave out the lower bound: .. code-block:: python - depends_on("cmake", type="build") - depends_on("libelf", type=("build", "link")) - depends_on("python", type="run") + depends_on('python@:2.9') -The dependency types are: +Notice that we didn't use ``@:3``. Version ranges are *inclusive*, so +``@:3`` means "up to and including 3". + +What if a package can only be built with Python 2.6? You might be +inclined to use: + +.. code-block:: python + + depends_on('python@2.6') + +However, this would be wrong. Spack assumes that all version constraints +are absolute, so it would try to install Python at exactly ``2.6``. The +correct way to specify this would be: + +.. code-block:: python + + depends_on('python@2.6.0:2.6.999') + + +^^^^^^^^^^^^^^^^ +Dependency Types +^^^^^^^^^^^^^^^^ + +Not all dependencies are created equal, and Spack allows you to specify +exactly what kind of a dependency you need. For example: + +.. code-block:: python - * **"build"**: made available during the project's build. The package will - be added to ``PATH``, the compiler include paths, and ``PYTHONPATH``. - Other projects which depend on this one will not have these modified - (building project X doesn't need project Y's build dependencies). - * **"link"**: the project is linked to by the project. The package will be - added to the current package's ``rpath``. - * **"run"**: the project is used by the project at runtime. The package will - be added to ``PATH`` and ``PYTHONPATH``. + depends_on('cmake', type='build') + depends_on('py-numpy', type=('build', 'run')) + depends_on('libelf', type=('build', 'link')) -Additional hybrid dependency types are (note the lack of quotes): +The following dependency types are available: - * ****: ``type`` assumed to be ``("build", - "link")``. This is the common case for compiled language usage. +* **"build"**: made available during the project's build. The package will + be added to ``PATH``, the compiler include paths, and ``PYTHONPATH``. + Other projects which depend on this one will not have these modified + (building project X doesn't need project Y's build dependencies). +* **"link"**: the project is linked to by the project. The package will be + added to the current package's ``rpath``. +* **"run"**: the project is used by the project at runtime. The package will + be added to ``PATH`` and ``PYTHONPATH``. -""""""""""""""""""" -Dependency Formulas -""""""""""""""""""" +One of the advantages of the ``build`` dependency type is that although the +dependency needs to be installed in order for the package to be built, it +can be uninstalled without concern afterwards. ``link`` and ``run`` disallow +this because uninstalling the dependency would break the package. -This section shows how to write appropriate ``depends_on()`` -declarations for some common cases. +If the dependency type is not specified, Spack uses a default of +``('build', 'link')``. This is the common case for compiler languages. +Non-compiled packages like Python modules commonly use +``('build', 'run')``. This means that the compiler wrappers don't need to +inject the dependency's ``prefix/lib`` directory, but the package needs to +be in ``PATH`` and ``PYTHONPATH`` during the build process and later when +a user wants to run the package. -* Python 2 only: ``depends_on('python@:2.8')`` -* Python 2.7 only: ``depends_on('python@2.7:2.8')`` -* Python 3 only: ``depends_on('python@3:')`` .. _setup-dependent-environment: -- cgit v1.2.3-70-g09d2 From c9da92dc9736375a44eba42033b00dc485be8e7a Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Mon, 10 Apr 2017 15:20:57 +0200 Subject: doc: start with known issues section (#3722) --- lib/spack/docs/index.rst | 1 + lib/spack/docs/known_issues.rst | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 lib/spack/docs/known_issues.rst (limited to 'lib') diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 2e99e96a3e..579d222346 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -51,6 +51,7 @@ or refer to the full manual below. basic_usage workflows tutorial_sc16 + known_issues .. toctree:: :maxdepth: 2 diff --git a/lib/spack/docs/known_issues.rst b/lib/spack/docs/known_issues.rst new file mode 100644 index 0000000000..aad0358cb1 --- /dev/null +++ b/lib/spack/docs/known_issues.rst @@ -0,0 +1,37 @@ +============ +Known Issues +============ + +This is a list of known bugs in Spack. It provides ways of getting around these +problems if you encounter them. + +----------------------------------------------------------------- +Default variants are not taken into account during concretization +----------------------------------------------------------------- + +**Status:** Expected to be fixed in the next release + +Current conretization algorithm does not take into account default values +of variants when adding extra constraints to the spec via CLI. For example +you may enounter the following error when trying to specify which MPI provider +to use + +.. code-block:: console + + $ spack install hdf5 ^openmpi + ==> Error: hdf5 does not depend on openmpi + +although the hdf5 package contains + +.. code-block:: python + + variant('mpi', default=True, description='Enable MPI support') + depends_on('mpi', when='+mpi') + +A workaround is to explicitly activate the variant related to the dependency: + +.. code-block:: console + + $ spack install hdf5+mpi ^openmpi + +See https://github.com/LLNL/spack/issues/397 for further details. -- cgit v1.2.3-70-g09d2 From e12e9996e40670c467fc62e5fbc38760c7ec869e Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 12 Apr 2017 10:46:00 -0500 Subject: Document commands that no longer work (#3781) --- lib/spack/docs/known_issues.rst | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/known_issues.rst b/lib/spack/docs/known_issues.rst index aad0358cb1..a68033dba6 100644 --- a/lib/spack/docs/known_issues.rst +++ b/lib/spack/docs/known_issues.rst @@ -11,17 +11,17 @@ Default variants are not taken into account during concretization **Status:** Expected to be fixed in the next release -Current conretization algorithm does not take into account default values +Current concretization algorithm does not take into account default values of variants when adding extra constraints to the spec via CLI. For example -you may enounter the following error when trying to specify which MPI provider -to use +you may encounter the following error when trying to specify which MPI provider +to use: .. code-block:: console $ spack install hdf5 ^openmpi ==> Error: hdf5 does not depend on openmpi -although the hdf5 package contains +although the hdf5 package contains: .. code-block:: python @@ -35,3 +35,36 @@ A workaround is to explicitly activate the variant related to the dependency: $ spack install hdf5+mpi ^openmpi See https://github.com/LLNL/spack/issues/397 for further details. + + +--------------------------------- +``spack extensions`` doesn't work +--------------------------------- + +**Status:** Up for grabs if you want to try to fix it + +Spack provides an ``extensions`` command that lists all available extensions +of a package, the ones that are installed, and the ones that are already +activated. This is very useful in conjunction with ``spack activate``. +Unfortunately, this command no longer works: + +.. code-block:: console + + $ spack extensions python + ==> python@2.7.13%clang@8.0.0-apple~tk~ucs4 arch=darwin-sierra-x86_64 -ckrr4mg has no extensions. + + +See https://github.com/LLNL/spack/issues/2895 for further details. + + +---------------------------- +``spack setup`` doesn't work +---------------------------- + +**Status:** Work in progress + +Spack provides a ``setup`` command that is useful for the development of +software outside of Spack. Unfortunately, this command no longer works. +See https://github.com/LLNL/spack/issues/2597 and +https://github.com/LLNL/spack/issues/2662 for details. This is expected +to be fixed by https://github.com/LLNL/spack/pull/2664. -- cgit v1.2.3-70-g09d2 From 0405505e21115bb0d4c3cbf24f834418c2fb7c46 Mon Sep 17 00:00:00 2001 From: Mario Melara Date: Fri, 14 Apr 2017 07:56:51 -0700 Subject: Quick fix for #3153 (#3822) --- lib/spack/spack/build_environment.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index a20a7b4db8..705e845440 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -225,6 +225,9 @@ def set_compiler_environment_variables(pkg, env): env.set('SPACK_COMPILER_SPEC', str(pkg.spec.compiler)) for mod in compiler.modules: + # Fixes issue https://github.com/LLNL/spack/issues/3153 + if os.environ.get("CRAY_CPU_TARGET") == "mic-knl": + load_module("cce") load_module(mod) compiler.setup_custom_environment(pkg, env) -- cgit v1.2.3-70-g09d2 From bec6d99b15750a8dcf01bbae7ea79d66e17b91ac Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 14 Apr 2017 10:13:14 -0500 Subject: Add documentation on explicit param for do_install (#3823) --- lib/spack/spack/package.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 177b4c908b..d2494939d7 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1145,22 +1145,24 @@ class PackageBase(with_metaclass(PackageMeta, object)): Package implementations should override install() to describe their build process. - :param keep_prefix: Keep install prefix on failure. By default, \ + :param bool keep_prefix: Keep install prefix on failure. By default, destroys it. - :param keep_stage: By default, stage is destroyed only if there are \ - no exceptions during build. Set to True to keep the stage + :param bool keep_stage: By default, stage is destroyed only if there + are no exceptions during build. Set to True to keep the stage even with exceptions. - :param install_deps: Install dependencies before installing this \ + :param bool install_deps: Install dependencies before installing this package - :param fake: Don't really build; install fake stub files instead. - :param skip_patch: Skip patch stage of build if True. - :param verbose: Display verbose build output (by default, suppresses \ - it) - :param dirty: Don't clean the build environment before installing. - :param make_jobs: Number of make jobs to use for install. Default is \ - ncpus - :param force: Install again, even if already installed. - :param run_tests: Run tests within the package's install() + :param bool skip_patch: Skip patch stage of build if True. + :param bool verbose: Display verbose build output (by default, + suppresses it) + :param int make_jobs: Number of make jobs to use for install. Default + is ncpus + :param bool run_tests: Run tests within the package's install() + :param bool fake: Don't really build; install fake stub files instead. + :param bool explicit: True if package was explicitly installed, False + if package was implicitly installed (as a dependency). + :param bool dirty: Don't clean the build environment before installing. + :param bool force: Install again, even if already installed. """ if not self.spec.concrete: raise ValueError("Can only install concrete packages: %s." -- cgit v1.2.3-70-g09d2 From 6574ec31430b5c00563f1942b72e2d830a022d6b Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 14 Apr 2017 18:51:54 -0400 Subject: stage: remove a rogue period (#3846) --- lib/spack/spack/stage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 21db3d75c2..29b6882927 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -455,7 +455,7 @@ class Stage(object): "control system, but it has been archived on a spack " "mirror. This means we cannot know a checksum for the " "tarball in advance. Be sure that your connection to " - "this mirror is secure!.") + "this mirror is secure!") else: self.fetcher.check() -- cgit v1.2.3-70-g09d2 From bd1beedaf52617df6a6baac8ebfbb06de3cdc03d Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 15 Apr 2017 10:31:00 -0500 Subject: Allow users to set parallel jobs in config.yaml (#3812) * Allow users to set parallel jobs in config.yaml * Undo change from endash to emdash * Remove parallel config, rename jobs to build_jobs --- etc/spack/defaults/config.yaml | 6 ++++++ lib/spack/docs/config_yaml.rst | 25 +++++++++++++++++++++---- lib/spack/spack/__init__.py | 6 ++++++ lib/spack/spack/build_environment.py | 2 +- lib/spack/spack/package.py | 2 +- lib/spack/spack/schema/config.py | 1 + 6 files changed, 36 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/etc/spack/defaults/config.yaml b/etc/spack/defaults/config.yaml index 4e02d0973d..f29acfe018 100644 --- a/etc/spack/defaults/config.yaml +++ b/etc/spack/defaults/config.yaml @@ -66,3 +66,9 @@ config: # If set to true, `spack install` and friends will NOT clean # potentially harmful variables from the build environment. Use wisely. dirty: false + + + # The default number of jobs to use when running `make` in parallel. + # If set to 4, for example, `spack install` will run `make -j4`. + # If not set, all available cores are used by default. + # build_jobs: 4 diff --git a/lib/spack/docs/config_yaml.rst b/lib/spack/docs/config_yaml.rst index 197bf5c530..28b258c2e5 100644 --- a/lib/spack/docs/config_yaml.rst +++ b/lib/spack/docs/config_yaml.rst @@ -99,8 +99,8 @@ See :ref:`modules` for details. ``build_stage`` -------------------- -Spack is designed to run out of a user home directories, and on many -systems the home directory a (slow) network filesystem. On most systems, +Spack is designed to run out of a user home directory, and on many +systems the home directory is a (slow) network filesystem. On most systems, building in a temporary filesystem results in faster builds than building in the home directory. Usually, there is also more space available in the temporary location than in the home directory. So, Spack tries to @@ -122,7 +122,7 @@ See :ref:`config-file-variables` for more on ``$tempdir`` and ``$spack``. When Spack builds a package, it creates a temporary directory within the ``build_stage``, and it creates a symbolic link to that directory in -``$spack/var/spack/stage``. This is used totrack the stage. +``$spack/var/spack/stage``. This is used to track the stage. After a package is successfully installed, Spack deletes the temporary directory it used to build. Unsuccessful builds are not deleted, but you @@ -180,7 +180,24 @@ the way packages build. This includes ``LD_LIBRARY_PATH``, ``CPATH``, ``LIBRARY_PATH``, ``DYLD_LIBRARY_PATH``, and others. By default, builds are ``clean``, but on some machines, compilers and -other tools may need custom ``LD_LIBRARY_PATH`` setings to run. You can +other tools may need custom ``LD_LIBRARY_PATH`` settings to run. You can set ``dirty`` to ``true`` to skip the cleaning step and make all builds "dirty" by default. Be aware that this will reduce the reproducibility of builds. + +-------------- +``build_jobs`` +-------------- + +Unless overridden in a package or on the command line, Spack builds all +packages in parallel. For a build system that uses Makefiles, this means +running ``make -j``, where ``build_jobs`` is the number of +threads to use. + +The default parallelism is equal to the number of cores on your machine. +If you work on a shared login node or have a strict ulimit, it may be +necessary to set the default to a lower value. By setting ``build_jobs`` +to 4, for example, commands like ``spack install`` will run ``make -j4`` +instead of hogging every core. + +To build all software in serial, set ``build_jobs`` to 1. diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 345a804dfe..85d881a769 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -23,6 +23,7 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import multiprocessing import os import sys import tempfile @@ -141,6 +142,11 @@ do_checksum = _config.get('checksum', True) dirty = _config.get('dirty', False) +# The number of jobs to use when building in parallel. +# By default, use all cores on the machine. +build_jobs = _config.get('build_jobs', multiprocessing.cpu_count()) + + #----------------------------------------------------------------------------- # When packages call 'from spack import *', this extra stuff is brought in. # diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 705e845440..4a8487daab 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -357,7 +357,7 @@ def set_module_variables_for_package(pkg, module): This makes things easier for package writers. """ # number of jobs spack will build with. - jobs = multiprocessing.cpu_count() + jobs = spack.build_jobs if not pkg.parallel: jobs = 1 elif pkg.make_jobs: diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index d2494939d7..108ddeff07 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -485,7 +485,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): parallel = True """# jobs to use for parallel make. If set, overrides default of ncpus.""" - make_jobs = None + make_jobs = spack.build_jobs """By default do not run tests within package's install()""" run_tests = False diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py index 7a41c0e14a..6c655db915 100644 --- a/lib/spack/spack/schema/config.py +++ b/lib/spack/spack/schema/config.py @@ -63,6 +63,7 @@ schema = { 'verify_ssl': {'type': 'boolean'}, 'checksum': {'type': 'boolean'}, 'dirty': {'type': 'boolean'}, + 'build_jobs': {'type': 'integer', 'minimum': 1}, } }, }, -- cgit v1.2.3-70-g09d2 From 5aa273b3198850301a7a2927e07c5ccabab6b08a Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 15 Apr 2017 11:46:28 -0500 Subject: Fix flake8 changed files detection (#3855) --- lib/spack/spack/cmd/flake8.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index a6dc941190..546a27c765 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -88,7 +88,7 @@ def changed_files(): git_args = [ # Add changed files committed since branching off of develop - ['diff', '--name-only', '--diff-filter=ACMR', 'develop'], + ['diff', '--name-only', '--diff-filter=ACMR', 'develop...'], # Add changed files that have been staged but not yet committed ['diff', '--name-only', '--diff-filter=ACMR', '--cached'], # Add changed files that are unstaged -- cgit v1.2.3-70-g09d2 From f4858cb7a7dfbc111a95580495a5c2ce3ab69ea8 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 19 Apr 2017 20:59:04 -0500 Subject: Rework Spack's Mercurial support (#3834) * Add tests to mercurial package * Add support for --insecure with mercurial fetching * Install man pages and tab-completion scripts * Add tests and latest version for all deps * Flake8 fix * Use certifi module to find CA certificate * Flake8 fix * Unset PYTHONPATH when running hg * svn_fetch should use to svn-test, not hg-test * Drop Python 3 support in Mercurial Python 3 support is a work in progress and isn't currently recommended: https://www.mercurial-scm.org/wiki/SupportedPythonVersions * Test both secure and insecure hg fetching * Test both secure and insecure git and svn fetching --- lib/spack/spack/fetch_strategy.py | 19 ++++- lib/spack/spack/test/git_fetch.py | 14 +++- lib/spack/spack/test/hg_fetch.py | 14 +++- lib/spack/spack/test/svn_fetch.py | 20 ++++- .../repos/builtin/packages/mercurial/package.py | 89 ++++++++++++++++------ .../repos/builtin/packages/py-appdirs/package.py | 5 +- .../repos/builtin/packages/py-certifi/package.py | 7 +- .../repos/builtin/packages/py-cffi/package.py | 12 ++- .../repos/builtin/packages/py-docutils/package.py | 16 +++- .../repos/builtin/packages/py-packaging/package.py | 2 + .../repos/builtin/packages/py-pycparser/package.py | 5 +- .../repos/builtin/packages/py-pygments/package.py | 8 +- .../repos/builtin/packages/py-pyparsing/package.py | 5 +- .../builtin/packages/py-setuptools/package.py | 8 +- var/spack/repos/builtin/packages/py-six/package.py | 4 +- 15 files changed, 176 insertions(+), 52 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 38752b3fc1..855b2f9379 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -808,8 +808,17 @@ class HgFetchStrategy(VCSFetchStrategy): @property def hg(self): + """:returns: The hg executable + :rtype: Executable + """ if not self._hg: self._hg = which('hg', required=True) + + # When building PythonPackages, Spack automatically sets + # PYTHONPATH. This can interfere with hg, which is a Python + # script. Unset PYTHONPATH while running hg. + self._hg.add_default_env('PYTHONPATH', '') + return self._hg @property @@ -829,9 +838,15 @@ class HgFetchStrategy(VCSFetchStrategy): args.append('at revision %s' % self.revision) tty.msg("Trying to clone Mercurial repository:", self.url, *args) - args = ['clone', self.url] + args = ['clone'] + + if spack.insecure: + args.append('--insecure') + + args.append(self.url) + if self.revision: - args += ['-r', self.revision] + args.extend(['-r', self.revision]) self.hg(*args) diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py index 3bd998c5c2..ef531ef65f 100644 --- a/lib/spack/spack/test/git_fetch.py +++ b/lib/spack/spack/test/git_fetch.py @@ -37,8 +37,15 @@ def type_of_test(request): return request.param +@pytest.fixture(params=[True, False]) +def secure(request): + """Attempt both secure and insecure fetching""" + return request.param + + def test_fetch( type_of_test, + secure, mock_git_repository, config, refresh_builtin_mock @@ -62,7 +69,12 @@ def test_fetch( pkg.versions[ver('git')] = t.args # Enter the stage directory and check some properties with pkg.stage: - pkg.do_stage() + try: + spack.insecure = secure + pkg.do_stage() + finally: + spack.insecure = False + assert h('HEAD') == h(t.revision) file_path = join_path(pkg.stage.source_path, t.file) diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py index 71e4693c56..29a6eef561 100644 --- a/lib/spack/spack/test/hg_fetch.py +++ b/lib/spack/spack/test/hg_fetch.py @@ -37,8 +37,15 @@ def type_of_test(request): return request.param +@pytest.fixture(params=[True, False]) +def secure(request): + """Attempt both secure and insecure fetching""" + return request.param + + def test_fetch( type_of_test, + secure, mock_hg_repository, config, refresh_builtin_mock @@ -62,7 +69,12 @@ def test_fetch( pkg.versions[ver('hg')] = t.args # Enter the stage directory and check some properties with pkg.stage: - pkg.do_stage() + try: + spack.insecure = secure + pkg.do_stage() + finally: + spack.insecure = False + assert h() == t.revision file_path = join_path(pkg.stage.source_path, t.file) diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py index 962a150909..69d675fe3c 100644 --- a/lib/spack/spack/test/svn_fetch.py +++ b/lib/spack/spack/test/svn_fetch.py @@ -33,12 +33,19 @@ from spack.version import ver @pytest.fixture(params=['default', 'rev0']) def type_of_test(request): - """Returns one of the test type available for the mock_hg_repository""" + """Returns one of the test type available for the mock_svn_repository""" + return request.param + + +@pytest.fixture(params=[True, False]) +def secure(request): + """Attempt both secure and insecure fetching""" return request.param def test_fetch( type_of_test, + secure, mock_svn_repository, config, refresh_builtin_mock @@ -56,13 +63,18 @@ def test_fetch( t = mock_svn_repository.checks[type_of_test] h = mock_svn_repository.hash # Construct the package under test - spec = Spec('hg-test') + spec = Spec('svn-test') spec.concretize() pkg = spack.repo.get(spec, new=True) - pkg.versions[ver('hg')] = t.args + pkg.versions[ver('svn')] = t.args # Enter the stage directory and check some properties with pkg.stage: - pkg.do_stage() + try: + spack.insecure = secure + pkg.do_stage() + finally: + spack.insecure = False + assert h() == t.revision file_path = join_path(pkg.stage.source_path, t.file) diff --git a/var/spack/repos/builtin/packages/mercurial/package.py b/var/spack/repos/builtin/packages/mercurial/package.py index ea77953f15..b383560cfe 100644 --- a/var/spack/repos/builtin/packages/mercurial/package.py +++ b/var/spack/repos/builtin/packages/mercurial/package.py @@ -23,16 +23,23 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -import llnl.util.tty as tty -import os +from llnl.util import tty -class Mercurial(Package): +class Mercurial(PythonPackage): """Mercurial is a free, distributed source control management tool.""" homepage = "https://www.mercurial-scm.org" - url = "https://www.mercurial-scm.org/release/mercurial-3.9.tar.gz" + url = "https://www.mercurial-scm.org/release/mercurial-4.1.2.tar.gz" + import_modules = [ + 'hgext', 'hgext3rd', 'mercurial', 'hgext.convert', 'hgext.fsmonitor', + 'hgext.highlight', 'hgext.largefiles', 'hgext.zeroconf', + 'hgext.fsmonitor.pywatchman', 'mercurial.hgweb', + 'mercurial.httpclient', 'mercurial.pure' + ] + + version('4.1.2', '934c99808bdc8385e074b902d59b0d93') version('3.9.1', '3759dd10edb8c1a6dfb8ff0ce82658ce') version('3.9', 'e2b355da744e94747daae3a5339d28a0') version('3.8.4', 'cec2c3db688cb87142809089c6ae13e9') @@ -40,30 +47,62 @@ class Mercurial(Package): version('3.8.2', 'c38daa0cbe264fc621dc3bb05933b0b3') version('3.8.1', '172a8c588adca12308c2aca16608d7f4') - extends('python') depends_on('python@2.6:2.8') depends_on('py-docutils', type='build') + depends_on('py-pygments', type=('build', 'run')) + depends_on('py-certifi', type=('build', 'run')) + + @run_after('install') + def post_install(self): + prefix = self.prefix + + # Install man pages + mkdirp(prefix.man1) + mkdirp(prefix.man5) + mkdirp(prefix.man8) + with working_dir('doc'): + install('hg.1', prefix.man1) + install('hgignore.5', prefix.man5) + install('hgrc.5', prefix.man5) + install('hg-ssh.8', prefix.man8) + + # Install completion scripts + contrib = join_path(prefix, 'contrib') + mkdir(contrib) + with working_dir('contrib'): + install('bash_completion', join_path(contrib, 'bash_completion')) + install('zsh_completion', join_path(contrib, 'zsh_completion')) + + @run_after('install') + def configure_certificates(self): + """Configuration of HTTPS certificate authorities + https://www.mercurial-scm.org/wiki/CACertificates""" - def install(self, spec, prefix): - make('install', 'PREFIX={0}'.format(prefix)) + etc_dir = join_path(self.prefix.etc, 'mercurial') + mkdirp(etc_dir) - # Configuration of HTTPS certificate authorities - # https://www.mercurial-scm.org/wiki/CACertificates - hgrc_filename = join_path(prefix.etc, 'mercurial', 'hgrc') - mkdirp(os.path.dirname(hgrc_filename)) + hgrc_filename = join_path(etc_dir, 'hgrc') + # Use certifi to find the location of the CA certificate + certificate = python('-c', 'import certifi; print certifi.where()', + output=str) + + if not certificate: + tty.warn('CA certificate not found. You may not be able to ' + 'connect to an HTTPS server. If your CA certificate ' + 'is in a non-standard location, you should add it to ' + '{0}.'.format(hgrc_filename)) + + # Write the global mercurial configuration file with open(hgrc_filename, 'w') as hgrc: - if os.path.exists('/etc/ssl/certs/ca-certificates.crt'): - # Debian/Ubuntu/Gentoo/Arch Linux - hgrc.write('[web]\ncacerts = /etc/ssl/certs/ca-certificates.crt') # noqa - elif os.path.exists('/etc/pki/tls/certs/ca-bundle.crt'): - # Fedora/RHEL/CentOS - hgrc.write('[web]\ncacerts = /etc/pki/tls/certs/ca-bundle.crt') - elif os.path.exists('/etc/ssl/ca-bundle.pem'): - # openSUSE/SLE - hgrc.write('[web]\ncacerts = /etc/ssl/ca-bundle.pem') - else: - tty.warn('CA certificate not found. You may not be able to ' - 'connect to an HTTPS server. If your CA certificate ' - 'is in a non-standard location, you should add it to ' - '{0}'.format(hgrc_filename)) + hgrc.write('[web]\ncacerts = {0}'.format(certificate)) + + @run_after('install') + @on_package_attributes(run_tests=True) + def check_install(self): + """Sanity-check setup.""" + + hg = Executable(join_path(self.prefix.bin, 'hg')) + + hg('debuginstall') + hg('version') diff --git a/var/spack/repos/builtin/packages/py-appdirs/package.py b/var/spack/repos/builtin/packages/py-appdirs/package.py index 360f56d987..802d59b99b 100644 --- a/var/spack/repos/builtin/packages/py-appdirs/package.py +++ b/var/spack/repos/builtin/packages/py-appdirs/package.py @@ -30,8 +30,11 @@ class PyAppdirs(PythonPackage): dirs, e.g. a "user data dir".""" homepage = "https://github.com/ActiveState/appdirs" - url = "https://pypi.io/packages/source/a/appdirs/appdirs-1.4.0.tar.gz" + url = "https://pypi.io/packages/source/a/appdirs/appdirs-1.4.3.tar.gz" + import_modules = ['appdirs'] + + version('1.4.3', '44c679904082a2133f5566c8a0d3ab42') version('1.4.0', '1d17b4c9694ab84794e228f28dc3275b') patch('setuptools-import.patch', when='@:1.4.0') diff --git a/var/spack/repos/builtin/packages/py-certifi/package.py b/var/spack/repos/builtin/packages/py-certifi/package.py index 959c0221ed..7d8095f3f9 100644 --- a/var/spack/repos/builtin/packages/py-certifi/package.py +++ b/var/spack/repos/builtin/packages/py-certifi/package.py @@ -29,9 +29,12 @@ class PyCertifi(PythonPackage): """Certifi: A carefully curated collection of Root Certificates for validating the trustworthiness of SSL certificates while verifying the identity of TLS hosts.""" - homepage = "https://github.com/certifi/python-certifi" - url = "https://github.com/certifi/python-certifi/archive/2016.02.28.tar.gz" + homepage = "http://certifi.io/" + url = "https://pypi.io/packages/source/c/certifi/certifi-2017.1.23.tar.gz" + import_modules = ['certifi'] + + version('2017.1.23', 'b72521a8badff5e89a8eabea586d79ab') version('2016.02.28', '5ccfc23bd5e931863f0b01ef3e9d2dbd3bef0e1b') depends_on('py-setuptools', type='build') diff --git a/var/spack/repos/builtin/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py index c0fbae639b..4d1f6ee5ad 100644 --- a/var/spack/repos/builtin/packages/py-cffi/package.py +++ b/var/spack/repos/builtin/packages/py-cffi/package.py @@ -23,15 +23,18 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * +import sys class PyCffi(PythonPackage): """Foreign Function Interface for Python calling C code""" homepage = "http://cffi.readthedocs.org/en/latest/" - # base https://pypi.python.org/pypi/cffi - url = "https://pypi.python.org/packages/source/c/cffi/cffi-1.1.2.tar.gz" + url = "https://pypi.io/packages/source/c/cffi/cffi-1.10.0.tar.gz" - version('1.1.2', 'ca6e6c45b45caa87aee9adc7c796eaea') + import_modules = ['cffi'] + + version('1.10.0', '2b5fa41182ed0edaf929a789e602a070') + version('1.1.2', 'ca6e6c45b45caa87aee9adc7c796eaea') depends_on('py-setuptools', type='build') depends_on('py-pycparser', type=('build', 'run')) @@ -44,4 +47,5 @@ class PyCffi(PythonPackage): # other compilation. We are setting the 'LDSHARED" to the # spack compiler wrapper plus a few extra flags necessary for # building the shared library. - spack_env.set('LDSHARED', "{0} -shared -pthread".format(spack_cc)) + if not sys.platform == 'darwin': + spack_env.set('LDSHARED', "{0} -shared -pthread".format(spack_cc)) diff --git a/var/spack/repos/builtin/packages/py-docutils/package.py b/var/spack/repos/builtin/packages/py-docutils/package.py index 00741284df..76a723e34d 100644 --- a/var/spack/repos/builtin/packages/py-docutils/package.py +++ b/var/spack/repos/builtin/packages/py-docutils/package.py @@ -33,8 +33,18 @@ class PyDocutils(PythonPackage): markup language.""" homepage = "http://docutils.sourceforge.net/" - url = "https://pypi.python.org/packages/source/d/docutils/docutils-0.12.tar.gz" + url = "https://pypi.io/packages/source/d/docutils/docutils-0.13.1.tar.gz" - version('0.13.1', 'ea4a893c633c788be9b8078b6b305d53', - url="https://pypi.python.org/packages/05/25/7b5484aca5d46915493f1fd4ecb63c38c333bd32aa9ad6e19da8d08895ae/docutils-0.13.1.tar.gz") + import_modules = [ + 'docutils', 'docutils.languages', 'docutils.parsers', + 'docutils.readers', 'docutils.transforms', 'docutils.utils', + 'docutils.writers', 'docutils.parsers.rst', + 'docutils.parsers.rst.directives', 'docutils.parsers.rst.languages', + 'docutils.utils.math', 'docutils.writers.html4css1', + 'docutils.writers.html5_polyglot', 'docutils.writers.latex2e', + 'docutils.writers.odf_odt', 'docutils.writers.pep_html', + 'docutils.writers.s5_html', 'docutils.writers.xetex' + ] + + version('0.13.1', 'ea4a893c633c788be9b8078b6b305d53') version('0.12', '4622263b62c5c771c03502afa3157768') diff --git a/var/spack/repos/builtin/packages/py-packaging/package.py b/var/spack/repos/builtin/packages/py-packaging/package.py index 506bb6f976..4ee97a507a 100644 --- a/var/spack/repos/builtin/packages/py-packaging/package.py +++ b/var/spack/repos/builtin/packages/py-packaging/package.py @@ -31,6 +31,8 @@ class PyPackaging(PythonPackage): homepage = "https://github.com/pypa/packaging" url = "https://pypi.io/packages/source/p/packaging/packaging-16.8.tar.gz" + import_modules = ['packaging'] + version('16.8', '53895cdca04ecff80b54128e475b5d3b') # Not needed for the installation, but used at runtime diff --git a/var/spack/repos/builtin/packages/py-pycparser/package.py b/var/spack/repos/builtin/packages/py-pycparser/package.py index 8de5c39d32..a2c00fe33a 100644 --- a/var/spack/repos/builtin/packages/py-pycparser/package.py +++ b/var/spack/repos/builtin/packages/py-pycparser/package.py @@ -28,8 +28,11 @@ from spack import * class PyPycparser(PythonPackage): """A complete parser of the C language, written in pure python.""" homepage = "https://github.com/eliben/pycparser" - url = "https://pypi.python.org/packages/source/p/pycparser/pycparser-2.13.tar.gz" + url = "https://pypi.io/packages/source/p/pycparser/pycparser-2.17.tar.gz" + import_modules = ['pycparser', 'pycparser.ply'] + + version('2.17', 'ca98dcb50bc1276f230118f6af5a40c7') version('2.13', 'e4fe1a2d341b22e25da0d22f034ef32f') depends_on('py-setuptools', type='build') diff --git a/var/spack/repos/builtin/packages/py-pygments/package.py b/var/spack/repos/builtin/packages/py-pygments/package.py index 42e3366cdf..0312a4f9aa 100644 --- a/var/spack/repos/builtin/packages/py-pygments/package.py +++ b/var/spack/repos/builtin/packages/py-pygments/package.py @@ -29,8 +29,14 @@ class PyPygments(PythonPackage): """Pygments is a syntax highlighting package written in Python.""" homepage = "https://pypi.python.org/pypi/pygments" - url = "https://pypi.python.org/packages/source/P/Pygments/Pygments-2.0.1.tar.gz" + url = "https://pypi.io/packages/source/P/Pygments/Pygments-2.2.0.tar.gz" + import_modules = [ + 'pygments', 'pygments.filters', 'pygments.formatters', + 'pygments.lexers', 'pygments.styles' + ] + + version('2.2.0', '13037baca42f16917cbd5ad2fab50844') version('2.1.3', 'ed3fba2467c8afcda4d317e4ef2c6150') version('2.0.1', 'e0daf4c14a4fe5b630da765904de4d6c') version('2.0.2', '238587a1370d62405edabd0794b3ec4a') diff --git a/var/spack/repos/builtin/packages/py-pyparsing/package.py b/var/spack/repos/builtin/packages/py-pyparsing/package.py index 936295a132..1d0c5a3bf0 100644 --- a/var/spack/repos/builtin/packages/py-pyparsing/package.py +++ b/var/spack/repos/builtin/packages/py-pyparsing/package.py @@ -28,8 +28,11 @@ from spack import * class PyPyparsing(PythonPackage): """A Python Parsing Module.""" homepage = "https://pypi.python.org/pypi/pyparsing" - url = "https://pypi.io/packages/source/p/pyparsing/pyparsing-2.0.3.tar.gz" + url = "https://pypi.io/packages/source/p/pyparsing/pyparsing-2.2.0.tar.gz" + import_modules = ['pyparsing'] + + version('2.2.0', '0214e42d63af850256962b6744c948d9') version('2.1.10', '065908b92904e0d3634eb156f44cc80e') version('2.0.3', '0fe479be09fc2cf005f753d3acc35939') diff --git a/var/spack/repos/builtin/packages/py-setuptools/package.py b/var/spack/repos/builtin/packages/py-setuptools/package.py index 94ee8a7fc4..6caccd63a4 100644 --- a/var/spack/repos/builtin/packages/py-setuptools/package.py +++ b/var/spack/repos/builtin/packages/py-setuptools/package.py @@ -32,12 +32,10 @@ class PySetuptools(PythonPackage): homepage = "https://pypi.python.org/pypi/setuptools" url = "https://pypi.io/packages/source/s/setuptools/setuptools-25.2.0.tar.gz" - import_modules = [ - 'pkg_resources', 'setuptools', 'pkg_resources.extern', - 'pkg_resources._vendor', 'pkg_resources._vendor.packaging', - 'setuptools.extern', 'setuptools.command' - ] + import_modules = ['pkg_resources', 'setuptools', 'setuptools.command'] + version('34.4.1', '5f9b07aeaafd29eac2548fc0b89a4934', + url="https://pypi.io/packages/source/s/setuptools/setuptools-34.4.1.zip") version('34.2.0', '41b630da4ea6cfa5894d9eb3142922be', url="https://pypi.io/packages/source/s/setuptools/setuptools-34.2.0.zip") version('25.2.0', 'a0dbb65889c46214c691f6c516cf959c') diff --git a/var/spack/repos/builtin/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py index b2faad3819..47a53438b5 100644 --- a/var/spack/repos/builtin/packages/py-six/package.py +++ b/var/spack/repos/builtin/packages/py-six/package.py @@ -29,7 +29,9 @@ class PySix(PythonPackage): """Python 2 and 3 compatibility utilities.""" homepage = "https://pypi.python.org/pypi/six" - url = "https://pypi.io/packages/source/s/six/six-1.9.0.tar.gz" + url = "https://pypi.io/packages/source/s/six/six-1.10.0.tar.gz" + + import_modules = ['six'] version('1.10.0', '34eed507548117b2ab523ab14b2f8b55') version('1.9.0', '476881ef4012262dfc8adc645ee786c4') -- cgit v1.2.3-70-g09d2 From e12f2c18557e67d927d351c36b0760e9b7826956 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 19 Apr 2017 23:33:14 -0500 Subject: Set proper deptypes for certain build systems (#3866) * Set proper deptypes for certain build systems * Add depends_on to namespace --- lib/spack/spack/build_systems/perl.py | 6 ++++-- lib/spack/spack/build_systems/python.py | 4 +++- lib/spack/spack/build_systems/r.py | 4 +++- 3 files changed, 10 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/perl.py b/lib/spack/spack/build_systems/perl.py index 78184c85dc..2f272373d2 100644 --- a/lib/spack/spack/build_systems/perl.py +++ b/lib/spack/spack/build_systems/perl.py @@ -27,7 +27,7 @@ import inspect import os from llnl.util.filesystem import join_path -from spack.directives import extends +from spack.directives import depends_on, extends from spack.package import PackageBase, run_after from spack.util.executable import Executable @@ -64,6 +64,8 @@ class PerlPackage(PackageBase): extends('perl') + depends_on('perl', type=('build', 'run')) + def configure_args(self): """Produces a list containing the arguments that must be passed to :py:meth:`~.PerlPackage.configure`. Arguments should not include @@ -85,7 +87,7 @@ class PerlPackage(PackageBase): self.build_executable = inspect.getmodule(self).make elif os.path.isfile('Build.PL'): self.build_method = 'Build.PL' - self.build_executable = Executable( + self.build_executable = Executable( join_path(self.stage.source_path, 'Build')) else: raise RuntimeError('Unknown build_method for perl package') diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 2c8ccebae6..904f0dbaa0 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -26,7 +26,7 @@ import inspect import os -from spack.directives import extends +from spack.directives import depends_on, extends from spack.package import PackageBase, run_after from llnl.util.filesystem import working_dir @@ -114,6 +114,8 @@ class PythonPackage(PackageBase): extends('python') + depends_on('python', type=('build', 'run')) + def setup_file(self): """Returns the name of the setup file to use.""" return 'setup.py' diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index cde3dc9fdd..618ba398e1 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -25,7 +25,7 @@ import inspect -from spack.directives import extends +from spack.directives import depends_on, extends from spack.package import PackageBase, run_after @@ -47,6 +47,8 @@ class RPackage(PackageBase): extends('r') + depends_on('r', type=('build', 'run')) + def install(self, spec, prefix): """Installs an R package.""" inspect.getmodule(self).R( -- cgit v1.2.3-70-g09d2 From a65c37f15dff4b4d60784fd4fcc55874ce9d6d11 Mon Sep 17 00:00:00 2001 From: scheibelp Date: Wed, 19 Apr 2017 21:59:18 -0700 Subject: Override partial installs by default (#3530) * Package install remove prior unfinished installs Depending on how spack is terminated in the middle of building a package it may leave a partially installed package in the install prefix. Originally Spack treated the package as being installed if the prefix was present, in which case the user would have to manually remove the installation prefix before restarting an install. This commit adds a more thorough check to ensure that a package is actually installed. If the installation prefix is present but Spack determines that the install did not complete, it removes the installation prefix and starts a new install; if the user has enabled --keep-prefix, then Spack reverts to its old behavior. * Added test for partial install handling * Added test for restoring DB * Style fixes * Restoring 2.6 compatibility * Relocated repair logic to separate function * If --keep-prefix is set, package installs will continue an install from an existing prefix if one is present * check metadata consistency when continuing partial install * Added --force option to make spack reinstall a package (and all dependencies) from scratch * Updated bash completion; removed '-f' shorthand for '--force' for install command * dont use multiple write modes for completion file --- lib/spack/spack/cmd/install.py | 9 ++ lib/spack/spack/directory_layout.py | 27 ++++- lib/spack/spack/package.py | 51 ++++++++- lib/spack/spack/test/install.py | 123 +++++++++++++++++++++ share/spack/spack-completion.bash | 2 +- .../repos/builtin.mock/packages/canfail/package.py | 41 +++++++ 6 files changed, 245 insertions(+), 8 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/canfail/package.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index fb01fc2d5e..08dc080e8e 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -72,6 +72,9 @@ the dependencies""" subparser.add_argument( '--fake', action='store_true', dest='fake', help="fake install. just remove prefix and create a fake file") + subparser.add_argument( + '--force', action='store_true', dest='force', + help='Install again even if package is already installed.') cd_group = subparser.add_mutually_exclusive_group() arguments.add_common_arguments(cd_group, ['clean', 'dirty']) @@ -319,6 +322,12 @@ def install(parser, args, **kwargs): tty.error('The `spack install` command requires a spec to install.') for spec in specs: + if args.force: + for s in spec.traverse(): + if s.package.installed: + tty.msg("Clearing %s for new installation" % s.name) + s.package.do_uninstall(force=True) + # Check if we were asked to produce some log for dashboards if args.log_format is not None: # Compute the filename for logging diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 9d09875484..e220a2d430 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -239,6 +239,17 @@ class YamlDirectoryLayout(DirectoryLayout): return join_path(self.path_for_spec(spec), self.metadata_dir, self.packages_dir) + def _completion_marker_file(self, spec): + return join_path(self.path_for_spec(spec), self.metadata_dir, + 'complete') + + def mark_complete(self, spec): + with open(self._completion_marker_file(spec), 'w'): + pass + + def completed_install(self, spec): + return os.path.exists(self._completion_marker_file(spec)) + def create_install_directory(self, spec): _check_concrete(spec) @@ -252,26 +263,34 @@ class YamlDirectoryLayout(DirectoryLayout): def check_installed(self, spec): _check_concrete(spec) path = self.path_for_spec(spec) - spec_file_path = self.spec_file_path(spec) if not os.path.isdir(path): return None + elif not self.completed_install(spec): + raise InconsistentInstallDirectoryError( + 'The prefix %s contains a partial install' % path) + + self.check_metadata_consistency(spec) + return path + + def check_metadata_consistency(self, spec): + spec_file_path = self.spec_file_path(spec) if not os.path.isfile(spec_file_path): raise InconsistentInstallDirectoryError( 'Install prefix exists but contains no spec.yaml:', - " " + path) + " " + spec.prefix) installed_spec = self.read_spec(spec_file_path) if installed_spec == spec: - return path + return # DAG hashes currently do not include build dependencies. # # TODO: remove this when we do better concretization and don't # ignore build-only deps in hashes. elif installed_spec == spec.copy(deps=('link', 'run')): - return path + return if spec.dag_hash() == installed_spec.dag_hash(): raise SpecHashCollisionError(spec, installed_spec) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 108ddeff07..e6eea35a80 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -856,7 +856,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): @property def installed(self): - return os.path.isdir(self.prefix) + return spack.store.layout.completed_install(self.spec) @property def prefix_lock(self): @@ -1174,10 +1174,16 @@ class PackageBase(with_metaclass(PackageMeta, object)): (self.name, self.spec.external)) return + self.repair_partial(keep_prefix) + # Ensure package is not already installed layout = spack.store.layout with self._prefix_read_lock(): - if layout.check_installed(self.spec): + if (keep_prefix and os.path.isdir(self.prefix) and + (not self.installed)): + tty.msg( + "Continuing from partial install of %s" % self.name) + elif layout.check_installed(self.spec): tty.msg( "%s is already installed in %s" % (self.name, self.prefix)) rec = spack.store.db.get_record(self.spec) @@ -1305,9 +1311,11 @@ class PackageBase(with_metaclass(PackageMeta, object)): try: # Create the install prefix and fork the build process. - spack.store.layout.create_install_directory(self.spec) + if (not keep_prefix) or (not os.path.isdir(self.prefix)): + spack.store.layout.create_install_directory(self.spec) # Fork a child to do the actual installation spack.build_environment.fork(self, build_process, dirty=dirty) + spack.store.layout.mark_complete(self.spec) # If we installed then we should keep the prefix keep_prefix = True if self.last_phase is None else keep_prefix # note: PARENT of the build process adds the new package to @@ -1332,6 +1340,43 @@ class PackageBase(with_metaclass(PackageMeta, object)): if not keep_prefix: self.remove_prefix() + def repair_partial(self, continue_with_partial=False): + """If continue_with_partial is not set, this ensures that the package + is either fully-installed or that the prefix is removed. If the + package is installed but there is no DB entry then this adds a + record. If continue_with_partial is not set this also clears the + stage directory to start an installation from scratch. + """ + layout = spack.store.layout + with self._prefix_read_lock(): + if (os.path.isdir(self.prefix) and not self.installed and + not continue_with_partial): + spack.hooks.pre_uninstall(self) + self.remove_prefix() + try: + spack.store.db.remove(self.spec) + except KeyError: + pass + spack.hooks.post_uninstall(self) + tty.msg("Removed partial install for %s" % + self.spec.short_spec) + elif self.installed and layout.check_installed(self.spec): + try: + spack.store.db.get_record(self.spec) + except KeyError: + tty.msg("Repairing db for %s" % self.name) + spack.store.db.add(self.spec) + + if continue_with_partial and not self.installed: + try: + layout.check_metadata_consistency(self.spec) + except directory_layout.DirectoryLayoutError: + self.remove_prefix() + + if not continue_with_partial: + self.stage.destroy() + self.stage.create() + def _do_install_pop_kwargs(self, kwargs): """Pops kwargs from do_install before starting the installation diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index f10c3a37e9..08694f7ee8 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -30,6 +30,8 @@ from spack.directory_layout import YamlDirectoryLayout from spack.fetch_strategy import URLFetchStrategy, FetchStrategyComposite from spack.spec import Spec +import os + @pytest.fixture() def install_mockery(tmpdir, config, builtin_mock): @@ -77,6 +79,123 @@ def test_install_and_uninstall(mock_archive): raise +def mock_remove_prefix(*args): + raise MockInstallError( + "Intentional error", + "Mock remove_prefix method intentionally fails") + + +@pytest.mark.usefixtures('install_mockery') +def test_partial_install(mock_archive): + spec = Spec('canfail') + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + try: + spack.package.Package.remove_prefix = mock_remove_prefix + try: + pkg.do_install() + except MockInstallError: + pass + spack.package.Package.remove_prefix = remove_prefix + setattr(pkg, 'succeed', True) + pkg.do_install() + assert pkg.installed + finally: + spack.package.Package.remove_prefix = remove_prefix + try: + delattr(pkg, 'succeed') + except AttributeError: + pass + + +@pytest.mark.usefixtures('install_mockery') +def test_partial_install_keep_prefix(mock_archive): + spec = Spec('canfail') + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + try: + spack.package.Package.remove_prefix = mock_remove_prefix + try: + pkg.do_install() + except MockInstallError: + pass + # Don't repair remove_prefix at this point, set keep_prefix so that + # Spack continues with a partial install + setattr(pkg, 'succeed', True) + pkg.do_install(keep_prefix=True) + assert pkg.installed + finally: + spack.package.Package.remove_prefix = remove_prefix + try: + delattr(pkg, 'succeed') + except AttributeError: + pass + + +@pytest.mark.usefixtures('install_mockery') +def test_partial_install_keep_prefix_check_metadata(mock_archive): + spec = Spec('canfail') + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + try: + spack.package.Package.remove_prefix = mock_remove_prefix + try: + pkg.do_install() + except MockInstallError: + pass + os.remove(spack.store.layout.spec_file_path(spec)) + spack.package.Package.remove_prefix = remove_prefix + setattr(pkg, 'succeed', True) + pkg.do_install(keep_prefix=True) + assert pkg.installed + spack.store.layout.check_metadata_consistency(spec) + finally: + spack.package.Package.remove_prefix = remove_prefix + try: + delattr(pkg, 'succeed') + except AttributeError: + pass + + +@pytest.mark.usefixtures('install_mockery') +def test_install_succeeds_but_db_add_fails(mock_archive): + """If an installation succeeds but the database is not updated, make sure + that the database is updated for a future install.""" + spec = Spec('cmake') + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + db_add = spack.store.db.add + + def mock_db_add(*args, **kwargs): + raise MockInstallError( + "Intentional error", "Mock db add method intentionally fails") + + try: + spack.package.Package.remove_prefix = mock_remove_prefix + spack.store.db.add = mock_db_add + try: + pkg.do_install() + except MockInstallError: + pass + assert pkg.installed + + spack.package.Package.remove_prefix = remove_prefix + spack.store.db.add = db_add + pkg.do_install() + assert spack.store.db.get_record(spec) + except: + spack.package.Package.remove_prefix = remove_prefix + raise + + @pytest.mark.usefixtures('install_mockery') def test_store(mock_archive): spec = Spec('cmake-client').concretized() @@ -102,3 +221,7 @@ def test_failing_build(mock_archive): pkg = spec.package with pytest.raises(spack.build_environment.ChildError): pkg.do_install() + + +class MockInstallError(spack.error.SpackError): + pass diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 819dcc06ab..1167690fa2 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -407,7 +407,7 @@ function _spack_install { then compgen -W "-h --help --only -j --jobs --keep-prefix --keep-stage -n --no-checksum -v --verbose --fake --clean --dirty - --run-tests --log-format --log-file" -- "$cur" + --run-tests --log-format --log-file --force" -- "$cur" else compgen -W "$(_all_packages)" -- "$cur" fi diff --git a/var/spack/repos/builtin.mock/packages/canfail/package.py b/var/spack/repos/builtin.mock/packages/canfail/package.py new file mode 100644 index 0000000000..bef4f6e838 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/canfail/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Canfail(Package): + """Package which fails install unless a special attribute is set""" + + homepage = "http://www.example.com" + url = "http://www.example.com/a-1.0.tar.gz" + + version('1.0', '0123456789abcdef0123456789abcdef') + + def install(self, spec, prefix): + try: + getattr(self, 'succeed') + touch(join_path(prefix, 'an_installation_file')) + except AttributeError: + raise InstallError() -- cgit v1.2.3-70-g09d2 From 50d7b335634d4cece65c819551e5370ec7cc126d Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 20 Apr 2017 10:18:52 +0200 Subject: test/python_version.py: ported to pytest (#3438) --- lib/spack/spack/test/python_version.py | 164 +++++++++++++++++---------------- 1 file changed, 85 insertions(+), 79 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/python_version.py b/lib/spack/spack/test/python_version.py index ee0ff9d2c9..d58df1a0aa 100644 --- a/lib/spack/spack/test/python_version.py +++ b/lib/spack/spack/test/python_version.py @@ -36,7 +36,6 @@ from __future__ import print_function import os import sys import re -import unittest import llnl.util.tty as tty import spack @@ -65,83 +64,90 @@ else: os.path.join(spack.lib_path, 'external', 'pyqver2.py')] -class PythonVersionTest(unittest.TestCase): - - def pyfiles(self, search_paths, exclude=()): - """List python search files in a set of search paths, excluding - any paths in the exclude list""" - # first file is the spack script. - yield spack.spack_file - - # Iterate through the whole spack source tree. - for path in search_paths: - for root, dirnames, filenames in os.walk(path): - for filename in filenames: - realpath = os.path.realpath(os.path.join(root, filename)) - if any(realpath.startswith(p) for p in exclude): - continue - - if re.match(r'^[^.#].*\.py$', filename): - yield os.path.join(root, filename) - - def check_python_versions(self, files): - # This is a dict dict mapping: - # version -> filename -> reasons - # - # Reasons are tuples of (lineno, string), where the string is the - # cause for a version incompatibility. - all_issues = {} - - # Parse files and run pyqver on each file. - for path in files: - with open(path) as pyfile: - full_text = pyfile.read() - versions = pyqver.get_versions(full_text, path) - - for ver, reasons in versions.items(): - if ver <= spack_min_supported: +def pyfiles(search_paths, exclude=()): + """Generator that yields all the python files in the search paths. + + :param search_paths: list of paths to search for python files + :param exclude: file paths to exclude from search + :return: python files + """ + # first file is the spack script. + yield spack.spack_file + + # Iterate through the whole spack source tree. + for path in search_paths: + for root, dirnames, filenames in os.walk(path): + for filename in filenames: + realpath = os.path.realpath(os.path.join(root, filename)) + if any(realpath.startswith(p) for p in exclude): continue - # Record issues. Mark exceptions with '# nopyqver' comment - for lineno, cause in reasons: - lines = full_text.split('\n') - if not re.search(r'#\s*nopyqver\s*$', lines[lineno - 1]): - all_issues.setdefault(ver, {})[path] = reasons - - # Print a message if there are are issues - if all_issues: - tty.msg("Spack must remain compatible with Python version %d.%d" - % spack_min_supported) - - # Print out a table showing which files/linenos require which - # python version, and a string describing why. - for v in sorted(all_issues.keys(), reverse=True): - messages = [] - for path in sorted(all_issues[v].keys()): - short_path = path - if path.startswith(spack.prefix): - short_path = path[len(spack.prefix):] - - reasons = [r for r in set(all_issues[v][path]) if r] - for lineno, cause in reasons: - file_line = "%s:%s" % (short_path.lstrip('/'), lineno) - messages.append((file_line, cause)) - - print() - tty.msg("These files require version %d.%d:" % v) - maxlen = max(len(f) for f, prob in messages) - fmt = "%%-%ds%%s" % (maxlen + 3) - print(fmt % ('File', 'Reason')) - print(fmt % ('-' * (maxlen), '-' * 20)) - for msg in messages: - print(fmt % msg) - - # Fail this test if there were issues. - self.assertTrue(len(all_issues) == 0) - - def test_core_module_compatibility(self): - self.check_python_versions( - self.pyfiles([spack.lib_path], exclude=exclude_paths)) - - def test_package_module_compatibility(self): - self.check_python_versions(self.pyfiles([spack.packages_path])) + if re.match(r'^[^.#].*\.py$', filename): + yield os.path.join(root, filename) + + +def check_python_versions(files): + """Check that a set of Python files works with supported Ptyhon versions""" + # This is a dict dict mapping: + # version -> filename -> reasons + # + # Reasons are tuples of (lineno, string), where the string is the + # cause for a version incompatibility. + all_issues = {} + + # Parse files and run pyqver on each file. + for path in files: + with open(path) as pyfile: + full_text = pyfile.read() + versions = pyqver.get_versions(full_text, path) + + for ver, reasons in versions.items(): + if ver <= spack_min_supported: + continue + + # Record issues. Mark exceptions with '# nopyqver' comment + for lineno, cause in reasons: + lines = full_text.split('\n') + if not re.search(r'#\s*nopyqver\s*$', lines[lineno - 1]): + all_issues.setdefault(ver, {})[path] = reasons + + # Print a message if there are are issues + if all_issues: + tty.msg("Spack must remain compatible with Python version %d.%d" + % spack_min_supported) + + # Print out a table showing which files/linenos require which + # python version, and a string describing why. + for v in sorted(all_issues.keys(), reverse=True): + messages = [] + for path in sorted(all_issues[v].keys()): + short_path = path + if path.startswith(spack.prefix): + short_path = path[len(spack.prefix):] + + reasons = [r for r in set(all_issues[v][path]) if r] + for lineno, cause in reasons: + file_line = "%s:%s" % (short_path.lstrip('/'), lineno) + messages.append((file_line, cause)) + + print() + tty.msg("These files require version %d.%d:" % v) + maxlen = max(len(f) for f, prob in messages) + fmt = "%%-%ds%%s" % (maxlen + 3) + print(fmt % ('File', 'Reason')) + print(fmt % ('-' * (maxlen), '-' * 20)) + for msg in messages: + print(fmt % msg) + + # Fail this test if there were issues. + assert not all_issues + + +def test_core_module_compatibility(): + """Test that all core spack modules work with supported Python versions.""" + check_python_versions(pyfiles([spack.lib_path], exclude=exclude_paths)) + + +def test_package_module_compatibility(): + """Test that all spack packages work with supported Python versions.""" + check_python_versions(pyfiles([spack.packages_path])) -- cgit v1.2.3-70-g09d2 From beeca6bb541787dab06a91272c0e18136076463e Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Thu, 20 Apr 2017 03:53:41 -0700 Subject: Revert "Override partial installs by default" (#3918) * Revert "Override partial installs by default (#3530)" This reverts commit a65c37f15dff4b4d60784fd4fcc55874ce9d6d11. --- lib/spack/spack/cmd/install.py | 9 -- lib/spack/spack/directory_layout.py | 27 +---- lib/spack/spack/package.py | 51 +-------- lib/spack/spack/test/install.py | 123 --------------------- share/spack/spack-completion.bash | 2 +- .../repos/builtin.mock/packages/canfail/package.py | 41 ------- 6 files changed, 8 insertions(+), 245 deletions(-) delete mode 100644 var/spack/repos/builtin.mock/packages/canfail/package.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 08dc080e8e..fb01fc2d5e 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -72,9 +72,6 @@ the dependencies""" subparser.add_argument( '--fake', action='store_true', dest='fake', help="fake install. just remove prefix and create a fake file") - subparser.add_argument( - '--force', action='store_true', dest='force', - help='Install again even if package is already installed.') cd_group = subparser.add_mutually_exclusive_group() arguments.add_common_arguments(cd_group, ['clean', 'dirty']) @@ -322,12 +319,6 @@ def install(parser, args, **kwargs): tty.error('The `spack install` command requires a spec to install.') for spec in specs: - if args.force: - for s in spec.traverse(): - if s.package.installed: - tty.msg("Clearing %s for new installation" % s.name) - s.package.do_uninstall(force=True) - # Check if we were asked to produce some log for dashboards if args.log_format is not None: # Compute the filename for logging diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index e220a2d430..9d09875484 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -239,17 +239,6 @@ class YamlDirectoryLayout(DirectoryLayout): return join_path(self.path_for_spec(spec), self.metadata_dir, self.packages_dir) - def _completion_marker_file(self, spec): - return join_path(self.path_for_spec(spec), self.metadata_dir, - 'complete') - - def mark_complete(self, spec): - with open(self._completion_marker_file(spec), 'w'): - pass - - def completed_install(self, spec): - return os.path.exists(self._completion_marker_file(spec)) - def create_install_directory(self, spec): _check_concrete(spec) @@ -263,34 +252,26 @@ class YamlDirectoryLayout(DirectoryLayout): def check_installed(self, spec): _check_concrete(spec) path = self.path_for_spec(spec) + spec_file_path = self.spec_file_path(spec) if not os.path.isdir(path): return None - elif not self.completed_install(spec): - raise InconsistentInstallDirectoryError( - 'The prefix %s contains a partial install' % path) - - self.check_metadata_consistency(spec) - return path - - def check_metadata_consistency(self, spec): - spec_file_path = self.spec_file_path(spec) if not os.path.isfile(spec_file_path): raise InconsistentInstallDirectoryError( 'Install prefix exists but contains no spec.yaml:', - " " + spec.prefix) + " " + path) installed_spec = self.read_spec(spec_file_path) if installed_spec == spec: - return + return path # DAG hashes currently do not include build dependencies. # # TODO: remove this when we do better concretization and don't # ignore build-only deps in hashes. elif installed_spec == spec.copy(deps=('link', 'run')): - return + return path if spec.dag_hash() == installed_spec.dag_hash(): raise SpecHashCollisionError(spec, installed_spec) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index e6eea35a80..108ddeff07 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -856,7 +856,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): @property def installed(self): - return spack.store.layout.completed_install(self.spec) + return os.path.isdir(self.prefix) @property def prefix_lock(self): @@ -1174,16 +1174,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): (self.name, self.spec.external)) return - self.repair_partial(keep_prefix) - # Ensure package is not already installed layout = spack.store.layout with self._prefix_read_lock(): - if (keep_prefix and os.path.isdir(self.prefix) and - (not self.installed)): - tty.msg( - "Continuing from partial install of %s" % self.name) - elif layout.check_installed(self.spec): + if layout.check_installed(self.spec): tty.msg( "%s is already installed in %s" % (self.name, self.prefix)) rec = spack.store.db.get_record(self.spec) @@ -1311,11 +1305,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): try: # Create the install prefix and fork the build process. - if (not keep_prefix) or (not os.path.isdir(self.prefix)): - spack.store.layout.create_install_directory(self.spec) + spack.store.layout.create_install_directory(self.spec) # Fork a child to do the actual installation spack.build_environment.fork(self, build_process, dirty=dirty) - spack.store.layout.mark_complete(self.spec) # If we installed then we should keep the prefix keep_prefix = True if self.last_phase is None else keep_prefix # note: PARENT of the build process adds the new package to @@ -1340,43 +1332,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): if not keep_prefix: self.remove_prefix() - def repair_partial(self, continue_with_partial=False): - """If continue_with_partial is not set, this ensures that the package - is either fully-installed or that the prefix is removed. If the - package is installed but there is no DB entry then this adds a - record. If continue_with_partial is not set this also clears the - stage directory to start an installation from scratch. - """ - layout = spack.store.layout - with self._prefix_read_lock(): - if (os.path.isdir(self.prefix) and not self.installed and - not continue_with_partial): - spack.hooks.pre_uninstall(self) - self.remove_prefix() - try: - spack.store.db.remove(self.spec) - except KeyError: - pass - spack.hooks.post_uninstall(self) - tty.msg("Removed partial install for %s" % - self.spec.short_spec) - elif self.installed and layout.check_installed(self.spec): - try: - spack.store.db.get_record(self.spec) - except KeyError: - tty.msg("Repairing db for %s" % self.name) - spack.store.db.add(self.spec) - - if continue_with_partial and not self.installed: - try: - layout.check_metadata_consistency(self.spec) - except directory_layout.DirectoryLayoutError: - self.remove_prefix() - - if not continue_with_partial: - self.stage.destroy() - self.stage.create() - def _do_install_pop_kwargs(self, kwargs): """Pops kwargs from do_install before starting the installation diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index 08694f7ee8..f10c3a37e9 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -30,8 +30,6 @@ from spack.directory_layout import YamlDirectoryLayout from spack.fetch_strategy import URLFetchStrategy, FetchStrategyComposite from spack.spec import Spec -import os - @pytest.fixture() def install_mockery(tmpdir, config, builtin_mock): @@ -79,123 +77,6 @@ def test_install_and_uninstall(mock_archive): raise -def mock_remove_prefix(*args): - raise MockInstallError( - "Intentional error", - "Mock remove_prefix method intentionally fails") - - -@pytest.mark.usefixtures('install_mockery') -def test_partial_install(mock_archive): - spec = Spec('canfail') - spec.concretize() - pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) - remove_prefix = spack.package.Package.remove_prefix - try: - spack.package.Package.remove_prefix = mock_remove_prefix - try: - pkg.do_install() - except MockInstallError: - pass - spack.package.Package.remove_prefix = remove_prefix - setattr(pkg, 'succeed', True) - pkg.do_install() - assert pkg.installed - finally: - spack.package.Package.remove_prefix = remove_prefix - try: - delattr(pkg, 'succeed') - except AttributeError: - pass - - -@pytest.mark.usefixtures('install_mockery') -def test_partial_install_keep_prefix(mock_archive): - spec = Spec('canfail') - spec.concretize() - pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) - remove_prefix = spack.package.Package.remove_prefix - try: - spack.package.Package.remove_prefix = mock_remove_prefix - try: - pkg.do_install() - except MockInstallError: - pass - # Don't repair remove_prefix at this point, set keep_prefix so that - # Spack continues with a partial install - setattr(pkg, 'succeed', True) - pkg.do_install(keep_prefix=True) - assert pkg.installed - finally: - spack.package.Package.remove_prefix = remove_prefix - try: - delattr(pkg, 'succeed') - except AttributeError: - pass - - -@pytest.mark.usefixtures('install_mockery') -def test_partial_install_keep_prefix_check_metadata(mock_archive): - spec = Spec('canfail') - spec.concretize() - pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) - remove_prefix = spack.package.Package.remove_prefix - try: - spack.package.Package.remove_prefix = mock_remove_prefix - try: - pkg.do_install() - except MockInstallError: - pass - os.remove(spack.store.layout.spec_file_path(spec)) - spack.package.Package.remove_prefix = remove_prefix - setattr(pkg, 'succeed', True) - pkg.do_install(keep_prefix=True) - assert pkg.installed - spack.store.layout.check_metadata_consistency(spec) - finally: - spack.package.Package.remove_prefix = remove_prefix - try: - delattr(pkg, 'succeed') - except AttributeError: - pass - - -@pytest.mark.usefixtures('install_mockery') -def test_install_succeeds_but_db_add_fails(mock_archive): - """If an installation succeeds but the database is not updated, make sure - that the database is updated for a future install.""" - spec = Spec('cmake') - spec.concretize() - pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) - remove_prefix = spack.package.Package.remove_prefix - db_add = spack.store.db.add - - def mock_db_add(*args, **kwargs): - raise MockInstallError( - "Intentional error", "Mock db add method intentionally fails") - - try: - spack.package.Package.remove_prefix = mock_remove_prefix - spack.store.db.add = mock_db_add - try: - pkg.do_install() - except MockInstallError: - pass - assert pkg.installed - - spack.package.Package.remove_prefix = remove_prefix - spack.store.db.add = db_add - pkg.do_install() - assert spack.store.db.get_record(spec) - except: - spack.package.Package.remove_prefix = remove_prefix - raise - - @pytest.mark.usefixtures('install_mockery') def test_store(mock_archive): spec = Spec('cmake-client').concretized() @@ -221,7 +102,3 @@ def test_failing_build(mock_archive): pkg = spec.package with pytest.raises(spack.build_environment.ChildError): pkg.do_install() - - -class MockInstallError(spack.error.SpackError): - pass diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 1167690fa2..819dcc06ab 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -407,7 +407,7 @@ function _spack_install { then compgen -W "-h --help --only -j --jobs --keep-prefix --keep-stage -n --no-checksum -v --verbose --fake --clean --dirty - --run-tests --log-format --log-file --force" -- "$cur" + --run-tests --log-format --log-file" -- "$cur" else compgen -W "$(_all_packages)" -- "$cur" fi diff --git a/var/spack/repos/builtin.mock/packages/canfail/package.py b/var/spack/repos/builtin.mock/packages/canfail/package.py deleted file mode 100644 index bef4f6e838..0000000000 --- a/var/spack/repos/builtin.mock/packages/canfail/package.py +++ /dev/null @@ -1,41 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Canfail(Package): - """Package which fails install unless a special attribute is set""" - - homepage = "http://www.example.com" - url = "http://www.example.com/a-1.0.tar.gz" - - version('1.0', '0123456789abcdef0123456789abcdef') - - def install(self, spec, prefix): - try: - getattr(self, 'succeed') - touch(join_path(prefix, 'an_installation_file')) - except AttributeError: - raise InstallError() -- cgit v1.2.3-70-g09d2 From 21e4a81de0a2d450760bb1afb943cdf54018f6d1 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 20 Apr 2017 10:32:21 -0500 Subject: Add Napoleon extension to support Google docstrings (#3920) --- lib/spack/docs/conf.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index 76ff0f921b..35637093da 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -134,6 +134,7 @@ todo_include_todos = True # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.graphviz', + 'sphinx.ext.napoleon', 'sphinx.ext.todo', 'sphinxcontrib.programoutput'] -- cgit v1.2.3-70-g09d2 From 5250e8ee8966b1e7c8be2f13277bc785d5af8e73 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 21 Apr 2017 12:11:29 -0500 Subject: Fix HPL build, convert to MakefilePackage (#3777) * Fix HPL build, convert to MakefilePackage * Flake8 fix * Fix: spec -> self.spec * Properly query for system libraries * Update Intel-MKL as well * Recurse in system libs, fix MKL path, fixes lapack_libs --- lib/spack/llnl/util/filesystem.py | 49 ++++++++++++++++++++++ var/spack/repos/builtin/packages/hpl/package.py | 28 ++++++------- .../repos/builtin/packages/intel-mkl/package.py | 40 ++++++++++++------ .../packages/intel-parallel-studio/package.py | 42 +++++++++++++------ 4 files changed, 118 insertions(+), 41 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 71d5096523..86122f42c8 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -47,6 +47,7 @@ __all__ = [ 'copy_mode', 'filter_file', 'find_libraries', + 'find_system_libraries', 'fix_darwin_install_name', 'force_remove', 'force_symlink', @@ -583,6 +584,54 @@ class LibraryList(collections.Sequence): return self.joined() +def find_system_libraries(args, shared=True): + """Searches the usual system library locations for the libraries + specified in args. + + Search order is as follows: + + 1. /lib64 + 2. /lib + 3. /usr/lib64 + 4. /usr/lib + 5. /usr/local/lib64 + 6. /usr/local/lib + + :param args: Library name(s) to search for + :type args: str or collections.Sequence + :param bool shared: if True searches for shared libraries, + + :returns: The libraries that have been found + :rtype: LibraryList + """ + if isinstance(args, str): + args = [args] + elif not isinstance(args, collections.Sequence): + message = '{0} expects a string or sequence of strings as the ' + message += 'first argument [got {1} instead]' + message = message.format(find_system_libraries.__name__, type(args)) + raise TypeError(message) + + libraries_found = [] + search_locations = [ + '/lib64', + '/lib', + '/usr/lib64', + '/usr/lib', + '/usr/local/lib64', + '/usr/local/lib', + ] + + for library in args: + for root in search_locations: + result = find_libraries(library, root, shared, recurse=True) + if result: + libraries_found += result + break + + return libraries_found + + def find_libraries(args, root, shared=True, recurse=False): """Returns an iterable object containing a list of full paths to libraries if found. diff --git a/var/spack/repos/builtin/packages/hpl/package.py b/var/spack/repos/builtin/packages/hpl/package.py index a171408a26..166e3d8d58 100644 --- a/var/spack/repos/builtin/packages/hpl/package.py +++ b/var/spack/repos/builtin/packages/hpl/package.py @@ -27,7 +27,7 @@ import os import platform -class Hpl(Package): +class Hpl(MakefilePackage): """HPL is a software package that solves a (random) dense linear system in double precision (64 bits) arithmetic on distributed-memory computers. It can thus be regarded as a portable as well as freely available @@ -45,7 +45,11 @@ class Hpl(Package): parallel = False - def configure(self, spec, arch): + arch = '{0}-{1}'.format(platform.system(), platform.processor()) + + build_targets = ['arch={0}'.format(arch)] + + def edit(self, spec, prefix): # List of configuration options # Order is important config = [] @@ -66,7 +70,7 @@ class Hpl(Package): 'RM = /bin/rm -f', 'TOUCH = touch', # Platform identifier - 'ARCH = {0}'.format(arch), + 'ARCH = {0}'.format(self.arch), # HPL Directory Structure / HPL library 'TOPdir = {0}'.format(os.getcwd()), 'INCdir = $(TOPdir)/include', @@ -74,7 +78,7 @@ class Hpl(Package): 'LIBdir = $(TOPdir)/lib/$(ARCH)', 'HPLlib = $(LIBdir)/libhpl.a', # Message Passing library (MPI) - 'MPinc = -I{0}'.format(spec['mpi'].prefix.include), + 'MPinc = {0}'.format(spec['mpi'].prefix.include), 'MPlib = -L{0}'.format(spec['mpi'].prefix.lib), # Linear Algebra library (BLAS or VSIPL) 'LAinc = {0}'.format(spec['blas'].prefix.include), @@ -99,21 +103,13 @@ class Hpl(Package): ]) # Write configuration options to include file - with open('Make.{0}'.format(arch), 'w') as makefile: + with open('Make.{0}'.format(self.arch), 'w') as makefile: for var in config: makefile.write('{0}\n'.format(var)) def install(self, spec, prefix): - # Arch used for file naming purposes only - arch = '{0}-{1}'.format(platform.system(), platform.processor()) - - # Generate Makefile include - self.configure(spec, arch) - - make('arch={0}'.format(arch)) - # Manual installation - install_tree(join_path('bin', arch), prefix.bin) - install_tree(join_path('lib', arch), prefix.lib) - install_tree(join_path('include', arch), prefix.include) + install_tree(join_path('bin', self.arch), prefix.bin) + install_tree(join_path('lib', self.arch), prefix.lib) + install_tree(join_path('include', self.arch), prefix.include) install_tree('man', prefix.man) diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index 59b66d63ad..7f0f8e0eb5 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -54,28 +54,44 @@ class IntelMkl(IntelInstaller): @property def blas_libs(self): - shared = True if '+shared' in self.spec else False - suffix = dso_suffix if '+shared' in self.spec else 'a' - mkl_integer = ['libmkl_intel_ilp64'] if '+ilp64' in self.spec else ['libmkl_intel_lp64'] # NOQA: ignore=E501 + spec = self.spec + prefix = self.prefix + shared = '+shared' in spec + + if '+ilp64' in spec: + mkl_integer = ['libmkl_intel_ilp64'] + else: + mkl_integer = ['libmkl_intel_lp64'] + mkl_threading = ['libmkl_sequential'] - if '+openmp' in self.spec: - mkl_threading = ['libmkl_intel_thread', 'libiomp5'] if '%intel' in self.spec else ['libmkl_gnu_thread'] # NOQA: ignore=E501 + + if '+openmp' in spec: + if '%intel' in spec: + mkl_threading = ['libmkl_intel_thread', 'libiomp5'] + else: + mkl_threading = ['libmkl_gnu_thread'] + # TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++'] + + mkl_root = join_path(prefix.lib, 'intel64') + mkl_libs = find_libraries( mkl_integer + ['libmkl_core'] + mkl_threading, - root=join_path(self.prefix.lib, 'intel64'), + root=mkl_root, + shared=shared + ) + + # Intel MKL link line advisor recommends these system libraries + system_libs = find_system_libraries( + ['libpthread', 'libm', 'libdl'], shared=shared ) - system_libs = [ - 'libpthread.{0}'.format(suffix), - 'libm.{0}'.format(suffix), - 'libdl.{0}'.format(suffix) - ] + return mkl_libs + system_libs @property def lapack_libs(self): - return self.libs + return self.blas_libs @property def scalapack_libs(self): diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py index 98043db400..d4ae5fe20f 100644 --- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py +++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py @@ -96,7 +96,7 @@ class IntelParallelStudio(IntelInstaller): variant('ilp64', default=False, description='64 bit integers') variant('openmp', default=False, description='OpenMP multithreading layer') - provides('mpi', when='@cluster:+mpi') + provides('mpi', when='@cluster.0:cluster.9999+mpi') provides('mkl', when='+mkl') provides('daal', when='+daal') provides('ipp', when='+ipp') @@ -108,28 +108,44 @@ class IntelParallelStudio(IntelInstaller): @property def blas_libs(self): - shared = True if '+shared' in self.spec else False - suffix = dso_suffix if '+shared' in self.spec else 'a' - mkl_integer = ['libmkl_intel_ilp64'] if '+ilp64' in self.spec else ['libmkl_intel_lp64'] # NOQA: ignore=E501 + spec = self.spec + prefix = self.prefix + shared = '+shared' in spec + + if '+ilp64' in spec: + mkl_integer = ['libmkl_intel_ilp64'] + else: + mkl_integer = ['libmkl_intel_lp64'] + mkl_threading = ['libmkl_sequential'] - if '+openmp' in self.spec: - mkl_threading = ['libmkl_intel_thread', 'libiomp5'] if '%intel' in self.spec else ['libmkl_gnu_thread'] # NOQA: ignore=E501 + + if '+openmp' in spec: + if '%intel' in spec: + mkl_threading = ['libmkl_intel_thread', 'libiomp5'] + else: + mkl_threading = ['libmkl_gnu_thread'] + # TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++'] + + mkl_root = join_path(prefix, 'mkl', 'lib', 'intel64') + mkl_libs = find_libraries( mkl_integer + ['libmkl_core'] + mkl_threading, - root=join_path(self.prefix, 'mkl', 'lib', 'intel64'), + root=mkl_root, + shared=shared + ) + + # Intel MKL link line advisor recommends these system libraries + system_libs = find_system_libraries( + ['libpthread', 'libm', 'libdl'], shared=shared ) - system_libs = [ - 'libpthread.{0}'.format(suffix), - 'libm.{0}'.format(suffix), - 'libdl.{0}'.format(suffix) - ] + return mkl_libs + system_libs @property def lapack_libs(self): - return self.libs + return self.blas_libs @property def scalapack_libs(self): -- cgit v1.2.3-70-g09d2 From 63c341037033f683221a7ede9d6b24e86ddf0951 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 21 Apr 2017 15:36:15 -0700 Subject: Fix checksumming in Python3; add more fetch tests (#3941) * Checksum code wasn't opening binary files as binary. - Fixes Python 3 issue where files are opened as unicode text by default, and decoding fails for binary blobs. * Simplify fetch test parametrization. * - add tests for URL fetching and checksumming. - fix coverage on interface functions in FetchStrategy superclass - add some extra crypto tests. --- lib/spack/spack/fetch_strategy.py | 38 ++++++--- lib/spack/spack/test/conftest.py | 13 ++- lib/spack/spack/test/git_fetch.py | 16 +--- lib/spack/spack/test/hg_fetch.py | 16 +--- lib/spack/spack/test/svn_fetch.py | 16 +--- lib/spack/spack/test/url_fetch.py | 93 ++++++++++++++++++++++ lib/spack/spack/util/crypto.py | 18 ++--- .../builtin.mock/packages/url-test/package.py | 35 ++++++++ 8 files changed, 186 insertions(+), 59 deletions(-) create mode 100644 lib/spack/spack/test/url_fetch.py create mode 100644 var/spack/repos/builtin.mock/packages/url-test/package.py (limited to 'lib') diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 855b2f9379..7cafeb296d 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -103,27 +103,42 @@ class FetchStrategy(with_metaclass(FSMeta, object)): # Subclasses need to implement these methods def fetch(self): - pass # Return True on success, False on fail. + """Fetch source code archive or repo. + + Returns: + bool: True on success, False on failure. + """ def check(self): - pass # Do checksum. + """Checksum the archive fetched by this FetchStrategy.""" def expand(self): - pass # Expand archive. + """Expand the downloaded archive.""" def reset(self): - pass # Revert to freshly downloaded state. + """Revert to freshly downloaded state. + + For archive files, this may just re-expand the archive. + """ def archive(self, destination): - pass # Used to create tarball for mirror. + """Create an archive of the downloaded data for a mirror. + + For downloaded files, this should preserve the checksum of the + original file. For repositories, it should just create an + expandable tarball out of the downloaded repository. + """ @property def cachable(self): - """Return whether the fetcher is capable of caching the - resource it retrieves. This generally is determined by - whether the resource is identifiably associated with a - specific package version.""" - pass + """Whether fetcher is capable of caching the resource it retrieves. + + This generally is determined by whether the resource is + identifiably associated with a specific package version. + + Returns: + bool: True if can cache, False otherwise. + """ def __str__(self): # Should be human readable URL. return "FetchStrategy.__str___" @@ -162,7 +177,8 @@ class URLFetchStrategy(FetchStrategy): if not self.url: self.url = url - self.digest = kwargs.get('md5', None) + self.digest = next((kwargs[h] for h in crypto.hashes if h in kwargs), + None) if not self.digest: self.digest = digest diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index fc1d6ecec2..796d95a0cf 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -300,6 +300,7 @@ def mock_archive(): repo_name = 'mock-archive-repo' tmpdir.ensure(repo_name, dir=True) repodir = tmpdir.join(repo_name) + # Create the configure script configure_path = str(tmpdir.join(repo_name, 'configure')) with open(configure_path, 'w') as f: @@ -315,15 +316,21 @@ def mock_archive(): "EOF\n" ) os.chmod(configure_path, 0o755) + # Archive it current = tmpdir.chdir() archive_name = '{0}.tar.gz'.format(repo_name) tar('-czf', archive_name, repo_name) current.chdir() - Archive = collections.namedtuple('Archive', ['url', 'path']) - url = 'file://' + str(tmpdir.join(archive_name)) + Archive = collections.namedtuple('Archive', + ['url', 'path', 'archive_file']) + archive_file = str(tmpdir.join(archive_name)) + # Return the url - yield Archive(url=url, path=str(repodir)) + yield Archive( + url=('file://' + archive_file), + archive_file=archive_file, + path=str(repodir)) stage.destroy() diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py index ef531ef65f..34f74df84f 100644 --- a/lib/spack/spack/test/git_fetch.py +++ b/lib/spack/spack/test/git_fetch.py @@ -31,18 +31,8 @@ from spack.spec import Spec from spack.version import ver -@pytest.fixture(params=['master', 'branch', 'tag', 'commit']) -def type_of_test(request): - """Returns one of the test type available for the mock_git_repository""" - return request.param - - -@pytest.fixture(params=[True, False]) -def secure(request): - """Attempt both secure and insecure fetching""" - return request.param - - +@pytest.mark.parametrize("type_of_test", ['master', 'branch', 'tag', 'commit']) +@pytest.mark.parametrize("secure", [True, False]) def test_fetch( type_of_test, secure, @@ -62,11 +52,13 @@ def test_fetch( # Retrieve the right test parameters t = mock_git_repository.checks[type_of_test] h = mock_git_repository.hash + # Construct the package under test spec = Spec('git-test') spec.concretize() pkg = spack.repo.get(spec, new=True) pkg.versions[ver('git')] = t.args + # Enter the stage directory and check some properties with pkg.stage: try: diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py index 29a6eef561..96a23a1c53 100644 --- a/lib/spack/spack/test/hg_fetch.py +++ b/lib/spack/spack/test/hg_fetch.py @@ -31,18 +31,8 @@ from spack.spec import Spec from spack.version import ver -@pytest.fixture(params=['default', 'rev0']) -def type_of_test(request): - """Returns one of the test type available for the mock_hg_repository""" - return request.param - - -@pytest.fixture(params=[True, False]) -def secure(request): - """Attempt both secure and insecure fetching""" - return request.param - - +@pytest.mark.parametrize("type_of_test", ['default', 'rev0']) +@pytest.mark.parametrize("secure", [True, False]) def test_fetch( type_of_test, secure, @@ -62,11 +52,13 @@ def test_fetch( # Retrieve the right test parameters t = mock_hg_repository.checks[type_of_test] h = mock_hg_repository.hash + # Construct the package under test spec = Spec('hg-test') spec.concretize() pkg = spack.repo.get(spec, new=True) pkg.versions[ver('hg')] = t.args + # Enter the stage directory and check some properties with pkg.stage: try: diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py index 69d675fe3c..2ffedee7db 100644 --- a/lib/spack/spack/test/svn_fetch.py +++ b/lib/spack/spack/test/svn_fetch.py @@ -31,18 +31,8 @@ from spack.spec import Spec from spack.version import ver -@pytest.fixture(params=['default', 'rev0']) -def type_of_test(request): - """Returns one of the test type available for the mock_svn_repository""" - return request.param - - -@pytest.fixture(params=[True, False]) -def secure(request): - """Attempt both secure and insecure fetching""" - return request.param - - +@pytest.mark.parametrize("type_of_test", ['default', 'rev0']) +@pytest.mark.parametrize("secure", [True, False]) def test_fetch( type_of_test, secure, @@ -62,11 +52,13 @@ def test_fetch( # Retrieve the right test parameters t = mock_svn_repository.checks[type_of_test] h = mock_svn_repository.hash + # Construct the package under test spec = Spec('svn-test') spec.concretize() pkg = spack.repo.get(spec, new=True) pkg.versions[ver('svn')] = t.args + # Enter the stage directory and check some properties with pkg.stage: try: diff --git a/lib/spack/spack/test/url_fetch.py b/lib/spack/spack/test/url_fetch.py new file mode 100644 index 0000000000..c9299f45a1 --- /dev/null +++ b/lib/spack/spack/test/url_fetch.py @@ -0,0 +1,93 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import os +import pytest + +from llnl.util.filesystem import * + +import spack +from spack.spec import Spec +from spack.version import ver +import spack.util.crypto as crypto + + +@pytest.fixture(params=list(crypto.hashes.keys())) +def checksum_type(request): + return request.param + + +@pytest.mark.parametrize('secure', [True, False]) +def test_fetch( + mock_archive, + secure, + checksum_type, + config, + refresh_builtin_mock +): + """Fetch an archive and make sure we can checksum it.""" + mock_archive.url + mock_archive.path + + algo = crypto.hashes[checksum_type]() + with open(mock_archive.archive_file, 'rb') as f: + algo.update(f.read()) + checksum = algo.hexdigest() + + # Get a spec and tweak the test package with new chcecksum params + spec = Spec('url-test') + spec.concretize() + + pkg = spack.repo.get('url-test', new=True) + pkg.url = mock_archive.url + pkg.versions[ver('test')] = {checksum_type: checksum, 'url': pkg.url} + pkg.spec = spec + + # Enter the stage directory and check some properties + with pkg.stage: + try: + spack.insecure = secure + pkg.do_stage() + finally: + spack.insecure = False + + assert os.path.exists('configure') + assert is_exe('configure') + + with open('configure') as f: + contents = f.read() + assert contents.startswith('#!/bin/sh') + assert 'echo Building...' in contents + + +def test_hash_detection(checksum_type): + algo = crypto.hashes[checksum_type]() + h = 'f' * (algo.digest_size * 2) # hex -> bytes + checker = crypto.Checker(h) + assert checker.hash_name == checksum_type + + +def test_unknown_hash(checksum_type): + with pytest.raises(ValueError): + crypto.Checker('a') diff --git a/lib/spack/spack/util/crypto.py b/lib/spack/spack/util/crypto.py index 2965168056..f0d48702a1 100644 --- a/lib/spack/spack/util/crypto.py +++ b/lib/spack/spack/util/crypto.py @@ -26,16 +26,16 @@ import sys import hashlib """Set of acceptable hashes that Spack will use.""" -_acceptable_hashes = [ - hashlib.md5, - hashlib.sha1, - hashlib.sha224, - hashlib.sha256, - hashlib.sha384, - hashlib.sha512] +hashes = dict((h, getattr(hashlib, h)) for h in [ + 'md5', + 'sha1', + 'sha224', + 'sha256', + 'sha384', + 'sha512']) """Index for looking up hasher for a digest.""" -_size_to_hash = dict((h().digest_size, h) for h in _acceptable_hashes) +_size_to_hash = dict((h().digest_size, h) for h in hashes.values()) def checksum(hashlib_algo, filename, **kwargs): @@ -44,7 +44,7 @@ def checksum(hashlib_algo, filename, **kwargs): """ block_size = kwargs.get('block_size', 2**20) hasher = hashlib_algo() - with open(filename) as file: + with open(filename, 'rb') as file: while True: data = file.read(block_size) if not data: diff --git a/var/spack/repos/builtin.mock/packages/url-test/package.py b/var/spack/repos/builtin.mock/packages/url-test/package.py new file mode 100644 index 0000000000..a1f9af7d7d --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/url-test/package.py @@ -0,0 +1,35 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 UrlTest(Package): + """Mock package that fetches from a URL.""" + homepage = "http://www.url-fetch-example.com" + + version('test', url='to-be-filled-in-by-test') + + def install(self, spec, prefix): + pass -- cgit v1.2.3-70-g09d2 From c67f8e4aa1d0d19c4c83d366d153d99428fcfb16 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 21 Apr 2017 15:45:12 -0700 Subject: Fix ABI detection issues with macOS gcc. (#3854) - gcc on macOS says it's version 4.2.1, but it's really clang, and it's actually the *same* clang as the system clang. - It also doesn't respond with a full path when called with --print-file-name=libstdc++.dylib, which is expected from gcc in abi.py. Instead, it gives a relative path and _gcc_compiler_compare doesn't understand what to do with it. This results in errors like: ``` lib/spack/spack/abi.py, line 71, in _gcc_get_libstdcxx_version libpath = os.readlink(output.strip()) OSError: [Errno 2] No such file or directory: 'libstdc++.dylib' ``` - This commit does two things: 1. Ignore any gcc that's actually clang in abi.py. We can probably do better than this, but it's not clear there is a need to, since we should handle the compiler as clang, not gcc. 2. Don't auto-detect any "gcc" that is actually clang anymore. Ignore it and expect people to use clang (which is the default macOS compiler anyway). Users can still add fake gccs to their compilers.yaml if they want, but it's discouraged. --- lib/spack/spack/abi.py | 9 ++++++++- lib/spack/spack/compiler.py | 7 ++++--- lib/spack/spack/compilers/gcc.py | 10 ++++++++++ lib/spack/spack/test/cmd/test_compiler_cmd.py | 4 +--- 4 files changed, 23 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/abi.py b/lib/spack/spack/abi.py index b3b1dd6d27..ad3cae6ee2 100644 --- a/lib/spack/spack/abi.py +++ b/lib/spack/spack/abi.py @@ -29,6 +29,7 @@ import spack.spec from spack.build_environment import dso_suffix from spack.spec import CompilerSpec from spack.util.executable import Executable, ProcessError +from spack.compilers.clang import Clang from llnl.util.lang import memoized @@ -44,7 +45,7 @@ class ABI(object): @memoized def _gcc_get_libstdcxx_version(self, version): """Returns gcc ABI compatibility info by getting the library version of - a compiler's libstdc++.so or libgcc_s.so""" + a compiler's libstdc++ or libgcc_s""" spec = CompilerSpec("gcc", version) compilers = spack.compilers.compilers_for_spec(spec) if not compilers: @@ -62,6 +63,12 @@ class ABI(object): else: return None try: + # Some gcc's are actually clang and don't respond properly to + # --print-file-name (they just print the filename, not the + # full path). Ignore these and expect them to be handled as clang. + if Clang.default_version(rungcc.exe[0]) != 'unknown': + return None + output = rungcc("--print-file-name=%s" % libname, return_output=True) except ProcessError: diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py index 90af900d0d..bfce31a9a3 100644 --- a/lib/spack/spack/compiler.py +++ b/lib/spack/spack/compiler.py @@ -49,14 +49,15 @@ _version_cache = {} def get_compiler_version(compiler_path, version_arg, regex='(.*)'): - if compiler_path not in _version_cache: + key = (compiler_path, version_arg, regex) + if key not in _version_cache: compiler = Executable(compiler_path) output = compiler(version_arg, output=str, error=str) match = re.search(regex, output) - _version_cache[compiler_path] = match.group(1) if match else 'unknown' + _version_cache[key] = match.group(1) if match else 'unknown' - return _version_cache[compiler_path] + return _version_cache[key] def dumpversion(compiler_path): diff --git a/lib/spack/spack/compilers/gcc.py b/lib/spack/spack/compilers/gcc.py index 304f82a492..826ddbf432 100644 --- a/lib/spack/spack/compilers/gcc.py +++ b/lib/spack/spack/compilers/gcc.py @@ -87,6 +87,16 @@ class Gcc(Compiler): def pic_flag(self): return "-fPIC" + @classmethod + def default_version(cls, cc): + # Skip any gcc versions that are actually clang, like Apple's gcc. + # Returning "unknown" makes them not detected by default. + # Users can add these manually to compilers.yaml at their own risk. + if spack.compilers.clang.Clang.default_version(cc) != 'unknown': + return 'unknown' + + return super(Gcc, cls).default_version(cc) + @classmethod def fc_version(cls, fc): return get_compiler_version( diff --git a/lib/spack/spack/test/cmd/test_compiler_cmd.py b/lib/spack/spack/test/cmd/test_compiler_cmd.py index 842b64039e..b046cdb922 100644 --- a/lib/spack/spack/test/cmd/test_compiler_cmd.py +++ b/lib/spack/spack/test/cmd/test_compiler_cmd.py @@ -89,6 +89,4 @@ class TestCompilerCommand(object): # Ensure new compiler is in there new_compilers = set(spack.compilers.all_compiler_specs()) new_compiler = new_compilers - old_compilers - assert new_compiler - assert sum(1 for c in new_compiler if - c.version == Version(test_version)) > 0 + assert any(c.version == Version(test_version) for c in new_compiler) -- cgit v1.2.3-70-g09d2 From ead58cbb9062fab01363e35746e65478acc2dcf5 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 21 Apr 2017 16:52:44 -0700 Subject: spack uninstall no longer requires a known package. (#3915) - Spack install would previously fail if it could not load a package for the thing being uninstalled. - This reworks uninstall to handle cases where the package is no longer known, e.g.: a) the package has been renamed or is no longer in Spack b) the repository the package came from is no longer registered in repos.yaml --- lib/spack/spack/cmd/uninstall.py | 12 ++--- lib/spack/spack/database.py | 53 ++++++++++++++++++-- lib/spack/spack/package.py | 104 ++++++++++++++------------------------- lib/spack/spack/repository.py | 10 ++-- lib/spack/spack/spec.py | 2 +- lib/spack/spack/stage.py | 3 +- 6 files changed, 102 insertions(+), 82 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index e0b40e0627..f3eaddf88a 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -76,9 +76,9 @@ def setup_parser(subparser): help="specs of packages to uninstall") -def concretize_specs(specs, allow_multiple_matches=False, force=False): - """Returns a list of specs matching the non necessarily - concretized specs given from cli +def find_matching_specs(specs, allow_multiple_matches=False, force=False): + """Returns a list of specs matching the not necessarily + concretized specs given from cli Args: specs: list of specs to be matched against installed packages @@ -147,10 +147,10 @@ def do_uninstall(specs, force): try: # should work if package is known to spack packages.append(item.package) - except spack.repository.UnknownPackageError: + except spack.repository.UnknownEntityError: # The package.py file has gone away -- but still # want to uninstall. - spack.Package(item).do_uninstall(force=True) + spack.Package.uninstall_by_spec(item, force=True) # Sort packages to be uninstalled by the number of installed dependents # This ensures we do things in the right order @@ -169,7 +169,7 @@ def get_uninstall_list(args): # Gets the list of installed specs that match the ones give via cli # takes care of '-a' is given in the cli - uninstall_list = concretize_specs(specs, args.all, args.force) + uninstall_list = find_matching_specs(specs, args.all, args.force) # Takes care of '-d' dependent_list = installed_dependents(uninstall_list) diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index c63da4cf2e..3cb8ced342 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -40,7 +40,9 @@ filesystem. """ import os +import sys import socket +import contextlib from six import string_types from six import iteritems @@ -52,12 +54,13 @@ from llnl.util.lock import * import spack.store import spack.repository -from spack.directory_layout import DirectoryLayoutError -from spack.version import Version import spack.spec -from spack.error import SpackError import spack.util.spack_yaml as syaml import spack.util.spack_json as sjson +from spack.util.crypto import bit_length +from spack.directory_layout import DirectoryLayoutError +from spack.error import SpackError +from spack.version import Version # DB goes in this directory underneath the root @@ -127,6 +130,9 @@ class InstallRecord(object): class Database(object): + """Per-process lock objects for each install prefix.""" + _prefix_locks = {} + def __init__(self, root, db_dir=None): """Create a Database for Spack installations under ``root``. @@ -185,6 +191,47 @@ class Database(object): """Get a read lock context manager for use in a `with` block.""" return ReadTransaction(self.lock, self._read, timeout=timeout) + def prefix_lock(self, spec): + """Get a lock on a particular spec's installation directory. + + NOTE: The installation directory **does not** need to exist. + + Prefix lock is a byte range lock on the nth byte of a file. + + The lock file is ``spack.store.db.prefix_lock`` -- the DB + tells us what to call it and it lives alongside the install DB. + + n is the sys.maxsize-bit prefix of the DAG hash. This makes + likelihood of collision is very low AND it gives us + readers-writer lock semantics with just a single lockfile, so no + cleanup required. + """ + prefix = spec.prefix + if prefix not in self._prefix_locks: + self._prefix_locks[prefix] = Lock( + self.prefix_lock_path, + spec.dag_hash_bit_prefix(bit_length(sys.maxsize)), 1) + + return self._prefix_locks[prefix] + + @contextlib.contextmanager + def prefix_read_lock(self, spec): + prefix_lock = self.prefix_lock(spec) + try: + prefix_lock.acquire_read(60) + yield self + finally: + prefix_lock.release_read() + + @contextlib.contextmanager + def prefix_write_lock(self, spec): + prefix_lock = self.prefix_lock(spec) + try: + prefix_lock.acquire_write(60) + yield self + finally: + prefix_lock.release_write() + def _write_to_file(self, stream): """Write out the databsae to a JSON file. diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 108ddeff07..0402926590 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -46,7 +46,6 @@ from six import StringIO from six import string_types from six import with_metaclass -import llnl.util.lock import llnl.util.tty as tty import spack import spack.store @@ -66,7 +65,6 @@ from llnl.util.link_tree import LinkTree from llnl.util.tty.log import log_output from spack import directory_layout from spack.stage import Stage, ResourceStage, StageComposite -from spack.util.crypto import bit_length from spack.util.environment import dump_environment from spack.version import * @@ -513,16 +511,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): """ sanity_check_is_dir = [] - """Per-process lock objects for each install prefix.""" - prefix_locks = {} - def __init__(self, spec): # this determines how the package should be built. self.spec = spec - # Lock on the prefix shared resource. Will be set in prefix property - self._prefix_lock = None - # Name of package is the name of its module, without the # containing module names. self.name = self.module.__name__ @@ -858,29 +850,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): def installed(self): return os.path.isdir(self.prefix) - @property - def prefix_lock(self): - """Prefix lock is a byte range lock on the nth byte of a file. - - The lock file is ``spack.store.db.prefix_lock`` -- the DB - tells us what to call it and it lives alongside the install DB. - - n is the sys.maxsize-bit prefix of the DAG hash. This makes - likelihood of collision is very low AND it gives us - readers-writer lock semantics with just a single lockfile, so no - cleanup required. - """ - if self._prefix_lock is None: - prefix = self.spec.prefix - if prefix not in Package.prefix_locks: - Package.prefix_locks[prefix] = llnl.util.lock.Lock( - spack.store.db.prefix_lock_path, - self.spec.dag_hash_bit_prefix(bit_length(sys.maxsize)), 1) - - self._prefix_lock = Package.prefix_locks[prefix] - - return self._prefix_lock - @property def prefix(self): """Get the prefix into which this package should be installed.""" @@ -1105,27 +1074,11 @@ class PackageBase(with_metaclass(PackageMeta, object)): resource_stage_folder = '-'.join(pieces) return resource_stage_folder - @contextlib.contextmanager - def _prefix_read_lock(self): - try: - self.prefix_lock.acquire_read(60) - yield self - finally: - self.prefix_lock.release_read() - - @contextlib.contextmanager - def _prefix_write_lock(self): - try: - self.prefix_lock.acquire_write(60) - yield self - finally: - self.prefix_lock.release_write() - @contextlib.contextmanager def _stage_and_write_lock(self): """Prefix lock nested in a stage.""" with self.stage: - with self._prefix_write_lock(): + with spack.store.db.prefix_write_lock(self.spec): yield def do_install(self, @@ -1176,8 +1129,12 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Ensure package is not already installed layout = spack.store.layout - with self._prefix_read_lock(): - if layout.check_installed(self.spec): + with spack.store.db.prefix_read_lock(self.spec): + if (keep_prefix and os.path.isdir(self.prefix) and + (not self.installed)): + tty.msg( + "Continuing from partial install of %s" % self.name) + elif layout.check_installed(self.spec): tty.msg( "%s is already installed in %s" % (self.name, self.prefix)) rec = spack.store.db.get_record(self.spec) @@ -1247,7 +1204,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): ) self.stage.keep = keep_stage - with self._stage_and_write_lock(): # Run the pre-install hook in the child process after # the directory is created. @@ -1503,34 +1459,50 @@ class PackageBase(with_metaclass(PackageMeta, object)): """ pass - def do_uninstall(self, force=False): - if not self.installed: + @staticmethod + def uninstall_by_spec(spec, force=False): + if not os.path.isdir(spec.prefix): # prefix may not exist, but DB may be inconsistent. Try to fix by # removing, but omit hooks. - specs = spack.store.db.query(self.spec, installed=True) + specs = spack.store.db.query(spec, installed=True) if specs: spack.store.db.remove(specs[0]) - tty.msg("Removed stale DB entry for %s" % self.spec.short_spec) + tty.msg("Removed stale DB entry for %s" % spec.short_spec) return else: - raise InstallError(str(self.spec) + " is not installed.") + raise InstallError(str(spec) + " is not installed.") if not force: - dependents = spack.store.db.installed_dependents(self.spec) + dependents = spack.store.db.installed_dependents(spec) if dependents: - raise PackageStillNeededError(self.spec, dependents) + raise PackageStillNeededError(spec, dependents) + + # Try to get the pcakage for the spec + try: + pkg = spec.package + except spack.repository.UnknownEntityError: + pkg = None # Pre-uninstall hook runs first. - with self._prefix_write_lock(): - spack.hooks.pre_uninstall(self) + with spack.store.db.prefix_write_lock(spec): + # TODO: hooks should take specs, not packages. + if pkg is not None: + spack.hooks.pre_uninstall(pkg) + # Uninstalling in Spack only requires removing the prefix. - self.remove_prefix() - # - spack.store.db.remove(self.spec) - tty.msg("Successfully uninstalled %s" % self.spec.short_spec) + spack.store.layout.remove_install_directory(spec) + spack.store.db.remove(spec) - # Once everything else is done, run post install hooks - spack.hooks.post_uninstall(self) + # TODO: refactor hooks to use specs, not packages. + if pkg is not None: + spack.hooks.post_uninstall(pkg) + + tty.msg("Successfully uninstalled %s" % spec.short_spec) + + def do_uninstall(self, force=False): + """Uninstall this package by spec.""" + # delegate to instance-less method. + Package.uninstall_by_spec(self.spec, force) def _check_extendable(self): if not self.extendable: diff --git a/lib/spack/spack/repository.py b/lib/spack/spack/repository.py index 5486f7a9a4..3e43cce781 100644 --- a/lib/spack/spack/repository.py +++ b/lib/spack/spack/repository.py @@ -924,11 +924,11 @@ class DuplicateRepoError(RepoError): """Raised when duplicate repos are added to a RepoPath.""" -class PackageLoadError(spack.error.SpackError): - """Superclass for errors related to loading packages.""" +class UnknownEntityError(RepoError): + """Raised when we encounter a package spack doesn't have.""" -class UnknownPackageError(PackageLoadError): +class UnknownPackageError(UnknownEntityError): """Raised when we encounter a package spack doesn't have.""" def __init__(self, name, repo=None): @@ -941,7 +941,7 @@ class UnknownPackageError(PackageLoadError): self.name = name -class UnknownNamespaceError(PackageLoadError): +class UnknownNamespaceError(UnknownEntityError): """Raised when we encounter an unknown namespace""" def __init__(self, namespace): @@ -949,7 +949,7 @@ class UnknownNamespaceError(PackageLoadError): "Unknown namespace: %s" % namespace) -class FailedConstructorError(PackageLoadError): +class FailedConstructorError(RepoError): """Raised when a package's class constructor fails.""" def __init__(self, name, exc_type, exc_obj, exc_tb): diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index adddb87428..b4170a0f7a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2187,7 +2187,7 @@ class Spec(object): if not self.virtual and other.virtual: try: pkg = spack.repo.get(self.fullname) - except spack.repository.PackageLoadError: + except spack.repository.UnknownEntityError: # If we can't get package info on this spec, don't treat # it as a provider of this vdep. return False diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 29b6882927..086c4c90f5 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -222,7 +222,8 @@ class Stage(object): self.keep = keep # File lock for the stage directory. We use one file for all - # stage locks. See Spec.prefix_lock for details on this approach. + # stage locks. See spack.database.Database.prefix_lock for + # details on this approach. self._lock = None if lock: if self.name not in Stage.stage_locks: -- cgit v1.2.3-70-g09d2 From 0b002c2911845005c9c5f181f1cd5d77b8db1ec0 Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Fri, 21 Apr 2017 22:59:30 -0600 Subject: fetch git submodules recursively (#3779) * fetch git submodules recursively This is useful if the submodules have submodules themselves. On the other hand doing a recursive update doesn't hurt if there is only one level. * fetch submodules with depth=1 as well (fix #2190) * use git submodule with depth only for git>=1.8.4 --- lib/spack/docs/packaging_guide.rst | 5 +++-- lib/spack/spack/fetch_strategy.py | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 0e8ddfa68f..6f4a3ecf1a 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -854,7 +854,7 @@ Git fetching is enabled with the following parameters to ``version``: * ``tag``: name of a tag to fetch. * ``branch``: name of a branch to fetch. * ``commit``: SHA hash (or prefix) of a commit to fetch. -* ``submodules``: Also fetch submodules when checking out this repository. +* ``submodules``: Also fetch submodules recursively when checking out this repository. Only one of ``tag``, ``branch``, or ``commit`` can be used at a time. @@ -917,7 +917,8 @@ Commits Submodules You can supply ``submodules=True`` to cause Spack to fetch submodules - along with the repository at fetch time. + recursively along with the repository at fetch time. For more information + about git submodules see the manpage of git: ``man git-submodule``. .. code-block:: python diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 7cafeb296d..c694610856 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -686,10 +686,20 @@ class GitFetchStrategy(VCSFetchStrategy): # Init submodules if the user asked for them. if self.submodules: - if spack.debug: - self.git('submodule', 'update', '--init') + # only git 1.8.4 and later have --depth option + if self.git_version < ver('1.8.4'): + if spack.debug: + self.git('submodule', 'update', '--init', '--recursive') + else: + self.git('submodule', '--quiet', 'update', '--init', + '--recursive') else: - self.git('submodule', '--quiet', 'update', '--init') + if spack.debug: + self.git('submodule', 'update', '--init', '--recursive', + '--depth=1') + else: + self.git('submodule', '--quiet', 'update', '--init', + '--recursive', '--depth=1') def archive(self, destination): super(GitFetchStrategy, self).archive(destination, exclude='.git') -- cgit v1.2.3-70-g09d2 From 9f0b94b4e190365b00df3d7ccfcc77d6b4ee4273 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 27 Mar 2017 14:02:00 -0700 Subject: PythonPackage builds flat installs instead of egg directories. - Spack doesn't need eggs -- it manages its own directories - Simplify install layout and reduce sys.path searches by installing all packages flat (eggs are deprecated for wheels, and this is also what wheels do). - We now supply the --single-version-externally-managed argument to `setup.py install` for setuptools packages and setuptools. - modify packages to only use setuptools args if setuptools is an immediate dependency - Remove setuptools from packages that do not need it. - Some packages use setuptools *only* when certain args (likeb 'develop' or 'bdist') are supplied to setup.py, and they specifically do not use setuptools for installation. - Spack never calls setup.py this way, so just removing the setuptools dependency works for these packages. --- lib/spack/spack/build_systems/python.py | 19 ++++++++++- var/spack/repos/builtin/packages/npm/package.py | 2 +- .../py-backports-ssl-match-hostname/package.py | 4 --- .../repos/builtin/packages/py-basemap/package.py | 1 - .../repos/builtin/packages/py-ipykernel/package.py | 1 - .../packages/py-ipython-genutils/package.py | 1 - .../repos/builtin/packages/py-ipython/package.py | 1 - .../builtin/packages/py-ipywidgets/package.py | 1 - .../builtin/packages/py-jupyter-client/package.py | 1 - .../builtin/packages/py-jupyter-console/package.py | 1 - .../builtin/packages/py-jupyter-core/package.py | 1 - .../packages/py-jupyter-notebook/package.py | 2 +- .../repos/builtin/packages/py-nbconvert/package.py | 12 +++---- .../builtin/packages/py-nbconvert/style.min.css | 37 ++++++++++++++++++++++ .../repos/builtin/packages/py-nbformat/package.py | 1 - .../builtin/packages/py-ptyprocess/package.py | 2 -- .../repos/builtin/packages/py-pycurl/package.py | 1 - .../repos/builtin/packages/py-traitlets/package.py | 1 - var/spack/repos/builtin/packages/py-zmq/package.py | 1 - 19 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 var/spack/repos/builtin/packages/py-nbconvert/style.min.css (limited to 'lib') diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 904f0dbaa0..7a8650bfce 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -222,7 +222,24 @@ class PythonPackage(PackageBase): def install_args(self, spec, prefix): """Arguments to pass to install.""" - return ['--prefix={0}'.format(prefix)] + args = ['--prefix={0}'.format(prefix)] + + # This option causes python packages (including setuptools) NOT + # to create eggs or easy-install.pth files. Instead, they + # install naturally into $prefix/pythonX.Y/site-packages. + # + # Eggs add an extra level of indirection to sys.path, slowing + # down large HPC runs. They are also deprecated in favor of + # wheels, which use a normal layout when installed. + # + # Spack manages the package directory on its own by symlinking + # extensions into the site-packages directory, so we don't really + # need the .pth files or egg directories, anyway. + if ('py-setuptools' == spec.name or # this is setuptools, or + 'py-setuptools' in spec._dependencies): # it's an immediate dep + args += ['--single-version-externally-managed', '--root=/'] + + return args def install_lib(self, spec, prefix): """Install all Python modules (extensions and pure Python).""" diff --git a/var/spack/repos/builtin/packages/npm/package.py b/var/spack/repos/builtin/packages/npm/package.py index 500674d1d8..6196da42e3 100644 --- a/var/spack/repos/builtin/packages/npm/package.py +++ b/var/spack/repos/builtin/packages/npm/package.py @@ -36,7 +36,7 @@ class Npm(AutotoolsPackage): version('3.10.9', 'ec1eb22b466ce87cdd0b90182acce07f') version('3.10.5', '46002413f4a71de9b0da5b506bf1d992') - depends_on('node-js') + depends_on('node-js', type=('build', 'run')) def setup_dependent_environment(self, spack_env, run_env, dependent_spec): npm_config_cache_dir = "%s/npm-cache" % dependent_spec.prefix diff --git a/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py b/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py index 12af938be6..2c2caaed61 100644 --- a/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py +++ b/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py @@ -32,7 +32,3 @@ class PyBackportsSslMatchHostname(PythonPackage): url = "https://pypi.io/packages/source/b/backports.ssl_match_hostname/backports.ssl_match_hostname-3.5.0.1.tar.gz" version('3.5.0.1', 'c03fc5e2c7b3da46b81acf5cbacfe1e6') - - # newer setuptools version mess with "namespace" packages in an - # incompatible way cf. https://github.com/pypa/setuptools/issues/900 - depends_on('py-setuptools@:30.999.999', type='build') diff --git a/var/spack/repos/builtin/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py index d2934eb3c7..e0687f1d52 100644 --- a/var/spack/repos/builtin/packages/py-basemap/package.py +++ b/var/spack/repos/builtin/packages/py-basemap/package.py @@ -35,7 +35,6 @@ class PyBasemap(PythonPackage): version('1.0.7', '48c0557ced9e2c6e440b28b3caff2de8') - depends_on('py-setuptools', type='build') depends_on('py-numpy', type=('build', 'run')) depends_on('py-matplotlib', type=('build', 'run')) depends_on('pil', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-ipykernel/package.py b/var/spack/repos/builtin/packages/py-ipykernel/package.py index 0303a8e43c..9c55abed7e 100644 --- a/var/spack/repos/builtin/packages/py-ipykernel/package.py +++ b/var/spack/repos/builtin/packages/py-ipykernel/package.py @@ -43,7 +43,6 @@ class PyIpykernel(PythonPackage): version('4.1.0', '638a43e4f8a15872f749090c3f0827b6') depends_on('python@2.7:2.7.999,3.3:') - depends_on('py-setuptools', type='build') depends_on('py-traitlets@4.1.0:', type=('build', 'run')) depends_on('py-tornado@4.0:', type=('build', 'run')) depends_on('py-ipython@4.0:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-ipython-genutils/package.py b/var/spack/repos/builtin/packages/py-ipython-genutils/package.py index 66e8a02130..121d85acfa 100644 --- a/var/spack/repos/builtin/packages/py-ipython-genutils/package.py +++ b/var/spack/repos/builtin/packages/py-ipython-genutils/package.py @@ -33,5 +33,4 @@ class PyIpythonGenutils(PythonPackage): version('0.1.0', '9a8afbe0978adbcbfcb3b35b2d015a56') - depends_on('py-setuptools', type='build') depends_on('python@2.7:2.7.999,3.3:') diff --git a/var/spack/repos/builtin/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py index 8806e1cf8e..57095649b4 100644 --- a/var/spack/repos/builtin/packages/py-ipython/package.py +++ b/var/spack/repos/builtin/packages/py-ipython/package.py @@ -38,7 +38,6 @@ class PyIpython(PythonPackage): version('2.3.1', '2b7085525dac11190bfb45bb8ec8dcbf') depends_on('python@2.7:2.8,3.3:') - depends_on('py-setuptools@18.5:', type=('build', 'run')) # These dependencies breaks concretization # See https://github.com/LLNL/spack/issues/2793 diff --git a/var/spack/repos/builtin/packages/py-ipywidgets/package.py b/var/spack/repos/builtin/packages/py-ipywidgets/package.py index eafee8e084..bf31a48df8 100644 --- a/var/spack/repos/builtin/packages/py-ipywidgets/package.py +++ b/var/spack/repos/builtin/packages/py-ipywidgets/package.py @@ -33,7 +33,6 @@ class PyIpywidgets(PythonPackage): version('5.2.2', '112f3daa4aa0f42f8dda831cea3649c8') - depends_on('py-setuptools', type='build') depends_on('python@2.7:2.7.999,3.3:') depends_on('py-ipython@4.0.0:', type=('build', 'run')) depends_on('py-ipykernel@4.2.2:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-jupyter-client/package.py b/var/spack/repos/builtin/packages/py-jupyter-client/package.py index b0c7b06362..4d36ffb6ef 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-client/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-client/package.py @@ -40,7 +40,6 @@ class PyJupyterClient(PythonPackage): version('4.1.0', 'cf42048b889c8434fbb5813a9eec1d34') version('4.0.0', '00fa63c67cb3adf359d09dc4d803aff5') - depends_on('py-setuptools', type='build') depends_on('python@2.7:2.7.999,3.3:') depends_on('py-traitlets', type=('build', 'run')) depends_on('py-jupyter-core', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-jupyter-console/package.py b/var/spack/repos/builtin/packages/py-jupyter-console/package.py index a5f3e53298..2932af7018 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-console/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-console/package.py @@ -37,7 +37,6 @@ class PyJupyterConsole(PythonPackage): version('4.0.3', '0e928ea261e7f8154698cf69ed4f2459') version('4.0.2', 'f2e174938c91136549b908bd39fa5d59') - depends_on('py-setuptools', type='build') depends_on('python@2.7:2.7.999,3.3:') depends_on('py-jupyter-client', type=('build', 'run')) depends_on('py-ipython', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-jupyter-core/package.py b/var/spack/repos/builtin/packages/py-jupyter-core/package.py index f650a91bb9..4fb4ec31ea 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-core/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-core/package.py @@ -42,6 +42,5 @@ class PyJupyterCore(PythonPackage): version('4.0.1', 'f849136b2badaaba2a8a3b397bf04639') version('4.0', 'b6b37cb4f40bd0fcd20433cb2cc7a4c1') - depends_on('py-setuptools', type='build') depends_on('python@2.7:2.7.999,3.3:') depends_on('py-traitlets', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py b/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py index 4c0d12b245..f375bc2b2c 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py @@ -44,9 +44,9 @@ class PyJupyterNotebook(PythonPackage): variant('terminal', default=False, description="Enable terminal functionality") - depends_on('py-setuptools', type='build') depends_on('python@2.7:2.7.999,3.3:') depends_on('npm', type='build') + depends_on('node-js', type=('build', 'run')) depends_on('py-jinja2', type=('build', 'run')) depends_on('py-tornado@4:', type=('build', 'run')) depends_on('py-ipython-genutils', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-nbconvert/package.py b/var/spack/repos/builtin/packages/py-nbconvert/package.py index 0e221d355c..7114b676a7 100644 --- a/var/spack/repos/builtin/packages/py-nbconvert/package.py +++ b/var/spack/repos/builtin/packages/py-nbconvert/package.py @@ -22,6 +22,7 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import os from spack import * @@ -35,7 +36,6 @@ class PyNbconvert(PythonPackage): version('4.1.0', '06655576713ba1ff7cece2b92760c187') version('4.0.0', '9661620b1e10a7b46f314588d2d0932f') - depends_on('py-setuptools', type='build') depends_on('py-pycurl', type='build') depends_on('python@2.7:2.7.999,3.3:') depends_on('py-mistune', type=('build', 'run')) @@ -48,8 +48,8 @@ class PyNbconvert(PythonPackage): depends_on('py-tornado', type=('build', 'run')) depends_on('py-jupyter-client', type=('build', 'run')) - # FIXME: - # Failed, try again after installing PycURL with `pip install pycurl` to avoid outdated SSL. # noqa - # Failed to download css from https://cdn.jupyter.org/notebook/4.1.0/style/style.min.css: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) # noqa - # Downloading CSS: https://cdn.jupyter.org/notebook/4.1.0/style/style.min.css # noqa - # error: Need Notebook CSS to proceed: nbconvert/resources/style.min.css + def patch(self): + # We bundle this with the spack package so that the installer + # doesn't try to download it. + install(os.path.join(self.package_dir, 'style.min.css'), + os.path.join('nbconvert', 'resources', 'style.min.css')) diff --git a/var/spack/repos/builtin/packages/py-nbconvert/style.min.css b/var/spack/repos/builtin/packages/py-nbconvert/style.min.css new file mode 100644 index 0000000000..6a9626dd8e --- /dev/null +++ b/var/spack/repos/builtin/packages/py-nbconvert/style.min.css @@ -0,0 +1,37 @@ +/*! +* +* Twitter Bootstrap +* +*//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0;vertical-align:middle}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../components/bootstrap/fonts/glyphicons-halflings-regular.eot);src:url(../components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix)format('embedded-opentype'),url(../components/bootstrap/fonts/glyphicons-halflings-regular.woff2)format('woff2'),url(../components/bootstrap/fonts/glyphicons-halflings-regular.woff)format('woff'),url(../components/bootstrap/fonts/glyphicons-halflings-regular.ttf)format('truetype'),url(../components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular)format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:1.42857143;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}figure{margin:0}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:3px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:33px}.h2,h2{font-size:27px}.h3,h3{font-size:23px}.h4,h4{font-size:17px}.h5,h5{font-size:13px}.h6,h6{font-size:12px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:14px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:19.5px}}.small,small{font-size:92%}.mark,mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:9px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:541px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:inherit;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:monospace}code{padding:2px 4px;font-size:90%;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:1px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:0;padding-right:0}@media (min-width:768px){.container{width:768px}}@media (min-width:992px){.container{width:940px}}@media (min-width:1200px){.container{width:1140px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:0;padding-right:0}.row{margin-left:0;margin-right:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:0;padding-right:0}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:19.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{display:block;padding-top:7px;font-size:13px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:13px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:45px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px \9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:31px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;min-height:30px}.input-lg{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-lg{height:45px;line-height:45px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.form-group-lg .form-control{height:45px;line-height:45px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;min-height:35px}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:45px;height:45px;line-height:45px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:0;margin-right:0}.form-horizontal .has-feedback .form-control-feedback{right:0}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}.form-horizontal .form-group-lg .control-label{padding-top:14.33px}.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:13px;line-height:1.42857143;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:1px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:13px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:541px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:2px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:17px;line-height:1.3333333;border-radius:3px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:1px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:13px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:2px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:1px}.input-group-addon.input-lg{padding:10px 16px;font-size:17px;border-radius:3px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:2px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:18px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:0;padding-left:0;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:540px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:541px){.navbar{border-radius:2px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:6px 0;font-size:17px;line-height:18px;height:30px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}.navbar-toggle{position:relative;float:right;margin-right:0;padding:9px 10px;margin-top:-2px;margin-bottom:-2px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:2px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:541px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:0}.navbar-toggle{display:none}}.navbar-nav{margin:3px 0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width:540px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:541px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}}.navbar-form{padding:10px 0;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:-1px 0}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:540px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:2px 2px 0 0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm{margin-top:0;margin-bottom:0}.navbar-btn.btn-xs{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px}@media (min-width:541px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-text{float:left;margin-left:0;margin-right:0}.navbar-left{float:left!important;float:left}.navbar-right{float:right!important;float:right;margin-right:0}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:540px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:540px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:18px;list-style:none;background-color:#f5f5f5;border-radius:2px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#5e5e5e}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:17px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:1px;border-top-left-radius:1px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:1px;border-top-right-radius:1px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:20px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:3px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:58.5px}}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#000}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:2px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:18px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:15px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:2px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:3px}.well-sm{padding:9px;border-radius:1px}.close{float:right;font-size:19.5px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:3px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1.42857143;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:3px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:13px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:2px 2px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;-moz-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.item_buttons:after,.item_buttons:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.item_buttons:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}/*! +* +* Font Awesome +* +*//*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url(../components/font-awesome/fonts/fontawesome-webfont.eot?v=4.2.0);src:url(../components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.2.0)format('embedded-opentype'),url(../components/font-awesome/fonts/fontawesome-webfont.woff?v=4.2.0)format('woff'),url(../components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.2.0)format('truetype'),url(../components/font-awesome/fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular)format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}/*! +* +* IPython base +* +*/.modal.fade .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}code{color:#000}pre{font-size:inherit;line-height:inherit}label{font-weight:400}.border-box-sizing{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.corner-all{border-radius:2px}.no-padding{padding:0}.hbox{display:-webkit-box;-webkit-box-orient:horizontal;display:-moz-box;-moz-box-orient:horizontal;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none}.vbox{display:-webkit-box;-webkit-box-orient:vertical;display:-moz-box;-moz-box-orient:vertical;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}.vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none}.hbox.reverse,.reverse,.vbox.reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;flex-direction:row-reverse}.box-flex0,.hbox.box-flex0,.vbox.box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;flex:none;width:auto}.box-flex1,.hbox.box-flex1,.vbox.box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.box-flex,.hbox.box-flex,.vbox.box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}.box-flex2,.hbox.box-flex2,.vbox.box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;flex:2}.box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1}.box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2}.hbox.start,.start,.vbox.start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;justify-content:flex-start}.end,.hbox.end,.vbox.end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;justify-content:flex-end}.center,.hbox.center,.vbox.center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;justify-content:center}.baseline,.hbox.baseline,.vbox.baseline{-webkit-box-pack:baseline;-moz-box-pack:baseline;box-pack:baseline;justify-content:baseline}.hbox.stretch,.stretch,.vbox.stretch{-webkit-box-pack:stretch;-moz-box-pack:stretch;box-pack:stretch;justify-content:stretch}.align-start,.hbox.align-start,.vbox.align-start{-webkit-box-align:start;-moz-box-align:start;box-align:start;align-items:flex-start}.align-end,.hbox.align-end,.vbox.align-end{-webkit-box-align:end;-moz-box-align:end;box-align:end;align-items:flex-end}.align-center,.hbox.align-center,.vbox.align-center{-webkit-box-align:center;-moz-box-align:center;box-align:center;align-items:center}.align-baseline,.hbox.align-baseline,.vbox.align-baseline{-webkit-box-align:baseline;-moz-box-align:baseline;box-align:baseline;align-items:baseline}.align-stretch,.hbox.align-stretch,.vbox.align-stretch{-webkit-box-align:stretch;-moz-box-align:stretch;box-align:stretch;align-items:stretch}div.error{margin:2em;text-align:center}div.error>h1{font-size:500%;line-height:normal}div.error>p{font-size:200%;line-height:normal}div.traceback-wrapper{text-align:left;max-width:800px;margin:auto}body{position:absolute;left:0;right:0;top:0;bottom:0;overflow:visible}#header{display:none;background-color:#fff;position:relative;z-index:100}#header #header-container{padding-bottom:5px;padding-top:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}#header .header-bar{width:100%;height:1px;background:#e7e7e7;margin-bottom:-1px}#header-spacer{width:100%;visibility:hidden}@media print{#header{display:none!important}#header-spacer{display:none}}#ipython_notebook{padding-left:0;padding-top:1px;padding-bottom:1px}@media (max-width:991px){#ipython_notebook{margin-left:10px}}#noscript{width:auto;padding-top:16px;padding-bottom:16px;text-align:center;font-size:22px;color:red;font-weight:700}#ipython_notebook img{height:28px}#site{width:100%;display:none;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;overflow:auto}@media print{#site{height:auto!important}}.ui-button .ui-button-text{padding:.2em .8em;font-size:77%}input.ui-button{padding:.3em .9em}span#login_widget{float:right}#logout,span#login_widget>.button{color:#333;background-color:#fff;border-color:#ccc}#logout.active,#logout.focus,#logout:active,#logout:focus,#logout:hover,.open>.dropdown-toggle#logout,.open>.dropdown-togglespan#login_widget>.button,span#login_widget>.button.active,span#login_widget>.button.focus,span#login_widget>.button:active,span#login_widget>.button:focus,span#login_widget>.button:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}#logout.active,#logout:active,.open>.dropdown-toggle#logout,.open>.dropdown-togglespan#login_widget>.button,span#login_widget>.button.active,span#login_widget>.button:active{background-image:none}#logout.disabled,#logout.disabled.active,#logout.disabled.focus,#logout.disabled:active,#logout.disabled:focus,#logout.disabled:hover,#logout[disabled],#logout[disabled].active,#logout[disabled].focus,#logout[disabled]:active,#logout[disabled]:focus,#logout[disabled]:hover,fieldset[disabled] #logout,fieldset[disabled] #logout.active,fieldset[disabled] #logout.focus,fieldset[disabled] #logout:active,fieldset[disabled] #logout:focus,fieldset[disabled] #logout:hover,fieldset[disabled] span#login_widget>.button,fieldset[disabled] span#login_widget>.button.active,fieldset[disabled] span#login_widget>.button.focus,fieldset[disabled] span#login_widget>.button:active,fieldset[disabled] span#login_widget>.button:focus,fieldset[disabled] span#login_widget>.button:hover,span#login_widget>.button.disabled,span#login_widget>.button.disabled.active,span#login_widget>.button.disabled.focus,span#login_widget>.button.disabled:active,span#login_widget>.button.disabled:focus,span#login_widget>.button.disabled:hover,span#login_widget>.button[disabled],span#login_widget>.button[disabled].active,span#login_widget>.button[disabled].focus,span#login_widget>.button[disabled]:active,span#login_widget>.button[disabled]:focus,span#login_widget>.button[disabled]:hover{background-color:#fff;border-color:#ccc}#logout .badge,span#login_widget>.button .badge{color:#fff;background-color:#333}.nav-header{text-transform:none}#header>span{margin-top:10px}.modal_stretch .modal-dialog{display:-webkit-box;-webkit-box-orient:vertical;display:-moz-box;-moz-box-orient:vertical;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;min-height:80vh}.modal_stretch .modal-dialog .modal-body{max-height:calc(100vh - 200px);overflow:auto;flex:1}@media (min-width:768px){.modal .modal-dialog{width:700px}select.form-control{margin-left:12px;margin-right:12px}}/*! +* +* IPython auth +* +*/.center-nav{display:inline-block;margin-bottom:-4px}/*! +* +* IPython tree view +* +*/.alternate_upload{background-color:none;display:inline}.alternate_upload.form{padding:0;margin:0}.alternate_upload input.fileinput{text-align:center;vertical-align:middle;display:inline;opacity:0;z-index:2;width:12ex;margin-right:-12ex}.alternate_upload .btn-upload{height:22px}ul#tabs{margin-bottom:4px}ul#tabs a{padding-top:6px;padding-bottom:4px}ul.breadcrumb a:focus,ul.breadcrumb a:hover{text-decoration:none}ul.breadcrumb i.icon-home{font-size:16px;margin-right:4px}ul.breadcrumb span{color:#5e5e5e}.list_toolbar{padding:4px 0;vertical-align:middle}.list_toolbar .tree-buttons{padding-top:1px}.dynamic-buttons{padding-top:3px;display:inline-block}.list_toolbar [class*=span]{min-height:24px}.list_header{font-weight:700;background-color:#eee}.list_placeholder{font-weight:700;padding:4px 7px}.list_container{margin-top:4px;margin-bottom:20px;border:1px solid #ddd;border-radius:2px}.list_container>div{border-bottom:1px solid #ddd}.list_container>div:hover .list-item{background-color:red}.list_container>div:last-child{border:none}.list_item:hover .list_item{background-color:#ddd}.list_item a{text-decoration:none}.list_item:hover{background-color:#fafafa}.action_col{text-align:right}.list_header>div,.list_item>div{line-height:22px;padding:4px 7px}.list_header>div input,.list_item>div input{margin-right:7px;margin-left:14px;vertical-align:baseline;line-height:22px;position:relative;top:-1px}.list_header>div .item_link,.list_item>div .item_link{margin-left:-1px;vertical-align:baseline;line-height:22px}.new-file input[type=checkbox]{visibility:hidden}.item_name{line-height:22px;height:24px}.item_icon{font-size:14px;color:#5e5e5e;margin-right:7px;margin-left:7px;line-height:22px;vertical-align:baseline}.item_buttons{line-height:1em;margin-left:-5px}.item_buttons .btn-group,.item_buttons .input-group{float:left}.item_buttons>.btn,.item_buttons>.btn-group,.item_buttons>.input-group{margin-left:5px}.item_buttons .btn{min-width:13ex}.item_buttons .running-indicator{padding-top:4px;color:#5cb85c}.toolbar_info{height:24px;line-height:24px}input.engine_num_input,input.nbname_input{padding-top:3px;padding-bottom:3px;height:22px;line-height:14px;margin:0}input.engine_num_input{width:60px}.highlight_text{color:#00f}#project_name{display:inline-block;padding-left:7px;margin-left:-2px}#project_name>.breadcrumb{padding:0;margin-bottom:0;background-color:transparent;font-weight:700}#tree-selector{padding-right:0}#button-select-all{min-width:50px}#select-all{margin-left:7px;margin-right:2px}.menu_icon{margin-right:2px}.tab-content .row{margin-left:0;margin-right:0}.folder_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f114"}.folder_icon:before.pull-left{margin-right:.3em}.folder_icon:before.pull-right{margin-left:.3em}.notebook_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f02d";position:relative;top:-1px}.notebook_icon:before.pull-left{margin-right:.3em}.notebook_icon:before.pull-right{margin-left:.3em}.running_notebook_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f02d";position:relative;top:-1px;color:#5cb85c}.running_notebook_icon:before.pull-left{margin-right:.3em}.running_notebook_icon:before.pull-right{margin-left:.3em}.file_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f016";position:relative;top:-2px}.file_icon:before.pull-left{margin-right:.3em}.file_icon:before.pull-right{margin-left:.3em}#notebook_toolbar .pull-right{padding-top:0;margin-right:-1px}ul#new-menu{left:auto;right:0}.kernel-menu-icon{padding-right:12px;width:24px;content:"\f096"}.kernel-menu-icon:before{content:"\f096"}.kernel-menu-icon-current:before{content:"\f00c"}#tab_content{padding-top:20px}#running .panel-group .panel{margin-top:3px;margin-bottom:1em}#running .panel-group .panel .panel-heading{background-color:#eee;line-height:22px;padding:4px 7px}#running .panel-group .panel .panel-heading a:focus,#running .panel-group .panel .panel-heading a:hover{text-decoration:none}#running .panel-group .panel .panel-body{padding:0}#running .panel-group .panel .panel-body .list_container{margin-top:0;margin-bottom:0;border:0;border-radius:0}#running .panel-group .panel .panel-body .list_container .list_item{border-bottom:1px solid #ddd}#running .panel-group .panel .panel-body .list_container .list_item:last-child{border-bottom:0}.delete-button,.duplicate-button,.rename-button,.shutdown-button{display:none}.dynamic-instructions{display:inline-block;padding-top:4px}/*! +* +* IPython text editor webapp +* +*/.selected-keymap i.fa{padding:0 5px}.selected-keymap i.fa:before{content:"\f00c"}#mode-menu{overflow:auto;max-height:20em}.edit_app #header{-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.2);box-shadow:0 0 12px 1px rgba(87,87,87,.2)}.edit_app #menubar .navbar{margin-bottom:-1px}.dirty-indicator{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px}.dirty-indicator.pull-left{margin-right:.3em}.dirty-indicator.pull-right{margin-left:.3em}.dirty-indicator-dirty{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px}.dirty-indicator-dirty.pull-left{margin-right:.3em}.dirty-indicator-dirty.pull-right{margin-left:.3em}.dirty-indicator-clean{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:20px}.dirty-indicator-clean.pull-left{margin-right:.3em}.dirty-indicator-clean.pull-right{margin-left:.3em}.dirty-indicator-clean:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f00c"}.dirty-indicator-clean:before.pull-left{margin-right:.3em}.dirty-indicator-clean:before.pull-right{margin-left:.3em}#filename{font-size:16pt;display:table;padding:0 5px}#current-mode{padding-left:5px;padding-right:5px}#texteditor-backdrop{padding-top:20px;padding-bottom:20px}@media not print{#texteditor-backdrop{background-color:#eee}}@media print{#texteditor-backdrop #texteditor-container .CodeMirror-gutter,#texteditor-backdrop #texteditor-container .CodeMirror-gutters{background-color:#fff}}@media not print{#texteditor-backdrop #texteditor-container .CodeMirror-gutter,#texteditor-backdrop #texteditor-container .CodeMirror-gutters{background-color:#fff}#texteditor-backdrop #texteditor-container{padding:0;background-color:#fff;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.2);box-shadow:0 0 12px 1px rgba(87,87,87,.2)}}/*! +* +* IPython notebook +* +*/.ansibold{font-weight:700}.ansiblack{color:#000}.ansired{color:#8b0000}.ansigreen{color:#006400}.ansiyellow{color:#c4a000}.ansiblue{color:#00008b}.ansipurple{color:#9400d3}.ansicyan{color:#4682b4}.ansigray{color:gray}.ansibgblack{background-color:#000}.ansibgred{background-color:red}.ansibggreen{background-color:green}.ansibgyellow{background-color:#ff0}.ansibgblue{background-color:#00f}.ansibgpurple{background-color:#ff00ff}.ansibgcyan{background-color:#0ff}.ansibggray{background-color:gray}div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;display:-moz-box;-moz-box-orient:vertical;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;border-radius:2px;box-sizing:border-box;-moz-box-sizing:border-box;border-width:thin;border-style:solid;width:100%;padding:5px;margin:0;outline:0}div.cell.selected{border-color:#ababab}@media print{div.cell.selected{border-color:transparent}}.edit_mode div.cell.selected{border-color:green}.prompt{min-width:14ex;padding:.4em;margin:0;font-family:monospace;text-align:right;line-height:1.21429em}div.inner_cell{display:-webkit-box;-webkit-box-orient:vertical;display:-moz-box;-moz-box-orient:vertical;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}@-moz-document url-prefix(){div.inner_cell{overflow-x:hidden}}div.input_area{border:1px solid #cfcfcf;border-radius:2px;background:#f7f7f7;line-height:1.21429em}div.prompt:empty{padding-top:0;padding-bottom:0}div.unrecognized_cell{padding:5px 5px 5px 0;display:-webkit-box;-webkit-box-orient:horizontal;display:-moz-box;-moz-box-orient:horizontal;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}div.unrecognized_cell .inner_cell{border-radius:2px;padding:5px;font-weight:700;color:red;border:1px solid #cfcfcf;background:#eaeaea}div.unrecognized_cell .inner_cell a,div.unrecognized_cell .inner_cell a:hover{color:inherit;text-decoration:none}@media (max-width:540px){.prompt{text-align:left}div.unrecognized_cell>div.prompt{display:none}}div.code_cell{}div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;display:-moz-box;-moz-box-orient:horizontal;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}@media (max-width:540px){div.input{-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}}div.input_prompt{color:navy;border-top:1px solid transparent}div.input_area>div.highlight{margin:.4em;border:none;padding:0;background-color:transparent}div.input_area>div.highlight>pre{margin:0;border:none;padding:0;background-color:transparent}.CodeMirror{line-height:1.21429em;font-size:14px;height:auto;background:0 0}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.CodeMirror-lines{padding:.4em}.CodeMirror-linenumber{padding:0 8px 0 4px}.CodeMirror-gutters{border-bottom-left-radius:2px;border-top-left-radius:2px}.CodeMirror pre{padding:0;border:0;border-radius:0}.highlight-base,.highlight-variable{color:#000}.highlight-variable-2{color:#1a1a1a}.highlight-variable-3{color:#333}.highlight-string{color:#BA2121}.highlight-comment{color:#408080;font-style:italic}.highlight-number{color:#080}.highlight-atom{color:#88F}.highlight-keyword{color:green;font-weight:700}.highlight-builtin{color:green}.highlight-error{color:red}.highlight-operator{color:#A2F;font-weight:700}.highlight-meta{color:#A2F}.highlight-def{color:#00f}.highlight-string-2{color:#f50}.highlight-qualifier{color:#555}.highlight-bracket{color:#997}.highlight-tag{color:#170}.highlight-attribute{color:#00c}.highlight-header{color:#00f}.highlight-quote{color:#090}.highlight-link{color:#00c}.cm-s-ipython span.cm-keyword{color:green;font-weight:700}.cm-s-ipython span.cm-atom{color:#88F}.cm-s-ipython span.cm-number{color:#080}.cm-s-ipython span.cm-def{color:#00f}.cm-s-ipython span.cm-variable{color:#000}.cm-s-ipython span.cm-operator{color:#A2F;font-weight:700}.cm-s-ipython span.cm-variable-2{color:#1a1a1a}.cm-s-ipython span.cm-variable-3{color:#333}.cm-s-ipython span.cm-comment{color:#408080;font-style:italic}.cm-s-ipython span.cm-string{color:#BA2121}.cm-s-ipython span.cm-string-2{color:#f50}.cm-s-ipython span.cm-meta{color:#A2F}.cm-s-ipython span.cm-qualifier{color:#555}.cm-s-ipython span.cm-builtin{color:green}.cm-s-ipython span.cm-bracket{color:#997}.cm-s-ipython span.cm-tag{color:#170}.cm-s-ipython span.cm-attribute{color:#00c}.cm-s-ipython span.cm-header{color:#00f}.cm-s-ipython span.cm-quote{color:#090}.cm-s-ipython span.cm-link{color:#00c}.cm-s-ipython span.cm-error{color:red}.cm-s-ipython span.cm-tab{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=')right no-repeat}div.output_wrapper{display:-webkit-box;-webkit-box-align:stretch;display:-moz-box;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch;z-index:1}div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:2px;-webkit-box-shadow:inset 0 2px 8px rgba(0,0,0,.8);box-shadow:inset 0 2px 8px rgba(0,0,0,.8);display:block}div.output_collapsed{margin:0;padding:0;display:-webkit-box;-webkit-box-orient:vertical;display:-moz-box;-moz-box-orient:vertical;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}div.out_prompt_overlay{height:100%;padding:0 .4em;position:absolute;border-radius:2px}div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000;box-shadow:inset 0 0 1px #000;background:rgba(240,240,240,.5)}div.output_prompt{color:#8b0000}div.output_area{padding:0;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;display:-moz-box;-moz-box-orient:horizontal;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}div.output_area .MathJax_Display{text-align:left!important}div.output_area .rendered_html img,div.output_area .rendered_html table{margin-left:0;margin-right:0}div.output_area img,div.output_area svg{max-width:100%;height:auto}div.output_area img.unconfined,div.output_area svg.unconfined{max-width:none}.output{display:-webkit-box;-webkit-box-orient:vertical;display:-moz-box;-moz-box-orient:vertical;display:box;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}@media (max-width:540px){div.output_area{-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;box-align:stretch;display:flex;flex-direction:column;align-items:stretch}}div.output_area pre{margin:0;padding:0;border:0;vertical-align:baseline;color:#000;background-color:transparent;border-radius:0}div.output_subarea{overflow-x:auto;padding:.4em;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1;max-width:calc(100% - 14ex)}div.output_text{text-align:left;color:#000;line-height:1.21429em}div.output_stderr{background:#fdd}div.output_latex{text-align:left}div.output_javascript:empty{padding:0}.js-error{color:#8b0000}div.raw_input_container{font-family:monospace;padding-top:5px}span.raw_input_prompt{}input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;vertical-align:baseline;padding:0 .25em;margin:0 .25em}input.raw_input:focus{box-shadow:none}p.p-space{margin-bottom:10px}div.output_unrecognized{padding:5px;font-weight:700;color:red}div.output_unrecognized a,div.output_unrecognized a:hover{color:inherit;text-decoration:none}.rendered_html{color:#000}.rendered_html em{font-style:italic}.rendered_html strong{font-weight:700}.rendered_html :link,.rendered_html :visited,.rendered_html u{text-decoration:underline}.rendered_html h1{font-size:185.7%;margin:1.08em 0 0;font-weight:700;line-height:1}.rendered_html h2{font-size:157.1%;margin:1.27em 0 0;font-weight:700;line-height:1}.rendered_html h3{font-size:128.6%;margin:1.55em 0 0;font-weight:700;line-height:1}.rendered_html h4{font-size:100%;margin:2em 0 0;font-weight:700;line-height:1}.rendered_html h5,.rendered_html h6{font-size:100%;margin:2em 0 0;font-weight:700;line-height:1;font-style:italic}.rendered_html h1:first-child{margin-top:.538em}.rendered_html h2:first-child{margin-top:.636em}.rendered_html h3:first-child{margin-top:.777em}.rendered_html h4:first-child,.rendered_html h5:first-child,.rendered_html h6:first-child{margin-top:1em}.rendered_html ul{list-style:disc;margin:0 2em;padding-left:0}.rendered_html ul ul{list-style:square;margin:0 2em}.rendered_html ul ul ul{list-style:circle;margin:0 2em}.rendered_html ol{list-style:decimal;margin:0 2em;padding-left:0}.rendered_html ol ol{list-style:upper-alpha;margin:0 2em}.rendered_html ol ol ol{list-style:lower-alpha;margin:0 2em}.rendered_html ol ol ol ol{list-style:lower-roman;margin:0 2em}.rendered_html ol ol ol ol ol{list-style:decimal;margin:0 2em}.rendered_html *+ol,.rendered_html *+ul{margin-top:1em}.rendered_html hr{color:#000;background-color:#000}.rendered_html pre{margin:1em 2em}.rendered_html code,.rendered_html pre{border:0;background-color:#fff;color:#000;font-size:100%;padding:0}.rendered_html blockquote{margin:1em 2em}.rendered_html table{margin-left:auto;margin-right:auto;border:1px solid #000;border-collapse:collapse}.rendered_html td,.rendered_html th,.rendered_html tr{border:1px solid #000;border-collapse:collapse;margin:1em 2em}.rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px}.rendered_html th{font-weight:700}.rendered_html *+table{margin-top:1em}.rendered_html p{text-align:left}.rendered_html *+p{margin-top:1em}.rendered_html img{display:block;margin-left:auto;margin-right:auto}.rendered_html *+img{margin-top:1em}.rendered_html img,.rendered_html svg{max-width:100%;height:auto}.rendered_html img.unconfined,.rendered_html svg.unconfined{max-width:none}div.text_cell{display:-webkit-box;-webkit-box-orient:horizontal;display:-moz-box;-moz-box-orient:horizontal;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}@media (max-width:540px){div.text_cell>div.prompt{display:none}}div.text_cell_render{outline:0;resize:none;width:inherit;border-style:none;padding:.5em .5em .5em .4em;color:#000;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}a.anchor-link:link{text-decoration:none;padding:0 20px;visibility:hidden}h1:hover .anchor-link,h2:hover .anchor-link,h3:hover .anchor-link,h4:hover .anchor-link,h5:hover .anchor-link,h6:hover .anchor-link{visibility:visible}.text_cell.rendered .input_area{display:none}.text_cell.rendered .rendered_html{overflow-x:auto}.text_cell.unrendered .text_cell_render{display:none}.cm-header-1,.cm-header-2,.cm-header-3,.cm-header-4,.cm-header-5,.cm-header-6{font-weight:700;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.cm-header-1{font-size:185.7%}.cm-header-2{font-size:157.1%}.cm-header-3{font-size:128.6%}.cm-header-4{font-size:110%}.cm-header-5,.cm-header-6{font-size:100%;font-style:italic}/*! +* +* IPython notebook webapp +* +*/@media (max-width:767px){.notebook_app{padding-left:0;padding-right:0}}#ipython-main-app{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;height:100%}div#notebook_panel{margin:0;padding:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;height:100%}#notebook{font-size:14px;line-height:20px;overflow-y:hidden;overflow-x:auto;width:100%;padding-top:20px;margin:0;outline:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;min-height:100%}@media not print{#notebook-container{padding:15px;background-color:#fff;min-height:0;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.2);box-shadow:0 0 12px 1px rgba(87,87,87,.2)}}div.ui-widget-content{border:1px solid #ababab;outline:0}pre.dialog{background-color:#f7f7f7;border:1px solid #ddd;border-radius:2px;padding:.4em .4em .4em 2em}p.dialog{padding:.2em}code,kbd,pre,samp{white-space:pre-wrap}#fonttest{font-family:monospace}p{margin-bottom:0}.end_space{min-height:100px;transition:height .2s ease}.notebook_app #header{-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.2);box-shadow:0 0 12px 1px rgba(87,87,87,.2)}@media not print{.notebook_app{background-color:#eee}}.celltoolbar{border:thin solid #CFCFCF;border-bottom:none;background:#EEE;border-radius:2px 2px 0 0;width:100%;height:29px;padding-right:4px;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch;-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;justify-content:flex-end;font-size:87%;padding-top:3px}@media print{.edit_mode div.cell.selected{border-color:transparent}div.code_cell{page-break-inside:avoid}#notebook-container{width:100%}.celltoolbar{display:none}}.ctb_hideshow{display:none;vertical-align:bottom}.ctb_global_show .ctb_show.ctb_hideshow{display:block}.ctb_global_show .ctb_show+.input_area,.ctb_global_show .ctb_show+div.text_cell_input,.ctb_global_show .ctb_show~div.text_cell_render{border-top-right-radius:0;border-top-left-radius:0}.ctb_global_show .ctb_show~div.text_cell_render{border:1px solid #cfcfcf}.celltoolbar select{color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;line-height:1.5;border-radius:1px;width:inherit;font-size:inherit;height:22px;padding:0;display:inline-block}.celltoolbar select:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.celltoolbar select::-moz-placeholder{color:#999;opacity:1}.celltoolbar select:-ms-input-placeholder{color:#999}.celltoolbar select::-webkit-input-placeholder{color:#999}.celltoolbar select[disabled],.celltoolbar select[readonly],fieldset[disabled] .celltoolbar select{background-color:#eee;opacity:1}.celltoolbar select[disabled],fieldset[disabled] .celltoolbar select{cursor:not-allowed}textarea.celltoolbar select{height:auto}select.celltoolbar select{height:30px;line-height:30px}select[multiple].celltoolbar select,textarea.celltoolbar select{height:auto}.celltoolbar label{margin-left:5px;margin-right:5px}.completions{position:absolute;z-index:10;overflow:hidden;border:1px solid #ababab;border-radius:2px;-webkit-box-shadow:0 6px 10px -1px #adadad;box-shadow:0 6px 10px -1px #adadad;line-height:1}.completions select{background:#fff;outline:0;border:none;padding:0;margin:0;overflow:auto;font-family:monospace;font-size:110%;color:#000;width:auto}.completions select option.context{color:#286090}#kernel_logo_widget{float:right!important;float:right}#kernel_logo_widget .current_kernel_logo{display:none;margin-top:-1px;margin-bottom:-1px;width:32px;height:32px}#menubar{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;margin-top:1px}#menubar .navbar{border-top:1px;border-radius:0 0 2px 2px;margin-bottom:0}#menubar .navbar-toggle{float:left;padding-top:7px;padding-bottom:7px;border:none}#menubar .navbar-collapse{clear:left}.nav-wrapper{border-bottom:1px solid #e7e7e7}i.menu-icon{padding-top:4px}ul#help_menu li a{overflow:hidden;padding-right:2.2em}ul#help_menu li a i{margin-right:-1.2em}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:block;content:"\f0da";float:right;color:#333;margin-top:2px;margin-right:-10px}.dropdown-submenu>a:after.pull-left{margin-right:.3em}.dropdown-submenu>a:after.pull-right{margin-left:.3em}.dropdown-submenu:hover>a:after{color:#262626}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}#notification_area{float:right!important;float:right;z-index:10}.indicator_area{float:right!important;float:right;color:#777;margin-left:5px;margin-right:5px;z-index:10;text-align:center;width:auto}#kernel_indicator{float:right!important;float:right;color:#777;margin-left:5px;margin-right:5px;z-index:10;text-align:center;width:auto;border-left:1px solid}#kernel_indicator .kernel_indicator_name{padding-left:5px;padding-right:5px}#modal_indicator{float:right!important;float:right;color:#777;margin-left:5px;margin-right:5px;z-index:10;text-align:center;width:auto}#readonly-indicator{float:right!important;float:right;color:#777;z-index:10;text-align:center;width:auto;display:none;margin:2px 0 0}.modal_indicator:before{width:1.28571429em;text-align:center}.edit_mode .modal_indicator:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f040"}.edit_mode .modal_indicator:before.pull-left{margin-right:.3em}.edit_mode .modal_indicator:before.pull-right{margin-left:.3em}.command_mode .modal_indicator:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:' '}.command_mode .modal_indicator:before.pull-left{margin-right:.3em}.command_mode .modal_indicator:before.pull-right{margin-left:.3em}.kernel_idle_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f10c"}.kernel_idle_icon:before.pull-left{margin-right:.3em}.kernel_idle_icon:before.pull-right{margin-left:.3em}.kernel_busy_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f111"}.kernel_busy_icon:before.pull-left{margin-right:.3em}.kernel_busy_icon:before.pull-right{margin-left:.3em}.kernel_dead_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f1e2"}.kernel_dead_icon:before.pull-left{margin-right:.3em}.kernel_dead_icon:before.pull-right{margin-left:.3em}.kernel_disconnected_icon:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f127"}.kernel_disconnected_icon:before.pull-left{margin-right:.3em}.kernel_disconnected_icon:before.pull-right{margin-left:.3em}.notification_widget{z-index:10;background:rgba(240,240,240,.5);margin-right:4px;color:#333;background-color:#fff;border-color:#ccc}.notification_widget.active,.notification_widget.focus,.notification_widget:active,.notification_widget:focus,.notification_widget:hover,.open>.dropdown-toggle.notification_widget{color:#333;background-color:#e6e6e6;border-color:#adadad}.notification_widget.active,.notification_widget:active,.open>.dropdown-toggle.notification_widget{background-image:none}.notification_widget.disabled,.notification_widget.disabled.active,.notification_widget.disabled.focus,.notification_widget.disabled:active,.notification_widget.disabled:focus,.notification_widget.disabled:hover,.notification_widget[disabled],.notification_widget[disabled].active,.notification_widget[disabled].focus,.notification_widget[disabled]:active,.notification_widget[disabled]:focus,.notification_widget[disabled]:hover,fieldset[disabled] .notification_widget,fieldset[disabled] .notification_widget.active,fieldset[disabled] .notification_widget.focus,fieldset[disabled] .notification_widget:active,fieldset[disabled] .notification_widget:focus,fieldset[disabled] .notification_widget:hover{background-color:#fff;border-color:#ccc}.notification_widget .badge{color:#fff;background-color:#333}.notification_widget.warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.notification_widget.warning.active,.notification_widget.warning.focus,.notification_widget.warning:active,.notification_widget.warning:focus,.notification_widget.warning:hover,.open>.dropdown-toggle.notification_widget.warning{color:#fff;background-color:#ec971f;border-color:#d58512}.notification_widget.warning.active,.notification_widget.warning:active,.open>.dropdown-toggle.notification_widget.warning{background-image:none}.notification_widget.warning.disabled,.notification_widget.warning.disabled.active,.notification_widget.warning.disabled.focus,.notification_widget.warning.disabled:active,.notification_widget.warning.disabled:focus,.notification_widget.warning.disabled:hover,.notification_widget.warning[disabled],.notification_widget.warning[disabled].active,.notification_widget.warning[disabled].focus,.notification_widget.warning[disabled]:active,.notification_widget.warning[disabled]:focus,.notification_widget.warning[disabled]:hover,fieldset[disabled] .notification_widget.warning,fieldset[disabled] .notification_widget.warning.active,fieldset[disabled] .notification_widget.warning.focus,fieldset[disabled] .notification_widget.warning:active,fieldset[disabled] .notification_widget.warning:focus,fieldset[disabled] .notification_widget.warning:hover{background-color:#f0ad4e;border-color:#eea236}.notification_widget.warning .badge{color:#f0ad4e;background-color:#fff}.notification_widget.success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.notification_widget.success.active,.notification_widget.success.focus,.notification_widget.success:active,.notification_widget.success:focus,.notification_widget.success:hover,.open>.dropdown-toggle.notification_widget.success{color:#fff;background-color:#449d44;border-color:#398439}.notification_widget.success.active,.notification_widget.success:active,.open>.dropdown-toggle.notification_widget.success{background-image:none}.notification_widget.success.disabled,.notification_widget.success.disabled.active,.notification_widget.success.disabled.focus,.notification_widget.success.disabled:active,.notification_widget.success.disabled:focus,.notification_widget.success.disabled:hover,.notification_widget.success[disabled],.notification_widget.success[disabled].active,.notification_widget.success[disabled].focus,.notification_widget.success[disabled]:active,.notification_widget.success[disabled]:focus,.notification_widget.success[disabled]:hover,fieldset[disabled] .notification_widget.success,fieldset[disabled] .notification_widget.success.active,fieldset[disabled] .notification_widget.success.focus,fieldset[disabled] .notification_widget.success:active,fieldset[disabled] .notification_widget.success:focus,fieldset[disabled] .notification_widget.success:hover{background-color:#5cb85c;border-color:#4cae4c}.notification_widget.success .badge{color:#5cb85c;background-color:#fff}.notification_widget.info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.notification_widget.info.active,.notification_widget.info.focus,.notification_widget.info:active,.notification_widget.info:focus,.notification_widget.info:hover,.open>.dropdown-toggle.notification_widget.info{color:#fff;background-color:#31b0d5;border-color:#269abc}.notification_widget.info.active,.notification_widget.info:active,.open>.dropdown-toggle.notification_widget.info{background-image:none}.notification_widget.info.disabled,.notification_widget.info.disabled.active,.notification_widget.info.disabled.focus,.notification_widget.info.disabled:active,.notification_widget.info.disabled:focus,.notification_widget.info.disabled:hover,.notification_widget.info[disabled],.notification_widget.info[disabled].active,.notification_widget.info[disabled].focus,.notification_widget.info[disabled]:active,.notification_widget.info[disabled]:focus,.notification_widget.info[disabled]:hover,fieldset[disabled] .notification_widget.info,fieldset[disabled] .notification_widget.info.active,fieldset[disabled] .notification_widget.info.focus,fieldset[disabled] .notification_widget.info:active,fieldset[disabled] .notification_widget.info:focus,fieldset[disabled] .notification_widget.info:hover{background-color:#5bc0de;border-color:#46b8da}.notification_widget.info .badge{color:#5bc0de;background-color:#fff}.notification_widget.danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.notification_widget.danger.active,.notification_widget.danger.focus,.notification_widget.danger:active,.notification_widget.danger:focus,.notification_widget.danger:hover,.open>.dropdown-toggle.notification_widget.danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.notification_widget.danger.active,.notification_widget.danger:active,.open>.dropdown-toggle.notification_widget.danger{background-image:none}.notification_widget.danger.disabled,.notification_widget.danger.disabled.active,.notification_widget.danger.disabled.focus,.notification_widget.danger.disabled:active,.notification_widget.danger.disabled:focus,.notification_widget.danger.disabled:hover,.notification_widget.danger[disabled],.notification_widget.danger[disabled].active,.notification_widget.danger[disabled].focus,.notification_widget.danger[disabled]:active,.notification_widget.danger[disabled]:focus,.notification_widget.danger[disabled]:hover,fieldset[disabled] .notification_widget.danger,fieldset[disabled] .notification_widget.danger.active,fieldset[disabled] .notification_widget.danger.focus,fieldset[disabled] .notification_widget.danger:active,fieldset[disabled] .notification_widget.danger:focus,fieldset[disabled] .notification_widget.danger:hover{background-color:#d9534f;border-color:#d43f3a}.notification_widget.danger .badge{color:#d9534f;background-color:#fff}div#pager{background-color:#fff;font-size:14px;line-height:20px;overflow:hidden;display:none;position:fixed;bottom:0;width:100%;max-height:50%;padding-top:8px;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.2);box-shadow:0 0 12px 1px rgba(87,87,87,.2);z-index:100;top:auto!important}div#pager pre{line-height:1.21429em;color:#000;background-color:#f7f7f7;padding:.4em}div#pager #pager-button-area{position:absolute;top:8px;right:20px}div#pager #pager-contents{position:relative;overflow:auto;width:100%;height:100%}div#pager #pager-contents #pager-container{position:relative;padding:15px 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}div#pager .ui-resizable-handle{top:0;height:8px;background:#f7f7f7;border-top:1px solid #cfcfcf;border-bottom:1px solid #cfcfcf}div#pager .ui-resizable-handle::after{content:'';top:2px;left:50%;height:3px;width:30px;margin-left:-15px;position:absolute;border-top:1px solid #cfcfcf}.quickhelp{display:-webkit-box;-webkit-box-orient:horizontal;display:-moz-box;-moz-box-orient:horizontal;display:box;box-orient:horizontal;box-align:stretch;display:flex;flex-direction:row;align-items:stretch}.shortcut_key{display:inline-block;width:20ex;text-align:right;font-family:monospace}.shortcut_descr{display:inline-block;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;flex:1}span.save_widget{margin-top:6px}span.save_widget span.filename{height:1em;line-height:1em;padding:3px;margin-left:16px;border:none;font-size:146.5%;border-radius:2px}span.save_widget span.filename:hover{background-color:#e6e6e6}span.autosave_status,span.checkpoint_status{font-size:small}@media (max-width:767px){span.save_widget{font-size:small}span.autosave_status,span.checkpoint_status{display:none}}@media (min-width:768px)and (max-width:991px){span.checkpoint_status{display:none}span.autosave_status{font-size:x-small}}.toolbar{padding:0;margin-left:-5px;margin-top:2px;margin-bottom:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.toolbar label,.toolbar select{width:auto;vertical-align:middle;margin-bottom:0;display:inline;font-size:92%;margin-left:.3em;margin-right:.3em;padding:3px 0 0}.toolbar .btn{padding:2px 8px}.toolbar .btn-group{margin-top:0;margin-left:5px}#maintoolbar{margin-bottom:-3px;margin-top:-8px;border:0;min-height:27px;margin-left:0;padding-top:11px;padding-bottom:3px}#maintoolbar .navbar-text{float:none;vertical-align:middle;text-align:right;margin-left:5px;margin-right:0;margin-top:0}.select-xs{height:24px}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}.bigtooltip{overflow:auto;height:200px;-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms}.smalltooltip{-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;text-overflow:ellipsis;overflow:hidden;height:80px}.tooltipbuttons{position:absolute;padding-right:15px;top:0;right:0}.tooltiptext{padding-right:30px}.ipython_tooltip{max-width:700px;animation:fadeOut 400ms;-webkit-animation:fadeIn 400ms;-moz-animation:fadeIn 400ms;animation:fadeIn 400ms;vertical-align:middle;background-color:#f7f7f7;overflow:visible;border:1px solid #ababab;outline:0;padding:3px 3px 3px 7px;padding-left:7px;font-family:monospace;min-height:50px;-moz-box-shadow:0 6px 10px -1px #adadad;-webkit-box-shadow:0 6px 10px -1px #adadad;box-shadow:0 6px 10px -1px #adadad;border-radius:2px;position:absolute;z-index:1000}.ipython_tooltip a{float:right}.ipython_tooltip .tooltiptext pre{border:0;border-radius:0;font-size:100%;background-color:#f7f7f7}.pretooltiparrow{left:0;margin:0;top:-16px;width:40px;height:16px;overflow:hidden;position:absolute}.pretooltiparrow:before{background-color:#f7f7f7;border:1px solid #ababab;z-index:11;content:"";position:absolute;left:15px;top:10px;width:25px;height:25px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg)}.terminal-app{background:#eee}.terminal-app #header{background:#fff;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.2);box-shadow:0 0 12px 1px rgba(87,87,87,.2)}.terminal-app .terminal{float:left;font-family:monospace;color:#fff;background:#000;padding:.4em;border-radius:2px;-webkit-box-shadow:0 0 12px 1px rgba(87,87,87,.4);box-shadow:0 0 12px 1px rgba(87,87,87,.4)}.terminal-app .terminal,.terminal-app .terminal dummy-screen{line-height:1em;font-size:14px}.terminal-app .terminal-cursor{color:#000;background:#fff}.terminal-app #terminado-container{margin-top:20px} +/*# sourceMappingURL=style.min.css.map */ \ No newline at end of file diff --git a/var/spack/repos/builtin/packages/py-nbformat/package.py b/var/spack/repos/builtin/packages/py-nbformat/package.py index 4ecf7f8fcf..e318096535 100644 --- a/var/spack/repos/builtin/packages/py-nbformat/package.py +++ b/var/spack/repos/builtin/packages/py-nbformat/package.py @@ -35,7 +35,6 @@ class PyNbformat(PythonPackage): version('4.0.1', 'ab7172e517c9d561c0c01eef5631b4c8') version('4.0.0', '7cf61359fa4e9cf3ef5e969e2fcb909e') - depends_on('py-setuptools', type='build') depends_on('py-ipython-genutils', type=('build', 'run')) depends_on('py-traitlets', type=('build', 'run')) depends_on('py-jsonschema', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-ptyprocess/package.py b/var/spack/repos/builtin/packages/py-ptyprocess/package.py index 2419793227..346b3fd26b 100644 --- a/var/spack/repos/builtin/packages/py-ptyprocess/package.py +++ b/var/spack/repos/builtin/packages/py-ptyprocess/package.py @@ -32,5 +32,3 @@ class PyPtyprocess(PythonPackage): url = "https://pypi.io/packages/source/p/ptyprocess/ptyprocess-0.5.1.tar.gz" version('0.5.1', '94e537122914cc9ec9c1eadcd36e73a1') - - depends_on('py-setuptools', type='build') diff --git a/var/spack/repos/builtin/packages/py-pycurl/package.py b/var/spack/repos/builtin/packages/py-pycurl/package.py index 81a2a35064..f08509b332 100644 --- a/var/spack/repos/builtin/packages/py-pycurl/package.py +++ b/var/spack/repos/builtin/packages/py-pycurl/package.py @@ -35,5 +35,4 @@ class PyPycurl(PythonPackage): version('7.43.0', 'c94bdba01da6004fa38325e9bd6b9760') depends_on('python@2.6:') - depends_on('py-setuptools', type='build') depends_on('curl@7.19.0:') diff --git a/var/spack/repos/builtin/packages/py-traitlets/package.py b/var/spack/repos/builtin/packages/py-traitlets/package.py index debd1dca43..78d19e3cbf 100644 --- a/var/spack/repos/builtin/packages/py-traitlets/package.py +++ b/var/spack/repos/builtin/packages/py-traitlets/package.py @@ -40,7 +40,6 @@ class PyTraitlets(PythonPackage): version('4.0.0', 'b5b95ea5941fd9619b4704dfd8201568') version('4.0', '14544e25ccf8e920ed1cbf833852481f') - depends_on('py-setuptools', type='build') depends_on('py-decorator', type=('build', 'run')) depends_on('py-ipython-genutils', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/py-zmq/package.py b/var/spack/repos/builtin/packages/py-zmq/package.py index cbc0e02e6e..7779029fcd 100644 --- a/var/spack/repos/builtin/packages/py-zmq/package.py +++ b/var/spack/repos/builtin/packages/py-zmq/package.py @@ -33,7 +33,6 @@ class PyZmq(PythonPackage): version('16.0.2', '4cf14a2995742253b2b009541f4436f4') version('14.7.0', 'bf304fb73d72aee314ff82d3554328c179938ecf') - depends_on('py-setuptools', type='build') depends_on('py-cython@0.16:', type=('build', 'run')) depends_on('py-py', type=('build', 'run')) depends_on('py-cffi', type=('build', 'run')) -- cgit v1.2.3-70-g09d2 From 94a0cca080f1cd27ca5eaa6dc3c470bb541f4b34 Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Sat, 22 Apr 2017 14:30:51 +0200 Subject: add Intel mpi package and add MPI wrappers to Intel parallel studio (#3905) * intel-mpi: add new package * fix hashes * fix typo * flake8 * add install * blank line * error * add bin64 * fix MPI wrappers in intel-parallel-studio * add missing I_MPI_FC * use shorter hashes --- lib/spack/spack/util/prefix.py | 1 + .../repos/builtin/packages/intel-mpi/package.py | 68 ++++++++++++++++++++++ .../packages/intel-parallel-studio/package.py | 21 +++++++ 3 files changed, 90 insertions(+) create mode 100644 var/spack/repos/builtin/packages/intel-mpi/package.py (limited to 'lib') diff --git a/lib/spack/spack/util/prefix.py b/lib/spack/spack/util/prefix.py index bc6808f350..e39b81a4c6 100644 --- a/lib/spack/spack/util/prefix.py +++ b/lib/spack/spack/util/prefix.py @@ -61,6 +61,7 @@ class Prefix(str): def __new__(cls, path): s = super(Prefix, cls).__new__(cls, path) s.bin = join_path(s, 'bin') + s.bin64 = join_path(s, 'bin64') s.sbin = join_path(s, 'sbin') s.etc = join_path(s, 'etc') s.include = join_path(s, 'include') diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py new file mode 100644 index 0000000000..c4d3df8f74 --- /dev/null +++ b/var/spack/repos/builtin/packages/intel-mpi/package.py @@ -0,0 +1,68 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 + +from spack.pkg.builtin.intel import IntelInstaller + + +class IntelMpi(IntelInstaller): + """Intel MPI""" + + homepage = "https://software.intel.com/en-us/intel-mpi-library" + + version('2017.2', 'b6c2e62c3fb9b1558ede72ccf72cf1d6', + url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11334/l_mpi_2017.2.174.tgz') + version('2017.1', 'd5e941ac2bcf7c5576f85f6bcfee4c18', + url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11014/l_mpi_2017.1.132.tgz') + version('5.1.3', '4316e78533a932081b1a86368e890800', + url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9278/l_mpi_p_5.1.3.223.tgz') + + provides('mpi') + + def install(self, spec, prefix): + self.intel_prefix = prefix + IntelInstaller.install(self, spec, prefix) + + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): + spack_env.set('I_MPI_CC', spack_cc) + spack_env.set('I_MPI_CXX', spack_cxx) + spack_env.set('I_MPI_F77', spack_fc) + spack_env.set('I_MPI_F90', spack_f77) + spack_env.set('I_MPI_FC', spack_fc) + + def setup_dependent_package(self, module, dep_spec): + # Check for presence of bin64 or bin directory + if os.path.isdir(self.prefix.bin): + bindir = self.prefix.bin + elif os.path.isdir(self.prefix.bin64): + bindir = self.prefix.bin64 + else: + raise RuntimeError('No suitable bindir found') + + self.spec.mpicc = join_path(bindir, 'mpicc') + self.spec.mpicxx = join_path(bindir, 'mpicxx') + self.spec.mpifc = join_path(bindir, 'mpif90') + self.spec.mpif77 = join_path(bindir, 'mpif77') diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py index d4ae5fe20f..8bc489f1cb 100644 --- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py +++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py @@ -403,3 +403,24 @@ class IntelParallelStudio(IntelInstaller): run_env.prepend_path('VTUNE_AMPLIFIER_XE_{0}_DIR'.format( major_ver), join_path(self.prefix, 'vtune_amplifier_xe')) + + def setup_dependent_environment(self, spack_env, run_env, dependent_spec): + spack_env.set('I_MPI_CC', spack_cc) + spack_env.set('I_MPI_CXX', spack_cxx) + spack_env.set('I_MPI_F77', spack_fc) + spack_env.set('I_MPI_F90', spack_f77) + spack_env.set('I_MPI_FC', spack_fc) + + def setup_dependent_package(self, module, dep_spec): + # Check for presence of bin64 or bin directory + if os.path.isdir(self.prefix.bin): + bindir = self.prefix.bin + elif os.path.isdir(self.prefix.bin64): + bindir = self.prefix.bin64 + else: + raise RuntimeError('No suitable bindir found') + + self.spec.mpicc = join_path(bindir, 'mpicc') + self.spec.mpicxx = join_path(bindir, 'mpic++') + self.spec.mpifc = join_path(bindir, 'mpif90') + self.spec.mpif77 = join_path(bindir, 'mpif77') -- cgit v1.2.3-70-g09d2 From fc8106afe3d8f46ba2f3171b0e02cf36aa3c3316 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 22 Apr 2017 17:31:22 -0500 Subject: Find more versions from GitHub (#3952) --- lib/spack/spack/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 174f7d0b3c..7a597073d6 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -71,7 +71,7 @@ def find_list_url(url): url_types = [ # e.g. https://github.com/llnl/callpath/archive/v1.0.1.tar.gz - (r'(.*github\.com/[^/]+/[^/]+)/archive/', + (r'(.*github\.com/[^/]+/[^/]+)', lambda m: m.group(1) + '/releases')] for pattern, fun in url_types: -- cgit v1.2.3-70-g09d2 From 3b52d0a8833bd577e63bbf3a9b97559f5a39b7f4 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Sun, 23 Apr 2017 03:06:27 +0200 Subject: External packages are now registered in the DB (#1167) * treats correctly a change from `explicit=False` to `explicit=True` in an external package DB entry. * added unit tests * fixed issues raised by @tgamblin . In particular the PR is no more hash-changing for packages that are not external. * added a test to check correctness of a spec/yaml round-trip for things that involve an external * Don't find external module path at each step of concretization * it's not necessary.. The paths are retrieved at the end of concretizaion * Don't find replacements for external packages. * Test root of the DAG if external * No reason not to test if the root of the DAG is external when external packages are now first class citizens! * Create `external` property for Spec (for external_path and external_module) * Allow users to specify external package paths relative to spack * Canonicalize external package paths so that users may specify their locations relative to spack's directory. * Update tests to use new external_path and external properly. * skip license hooks on external --- lib/spack/spack/build_environment.py | 5 +- lib/spack/spack/concretize.py | 2 +- lib/spack/spack/database.py | 68 ++++++++++++++++++--- lib/spack/spack/directory_layout.py | 2 +- lib/spack/spack/hooks/licensing.py | 4 +- lib/spack/spack/hooks/sbang.py | 8 ++- lib/spack/spack/package.py | 84 ++++++++++++++++++++------ lib/spack/spack/package_prefs.py | 10 +-- lib/spack/spack/spec.py | 47 +++++++++++--- lib/spack/spack/test/cmd/uninstall.py | 2 +- lib/spack/spack/test/concretize.py | 6 +- lib/spack/spack/test/concretize_preferences.py | 2 +- lib/spack/spack/test/conftest.py | 2 + lib/spack/spack/test/database.py | 35 +++++++++-- lib/spack/spack/test/spec_yaml.py | 10 +++ 15 files changed, 230 insertions(+), 57 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 4a8487daab..06ac65f552 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -465,7 +465,10 @@ def parent_class_modules(cls): def load_external_modules(pkg): - """ traverse the spec list and find any specs that have external modules. + """Traverse the spec list associated with a package + and find any specs that have external modules. + + :param pkg: package under consideration """ for dep in list(pkg.spec.traverse()): if dep.external_module: diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 2a5ce65fa4..0b29d2874e 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -99,7 +99,7 @@ class DefaultConcretizer(object): # Use a sort key to order the results return sorted(usable, key=lambda spec: ( - not (spec.external or spec.external_module), # prefer externals + not spec.external, # prefer externals pref_key(spec), # respect prefs spec.name, # group by name reverse_order(spec.versions), # latest version diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 3cb8ced342..33eb7bea4c 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -67,9 +67,9 @@ from spack.version import Version _db_dirname = '.spack-db' # DB version. This is stuck in the DB file to track changes in format. -_db_version = Version('0.9.2') +_db_version = Version('0.9.3') -# Default timeout for spack database locks is 5 min. +# Timeout for spack database locks in seconds _db_lock_timeout = 60 # Types of dependencies tracked by the database @@ -409,24 +409,40 @@ class Database(object): self._data = {} transaction = WriteTransaction( - self.lock, _read_suppress_error, self._write, _db_lock_timeout) + self.lock, _read_suppress_error, self._write, _db_lock_timeout + ) with transaction: if self._error: tty.warn( "Spack database was corrupt. Will rebuild. Error was:", - str(self._error)) + str(self._error) + ) self._error = None + # Read first the `spec.yaml` files in the prefixes. They should be + # considered authoritative with respect to DB reindexing, as + # entries in the DB may be corrupted in a way that still makes + # them readable. If we considered DB entries authoritative + # instead, we would perpetuate errors over a reindex. + old_data = self._data try: + # Initialize data in the reconstructed DB self._data = {} - # Ask the directory layout to traverse the filesystem. + # Start inspecting the installed prefixes + processed_specs = set() + for spec in directory_layout.all_specs(): # Try to recover explicit value from old DB, but - # default it to False if DB was corrupt. - explicit = False + # default it to True if DB was corrupt. This is + # just to be conservative in case a command like + # "autoremove" is run by the user after a reindex. + tty.debug( + 'RECONSTRUCTING FROM SPEC.YAML: {0}'.format(spec) + ) + explicit = True if old_data is not None: old_info = old_data.get(spec.dag_hash()) if old_info is not None: @@ -434,6 +450,42 @@ class Database(object): self._add(spec, directory_layout, explicit=explicit) + processed_specs.add(spec) + + for key, entry in old_data.items(): + # We already took care of this spec using + # `spec.yaml` from its prefix. + if entry.spec in processed_specs: + msg = 'SKIPPING RECONSTRUCTION FROM OLD DB: {0}' + msg += ' [already reconstructed from spec.yaml]' + tty.debug(msg.format(entry.spec)) + continue + + # If we arrived here it very likely means that + # we have external specs that are not dependencies + # of other specs. This may be the case for externally + # installed compilers or externally installed + # applications. + tty.debug( + 'RECONSTRUCTING FROM OLD DB: {0}'.format(entry.spec) + ) + try: + layout = spack.store.layout + if entry.spec.external: + layout = None + kwargs = { + 'spec': entry.spec, + 'directory_layout': layout, + 'explicit': entry.explicit + } + self._add(**kwargs) + processed_specs.add(entry.spec) + except Exception as e: + # Something went wrong, so the spec was not restored + # from old data + tty.debug(e.message) + pass + self._check_ref_counts() except: @@ -542,7 +594,7 @@ class Database(object): key = spec.dag_hash() if key not in self._data: - installed = False + installed = bool(spec.external) path = None if not spec.external and directory_layout: path = directory_layout.path_for_spec(spec) diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 9d09875484..e7c9d6c590 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -193,7 +193,7 @@ class YamlDirectoryLayout(DirectoryLayout): _check_concrete(spec) if spec.external: - return spec.external + return spec.external_path path = spec.format(self.path_scheme) return path diff --git a/lib/spack/spack/hooks/licensing.py b/lib/spack/spack/hooks/licensing.py index a99099749c..9a244dbdef 100644 --- a/lib/spack/spack/hooks/licensing.py +++ b/lib/spack/spack/hooks/licensing.py @@ -31,7 +31,7 @@ from llnl.util.filesystem import join_path, mkdirp def pre_install(pkg): """This hook handles global license setup for licensed software.""" - if pkg.license_required: + if pkg.license_required and not pkg.spec.external: set_up_license(pkg) @@ -145,7 +145,7 @@ def write_license_file(pkg, license_path): def post_install(pkg): """This hook symlinks local licenses to the global license for licensed software.""" - if pkg.license_required: + if pkg.license_required and not pkg.spec.external: symlink_license(pkg) diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py index 6f9736a018..fb824470e2 100644 --- a/lib/spack/spack/hooks/sbang.py +++ b/lib/spack/spack/hooks/sbang.py @@ -104,8 +104,12 @@ def filter_shebangs_in_directory(directory, filenames=None): def post_install(pkg): """This hook edits scripts so that they call /bin/bash - $spack_prefix/bin/sbang instead of something longer than the - shebang limit.""" + $spack_prefix/bin/sbang instead of something longer than the + shebang limit. + """ + if pkg.spec.external: + tty.debug('SKIP: shebang filtering [external package]') + return for directory, _, filenames in os.walk(pkg.prefix): filter_shebangs_in_directory(directory, filenames) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 0402926590..bc479c9cf5 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1081,6 +1081,51 @@ class PackageBase(with_metaclass(PackageMeta, object)): with spack.store.db.prefix_write_lock(self.spec): yield + def _process_external_package(self, explicit): + """Helper function to process external packages. It runs post install + hooks and registers the package in the DB. + + :param bool explicit: True if the package was requested explicitly by + the user, False if it was pulled in as a dependency of an explicit + package. + """ + if self.spec.external_module: + message = '{s.name}@{s.version} : has external module in {module}' + tty.msg(message.format(s=self, module=self.spec.external_module)) + message = '{s.name}@{s.version} : is actually installed in {path}' + tty.msg(message.format(s=self, path=self.spec.external_path)) + else: + message = '{s.name}@{s.version} : externally installed in {path}' + tty.msg(message.format(s=self, path=self.spec.external_path)) + try: + # Check if the package was already registered in the DB + # If this is the case, then just exit + rec = spack.store.db.get_record(self.spec) + message = '{s.name}@{s.version} : already registered in DB' + tty.msg(message.format(s=self)) + # Update the value of rec.explicit if it is necessary + self._update_explicit_entry_in_db(rec, explicit) + + except KeyError: + # If not register it and generate the module file + # For external packages we just need to run + # post-install hooks to generate module files + message = '{s.name}@{s.version} : generating module file' + tty.msg(message.format(s=self)) + spack.hooks.post_install(self) + # Add to the DB + message = '{s.name}@{s.version} : registering into DB' + tty.msg(message.format(s=self)) + spack.store.db.add(self.spec, None, explicit=explicit) + + def _update_explicit_entry_in_db(self, rec, explicit): + if explicit and not rec.explicit: + with spack.store.db.write_transaction(): + rec = spack.store.db.get_record(self.spec) + rec.explicit = True + message = '{s.name}@{s.version} : marking the package explicit' + tty.msg(message.format(s=self)) + def do_install(self, keep_prefix=False, keep_stage=False, @@ -1121,11 +1166,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): raise ValueError("Can only install concrete packages: %s." % self.spec.name) - # No installation needed if package is external + # For external packages the workflow is simplified, and basically + # consists in module file generation and registration in the DB if self.spec.external: - tty.msg("%s is externally installed in %s" % - (self.name, self.spec.external)) - return + return self._process_external_package(explicit) # Ensure package is not already installed layout = spack.store.layout @@ -1135,14 +1179,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): tty.msg( "Continuing from partial install of %s" % self.name) elif layout.check_installed(self.spec): - tty.msg( - "%s is already installed in %s" % (self.name, self.prefix)) + msg = '{0.name} is already installed in {0.prefix}' + tty.msg(msg.format(self)) rec = spack.store.db.get_record(self.spec) - if (not rec.explicit) and explicit: - with spack.store.db.write_transaction(): - rec = spack.store.db.get_record(self.spec) - rec.explicit = True - return + return self._update_explicit_entry_in_db(rec, explicit) # Dirty argument takes precedence over dirty config setting. if dirty is None: @@ -1150,10 +1190,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): self._do_install_pop_kwargs(kwargs) - tty.msg("Installing %s" % self.name) - # First, install dependencies recursively. if install_deps: + tty.debug('Installing {0} dependencies'.format(self.name)) for dep in self.spec.dependencies(): dep.package.do_install( keep_prefix=keep_prefix, @@ -1168,6 +1207,8 @@ class PackageBase(with_metaclass(PackageMeta, object)): **kwargs ) + tty.msg('Installing %s' % self.name) + # Set run_tests flag before starting build. self.run_tests = run_tests @@ -1265,7 +1306,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Fork a child to do the actual installation spack.build_environment.fork(self, build_process, dirty=dirty) # If we installed then we should keep the prefix - keep_prefix = True if self.last_phase is None else keep_prefix + keep_prefix = self.last_phase is None or keep_prefix # note: PARENT of the build process adds the new package to # the database, so that we don't need to re-read from file. spack.store.db.add( @@ -1490,12 +1531,19 @@ class PackageBase(with_metaclass(PackageMeta, object)): spack.hooks.pre_uninstall(pkg) # Uninstalling in Spack only requires removing the prefix. - spack.store.layout.remove_install_directory(spec) + if not spec.external: + msg = 'Deleting package prefix [{0}]' + tty.debug(msg.format(spec.short_spec)) + spack.store.layout.remove_install_directory(spec) + # Delete DB entry + msg = 'Deleting DB entry [{0}]' + tty.debug(msg.format(spec.short_spec)) spack.store.db.remove(spec) + tty.msg("Successfully uninstalled %s" % spec.short_spec) - # TODO: refactor hooks to use specs, not packages. - if pkg is not None: - spack.hooks.post_uninstall(pkg) + # TODO: refactor hooks to use specs, not packages. + if pkg is not None: + spack.hooks.post_uninstall(pkg) tty.msg("Successfully uninstalled %s" % spec.short_spec) diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index f9dac2bef0..8b1fe08154 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -29,6 +29,7 @@ from llnl.util.lang import classproperty import spack import spack.error +from spack.util.path import canonicalize_path from spack.version import * @@ -199,7 +200,7 @@ def spec_externals(spec): """Return a list of external specs (w/external directory path filled in), one for each known external installation.""" # break circular import. - from spack.build_environment import get_path_from_module + from spack.build_environment import get_path_from_module # noqa: F401 allpkgs = get_packages_config() name = spec.name @@ -215,7 +216,8 @@ def spec_externals(spec): # skip entries without paths (avoid creating extra Specs) continue - external_spec = spack.spec.Spec(external_spec, external=path) + external_spec = spack.spec.Spec(external_spec, + external_path=canonicalize_path(path)) if external_spec.satisfies(spec): external_specs.append(external_spec) @@ -223,10 +225,8 @@ def spec_externals(spec): if not module: continue - path = get_path_from_module(module) - external_spec = spack.spec.Spec( - external_spec, external=path, external_module=module) + external_spec, external_module=module) if external_spec.satisfies(spec): external_specs.append(external_spec) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index b4170a0f7a..3d067e083f 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -954,7 +954,7 @@ class Spec(object): self._concrete = kwargs.get('concrete', False) # Allow a spec to be constructed with an external path. - self.external = kwargs.get('external', None) + self.external_path = kwargs.get('external_path', None) self.external_module = kwargs.get('external_module', None) # This allows users to construct a spec DAG with literals. @@ -976,6 +976,10 @@ class Spec(object): self._add_dependency(spec, deptypes) deptypes = () + @property + def external(self): + return bool(self.external_path) or bool(self.external_module) + def get_dependency(self, name): dep = self._dependencies.get(name) if dep is not None: @@ -1349,6 +1353,12 @@ class Spec(object): if params: d['parameters'] = params + if self.external: + d['external'] = { + 'path': self.external_path, + 'module': bool(self.external_module) + } + # TODO: restore build dependencies here once we have less picky # TODO: concretization. deps = self.dependencies_dict(deptype=('link', 'run')) @@ -1412,6 +1422,22 @@ class Spec(object): for name in FlagMap.valid_compiler_flags(): spec.compiler_flags[name] = [] + if 'external' in node: + spec.external_path = None + spec.external_module = None + # This conditional is needed because sometimes this function is + # called with a node already constructed that contains a 'versions' + # and 'external' field. Related to virtual packages provider + # indexes. + if node['external']: + spec.external_path = node['external']['path'] + spec.external_module = node['external']['module'] + if spec.external_module is False: + spec.external_module = None + else: + spec.external_path = None + spec.external_module = None + # Don't read dependencies here; from_node_dict() is used by # from_yaml() to read the root *and* each dependency spec. @@ -1578,6 +1604,8 @@ class Spec(object): done = True for spec in list(self.traverse()): replacement = None + if spec.external: + continue if spec.virtual: replacement = self._find_provider(spec, self_index) if replacement: @@ -1614,7 +1642,7 @@ class Spec(object): continue # If replacement is external then trim the dependencies - if replacement.external or replacement.external_module: + if replacement.external: if (spec._dependencies): changed = True spec._dependencies = DependencyMap() @@ -1632,7 +1660,8 @@ class Spec(object): feq(replacement.architecture, spec.architecture) and feq(replacement._dependencies, spec._dependencies) and feq(replacement.variants, spec.variants) and - feq(replacement.external, spec.external) and + feq(replacement.external_path, + spec.external_path) and feq(replacement.external_module, spec.external_module)): continue @@ -1691,14 +1720,14 @@ class Spec(object): if s.namespace is None: s.namespace = spack.repo.repo_for_pkg(s.name).namespace - for s in self.traverse(root=False): + for s in self.traverse(): if s.external_module: compiler = spack.compilers.compiler_for_spec( s.compiler, s.architecture) for mod in compiler.modules: load_module(mod) - s.external = get_path_from_module(s.external_module) + s.external_path = get_path_from_module(s.external_module) # Mark everything in the spec as concrete, as well. self._mark_concrete() @@ -1919,7 +1948,7 @@ class Spec(object): # if we descend into a virtual spec, there's nothing more # to normalize. Concretize will finish resolving it later. - if self.virtual or self.external or self.external_module: + if self.virtual or self.external: return False # Combine constraints from package deps with constraints from @@ -2325,7 +2354,7 @@ class Spec(object): self.variants != other.variants and self._normal != other._normal and self.concrete != other.concrete and - self.external != other.external and + self.external_path != other.external_path and self.external_module != other.external_module and self.compiler_flags != other.compiler_flags) @@ -2341,7 +2370,7 @@ class Spec(object): self.compiler_flags = other.compiler_flags.copy() self.variants = other.variants.copy() self.variants.spec = self - self.external = other.external + self.external_path = other.external_path self.external_module = other.external_module self.namespace = other.namespace @@ -2988,7 +3017,7 @@ class SpecParser(spack.parse.Parser): spec.variants = VariantMap(spec) spec.architecture = None spec.compiler = None - spec.external = None + spec.external_path = None spec.external_module = None spec.compiler_flags = FlagMap(spec) spec._dependents = DependencyMap() diff --git a/lib/spack/spack/test/cmd/uninstall.py b/lib/spack/spack/test/cmd/uninstall.py index bfbb9b8148..5765f4613d 100644 --- a/lib/spack/spack/test/cmd/uninstall.py +++ b/lib/spack/spack/test/cmd/uninstall.py @@ -53,7 +53,7 @@ def test_uninstall(database): uninstall(parser, args) all_specs = spack.store.layout.all_specs() - assert len(all_specs) == 7 + assert len(all_specs) == 8 # query specs with multiple configurations mpileaks_specs = [s for s in all_specs if s.satisfies('mpileaks')] callpath_specs = [s for s in all_specs if s.satisfies('callpath')] diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 3b383584ce..2063088184 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -293,7 +293,7 @@ class TestConcretize(object): def test_external_package(self): spec = Spec('externaltool%gcc') spec.concretize() - assert spec['externaltool'].external == '/path/to/external_tool' + assert spec['externaltool'].external_path == '/path/to/external_tool' assert 'externalprereq' not in spec assert spec['externaltool'].compiler.satisfies('gcc') @@ -322,8 +322,8 @@ class TestConcretize(object): def test_external_and_virtual(self): spec = Spec('externaltest') spec.concretize() - assert spec['externaltool'].external == '/path/to/external_tool' - assert spec['stuff'].external == '/path/to/external_virtual_gcc' + assert spec['externaltool'].external_path == '/path/to/external_tool' + assert spec['stuff'].external_path == '/path/to/external_virtual_gcc' assert spec['externaltool'].compiler.satisfies('gcc') assert spec['stuff'].compiler.satisfies('gcc') diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index bf915064b2..0b9f7a0046 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -170,4 +170,4 @@ mpich: # ensure that once config is in place, external is used spec = Spec('mpi') spec.concretize() - assert spec['mpich'].external == '/dummy/path' + assert spec['mpich'].external_path == '/dummy/path' diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 796d95a0cf..120425794f 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -252,6 +252,7 @@ def database(tmpdir_factory, builtin_mock, config): _install('mpileaks ^mpich') _install('mpileaks ^mpich2') _install('mpileaks ^zmpi') + _install('externaltest') t = Database( real=real, @@ -265,6 +266,7 @@ def database(tmpdir_factory, builtin_mock, config): t.install('mpileaks ^mpich') t.install('mpileaks ^mpich2') t.install('mpileaks ^zmpi') + t.install('externaltest') yield t diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index 0d7999cd36..a4b35e1df7 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -86,11 +86,17 @@ def _check_merkleiness(): def _check_db_sanity(install_db): """Utiilty function to check db against install layout.""" - expected = sorted(spack.store.layout.all_specs()) + pkg_in_layout = sorted(spack.store.layout.all_specs()) actual = sorted(install_db.query()) - assert len(expected) == len(actual) - for e, a in zip(expected, actual): + externals = sorted([x for x in actual if x.external]) + nexpected = len(pkg_in_layout) + len(externals) + + assert nexpected == len(actual) + + non_external_in_db = sorted([x for x in actual if not x.external]) + + for e, a in zip(pkg_in_layout, non_external_in_db): assert e == a _check_merkleiness() @@ -127,7 +133,7 @@ def test_005_db_exists(database): def test_010_all_install_sanity(database): """Ensure that the install layout reflects what we think it does.""" all_specs = spack.store.layout.all_specs() - assert len(all_specs) == 13 + assert len(all_specs) == 14 # Query specs with multiple configurations mpileaks_specs = [s for s in all_specs if s.satisfies('mpileaks')] @@ -207,7 +213,7 @@ def test_050_basic_query(database): """Ensure querying database is consistent with what is installed.""" install_db = database.mock.db # query everything - assert len(spack.store.db.query()) == 13 + assert len(spack.store.db.query()) == 16 # query specs with multiple configurations mpileaks_specs = install_db.query('mpileaks') @@ -365,3 +371,22 @@ def test_110_no_write_with_exception_on_install(database): # reload DB and make sure cmake was not written. with install_db.read_transaction(): assert install_db.query('cmake', installed=any) == [] + + +def test_external_entries_in_db(database): + install_db = database.mock.db + + rec = install_db.get_record('mpileaks ^zmpi') + assert rec.spec.external_path is None + assert rec.spec.external_module is None + + rec = install_db.get_record('externaltool') + assert rec.spec.external_path == '/path/to/external_tool' + assert rec.spec.external_module is None + assert rec.explicit is False + + rec.spec.package.do_install(fake=True, explicit=True) + rec = install_db.get_record('externaltool') + assert rec.spec.external_path == '/path/to/external_tool' + assert rec.spec.external_module is None + assert rec.explicit is True diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py index 0bcd2de3cf..adf262a60e 100644 --- a/lib/spack/spack/test/spec_yaml.py +++ b/lib/spack/spack/test/spec_yaml.py @@ -52,6 +52,16 @@ def test_normal_spec(builtin_mock): check_yaml_round_trip(spec) +def test_external_spec(config, builtin_mock): + spec = Spec('externaltool') + spec.concretize() + check_yaml_round_trip(spec) + + spec = Spec('externaltest') + spec.concretize() + check_yaml_round_trip(spec) + + def test_ambiguous_version_spec(builtin_mock): spec = Spec('mpileaks@1.0:5.0,6.1,7.3+debug~opt') spec.normalize() -- cgit v1.2.3-70-g09d2 From c144c883024128ac9f82139d7ee37ab0122b9684 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sun, 23 Apr 2017 10:32:08 -0500 Subject: Use six.moves.input instead of raw_input (#3961) * Use six.moves.input instead of raw_input * Remove comment mentioning raw_input --- lib/spack/llnl/util/tty/__init__.py | 5 +++-- lib/spack/spack/package.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index f78d889037..5acd61bc37 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -30,6 +30,7 @@ import termios import struct import traceback from six import StringIO +from six.moves import input from llnl.util.tty.color import * @@ -164,7 +165,7 @@ def get_number(prompt, **kwargs): number = None while number is None: msg(prompt, newline=False) - ans = raw_input() + ans = input() if ans == str(abort): return None @@ -197,7 +198,7 @@ def get_yes_or_no(prompt, **kwargs): result = None while result is None: msg(prompt, newline=False) - ans = raw_input().lower() + ans = input().lower() if not ans: result = default_value if result is None: diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index bc479c9cf5..4a42fef337 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1228,7 +1228,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): # otherwise it should not have passed us the copy of the stream. # Thus, we are free to work with the the copy (input_stream) # however we want. For example, we might want to call functions - # (e.g. raw_input()) that implicitly read from whatever stream is + # (e.g. input()) that implicitly read from whatever stream is # assigned to sys.stdin. Since we want them to work with the # original input stream, we are making the following assignment: sys.stdin = input_stream -- cgit v1.2.3-70-g09d2 From 99a8297add053bba9d10df509c9f702bea22074c Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 24 Apr 2017 15:25:41 -0700 Subject: Rename tutorial_sc16.rst to tutorial.rst (#3974) - make the name more generic for posterity. --- lib/spack/docs/index.rst | 2 +- lib/spack/docs/tutorial.rst | 48 + lib/spack/docs/tutorial_basics.rst | 1252 +++++++++++++++++++++++++ lib/spack/docs/tutorial_modules.rst | 977 +++++++++++++++++++ lib/spack/docs/tutorial_packaging.rst | 462 +++++++++ lib/spack/docs/tutorial_sc16.rst | 48 - lib/spack/docs/tutorial_sc16_modules.rst | 977 ------------------- lib/spack/docs/tutorial_sc16_packaging.rst | 462 --------- lib/spack/docs/tutorial_sc16_spack_basics.rst | 1252 ------------------------- 9 files changed, 2740 insertions(+), 2740 deletions(-) create mode 100644 lib/spack/docs/tutorial.rst create mode 100644 lib/spack/docs/tutorial_basics.rst create mode 100644 lib/spack/docs/tutorial_modules.rst create mode 100644 lib/spack/docs/tutorial_packaging.rst delete mode 100644 lib/spack/docs/tutorial_sc16.rst delete mode 100644 lib/spack/docs/tutorial_sc16_modules.rst delete mode 100644 lib/spack/docs/tutorial_sc16_packaging.rst delete mode 100644 lib/spack/docs/tutorial_sc16_spack_basics.rst (limited to 'lib') diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 579d222346..5dd6fe23be 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -50,7 +50,7 @@ or refer to the full manual below. getting_started basic_usage workflows - tutorial_sc16 + tutorial known_issues .. toctree:: diff --git a/lib/spack/docs/tutorial.rst b/lib/spack/docs/tutorial.rst new file mode 100644 index 0000000000..e6f48fa10e --- /dev/null +++ b/lib/spack/docs/tutorial.rst @@ -0,0 +1,48 @@ +.. _spack-101: + +============================= +Tutorial: Spack 101 +============================= + +This is a 3-hour introduction to Spack with lectures and live demos. It +was presented as a tutorial at `Supercomputing 2016 +`_. You can use these materials to teach +a course on Spack at your own site, or you can just skip ahead and read +the live demo scripts to see how Spack is used in practice. + +.. _sc16-slides: + +.. rubric:: Slides + +.. figure:: tutorial/sc16-tutorial-slide-preview.png + :target: http://llnl.github.io/spack/files/Spack-SC16-Tutorial.pdf + :height: 72px + :align: left + :alt: Slide Preview + +`Download Slides `_. + +**Full citation:** Todd Gamblin, Massimiliano Culpo, Gregory Becker, Matt +Legendre, Greg Lee, Elizabeth Fischer, and Benedikt Hegner. +`Managing HPC Software Complexity with Spack +`_. +Tutorial presented at Supercomputing 2016. November 13, 2016, Salt Lake +City, UT, USA. + +.. _sc16-live-demos: + +.. rubric:: Live Demos + +These scripts will take you step-by-step through basic Spack tasks. They +correspond to sections in the slides above. + + 1. :ref:`basics-tutorial` + 2. :ref:`packaging-tutorial` + 3. :ref:`modules-tutorial` + +Full contents: + +.. toctree:: + tutorial_basics + tutorial_packaging + tutorial_modules diff --git a/lib/spack/docs/tutorial_basics.rst b/lib/spack/docs/tutorial_basics.rst new file mode 100644 index 0000000000..8d9a8fbaea --- /dev/null +++ b/lib/spack/docs/tutorial_basics.rst @@ -0,0 +1,1252 @@ +.. _basics-tutorial: + +========================================= +Basic Installation Tutorial +========================================= + +This tutorial will guide you through the process of installing software +using Spack. We will first cover the `spack install` command, focusing on +the power of the spec syntax and the flexibility it gives to users. We +will also cover the `spack find` command for viewing installed packages +and the `spack uninstall` command. Finally, we will touch on how Spack +manages compilers, especially as it relates to using Spack-built +compilers within Spack. We will include full output from all of the +commands demonstrated, although we will frequently call attention to only +small portions of that output (or merely to the fact that it +succeeded). The provided output is all from a cluster running Red Hat +Enterprise Linux. + +.. _basics-tutorial-install: + +---------------- +Installing Spack +---------------- + +Spack works out of the box. Simply clone spack and get going. + +.. code-block:: console + + $ git clone https://github.com/LLNL/spack.git + Initialized empty Git repository in ~/spack/.git/ + remote: Counting objects: 47125, done. + remote: Compressing objects: 100% (68/68), done. + remote: Total 47125 (delta 16), reused 2 (delta 2), pack-reused 47047 + Receiving objects: 100% (47125/47125), 12.02 MiB | 2.11 MiB/s, done. + Resolving deltas: 100% (23044/23044), done. + $ cd spack + +Then add Spack to your path. + +.. code-block:: console + + $ export PATH=~/spack/bin:$PATH + +You're good to go! + +----------------- +What is in Spack? +----------------- + +The ``spack list`` command shows available packages. + +.. code-block:: console + + $ spack list + ==> 1016 packages. + abinit hwloc piranha r-rjava + ack hydra pixman r-rjson + activeharmony hypre pkg-config r-rjsonio + ... + +The ``spack list`` command can also take a query string. Spack +automatically adds wildcards to both ends of the string. For example, +we can view all available python packages. + +.. code-block:: console + + $ spack list py + ==> 129 packages. + py-3to2 py-epydoc py-nestle py-pycparser py-six + py-alabaster py-flake8 py-netcdf py-pydatalog py-sncosmo + py-argcomplete py-funcsigs py-networkx py-pyelftools py-snowballstemmer + ... + +------------------- +Installing Packages +------------------- + +Installing a package with Spack is very simple. To install a piece of +software, simply type ``spack install `` + +.. code-block:: console + + $ spack install libelf + ==> Installing libelf + ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz + curl: (37) Couldn't open file ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz + ==> Fetching from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz failed. + ==> Trying to fetch from http://www.mr511.de/software/libelf-0.8.13.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a/libelf-0.8.13.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a + ==> No patches needed for libelf + ==> Building libelf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libelf + Fetch: 1.21s. Build: 8.42s. Total: 9.62s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a + + +Spack's spec syntax is the interface by which we can request specific +configurations of the package. The ``%`` sigil is used to specify +compilers. + +.. code-block:: console + + $ spack install libelf %intel + ==> Installing libelf + ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj/libelf-0.8.13.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj + ==> No patches needed for libelf + ==> Building libelf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libelf + Fetch: 0.09s. Build: 50.64s. Total: 50.72s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj + +Note that this installation is located separately from the previous +one. We will discuss this in more detail later, but this is part of what +allows Spack to support arbitrarily versioned software. + +You can check for particular versions before requesting them. We will +use the ``spack versions`` command to see the available versions, and then +install a different version of ``libelf``. + +.. code-block:: console + + $ spack versions libelf + ==> Safe versions (already checksummed): + 0.8.13 + 0.8.12 + ==> Remote versions (not yet checksummed): + 0.8.11 + 0.8.10 + 0.8.9 + 0.8.8 + 0.8.7 + 0.8.6 + 0.8.5 + 0.8.4 + 0.8.3 + 0.8.2 + 0.8.0 + 0.7.0 + 0.6.4 + 0.5.2 + + +The ``@`` sigil is used to specify versions, both of packages and of +compilers. + +.. code-block:: console + + $ spack install libelf @0.8.12 + ==> Installing libelf + ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz + curl: (37) Couldn't open file ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz + ==> Fetching from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz failed. + ==> Trying to fetch from http://www.mr511.de/software/libelf-0.8.12.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy/libelf-0.8.12.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy + ==> No patches needed for libelf + ==> Building libelf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libelf + Fetch: 1.12s. Build: 7.88s. Total: 9.00s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy + + + + $ spack install libelf %intel@15.0.4 + ==> Installing libelf + ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.13-w33hrejdyqu2j2gggdswitls2zv6kdsi/libelf-0.8.13.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.13-w33hrejdyqu2j2gggdswitls2zv6kdsi + ==> No patches needed for libelf + ==> Building libelf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libelf + Fetch: 0.09s. Build: 55.51s. Total: 55.60s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-15.0.4/libelf-0.8.13-w33hrejdyqu2j2gggdswitls2zv6kdsi + + +The spec syntax also includes compiler flags. Spack accepts +``cppflags``, ``cflags``, ``cxxflags``, ``fflags``, ``ldflags``, and +``ldlibs`` parameters. The values of these fields must be quoted on +the command line if they include spaces. These values are injected +into the compile line automatically by the Spack compiler wrappers. + +.. code-block:: console + + $ spack install libelf @0.8.12 cppflags="-O3" + ==> Installing libelf + ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw/libelf-0.8.12.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw + ==> No patches needed for libelf + ==> Building libelf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libelf + Fetch: 0.04s. Build: 7.95s. Total: 7.99s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw + + +The ``spack find`` command is used to query installed packages. Note that +some packages appear identical with the default output. The ``-l`` flag +shows the hash of each package, and the ``-f`` flag shows any non-empty +compiler flags of those packages. + +.. code-block:: console + + $ spack find + ==> 5 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + libelf@0.8.12 + libelf@0.8.12 + libelf@0.8.13 + + -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- + libelf@0.8.13 + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + libelf@0.8.13 + + + + $ spack find -lf + ==> 5 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + ipggckv libelf@0.8.12%gcc + + vrv2ttb libelf@0.8.12%gcc cppflags="-O3" + + csrt4qx libelf@0.8.13%gcc + + + -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- + w33hrej libelf@0.8.13%intel + + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + 7wgp32x libelf@0.8.13%intel + + +Spack generates a hash for each spec. This hash is a function of the full +provenance of the package, so any change to the spec affects the +hash. Spack uses this value to compare specs and to generate unique +installation directories for every combinatorial version. As we move into +more complicated packages with software dependencies, we can see that +Spack reuses existing packages to satisfy a dependency only when the +existing package's hash matches the desired spec. + +.. code-block:: console + + $ spack install libdwarf + ==> Installing libdwarf + ==> libelf is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a + ==> Can not find version 20160507 in url_list + ==> Trying to fetch from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz + curl: (37) Couldn't open file ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz + ==> Fetching from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz failed. + ==> Trying to fetch from http://www.prevanders.net/libdwarf-20160507.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz/libdwarf-20160507.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz + ==> No patches needed for libdwarf + ==> Building libdwarf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libdwarf + Fetch: 1.56s. Build: 33.59s. Total: 35.15s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz + + +Dependencies can be explicitly requested using the ``^`` sigil. Note that +the spec syntax is recursive. Anything we could specify about the +top-level package, we can also specify about a dependency using ``^``. + +.. code-block:: console + + $ spack install libdwarf ^libelf @0.8.12 %intel + ==> Installing libdwarf + ==> Installing libelf + ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.12-4blbe3qxqct3ymrfoxxnxysmybvbxay7/libelf-0.8.12.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.12-4blbe3qxqct3ymrfoxxnxysmybvbxay7 + ==> No patches needed for libelf + ==> Building libelf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libelf + Fetch: 0.04s. Build: 52.16s. Total: 52.19s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libelf-0.8.12-4blbe3qxqct3ymrfoxxnxysmybvbxay7 + ==> Can not find version 20160507 in url_list + ==> Trying to fetch from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz + ################################################################################################################################################################################# 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libdwarf-20160507-csruprgucaujkfkrcywhwou7nbeis5fo/libdwarf-20160507.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libdwarf-20160507-csruprgucaujkfkrcywhwou7nbeis5fo + ==> No patches needed for libdwarf + ==> Building libdwarf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libdwarf + Fetch: 0.40s. Build: 2m 17.29s. Total: 2m 17.69s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libdwarf-20160507-csruprgucaujkfkrcywhwou7nbeis5fo + + +Packages can also be referred to from the command line by their package +hash. Using the ``spack find -lf`` command earlier we saw that the hash +of our optimized installation of libelf (``cppflags="-O3"``) began with +``vrv2ttb``. We can now explicitly build with that package without typing +the entire spec, by using the ``/`` sigil to refer to it by hash. As with +other tools like git, you do not need to specify an *entire* hash on the +command line. You can specify just enough digits to identify a hash +uniquely. If a hash prefix is ambiguous (i.e., two or more installed +packages share the prefix) then spack will report an error. + +.. code-block:: console + + $ spack install libdwarf ^/vrv2ttb + ==> Installing libdwarf + ==> libelf is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw + ==> Can not find version 20160507 in url_list + ==> Trying to fetch from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz + #################################################################################################################################################################################################################################################### 100.0% + ==> Staging archive: ~/spack/var/spack/stage/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t/libdwarf-20160507.tar.gz + ==> Created stage in ~/spack/var/spack/stage/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t + ==> No patches needed for libdwarf + ==> Building libdwarf [Package] + ==> Executing phase : 'install' + ==> Successfully installed libdwarf + Fetch: 0.96s. Build: 24.03s. Total: 24.99s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t + + +The ``spack find`` command can also take a ``-d`` flag, which can show +dependency information. Note that each package has a top-level entry, +even if it also appears as a dependency. + +.. code-block:: console + + $ spack find -ldf + ==> 9 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + dtg3tgn libdwarf@20160507%gcc + vrv2ttb ^libelf@0.8.12%gcc cppflags="-O3" + + yfx6p3g libdwarf@20160507%gcc + csrt4qx ^libelf@0.8.13%gcc + + ipggckv libelf@0.8.12%gcc + + vrv2ttb libelf@0.8.12%gcc cppflags="-O3" + + csrt4qx libelf@0.8.13%gcc + + + -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- + w33hrej libelf@0.8.13%intel + + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + csruprg libdwarf@20160507%intel + 4blbe3q ^libelf@0.8.12%intel + + 4blbe3q libelf@0.8.12%intel + + 7wgp32x libelf@0.8.13%intel + + +As we get to more complex packages, full installs will take too long to +build in the time allotted for this tutorial. Our collaborators at CERN +have been working on binary caching for Spack, which would allow for very +fast installs of previously built packages. We are still working out the +security ramifications of the feature, but it is coming soon. + +For now, we will switch to doing "fake" installs. When supplied with the +``--fake`` flag (primarily used for debugging), Spack computes build +metadata the same way it normally would, but it does not download the +source or run the install script for a pacakge. We can use this to +quickly demonstrate some of the more advanced Spack features in our +limited tutorial time. + +``HDF5`` is an example of a more complicated package, with an MPI +dependency. If we install it "out of the box," it will build with +``openmpi``. + +.. code-block:: console + + $ spack install --fake hdf5 + ==> Installing hdf5 + ==> Installing zlib + ==> Building zlib [Package] + ==> Successfully installed zlib + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Installing openmpi + ==> Installing hwloc + ==> Installing libpciaccess + ==> Installing util-macros + ==> Building util-macros [Package] + ==> Successfully installed util-macros + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/util-macros-1.19.0-pc6zhs4cnkmg2cv4et4fizsp6scuvacg + ==> Installing libtool + ==> Installing m4 + ==> Installing libsigsegv + ==> Building libsigsegv [Package] + ==> Successfully installed libsigsegv + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libsigsegv-2.10-q4cok3yber7lhf3jswg6mysg7oi53unh + ==> Building m4 [Package] + ==> Successfully installed m4 + Fetch: . Build: 0.23s. Total: 0.23s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> Building libtool [Package] + ==> Successfully installed libtool + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libtool-2.4.6-rdx5nkfjwlvcanz5il3ys2pe34j4vxx5 + ==> Installing pkg-config + ==> Building pkg-config [Package] + ==> Successfully installed pkg-config + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/pkg-config-0.29.1-wpjnlzahdw6ahkrgmqyeugkj2zhv4tui + ==> Building libpciaccess [Package] + ==> Successfully installed libpciaccess + Fetch: . Build: 0.10s. Total: 0.10s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libpciaccess-0.13.4-m2f6fpm22rpprq2ihkmfx6llf363264m + ==> Building hwloc [Package] + ==> Successfully installed hwloc + Fetch: . Build: 0.23s. Total: 0.23s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hwloc-1.11.4-xpb6hbl2hsze25cgdgfnoppn6rchhzaz + ==> Building openmpi [Package] + ==> Successfully installed openmpi + Fetch: . Build: 0.35s. Total: 0.35s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> Building hdf5 [AutotoolsPackage] + ==> Successfully installed hdf5 + Fetch: . Build: 0.61s. Total: 0.61s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es + + +Spack packages can also have variants. Boolean variants can be specified +using the ``+`` and ``~`` or ``-`` sigils. There are two sigils for +``False`` to avoid conflicts with shell parsing in different +situations. Variants (boolean or otherwise) can also be specified using +the same syntax as compiler flags. Here we can install HDF5 without MPI +support. + +.. code-block:: console + + $ spack install --fake hdf5~mpi + ==> Installing hdf5 + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Building hdf5 [AutotoolsPackage] + ==> Successfully installed hdf5 + Fetch: . Build: 0.22s. Total: 0.22s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-twppaioxqn6lti4grgopnmhwcq3h2rpw + + +We might also want to install HDF5 with a different MPI +implementation. While MPI is not a package itself, packages can depend on +abstract interfaces like MPI. Spack handles these through "virtual +dependencies." A package, such as HDF5, can depend on the MPI +interface. Other packages (``openmpi``, ``mpich``, ``mvapich``, etc.) +provide the MPI interface. Any of these providers can be requested for +an MPI dependency. For example, we can build HDF5 with MPI support +provided by mpich by specifying a dependency on ``mpich``. Spack also +supports versioning of virtual dependencies. A package can depend on the +MPI interface at version 3, and provider packages specify what version of +the interface *they* provide. The partial spec ``^mpi@3`` can be safisfied +by any of several providers. + +.. code-block:: console + + $ spack install --fake hdf5+mpi ^mpich + ==> Installing hdf5 + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Building hdf5 [AutotoolsPackage] + ==> Successfully installed hdf5 + Fetch: . Build: 0.38s. Total: 0.38s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m + + +We'll do a quick check in on what we have installed so far. + +.. code-block:: console + + $ spack find -ldf + ==> 22 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + twppaio hdf5@1.10.0-patch1%gcc + ayc4jq7 ^zlib@1.2.8%gcc + + j36yfw2 hdf5@1.10.0-patch1%gcc + 5jlp2nd ^mpich@3.2%gcc + ayc4jq7 ^zlib@1.2.8%gcc + + ezvtnox hdf5@1.10.0-patch1%gcc + j4cgoq4 ^openmpi@2.0.1%gcc + xpb6hbl ^hwloc@1.11.4%gcc + m2f6fpm ^libpciaccess@0.13.4%gcc + ayc4jq7 ^zlib@1.2.8%gcc + + xpb6hbl hwloc@1.11.4%gcc + m2f6fpm ^libpciaccess@0.13.4%gcc + + dtg3tgn libdwarf@20160507%gcc + vrv2ttb ^libelf@0.8.12%gcc cppflags="-O3" + + yfx6p3g libdwarf@20160507%gcc + csrt4qx ^libelf@0.8.13%gcc + + ipggckv libelf@0.8.12%gcc + + vrv2ttb libelf@0.8.12%gcc cppflags="-O3" + + csrt4qx libelf@0.8.13%gcc + + m2f6fpm libpciaccess@0.13.4%gcc + + q4cok3y libsigsegv@2.10%gcc + + rdx5nkf libtool@2.4.6%gcc + + qijdzvh m4@1.4.17%gcc + q4cok3y ^libsigsegv@2.10%gcc + + 5jlp2nd mpich@3.2%gcc + + j4cgoq4 openmpi@2.0.1%gcc + xpb6hbl ^hwloc@1.11.4%gcc + m2f6fpm ^libpciaccess@0.13.4%gcc + + wpjnlza pkg-config@0.29.1%gcc + + pc6zhs4 util-macros@1.19.0%gcc + + ayc4jq7 zlib@1.2.8%gcc + + + -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- + w33hrej libelf@0.8.13%intel + + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + csruprg libdwarf@20160507%intel + 4blbe3q ^libelf@0.8.12%intel + + 4blbe3q libelf@0.8.12%intel + + 7wgp32x libelf@0.8.13%intel + + +Spack models the dependencies of packages as a directed acyclic graph +(DAG). The ``spack find -d`` command shows the tree representation of +that graph. We can also use the ``spack graph`` command to view the entire +DAG as a graph. + +.. code-block:: console + + $ spack graph hdf5+mpi ^mpich + o hdf5 + |\ + o | zlib + / + o mpich + +You may also have noticed that there are some packages shown in the +``spack find -d`` output that we didn't install explicitly. These are +dependencies that were installed implicitly. A few packages installed +implicitly are not shown as dependencies in the ``spack find -d`` +output. These are build dependencies. For example, ``libpciaccess`` is a +dependency of openmpi and requires m4 to build. Spack will build `m4`` as +part of the installation of ``openmpi``, but it does not become a part of +the DAG because it is not linked in at run time. Spack handles build +dependencies differently because of their different (less strict) +consistency requirements. It is entirely possible to have two packages +using different versions of a dependency to build, which obviously cannot +be done with linked dependencies. + +``HDF5`` is more complicated than our basic example of libelf and +libdwarf, but it's still within the realm of software that an experienced +HPC user could reasonably expect to install given a bit of time. Now +let's look at a more complicated package. + +.. code-block:: console + + $ spack install --fake trilinos + ==> Installing trilinos + ==> Installing superlu-dist + ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> Installing parmetis + ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> Installing cmake + ==> Installing bzip2 + ==> Building bzip2 [Package] + ==> Successfully installed bzip2 + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bzip2-1.0.6-gll2xsahysy7ji5gkmfxwkofdt3mwjhs + ==> expat is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/expat-2.2.0-mg5kwd3kluxdgorj32vzbp7aksg3vqej + ==> Installing ncurses + ==> Building ncurses [Package] + ==> Successfully installed ncurses + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/ncurses-6.0-fttg4astvrtq2buey4wq66tnyu7bgj2c + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Installing openssl + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Building openssl [Package] + ==> Successfully installed openssl + Fetch: . Build: 0.23s. Total: 0.23s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openssl-1.0.2j-kt5xyk2dkho6tzadnqlbnbujmljprylg + ==> Installing libarchive + ==> Installing lzma + ==> Building lzma [Package] + ==> Successfully installed lzma + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/lzma-4.32.7-hah2cdo3zbulz6yg5do6dvnfn6en5v5c + ==> Installing nettle + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> Installing gmp + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> Building gmp [AutotoolsPackage] + ==> Successfully installed gmp + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf + ==> Building nettle [Package] + ==> Successfully installed nettle + Fetch: . Build: 0.18s. Total: 0.18s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/nettle-3.2-w4ieitifcmrldo4ra7as63apagzf56ja + ==> bzip2 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bzip2-1.0.6-gll2xsahysy7ji5gkmfxwkofdt3mwjhs + ==> expat is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/expat-2.2.0-mg5kwd3kluxdgorj32vzbp7aksg3vqej + ==> Installing libxml2 + ==> Installing xz + ==> Building xz [Package] + ==> Successfully installed xz + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/xz-5.2.2-bxh6cpyqqozazm5okvjqk23sww3gccnf + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Building libxml2 [Package] + ==> Successfully installed libxml2 + Fetch: . Build: 0.35s. Total: 0.35s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libxml2-2.9.4-un323rppyu5qipkegyf7flmymvtmunrx + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Installing lz4 + ==> Building lz4 [Package] + ==> Successfully installed lz4 + Fetch: . Build: 0.12s. Total: 0.12s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/lz4-131-ivy2fcaw7ywujx74weebdi5bsm7q4vkc + ==> openssl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openssl-1.0.2j-kt5xyk2dkho6tzadnqlbnbujmljprylg + ==> xz is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/xz-5.2.2-bxh6cpyqqozazm5okvjqk23sww3gccnf + ==> Installing lzo + ==> Building lzo [AutotoolsPackage] + ==> Successfully installed lzo + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/lzo-2.09-dlgnm74ozo6baactkft5oah2jre2ri2i + ==> Building libarchive [Package] + ==> Successfully installed libarchive + Fetch: . Build: 1.35s. Total: 1.35s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libarchive-3.2.1-biq3kebw7vel7njusill7vv7mjldkqjv + ==> xz is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/xz-5.2.2-bxh6cpyqqozazm5okvjqk23sww3gccnf + ==> Installing curl + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> openssl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openssl-1.0.2j-kt5xyk2dkho6tzadnqlbnbujmljprylg + ==> Building curl [Package] + ==> Successfully installed curl + Fetch: . Build: 0.36s. Total: 0.36s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/curl-7.50.3-oze4gqutj4x2isbkcn5ob2bhhxbskod4 + ==> Building cmake [Package] + ==> Successfully installed cmake + Fetch: . Build: 1.64s. Total: 1.64s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> Installing metis + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> Building metis [Package] + ==> Successfully installed metis + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> Building parmetis [Package] + ==> Successfully installed parmetis + Fetch: . Build: 0.62s. Total: 0.62s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-rtg6hml5t6acdcnxomn3l5zfiful4d2t + ==> Installing openblas + ==> Building openblas [Package] + ==> Successfully installed openblas + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> Building superlu-dist [Package] + ==> Successfully installed superlu-dist + Fetch: . Build: 0.85s. Total: 0.85s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/superlu-dist-5.1.1-25r6jlvkpjnkiuwt2rtbzhk3l3htuxs7 + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> Installing glm + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> Building glm [Package] + ==> Successfully installed glm + Fetch: . Build: 0.12s. Total: 0.12s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/glm-0.9.7.1-7a6oho4aerz7vftxd5ur7lywscht2iry + ==> Installing hypre + ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building hypre [Package] + ==> Successfully installed hypre + Fetch: . Build: 0.61s. Total: 0.61s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hypre-2.11.1-lf7hcejiiww5peesh57quda72z67veit + ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> Installing netlib-scalapack + ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building netlib-scalapack [Package] + ==> Successfully installed netlib-scalapack + Fetch: . Build: 0.61s. Total: 0.61s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dvcanz2qq4dfcexznbhbmzbxfj43uz4q + ==> Installing suite-sparse + ==> Installing tbb + ==> Building tbb [Package] + ==> Successfully installed tbb + Fetch: . Build: 0.12s. Total: 0.12s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/tbb-4.4.4-zawzkkhrmdonbjpj3a5bb6gkgnqlrjeu + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> Building suite-sparse [Package] + ==> Successfully installed suite-sparse + Fetch: . Build: 0.49s. Total: 0.49s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/suite-sparse-4.5.3-lvur6hriy2j7xfjwh5punp3exwpynzm6 + ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> Installing netcdf + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> curl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/curl-7.50.3-oze4gqutj4x2isbkcn5ob2bhhxbskod4 + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es + ==> Building netcdf [Package] + ==> Successfully installed netcdf + Fetch: . Build: 0.90s. Total: 0.90s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netcdf-4.4.1-tcl4zbrmdfrit2cqlaxig6xieu5h552j + ==> Installing mumps + ==> netlib-scalapack is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dvcanz2qq4dfcexznbhbmzbxfj43uz4q + ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building mumps [Package] + ==> Successfully installed mumps + Fetch: . Build: 0.74s. Total: 0.74s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mumps-5.0.2-kr5r4nnx5tfcacxnk3ii5dsxbe6pu5fy + ==> Installing matio + ==> Building matio [Package] + ==> Successfully installed matio + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/matio-1.5.2-4zrozucookychlvc4q53omp2zyfk2bed + ==> Installing boost + ==> bzip2 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bzip2-1.0.6-gll2xsahysy7ji5gkmfxwkofdt3mwjhs + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> Building boost [Package] + ==> Successfully installed boost + Fetch: . Build: 0.35s. Total: 0.35s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/boost-1.62.0-je7eqvzt74kezwhh55y5lwt5dy6pnali + ==> parmetis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-rtg6hml5t6acdcnxomn3l5zfiful4d2t + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es + ==> Building trilinos [Package] + ==> Successfully installed trilinos + Fetch: . Build: 2.63s. Total: 2.63s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/trilinos-12.8.1-uvd6dfd7x4uyvck4awo3r3frudihn4ar + + +Now we're starting to see the power of Spack. Trilinos has 11 top level +dependecies, many of which have dependencies of their own. Installing +more complex packages can take days or weeks even for an experienced +user. Although we've done a fake installation for the tutorial, a real +installation of trilinos using Spack takes about 3 hours (depending on +the system), but only 20 seconds of programmer time. + +Spack manages constistency of the entire DAG. Every MPI dependency will +be satisfied by the same configuration of MPI, etc. If we install +``trilinos`` again specifying a dependency on our previous HDF5 built +with ``mpich``: + +.. code-block:: console + + $ spack install --fake trilinos ^hdf5+mpi ^mpich + ==> Installing trilinos + ==> Installing superlu-dist + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> Installing parmetis + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> Building parmetis [Package] + ==> Successfully installed parmetis + Fetch: . Build: 0.38s. Total: 0.38s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-43kbtni6p5y446c6qdkybq4htj7ot4zn + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building superlu-dist [Package] + ==> Successfully installed superlu-dist + Fetch: . Build: 0.61s. Total: 0.61s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/superlu-dist-5.1.1-46uuupehmonx5jicc6xnegnud2n5jqyl + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> glm is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/glm-0.9.7.1-7a6oho4aerz7vftxd5ur7lywscht2iry + ==> Installing hypre + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building hypre [Package] + ==> Successfully installed hypre + Fetch: . Build: 0.37s. Total: 0.37s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hypre-2.11.1-6ajnyymoivs5apajd7thjisae36jv4lz + ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv + ==> Installing netlib-scalapack + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building netlib-scalapack [Package] + ==> Successfully installed netlib-scalapack + Fetch: . Build: 0.37s. Total: 0.37s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dayeep27omm26wksd3iqvbu3gezc2eoh + ==> suite-sparse is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/suite-sparse-4.5.3-lvur6hriy2j7xfjwh5punp3exwpynzm6 + ==> Installing netcdf + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> curl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/curl-7.50.3-oze4gqutj4x2isbkcn5ob2bhhxbskod4 + ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh + ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m + ==> Building netcdf [Package] + ==> Successfully installed netcdf + Fetch: . Build: 0.67s. Total: 0.67s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netcdf-4.4.1-gfemi4jk4qltvp33xhtpkam7dozbqvhq + ==> Installing mumps + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> netlib-scalapack is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dayeep27omm26wksd3iqvbu3gezc2eoh + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> Building mumps [Package] + ==> Successfully installed mumps + Fetch: . Build: 0.49s. Total: 0.49s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mumps-5.0.2-w7t5pl3jhhwitfiyer63zj6zv7idkt3m + ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za + ==> matio is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/matio-1.5.2-4zrozucookychlvc4q53omp2zyfk2bed + ==> boost is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/boost-1.62.0-je7eqvzt74kezwhh55y5lwt5dy6pnali + ==> parmetis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-43kbtni6p5y446c6qdkybq4htj7ot4zn + ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt + ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m + ==> Building trilinos [Package] + ==> Successfully installed trilinos + Fetch: . Build: 2.42s. Total: 2.42s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/trilinos-12.8.1-ffwrpxnq7lhiw2abxn2u7ffr4jjsdwep + +We see that every package in the trilinos DAG that depends on MPI now +uses ``mpich``. + +.. code-block:: console + + $ spack find -d trilinos + ==> 2 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + trilinos@12.8.1 + ^boost@1.62.0 + ^bzip2@1.0.6 + ^zlib@1.2.8 + ^glm@0.9.7.1 + ^hdf5@1.10.0-patch1 + ^mpich@3.2 + ^hypre@2.11.1 + ^openblas@0.2.19 + ^matio@1.5.2 + ^metis@5.1.0 + ^mumps@5.0.2 + ^netlib-scalapack@2.0.2 + ^netcdf@4.4.1 + ^curl@7.50.3 + ^openssl@1.0.2j + ^parmetis@4.0.3 + ^suite-sparse@4.5.3 + ^tbb@4.4.4 + ^superlu-dist@5.1.1 + + trilinos@12.8.1 + ^boost@1.62.0 + ^bzip2@1.0.6 + ^zlib@1.2.8 + ^glm@0.9.7.1 + ^hdf5@1.10.0-patch1 + ^openmpi@2.0.1 + ^hwloc@1.11.4 + ^libpciaccess@0.13.4 + ^hypre@2.11.1 + ^openblas@0.2.19 + ^matio@1.5.2 + ^metis@5.1.0 + ^mumps@5.0.2 + ^netlib-scalapack@2.0.2 + ^netcdf@4.4.1 + ^curl@7.50.3 + ^openssl@1.0.2j + ^parmetis@4.0.3 + ^suite-sparse@4.5.3 + ^tbb@4.4.4 + ^superlu-dist@5.1.1 + + +As we discussed before, the ``spack find -d`` command shows the +dependency information as a tree. While that is often sufficient, many +complicated packages, including trilinos, have dependencies that +cannot be fully represented as a tree. Again, the ``spack graph`` +command shows the full DAG of the dependency information. + +.. code-block:: console + + $ spack graph trilinos + o trilinos + |\ + | |\ + | | |\ + | | | |\ + | | | | |\ + | | | | | |\ + | | | | | | |\ + | o | | | | | | netcdf + | |\ \ \ \ \ \ \ + | | |\ \ \ \ \ \ \ + | | | o | | | | | | curl + | | |/| | | | | | | + | |/| | | | | | | | + | | | o | | | | | | openssl + | | |/ / / / / / / + | |/| | | | | | | + | | o | | | | | | hdf5 + | |/| | | | | | | + | | |/ / / / / / + | o | | | | | | zlib + | / / / / / / + o | | | | | | swig + o | | | | | | pcre + / / / / / / + o | | | | | mpi + / / / / / + o | | | | matio + / / / / + o | | | lapack + / / / + o | | glm + / / + o | boost + / + o blas + + +You can control how the output is displayed with a number of options. + +The ASCII output from ``spack graph`` can be difficult to parse for +complicated packages. The output can be changed to the ``graphviz`` +``.dot`` format using the `--dot` flag. + +.. code-block:: console + + $ spack graph --dot trilinos | dot -Tpdf trilinos_graph.pdf + +.. _basics-tutorial-uninstall: + +--------------------- +Uninstalling Packages +--------------------- + +Earlier we installed many configurations each of libelf and +libdwarf. Now we will go through and uninstall some of those packages +that we didn't really need. + +.. code-block:: console + + $ spack find -d libdwarf + ==> 3 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + libdwarf@20160507 + ^libelf@0.8.12 + + libdwarf@20160507 + ^libelf@0.8.13 + + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + libdwarf@20160507 + ^libelf@0.8.12 + + $ spack find libelf + ==> 6 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + libelf@0.8.12 libelf@0.8.12 libelf@0.8.13 + + -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- + libelf@0.8.13 + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + libelf@0.8.12 libelf@0.8.13 + + +We can uninstall packages by spec using the same syntax as install. + +.. code-block:: console + + $ spack uninstall libelf%intel@15.0.4 + ==> The following packages will be uninstalled : + + -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- + w33hrej libelf@0.8.13%intel + + + ==> Do you want to proceed? [y/n] y + ==> Successfully uninstalled libelf@0.8.13%intel@15.0.4 arch=linux-redhat6-x86_64-w33hrej + + + + $ spack find -lf libelf + ==> 5 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + ipggckv libelf@0.8.12%gcc + + vrv2ttb libelf@0.8.12%gcc cppflags="-O3" + + csrt4qx libelf@0.8.13%gcc + + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + 4blbe3q libelf@0.8.12%intel + + 7wgp32x libelf@0.8.13%intel + + +We can uninstall packages by referring only to their hash. + + +We can use either ``-f`` (force) or ``-R`` (remove dependents as well) to +remove packages that are required by another installed package. + +.. code-block:: console + + $ spack uninstall /4blb + ==> Error: Will not uninstall libelf@0.8.12%intel@16.0.3-4blbe3q + + The following packages depend on it: + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + csruprg libdwarf@20160507%intel + + + ==> Error: You can use spack uninstall --dependents to uninstall these dependencies as well + $ spack uninstall -R /4blb + ==> The following packages will be uninstalled : + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + csruprg libdwarf@20160507%intel + + 4blbe3q libelf@0.8.12%intel + + + ==> Do you want to proceed? [y/n] y + ==> Successfully uninstalled libdwarf@20160507%intel@16.0.3 arch=linux-redhat6-x86_64-csruprg + ==> Successfully uninstalled libelf@0.8.12%intel@16.0.3 arch=linux-redhat6-x86_64-4blbe3q + + +Spack will not uninstall packages that are not sufficiently +specified. The ``-a`` (all) flag can be used to uninstall multiple +packages at once. + +.. code-block:: console + + $ spack uninstall trilinos + ==> Error: trilinos matches multiple packages: + + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + ffwrpxn trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist + + uvd6dfd trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist + + + ==> Error: You can either: + a) Use a more specific spec, or + b) use spack uninstall -a to uninstall ALL matching specs. + + + + $ spack uninstall /ffwr + ==> The following packages will be uninstalled : + + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + ffwrpxn trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist + + + ==> Do you want to proceed? [y/n] y + ==> Successfully uninstalled trilinos@12.8.1%gcc@4.4.7+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist arch=linux-redhat6-x86_64-ffwrpxn + +----------------------------- +Advanced ``spack find`` Usage +----------------------------- + +We will go over some additional uses for the `spack find` command not +already covered in the :ref:`basics-tutorial-install` and +:ref:`basics-tutorial-uninstall` sections. + +The ``spack find`` command can accept what we call "anonymous specs." +These are expressions in spec syntax that do not contain a package +name. For example, `spack find %intel` will return every package built +with the intel compiler, and ``spack find cppflags="-O3"`` will +return every package which was built with ``cppflags="-O3"``. + +.. code-block:: console + + $ spack find %intel + ==> 1 installed packages. + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + libelf@0.8.13 + + + + $ spack find cppflags="-O3" + ==> 1 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + libelf@0.8.12 + + +The ``find`` command can also show which packages were installed +explicitly (rather than pulled in as a dependency) using the ``-e`` +flag. The ``-E`` flag shows implicit installs only. The ``find`` command can +also show the path to which a spack package was installed using the ``-p`` +command. + +.. code-block:: console + + $ spack find -pe + ==> 10 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + hdf5@1.10.0-patch1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-twppaioxqn6lti4grgopnmhwcq3h2rpw + hdf5@1.10.0-patch1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m + hdf5@1.10.0-patch1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es + libdwarf@20160507 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t + libdwarf@20160507 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz + libelf@0.8.12 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy + libelf@0.8.12 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw + libelf@0.8.13 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a + trilinos@12.8.1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/trilinos-12.8.1-uvd6dfd7x4uyvck4awo3r3frudihn4ar + + -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- + libelf@0.8.13 ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj + + +--------------------- +Customizing Compilers +--------------------- + + +Spack manages a list of available compilers on the system, detected +automatically from from the user's ``PATH`` variable. The ``spack +compilers`` command is an alias for the command ``spack compiler list``. + +.. code-block:: console + + $ spack compilers + ==> Available compilers + -- gcc ---------------------------------------------------------- + gcc@4.4.7 + + -- intel -------------------------------------------------------- + intel@16.0.3 intel@15.0.1 intel@14.0.0 intel@12.1.3 intel@10.0 + intel@16.0.2 intel@15.0.0 intel@13.1.1 intel@12.1.2 intel@9.1 + intel@16.0.1 intel@14.0.4 intel@13.1.0 intel@12.1.0 + intel@16.0.0 intel@14.0.3 intel@13.0.1 intel@12.0.4 + intel@15.0.4 intel@14.0.2 intel@13.0.0 intel@11.1 + intel@15.0.3 intel@14.0.1 intel@12.1.5 intel@10.1 + + -- pgi ---------------------------------------------------------- + pgi@16.5-0 pgi@15.7-0 pgi@14.7-0 pgi@13.2-0 pgi@11.10-0 pgi@9.0-4 + pgi@16.3-0 pgi@15.5-0 pgi@14.3-0 pgi@13.1-1 pgi@11.1-0 pgi@8.0-1 + pgi@16.1-0 pgi@15.1-0 pgi@13.10-0 pgi@12.8-0 pgi@10.9-0 pgi@7.1-3 + pgi@15.10-0 pgi@14.10-0 pgi@13.6-0 pgi@12.1-0 pgi@10.2-0 pgi@7.0-6 + +The compilers are maintained in a YAML file that can be hand-edited +for special cases. Spack also has tools to add compilers, and +compilers built with Spack can be added to the configuration. + +.. code-block:: console + + $ spack install --fake gcc@6.1.0 + ==> Installing gcc + ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf + ==> Installing isl + ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf + ==> Building isl [Package] + ==> Successfully installed isl + Fetch: . Build: 0.19s. Total: 0.19s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/isl-0.14-hs2w7mjjjaakkmbbv5yvfqf7yyzhorl6 + ==> Installing mpc + ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf + ==> Installing mpfr + ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf + ==> Building mpfr [Package] + ==> Successfully installed mpfr + Fetch: . Build: 0.17s. Total: 0.17s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpfr-3.1.4-7kt5ij437khredfq4bvnyu22t3fmtfvt + ==> Building mpc [Package] + ==> Successfully installed mpc + Fetch: . Build: 0.28s. Total: 0.28s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpc-1.0.3-g5taq6lt3zuy5l2jtggi5lctxnl4la5u + ==> Installing binutils + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> Installing bison + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> Building bison [Package] + ==> Successfully installed bison + Fetch: . Build: 0.12s. Total: 0.12s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bison-3.0.4-hkhfysfvq5l6rsns67g2htmkpxauvnwa + ==> Installing flex + ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je + ==> bison is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bison-3.0.4-hkhfysfvq5l6rsns67g2htmkpxauvnwa + ==> Building flex [Package] + ==> Successfully installed flex + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/flex-2.6.0-qd6d73rdfrozdrsdpimvl4tj7d5ps7qg + ==> Building binutils [Package] + ==> Successfully installed binutils + Fetch: . Build: 0.11s. Total: 0.11s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/binutils-2.27-iq2hry3gvaxszmwwbnll7njgdgaek56o + ==> mpfr is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpfr-3.1.4-7kt5ij437khredfq4bvnyu22t3fmtfvt + ==> Building gcc [Package] + ==> Successfully installed gcc + Fetch: . Build: 0.66s. Total: 0.66s. + [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh + + + + $ spack find -p gcc + ==> 1 installed packages. + -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- + gcc@6.1.0 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh + + +If we had done a "real" install of gcc, we could add it to our +configuration now using the `spack compiler add` command, but we would +also be waiting for it to install. If we run the command now, it will +return no new compilers. + +.. code-block:: console + + $ spack compiler add ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh/bin + ==> Found no new compilers + +If we had done a real install, the output would have been as follows: + +.. code-block:: console + + $ spack compiler add ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh/bin + ==> Added 1 new compiler to ~/.spack/linux/compilers.yaml + gcc@6.1.0 diff --git a/lib/spack/docs/tutorial_modules.rst b/lib/spack/docs/tutorial_modules.rst new file mode 100644 index 0000000000..00b42251db --- /dev/null +++ b/lib/spack/docs/tutorial_modules.rst @@ -0,0 +1,977 @@ +.. _modules-tutorial: + +============================= +Module Configuration Tutorial +============================= + +This tutorial will guide you through the customization of both +content and naming of module files generated by Spack. + +Starting from the default Spack settings you will add an increasing +number of directives to the ``modules.yaml`` configuration file to +satisfy a number of constraints that mimic those that you may encounter +in a typical production environment at HPC sites. + +Even though the focus will be for the most part on customizing +TCL non-hierarchical module files, everything +you'll see applies also to other kinds of module files generated by Spack. + +The generation of Lua hierarchical +module files will be addressed at the end of the tutorial, +and you'll see that with minor modifications +to an existing ``modules.yaml`` written for TCL +non-hierarchical modules you'll get almost +for free the possibility to try a hierarchical layout. + +Let's start! + +.. _module_file_tutorial_prerequisites: + +------------- +Prerequisites +------------- + +Before proceeding further ensure: + +- you have LMod or Environment Modules available +- have :ref:`shell support ` activated in Spack + +If you need to install Lmod or Environment module you can refer +to the documentation :ref:`here `. + + +^^^^^^^^^^^^^^^^^^ +Add a new compiler +^^^^^^^^^^^^^^^^^^ + +Spack automatically scans the environment to search for available +compilers on first use. On Ubuntu 14.04, a fresh clone will show +something like this: + +.. code-block:: console + + $ uname -a + Linux nuvolari 4.4.0-45-generic #66~14.04.1-Ubuntu SMP Wed Oct 19 15:05:38 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux + + $ spack compilers + ==> Available compilers + -- gcc ---------------------------------------------------------- + gcc@4.8 + +In order to showcase the capabilities of module customization, we will want to +build a limited set of packages with multiple compilers. If you do not already +have multiple compilers listed by ``spack compilers``, you should build one +with Spack: + +.. code-block:: console + + $ spack install gcc@6.2.0 + # ... + # Wait a long time + # ... + +Then we can use shell support for modules to add it to the list of known compilers: + +.. code-block:: console + + # The name of the generated module may vary + $ module load gcc-6.2.0-gcc-4.8-twd5nqg + + $ spack compiler add + ==> Added 1 new compiler to ~/.spack/linux/compilers.yaml + gcc@6.2.0 + + $ spack compilers + ==> Available compilers + -- gcc ---------------------------------------------------------- + gcc@6.2.0 gcc@4.8 + +Note that the 7-digit hash at the end of the generated module may vary depending +on architecture or package version. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Build software that will be used in the tutorial +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Next you should install a few modules that will be used in the tutorial: + +.. code-block:: console + + $ spack install netlib-scalapack ^openmpi ^openblas + $ spack install netlib-scalapack ^mpich ^openblas + $ spack install netlib-scalapack ^openmpi ^netlib-lapack + $ spack install netlib-scalapack ^mpich ^netlib-lapack + $ spack install py-scipy ^openblas + +In the end your environment should look something like: + +.. code-block:: console + + $ module avail + + ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ + binutils-2.27-gcc-4.8-dz3xevw libpciaccess-0.13.4-gcc-6.2.0-eo2siet lzo-2.09-gcc-6.2.0-jcngz72 netlib-scalapack-2.0.2-gcc-6.2.0-wnimqhw python-2.7.12-gcc-6.2.0-qu7rc5p + bzip2-1.0.6-gcc-6.2.0-csoc2mq libsigsegv-2.10-gcc-4.8-avb6azw m4-1.4.17-gcc-4.8-iggewke netlib-scalapack-2.0.2-gcc-6.2.0-wojunhq sqlite-3.8.5-gcc-6.2.0-td3zfe7 + cmake-3.5.2-gcc-6.2.0-6poypqg libsigsegv-2.10-gcc-6.2.0-g3qpmbi m4-1.4.17-gcc-6.2.0-lhgqa6s nettle-3.2-gcc-6.2.0-djdthlh tcl-8.6.5-gcc-4.8-atddxu7 + curl-7.50.3-gcc-6.2.0-2ffacqm libtool-2.4.6-gcc-6.2.0-kiepac6 mpc-1.0.3-gcc-4.8-lylv7lk openblas-0.2.19-gcc-6.2.0-js33umc util-macros-1.19.0-gcc-6.2.0-uoukuqk + expat-2.2.0-gcc-6.2.0-bxqnjar libxml2-2.9.4-gcc-6.2.0-3k4ykbe mpfr-3.1.4-gcc-4.8-bldfx3w openmpi-2.0.1-gcc-6.2.0-s3qbtby xz-5.2.2-gcc-6.2.0-t5lk6in + gcc-6.2.0-gcc-4.8-twd5nqg lmod-6.4.5-gcc-4.8-7v7bh7b mpich-3.2-gcc-6.2.0-5n5xoep openssl-1.0.2j-gcc-6.2.0-hibnfda zlib-1.2.8-gcc-4.8-bds4ies + gmp-6.1.1-gcc-4.8-uq52e2n lua-5.3.2-gcc-4.8-xozf2hx ncurses-6.0-gcc-4.8-u62fit4 pkg-config-0.29.1-gcc-6.2.0-rslsgcs zlib-1.2.8-gcc-6.2.0-asydrba + gmp-6.1.1-gcc-6.2.0-3cfh3hi lua-luafilesystem-1_6_3-gcc-4.8-sbzejlz ncurses-6.0-gcc-6.2.0-7tb426s py-nose-1.3.7-gcc-6.2.0-4gl5c42 + hwloc-1.11.4-gcc-6.2.0-3ostwel lua-luaposix-33.4.0-gcc-4.8-xf7y2p5 netlib-lapack-3.6.1-gcc-6.2.0-mirer2l py-numpy-1.11.1-gcc-6.2.0-i3rpk4e + isl-0.14-gcc-4.8-cq73t5m lz4-131-gcc-6.2.0-cagoem4 netlib-scalapack-2.0.2-gcc-6.2.0-6bqlxqy py-scipy-0.18.1-gcc-6.2.0-e6uljfi + libarchive-3.2.1-gcc-6.2.0-2b54aos lzma-4.32.7-gcc-6.2.0-sfmeynw netlib-scalapack-2.0.2-gcc-6.2.0-hpqb3dp py-setuptools-25.2.0-gcc-6.2.0-hkqauaa + +------------------------------------------------ +Filter unwanted modifications to the environment +------------------------------------------------ + +The non-hierarchical TCL module files that have been generated so far +follow the default rules for module generation, which are given +:ref:`here ` in the reference part of the manual. Taking a +look at the ``gcc`` module you'll see something like: + +.. code-block:: console + + $ module show gcc-6.2.0-gcc-4.8-twd5nqg + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc-6.2.0-gcc-4.8-twd5nqg: + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + whatis("gcc @6.2.0 ") + prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") + prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") + prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") + prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") + prepend_path("LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") + prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") + prepend_path("CPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/include") + help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, + Fortran, and Java. + ]]) + +As expected, a few environment variables representing paths will be modified +by the modules according to the default prefix inspection rules. + +Consider now the case that your site has decided that e.g. ``CPATH`` and +``LIBRARY_PATH`` modifications should not be present in module files. What you can +do to abide by the rules is to create a configuration file ``~/.spack/modules.yaml`` +with the following content: + +.. code-block:: yaml + + modules: + tcl: + all: + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + +Next you should regenerate all the module files: + +.. code-block:: console + + $ spack module refresh --module-type tcl + ==> You are about to regenerate tcl module files for: + + -- linux-Ubuntu14-x86_64 / gcc@4.8 ------------------------------ + dz3xevw binutils@2.27 uq52e2n gmp@6.1.1 avb6azw libsigsegv@2.10 xozf2hx lua@5.3.2 xf7y2p5 lua-luaposix@33.4.0 lylv7lk mpc@1.0.3 u62fit4 ncurses@6.0 bds4ies zlib@1.2.8 + twd5nqg gcc@6.2.0 cq73t5m isl@0.14 7v7bh7b lmod@6.4.5 sbzejlz lua-luafilesystem@1_6_3 iggewke m4@1.4.17 bldfx3w mpfr@3.1.4 atddxu7 tcl@8.6.5 + + ... + + ==> Do you want to proceed? [y/n] y + ==> Regenerating tcl module files + +If you take a look now at the module for ``gcc`` you'll see that the unwanted +paths have disappeared: + +.. code-block:: console + + $ module show gcc-6.2.0-gcc-4.8-twd5nqg + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc-6.2.0-gcc-4.8-twd5nqg: + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + whatis("gcc @6.2.0 ") + prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") + prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") + prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") + prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") + prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") + help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, + Fortran, and Java. + ]]) + +---------------------------------------------- +Prevent some module files from being generated +---------------------------------------------- + +Another common request at many sites is to avoid exposing software that +is only needed as an intermediate step when building a newer stack. +Let's try to prevent the generation of +module files for anything that is compiled with ``gcc@4.8`` (the OS provided compiler). + +To do this you should add a ``blacklist`` keyword to the configuration file: + +.. code-block:: yaml + :emphasize-lines: 3,4 + + modules: + tcl: + blacklist: + - '%gcc@4.8' + all: + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + +and regenerate the module files: + +.. code-block:: console + + $ spack module refresh --module-type tcl --delete-tree + ==> You are about to regenerate tcl module files for: + + -- linux-Ubuntu14-x86_64 / gcc@4.8 ------------------------------ + dz3xevw binutils@2.27 uq52e2n gmp@6.1.1 avb6azw libsigsegv@2.10 xozf2hx lua@5.3.2 xf7y2p5 lua-luaposix@33.4.0 lylv7lk mpc@1.0.3 u62fit4 ncurses@6.0 bds4ies zlib@1.2.8 + twd5nqg gcc@6.2.0 cq73t5m isl@0.14 7v7bh7b lmod@6.4.5 sbzejlz lua-luafilesystem@1_6_3 iggewke m4@1.4.17 bldfx3w mpfr@3.1.4 atddxu7 tcl@8.6.5 + + -- linux-Ubuntu14-x86_64 / gcc@6.2.0 ---------------------------- + csoc2mq bzip2@1.0.6 2b54aos libarchive@3.2.1 sfmeynw lzma@4.32.7 wnimqhw netlib-scalapack@2.0.2 s3qbtby openmpi@2.0.1 hkqauaa py-setuptools@25.2.0 + 6poypqg cmake@3.5.2 eo2siet libpciaccess@0.13.4 jcngz72 lzo@2.09 6bqlxqy netlib-scalapack@2.0.2 hibnfda openssl@1.0.2j qu7rc5p python@2.7.12 + 2ffacqm curl@7.50.3 g3qpmbi libsigsegv@2.10 lhgqa6s m4@1.4.17 wojunhq netlib-scalapack@2.0.2 rslsgcs pkg-config@0.29.1 td3zfe7 sqlite@3.8.5 + bxqnjar expat@2.2.0 kiepac6 libtool@2.4.6 5n5xoep mpich@3.2 hpqb3dp netlib-scalapack@2.0.2 4gl5c42 py-nose@1.3.7 uoukuqk util-macros@1.19.0 + 3cfh3hi gmp@6.1.1 3k4ykbe libxml2@2.9.4 7tb426s ncurses@6.0 djdthlh nettle@3.2 i3rpk4e py-numpy@1.11.1 t5lk6in xz@5.2.2 + 3ostwel hwloc@1.11.4 cagoem4 lz4@131 mirer2l netlib-lapack@3.6.1 js33umc openblas@0.2.19 e6uljfi py-scipy@0.18.1 asydrba zlib@1.2.8 + + ==> Do you want to proceed? [y/n] y + + $ module avail + + ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ + bzip2-1.0.6-gcc-6.2.0-csoc2mq libsigsegv-2.10-gcc-6.2.0-g3qpmbi ncurses-6.0-gcc-6.2.0-7tb426s openmpi-2.0.1-gcc-6.2.0-s3qbtby sqlite-3.8.5-gcc-6.2.0-td3zfe7 + cmake-3.5.2-gcc-6.2.0-6poypqg libtool-2.4.6-gcc-6.2.0-kiepac6 netlib-lapack-3.6.1-gcc-6.2.0-mirer2l openssl-1.0.2j-gcc-6.2.0-hibnfda util-macros-1.19.0-gcc-6.2.0-uoukuqk + curl-7.50.3-gcc-6.2.0-2ffacqm libxml2-2.9.4-gcc-6.2.0-3k4ykbe netlib-scalapack-2.0.2-gcc-6.2.0-6bqlxqy pkg-config-0.29.1-gcc-6.2.0-rslsgcs xz-5.2.2-gcc-6.2.0-t5lk6in + expat-2.2.0-gcc-6.2.0-bxqnjar lz4-131-gcc-6.2.0-cagoem4 netlib-scalapack-2.0.2-gcc-6.2.0-hpqb3dp py-nose-1.3.7-gcc-6.2.0-4gl5c42 zlib-1.2.8-gcc-6.2.0-asydrba + gmp-6.1.1-gcc-6.2.0-3cfh3hi lzma-4.32.7-gcc-6.2.0-sfmeynw netlib-scalapack-2.0.2-gcc-6.2.0-wnimqhw py-numpy-1.11.1-gcc-6.2.0-i3rpk4e + hwloc-1.11.4-gcc-6.2.0-3ostwel lzo-2.09-gcc-6.2.0-jcngz72 netlib-scalapack-2.0.2-gcc-6.2.0-wojunhq py-scipy-0.18.1-gcc-6.2.0-e6uljfi + libarchive-3.2.1-gcc-6.2.0-2b54aos m4-1.4.17-gcc-6.2.0-lhgqa6s nettle-3.2-gcc-6.2.0-djdthlh py-setuptools-25.2.0-gcc-6.2.0-hkqauaa + libpciaccess-0.13.4-gcc-6.2.0-eo2siet mpich-3.2-gcc-6.2.0-5n5xoep openblas-0.2.19-gcc-6.2.0-js33umc python-2.7.12-gcc-6.2.0-qu7rc5p + +This time it is convenient to pass the option ``--delete-tree`` to the command that +regenerates the module files to instruct it to delete the existing tree and regenerate +a new one instead of overwriting the files in the existing directory. + +If you pay careful attention you'll see though that we went too far in blacklisting modules: +the module for ``gcc@6.2.0`` disappeared as it was bootstrapped with ``gcc@4.8``. To specify +exceptions to the blacklist rules you can use ``whitelist``: + +.. code-block:: yaml + :emphasize-lines: 3,4 + + modules: + tcl: + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + +``whitelist`` rules always have precedence over ``blacklist`` rules. If you regenerate the modules again: + +.. code-block:: console + + $ spack module refresh --module-type tcl -y + +you'll see that now the module for ``gcc@6.2.0`` has reappeared: + +.. code-block:: console + + $ module avail gcc-6.2.0-gcc-4.8-twd5nqg + + ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ + gcc-6.2.0-gcc-4.8-twd5nqg + +------------------------- +Change module file naming +------------------------- + +The next step in making module files more user-friendly is to +improve their naming scheme. +To reduce the length of the hash or remove it altogether you can +use the ``hash_length`` keyword in the configuration file: + +.. TODO: give reasons to remove hashes if they are not evident enough? + +.. code-block:: yaml + :emphasize-lines: 3 + + modules: + tcl: + hash_length: 0 + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + +If you try to regenerate the module files now you will get an error: + +.. code-block:: console + + $ spack module refresh --module-type tcl --delete-tree -y + ==> Error: Name clashes detected in module files: + + file : ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/netlib-scalapack-2.0.2-gcc-6.2.0 + spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 + spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 + spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 + spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 + + ==> Error: Operation aborted + +.. note:: + We try to check for errors upfront! + In Spack we check for errors upfront whenever possible, so don't worry about your module files: + as a name clash was detected nothing has been changed on disk. + +The problem here is that without +the hashes the four different flavors of ``netlib-scalapack`` map to the same module file +name. We have the possibility to add suffixes to differentiate them: + +.. code-block:: yaml + :emphasize-lines: 9-11,14-17 + + modules: + tcl: + hash_length: 0 + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + suffixes: + '^openblas': openblas + '^netlib-lapack': netlib + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + netlib-scalapack: + suffixes: + '^openmpi': openmpi + '^mpich': mpich + +As you can see it is possible to specify rules that applies only to a +restricted set of packages using :ref:`anonymous specs `. +Regenerating module files now we obtain: + +.. code-block:: console + + $ spack module refresh --module-type tcl --delete-tree -y + ==> Regenerating tcl module files + $ module avail + + ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ + bzip2-1.0.6-gcc-6.2.0 libpciaccess-0.13.4-gcc-6.2.0 mpich-3.2-gcc-6.2.0 openblas-0.2.19-gcc-6.2.0 python-2.7.12-gcc-6.2.0 + cmake-3.5.2-gcc-6.2.0 libsigsegv-2.10-gcc-6.2.0 ncurses-6.0-gcc-6.2.0 openmpi-2.0.1-gcc-6.2.0 sqlite-3.8.5-gcc-6.2.0 + curl-7.50.3-gcc-6.2.0 libtool-2.4.6-gcc-6.2.0 netlib-lapack-3.6.1-gcc-6.2.0 openssl-1.0.2j-gcc-6.2.0 util-macros-1.19.0-gcc-6.2.0 + expat-2.2.0-gcc-6.2.0 libxml2-2.9.4-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-netlib-mpich pkg-config-0.29.1-gcc-6.2.0 xz-5.2.2-gcc-6.2.0 + gcc-6.2.0-gcc-4.8 lz4-131-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-netlib-openmpi py-nose-1.3.7-gcc-6.2.0 zlib-1.2.8-gcc-6.2.0 + gmp-6.1.1-gcc-6.2.0 lzma-4.32.7-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-openblas-mpich py-numpy-1.11.1-gcc-6.2.0-openblas + hwloc-1.11.4-gcc-6.2.0 lzo-2.09-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-openblas-openmpi py-scipy-0.18.1-gcc-6.2.0-openblas + libarchive-3.2.1-gcc-6.2.0 m4-1.4.17-gcc-6.2.0 nettle-3.2-gcc-6.2.0 py-setuptools-25.2.0-gcc-6.2.0 + +Finally we can set a ``naming_scheme`` to prevent users from loading +modules that refer to different flavors of the same library/application: + +.. code-block:: yaml + :emphasize-lines: 4,10,11 + + modules: + tcl: + hash_length: 0 + naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + conflict: + - '${PACKAGE}' + suffixes: + '^openblas': openblas + '^netlib-lapack': netlib + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + netlib-scalapack: + suffixes: + '^openmpi': openmpi + '^mpich': mpich + +The final result should look like: + +.. code-block:: console + + $ module avail + + ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ + bzip2/1.0.6-gcc-6.2.0 libpciaccess/0.13.4-gcc-6.2.0 mpich/3.2-gcc-6.2.0 openblas/0.2.19-gcc-6.2.0 python/2.7.12-gcc-6.2.0 + cmake/3.5.2-gcc-6.2.0 libsigsegv/2.10-gcc-6.2.0 ncurses/6.0-gcc-6.2.0 openmpi/2.0.1-gcc-6.2.0 sqlite/3.8.5-gcc-6.2.0 + curl/7.50.3-gcc-6.2.0 libtool/2.4.6-gcc-6.2.0 netlib-lapack/3.6.1-gcc-6.2.0 openssl/1.0.2j-gcc-6.2.0 util-macros/1.19.0-gcc-6.2.0 + expat/2.2.0-gcc-6.2.0 libxml2/2.9.4-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-netlib-mpich pkg-config/0.29.1-gcc-6.2.0 xz/5.2.2-gcc-6.2.0 + gcc/6.2.0-gcc-4.8 lz4/131-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-netlib-openmpi py-nose/1.3.7-gcc-6.2.0 zlib/1.2.8-gcc-6.2.0 + gmp/6.1.1-gcc-6.2.0 lzma/4.32.7-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-openblas-mpich py-numpy/1.11.1-gcc-6.2.0-openblas + hwloc/1.11.4-gcc-6.2.0 lzo/2.09-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-openblas-openmpi (D) py-scipy/0.18.1-gcc-6.2.0-openblas + libarchive/3.2.1-gcc-6.2.0 m4/1.4.17-gcc-6.2.0 nettle/3.2-gcc-6.2.0 py-setuptools/25.2.0-gcc-6.2.0 + +.. note:: + TCL specific directive + The directives ``naming_scheme`` and ``conflict`` are TCL specific and do not apply + to the ``dotkit`` or ``lmod`` sections in the configuration file. + +------------------------------------ +Add custom environment modifications +------------------------------------ + +At many sites it is customary to set an environment variable in a +package's module file that points to the folder in which the package +is installed. You can achieve this with Spack by adding an +``environment`` directive to the configuration file: + +.. code-block:: yaml + :emphasize-lines: 17-19 + + modules: + tcl: + hash_length: 0 + naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + conflict: + - '${PACKAGE}' + suffixes: + '^openblas': openblas + '^netlib-lapack': netlib + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + environment: + set: + '${PACKAGE}_ROOT': '${PREFIX}' + netlib-scalapack: + suffixes: + '^openmpi': openmpi + '^mpich': mpich + +There are many variable tokens available to use in the ``environment`` +and ``naming_scheme`` directives, such as ``${PACKAGE}``, +``${VERSION}``, etc. (see the :meth:`~spack.spec.Spec.format` API +documentation for the complete list). + +Regenerating the module files should result in something like: + +.. code-block:: console + :emphasize-lines: 14 + + $ spack module refresh -y --module-type tcl + ==> Regenerating tcl module files + + $ module show gcc + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc/6.2.0-gcc-4.8: + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + whatis("gcc @6.2.0 ") + prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") + prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") + prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") + prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") + prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") + setenv("GCC_ROOT","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u") + conflict("gcc") + help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, + Fortran, and Java. + ]]) + +As you can see, the ``gcc`` module has the environment variable ``GCC_ROOT`` set. + +Sometimes it's also useful to apply environment modifications selectively and target +only certain packages. You can, for instance set the common variables ``CC``, ``CXX``, +etc. in the ``gcc`` module file and apply other custom modifications to the +``openmpi`` modules as follows: + +.. code-block:: yaml + :emphasize-lines: 20-32 + + modules: + tcl: + hash_length: 0 + naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + conflict: + - '${PACKAGE}' + suffixes: + '^openblas': openblas + '^netlib-lapack': netlib + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + environment: + set: + '${PACKAGE}_ROOT': '${PREFIX}' + gcc: + environment: + set: + CC: gcc + CXX: g++ + FC: gfortran + F90: gfortran + F77: gfortran + openmpi: + environment: + set: + SLURM_MPI_TYPE: pmi2 + OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' + netlib-scalapack: + suffixes: + '^openmpi': openmpi + '^mpich': mpich + +This time we will be more selective and regenerate only the ``gcc`` and +``openmpi`` module files: + +.. code-block:: console + + $ spack module refresh -y --module-type tcl gcc + ==> Regenerating tcl module files + + $ spack module refresh -y --module-type tcl openmpi + ==> Regenerating tcl module files + + $ module show gcc + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc/6.2.0-gcc-4.8: + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + whatis("gcc @6.2.0 ") + prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") + prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") + prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") + prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") + prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") + setenv("GCC_ROOT","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u") + setenv("CC","gcc") + setenv("CXX","g++") + setenv("F90","gfortran") + setenv("FC","gfortran") + setenv("F77","gfortran") + conflict("gcc") + help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, + Fortran, and Java. + ]]) + + $ module show openmpi + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/openmpi/2.0.1-gcc-6.2.0: + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + whatis("openmpi @2.0.1 ") + prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/bin") + prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/") + prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/lib") + prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/lib/pkgconfig") + prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/share/man") + setenv("SLURM_MPI_TYPE","pmi2") + setenv("OMPI_MCA_BTL_OPENIB_WARN_DEFAULT_GID_PREFIX","0") + setenv("OPENMPI_ROOT","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w") + conflict("openmpi") + help([[The Open MPI Project is an open source Message Passing Interface + implementation that is developed and maintained by a consortium of + academic, research, and industry partners. Open MPI is therefore able to + combine the expertise, technologies, and resources from all across the + High Performance Computing community in order to build the best MPI + library available. Open MPI offers advantages for system and software + vendors, application developers and computer science researchers. + ]]) + + +--------------------- +Autoload dependencies +--------------------- + +Spack can also generate module files that contain code to load the +dependencies automatically. You can, for instance generate python +modules that load their dependencies by adding the ``autoload`` +directive and assigning it the value ``direct``: + +.. code-block:: yaml + :emphasize-lines: 37,38 + + modules: + tcl: + hash_length: 0 + naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + conflict: + - '${PACKAGE}' + suffixes: + '^openblas': openblas + '^netlib-lapack': netlib + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + environment: + set: + '${PACKAGE}_ROOT': '${PREFIX}' + gcc: + environment: + set: + CC: gcc + CXX: g++ + FC: gfortran + F90: gfortran + F77: gfortran + openmpi: + environment: + set: + SLURM_MPI_TYPE: pmi2 + OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' + netlib-scalapack: + suffixes: + '^openmpi': openmpi + '^mpich': mpich + ^python: + autoload: 'direct' + +and regenerating the module files for every package that depends on ``python``: + +.. code-block:: console + + $ spack module refresh -y --module-type tcl ^python + ==> Regenerating tcl module files + +Now the ``py-scipy`` module will be: + +.. code-block:: tcl + + #%Module1.0 + ## Module file created by spack (https://github.com/LLNL/spack) on 2016-11-02 20:53:21.283547 + ## + ## py-scipy@0.18.1%gcc@6.2.0 arch=linux-Ubuntu14-x86_64-e6uljfi + ## + module-whatis "py-scipy @0.18.1" + + proc ModulesHelp { } { + puts stderr "SciPy (pronounced "Sigh Pie") is a Scientific Library for Python. It" + puts stderr "provides many user-friendly and efficient numerical routines such as" + puts stderr "routines for numerical integration and optimization." + } + + if ![ is-loaded python/2.7.12-gcc-6.2.0 ] { + puts stderr "Autoloading python/2.7.12-gcc-6.2.0" + module load python/2.7.12-gcc-6.2.0 + } + + if ![ is-loaded openblas/0.2.19-gcc-6.2.0 ] { + puts stderr "Autoloading openblas/0.2.19-gcc-6.2.0" + module load openblas/0.2.19-gcc-6.2.0 + } + + if ![ is-loaded py-numpy/1.11.1-gcc-6.2.0-openblas ] { + puts stderr "Autoloading py-numpy/1.11.1-gcc-6.2.0-openblas" + module load py-numpy/1.11.1-gcc-6.2.0-openblas + } + + prepend-path CMAKE_PREFIX_PATH "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh/" + prepend-path LD_LIBRARY_PATH "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh/lib" + prepend-path PYTHONPATH "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh/lib/python2.7/site-packages" + setenv PY_SCIPY_ROOT "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh" + conflict py-scipy + +and will contain code to autoload all the dependencies: + +.. code-block:: console + + $ module load py-scipy + Autoloading python/2.7.12-gcc-6.2.0 + Autoloading openblas/0.2.19-gcc-6.2.0 + Autoloading py-numpy/1.11.1-gcc-6.2.0-openblas + +----------------------------- +Lua hierarchical module files +----------------------------- + +In the final part of this tutorial you will modify ``modules.yaml`` to generate +Lua hierarchical module files. You will see that most of the directives used before +are also valid in the ``lmod`` context. + +^^^^^^^^^^^^^^^^^ +Core/Compiler/MPI +^^^^^^^^^^^^^^^^^ + +.. warning:: + Only LMod supports Lua hierarchical module files + For this part of the tutorial you need to be using LMod to + manage your environment. + +The most common hierarchy is the so called ``Core/Compiler/MPI``. To have an idea +how a hierarchy is organized you may refer to the +`Lmod guide `_. +Since ``lmod`` is not enabled by default, you need to add it to the list of +enabled module file generators. The other things you need to do are: + +- change the ``tcl`` tag to ``lmod`` +- remove ``tcl`` specific directives (``naming_scheme`` and ``conflict``) +- set which compilers are considered ``core`` +- remove the ``mpi`` related suffixes (as they will be substituted by hierarchies) + +After modifications the configuration file will be: + +.. code-block:: yaml + :emphasize-lines: 2-6 + + modules: + enable:: + - lmod + lmod: + core_compilers: + - 'gcc@4.8' + hash_length: 0 + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + all: + suffixes: + '^openblas': openblas + '^netlib-lapack': netlib + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + environment: + set: + '${PACKAGE}_ROOT': '${PREFIX}' + gcc: + environment: + set: + CC: gcc + CXX: g++ + FC: gfortran + F90: gfortran + F77: gfortran + openmpi: + environment: + set: + SLURM_MPI_TYPE: pmi2 + OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' + + +.. note:: + The double colon + The double colon after ``enable`` is intentional and it serves the + purpose of overriding the default list of enabled generators so + that only ``lmod`` will be active (see :ref:`the reference + manual ` for a more detailed explanation of + config scopes). If a single colon is used, it will append instead + of override. + +The directive ``core_compilers`` accepts a list of compilers; everything built +using these compilers will create a module in the ``Core`` part of the hierarchy. It is +common practice to put the OS provided compilers in the list and only build common utilities +and other compilers in ``Core``. + +If you regenerate the module files + +.. code-block:: console + + $ spack module refresh --module-type lmod --delete-tree -y + +and update ``MODULEPATH`` to point to the ``Core`` folder, and +list the available modules, you'll see: + +.. code-block:: console + + $ module unuse ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 + $ module use ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core + $ module avail + + ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- + gcc/6.2.0 + +The only module visible now is ``gcc``. Loading that you will make +visible the ``Compiler`` part of the software stack that was built with ``gcc/6.2.0``: + +.. code-block:: console + + $ module load gcc + $ module avail + + -------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/gcc/6.2.0 --------------------------------------------------------------------- + binutils/2.27 curl/7.50.3 hwloc/1.11.4 libtool/2.4.6 lzo/2.09 netlib-lapack/3.6.1 openssl/1.0.2j py-scipy/0.18.1-openblas util-macros/1.19.0 + bison/3.0.4 expat/2.2.0 libarchive/3.2.1 libxml2/2.9.4 m4/1.4.17 nettle/3.2 pkg-config/0.29.1 py-setuptools/25.2.0 xz/5.2.2 + bzip2/1.0.6 flex/2.6.0 libpciaccess/0.13.4 lz4/131 mpich/3.2 openblas/0.2.19 py-nose/1.3.7 python/2.7.12 zlib/1.2.8 + cmake/3.6.1 gmp/6.1.1 libsigsegv/2.10 lzma/4.32.7 ncurses/6.0 openmpi/2.0.1 py-numpy/1.11.1-openblas sqlite/3.8.5 + + ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- + gcc/6.2.0 (L) + +The same holds true for the ``MPI`` part of the stack, that you can enable by loading +either ``mpich`` or ``openmpi``. The nice features of LMod will become evident +once you'll try switching among different stacks: + +.. code-block:: console + + $ module load mpich + $ module avail + + ----------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/mpich/3.2-5n5xoep/gcc/6.2.0 ------------------------------------------------------------ + netlib-scalapack/2.0.2-netlib netlib-scalapack/2.0.2-openblas (D) + + -------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/gcc/6.2.0 --------------------------------------------------------------------- + binutils/2.27 curl/7.50.3 hwloc/1.11.4 libtool/2.4.6 lzo/2.09 netlib-lapack/3.6.1 openssl/1.0.2j py-scipy/0.18.1-openblas util-macros/1.19.0 + bison/3.0.4 expat/2.2.0 libarchive/3.2.1 libxml2/2.9.4 m4/1.4.17 nettle/3.2 pkg-config/0.29.1 py-setuptools/25.2.0 xz/5.2.2 + bzip2/1.0.6 flex/2.6.0 libpciaccess/0.13.4 lz4/131 mpich/3.2 (L) openblas/0.2.19 py-nose/1.3.7 python/2.7.12 zlib/1.2.8 + cmake/3.6.1 gmp/6.1.1 libsigsegv/2.10 lzma/4.32.7 ncurses/6.0 openmpi/2.0.1 py-numpy/1.11.1-openblas sqlite/3.8.5 + + ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- + gcc/6.2.0 (L) + + $ module load openblas netlib-scalapack/2.0.2-openblas + $ module list + + Currently Loaded Modules: + 1) gcc/6.2.0 2) mpich/3.2 3) openblas/0.2.19 4) netlib-scalapack/2.0.2-openblas + + $ module load openmpi + + Lmod is automatically replacing "mpich/3.2" with "openmpi/2.0.1" + + + Due to MODULEPATH changes the following have been reloaded: + 1) netlib-scalapack/2.0.2-openblas + +This layout is already a great improvement over the usual non-hierarchical layout, +but it still has an asymmetry: ``LAPACK`` providers are semantically the same as ``MPI`` +providers, but they are still not part of the hierarchy. We'll see a possible solution +next. + +.. Activate lmod and turn the previous modifications into lmod: + Add core compilers + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Extend the hierarchy to other virtual providers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. warning:: + This is an experimental feature + Having a hierarchy deeper than ``Core``/``Compiler``/``MPI`` is an experimental + feature, still not fully supported by ``module spider``, + see `here `_. Furthermore its use + with hierarchies more complex than ``Core``/``Compiler``/``MPI``/``LAPACK`` + has not been thoroughly tested in production environments. + +Spack permits you to generate Lua hierarchical module files where users +can add an arbitrary list of virtual providers to the triplet +``Core``/``Compiler``/``MPI``. A configuration file like: + +.. code-block:: yaml + :emphasize-lines: 7,8 + + modules: + enable:: + - lmod + lmod: + core_compilers: + - 'gcc@4.8' + hierarchical_scheme: + - lapack + hash_length: 0 + whitelist: + - gcc + blacklist: + - '%gcc@4.8' + - readline + all: + filter: + environment_blacklist: ['CPATH', 'LIBRARY_PATH'] + environment: + set: + '${PACKAGE}_ROOT': '${PREFIX}' + gcc: + environment: + set: + CC: gcc + CXX: g++ + FC: gfortran + F90: gfortran + F77: gfortran + openmpi: + environment: + set: + SLURM_MPI_TYPE: pmi2 + OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' + +will add ``lapack`` providers to the mix. After the usual regeneration of module files: + +.. code-block:: console + + $ module purge + $ spack module refresh --module-type lmod --delete-tree -y + ==> Regenerating lmod module files + +you will have something like: + +.. code-block:: console + + $ module load gcc + $ module load openblas + $ module load openmpi + $ module avail + + --------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/openblas/0.2.19-js33umc/openmpi/2.0.1-s3qbtby/gcc/6.2.0 ---------------------------------------------- + netlib-scalapack/2.0.2 + + -------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/openblas/0.2.19-js33umc/gcc/6.2.0 --------------------------------------------------------- + py-numpy/1.11.1 py-scipy/0.18.1 + + -------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/gcc/6.2.0 --------------------------------------------------------------------- + binutils/2.27 curl/7.50.3 hwloc/1.11.4 libtool/2.4.6 lzo/2.09 netlib-lapack/3.6.1 openssl/1.0.2j python/2.7.12 zlib/1.2.8 + bison/3.0.4 expat/2.2.0 libarchive/3.2.1 libxml2/2.9.4 m4/1.4.17 nettle/3.2 pkg-config/0.29.1 sqlite/3.8.5 + bzip2/1.0.6 flex/2.6.0 libpciaccess/0.13.4 lz4/131 mpich/3.2 openblas/0.2.19 (L) py-nose/1.3.7 util-macros/1.19.0 + cmake/3.6.1 gmp/6.1.1 libsigsegv/2.10 lzma/4.32.7 ncurses/6.0 openmpi/2.0.1 (L) py-setuptools/25.2.0 xz/5.2.2 + + ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- + gcc/6.2.0 (L) + +Now both the ``MPI`` and the ``LAPACK`` providers are handled by LMod as hierarchies: + +.. code-block:: console + + $ module load py-numpy netlib-scalapack + $ module load mpich + + Lmod is automatically replacing "openmpi/2.0.1" with "mpich/3.2" + + + Due to MODULEPATH changes the following have been reloaded: + 1) netlib-scalapack/2.0.2 + + $ module load netlib-lapack + + Lmod is automatically replacing "openblas/0.2.19" with "netlib-lapack/3.6.1" + + + Inactive Modules: + 1) py-numpy + + Due to MODULEPATH changes the following have been reloaded: + 1) netlib-scalapack/2.0.2 + +making the use of tags to differentiate them unnecessary. +Note that because we only compiled ``py-numpy`` with ``openblas`` the module +is made inactive when we switch the ``LAPACK`` provider. The user +environment will now be consistent by design! diff --git a/lib/spack/docs/tutorial_packaging.rst b/lib/spack/docs/tutorial_packaging.rst new file mode 100644 index 0000000000..e250ab835e --- /dev/null +++ b/lib/spack/docs/tutorial_packaging.rst @@ -0,0 +1,462 @@ +.. _packaging-tutorial: + +========================= +Package Creation Tutorial +========================= + +This tutorial will walk you through the steps behind building a simple +package installation script. We'll focus building an mpileaks package, +which is a MPI debugging tool. By creating a package file we're +essentially giving Spack a recipe for how to build a particular piece of +software. We're describing some of the software's dependencies, where to +find the package, what commands and options are used to build the package +from source, and more. Once we've specified a package's recipe, we can +ask Spack to build that package in many different ways. + +This tutorial assumes you have a basic familiarity with some of the Spack +commands, and that you have a working version of Spack installed. If +not, we suggest looking at Spack's *Getting Started* guide. This +tutorial also assumes you have at least a beginner's-level familiarity +with Python. + +Also note that this document is a tutorial. It can help you get started +with packaging, but is not intended to be complete. See Spack's +:ref:`packaging-guide` for more complete documentation on this topic. + +--------------- +Getting Started +--------------- + +A few things before we get started: + +- We'll refer to the Spack installation location via the environment + variable ``SPACK_ROOT``. You should point ``SPACK_ROOT`` at wherever + you have Spack installed. +- Add ``$SPACK_ROOT/bin`` to your ``PATH`` before you start. +- Make sure your ``EDITOR`` environment variable is set to some text + editor you like. +- We'll be writing Python code as part of this tutorial. You can find + successive versions of the Python code in + ``$SPACK_ROOT/lib/spack/docs/tutorial/examples``. + +------------------------- +Creating the Package File +------------------------- + +Spack comes with a handy command to create a new package: ``spack create`` + +This command is given the location of a package's source code, downloads +the code, and sets up some basic packaging infrastructure for you. The +mpileaks source code can be found on GitHub, and here's what happens when +we run ``spack create`` on it: + +.. code-block:: console + + $ spack create -f https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz + ==> This looks like a URL for mpileaks version 1.0 + ==> Creating template for package mpileaks + ==> Downloading... + ==> Fetching https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz + ###################################################################################### 100.0% + +And Spack should spawn a text editor with this file: + +.. literalinclude:: tutorial/examples/0.package.py + :language: python + +Spack has created this file in +``$SPACK_ROOT/var/spack/repos/builtin/packages/mpileaks/package.py``. Take a +moment to look over the file. There's a few placeholders that Spack has +created, which we'll fill in as part of this tutorial: + +- We'll document some information about this package in the comments. +- We'll fill in the dependency list for this package. +- We'll fill in some of the configuration arguments needed to build this + package. + +For the moment, exit your editor and let's see what happens when we try +to build this package: + +.. code-block:: console + + $ spack install mpileaks + ==> Installing mpileaks + ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz + ==> Staging archive: /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-hufwhwpq5benv3sslie6ryflk5s6nm35/mpileaks-1.0.tar.gz + ==> Created stage in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-hufwhwpq5benv3sslie6ryflk5s6nm35 + ==> Ran patch() for mpileaks + ==> Building mpileaks [AutotoolsPackage] + ==> Executing phase : 'autoreconf' + ==> Executing phase : 'configure' + ==> Error: ProcessError: Command exited with status 1: + './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-hufwhwpq5benv3sslie6ryflk5s6nm35' + /usr/workspace/wsa/legendre/spack/lib/spack/spack/build_systems/autotools.py:150, in configure: + 145 def configure(self, spec, prefix): + 146 """Runs configure with the arguments specified in `configure_args` + 147 and an appropriately set prefix + 148 """ + 149 options = ['--prefix={0}'.format(prefix)] + self.configure_args() + >> 150 inspect.getmodule(self).configure(*options) + + See build log for details: + /tmp/legendre/spack-stage/spack-stage-8HVzqu/mpileaks-1.0/spack-build.out + +This obviously didn't work; we need to fill in the package-specific +information. Specifically, Spack didn't try to build any of mpileaks' +dependencies, nor did it use the proper configure arguments. Let's start +fixing things + +--------------------- +Package Documentation +--------------------- + +We can bring the ``package.py`` file back into our ``EDITOR`` with the +``spack edit`` command: + +.. code-block:: console + + $ spack edit mpileaks + +Let's remove some of the ``FIXME`` comments, and add links to the mpileaks +homepage and document what mpileaks does. I'm also going to cut out the +Copyright clause at this point to keep this tutorial document shorter, +but you shouldn't do that normally. The results of these changes can be +found in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/1.package.py`` +and are below. Make these changes to your ``package.py``: + +.. literalinclude:: tutorial/examples/1.package.py + :lines: 25- + :language: python + +We've filled in the comment that describes what this package does and +added a link to the web site. That won't help us build yet, but it will +allow Spack to provide some documentation on this package to other users: + +.. code-block:: console + + $ spack info mpileaks + AutotoolsPackage: mpileaks + Homepage: https://github.com/hpc/mpileaks + + Safe versions: + 1.0 https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz + + Variants: + None + + Installation Phases: + autoreconf configure build install + + Build Dependencies: + None + + Link Dependencies: + None + + Run Dependencies: + None + + Virtual Packages: + None + + Description: + Tool to detect and report MPI objects like MPI_Requests and + MPI_Datatypes + +As we fill in more information about this package the ``spack info`` command +will become more informative. Now let's start making this package build. + +------------ +Dependencies +------------ + +The mpileaks packages depends on three other package: ``MPI``, +``adept-utils``, and ``callpath``. Let's add those via the +``depends_on`` command in our ``package.py`` (this version is in +``$SPACK_ROOT/lib/spack/docs/tutorial/examples/2.package.py``): + +.. literalinclude:: tutorial/examples/2.package.py + :lines: 25- + :language: python + +Now when we go to build mpileaks, Spack will fetch and build these +dependencies before building mpileaks. Note that the mpi dependency is a +different kind of beast than the adept-utils and callpath dependencies; +there is no mpi package available in Spack. Instead mpi is a virtual +dependency. Spack may satisfy that dependency by installing packages +such as ``openmpi`` or ``mvapich``. See the :ref:`packaging-guide` for more +information on virtual dependencies. + +Now when we try to install this package a lot more happens: + +.. code-block:: console + + $ spack install mpileaks + ==> Installing mpileaks + ==> openmpi is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz + ==> callpath is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube + ==> adept-utils is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz + ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz + ==> Already staged mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk + ==> Already patched mpileaks + ==> Building mpileaks [AutotoolsPackage] + ==> Executing phase : 'autoreconf' + ==> Executing phase : 'configure' + ==> Error: ProcessError: Command exited with status 1: + './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk' + /usr/workspace/wsa/legendre/spack/lib/spack/spack/build_systems/autotools.py:150, in configure: + 145 def configure(self, spec, prefix): + 146 """Runs configure with the arguments specified in `configure_args` + 147 and an appropriately set prefix + 148 """ + 149 options = ['--prefix={0}'.format(prefix)] + self.configure_args() + >> 150 inspect.getmodule(self).configure(*options) + + See build log for details: + /tmp/legendre/spack-stage/spack-stage-7V5yyk/mpileaks-1.0/spack-build.out + +Note that this command may take a while to run and produce more output if +you don't have an MPI already installed or configured in Spack. + +Now Spack has identified and made sure all of our dependencies have been +built. It found the ``openmpi`` package that will satisfy our ``mpi`` +dependency, and the ``callpath`` and ``adept-utils`` package to satisfy our +concrete dependencies. + +------------------------ +Debugging Package Builds +------------------------ + +Our ``mpileaks`` package is still not building. It may be obvious to +many of you that we're still missing the configure options. But let's +pretend we're not all intelligent developers and use this opportunity +spend some time debugging. We a few options that can tell us about +what's going wrong: + +As per the error message, Spack has given us a ``spack-build.out`` debug log: + +.. code-block:: console + + ==> './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk' + checking metadata... no + checking installation directory variables... yes + checking for a BSD-compatible install... /usr/bin/install -c + checking whether build environment is sane... yes + checking for a thread-safe mkdir -p... /usr/bin/mkdir -p + checking for gawk... gawk + checking whether make sets $(MAKE)... yes + checking for gcc... /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc + checking for C compiler default output file name... a.out + checking whether the C compiler works... yes + checking whether we are cross compiling... no + checking for suffix of executables... + checking for suffix of object files... o + checking whether we are using the GNU C compiler... yes + checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc accepts -g... yes + checking for /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc option to accept ISO C89... none needed + checking for style of include used by make... GNU + checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc... gcc3 + checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc and cc understand -c and -o together... yes + checking whether we are using the GNU C++ compiler... yes + checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++ accepts -g... yes + checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++... gcc3 + checking for /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc... /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc + Checking whether /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc responds to '-showme:compile'... yes + configure: error: unable to locate ``adept-utils`` installation + +This gives us the output from the build, and it's fairly obvious that +mpileaks isn't finding its ``adept-utils`` package. Spack has +automatically added the include and library directories of +``adept-utils`` to the compiler's search path, but some packages like +mpileaks can sometimes be picky and still want things spelled out on +their command line. But let's continue to pretend we're not brilliant +developers, and explore some other debugging paths: + +We can also enter the build area and try to manually run the build: + +.. code-block:: console + + $ spack env mpileaks bash + $ spack cd mpileaks + +The ``spack env`` command spawned a new shell that contains the same +environment that Spack used to build the mpileaks package (you can +substitute bash for your favorite shell). The ``spack cd`` command +changed our working dirctory to the last attempted build for mpileaks. +From here we can manually re-run the build: + +.. code-block:: console + + $ ./configure + checking metadata... no + checking installation directory variables... yes + checking for a BSD-compatible install... /usr/bin/install -c + checking whether build environment is sane... yes + checking for a thread-safe mkdir -p... /usr/bin/mkdir -p + checking for gawk... gawk + checking whether make sets $(MAKE)... yes + checking for gcc... /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc + checking for C compiler default output file name... a.out + checking whether the C compiler works... yes + checking whether we are cross compiling... no + checking for suffix of executables... + checking for suffix of object files... o + checking whether we are using the GNU C compiler... yes + checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc accepts -g... yes + checking for /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc option to accept ISO C89... none needed + checking for style of include used by make... GNU + checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc... gcc3 + checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc and cc understand -c and -o together... yes + checking whether we are using the GNU C++ compiler... yes + checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++ accepts -g... yes + checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++... gcc3 + checking for /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc... /usr/workspace/wsa /legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc + Checking whether /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc responds to '-showme:compile'... yes + configure: error: unable to locate adept-utils installation + +We're seeing the same error, but now we're in a shell where we can run +the command ourselves and debug as needed. We could, for example, run +``./configure --help`` to see what options we can use to specify +dependencies. + +We can use the ``exit`` command to leave the shell spawned by ``spack +env``. + +------------------------------ +Specifying Configure Arguments +------------------------------ + +Let's add the configure arguments to the mpileaks' ``package.py``. This +version can be found in +``$SPACK_ROOT/lib/spack/docs/tutorial/examples/3.package.py``: + +.. literalinclude:: tutorial/examples/3.package.py + :lines: 25- + :language: python + +This is all we need for working mpileaks! If we install now we'll see: + +.. code-block:: console + + $ spack install mpileaks + spack install mpileaks + ==> Installing mpileaks + ==> openmpi is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz + ==> callpath is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube + ==> adept-utils is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz + ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz + ==> Already staged mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk + ==> Already patched mpileaks + ==> Building mpileaks [AutotoolsPackage] + ==> Executing phase : 'autoreconf' + ==> Executing phase : 'configure' + ==> Executing phase : 'build' + ==> Executing phase : 'install' + ==> Successfully installed mpileaks + Fetch: 0.00s. Build: 14.08s. Total: 14.08s. + [+] /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk + +We took a few shortcuts for this package that are worth highlighting. +Spack automatically detected that mpileaks was an Autotools-based package +when we ran ``spack create``. If this had been a CMake-based package we +would have been filling in a ``cmake_args`` function instead of +``configure_args``. If Spack hadn't been able to detect the build +system, we'd be filling in a generic install method that would manually +be calling build commands, such as is found in the ``zlib`` package: + +.. code-block:: python + + def install(self, spec, prefix): + configure('--prefix={0}'.format(prefix)) + make() + make('install') + +-------- +Variants +-------- + +We have a successful mpileaks build, but let's take some time to improve +it. ``mpileaks`` has a build-time option to truncate parts of the stack +that it walks. Let's add a variant to allow users to set this when they +build in Spack. + +To do this, we'll add a variant to our package, as per the following (see +``$SPACK_ROOT/lib/spack/docs/tutorial/examples/4.package.py``): + +.. literalinclude:: tutorial/examples/4.package.py + :lines: 25- + :language: python + +We've added the variant ``stackstart``, and given it a default value of +``0``. If we install now we can see the stackstart variant added to the +configure line (output truncated for length): + +.. code-block:: console + + $ spack install --verbose mpileaks stackstart=4 + ==> Installing mpileaks + ==> openmpi is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz + ==> callpath is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube + ==> adept-utils is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz + ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz + ==> Staging archive: /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-otqo2opkhan5ksujt6tpmdftydrieig7/mpileaks-1.0.tar.gz + ==> Created stage in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-otqo2opkhan5ksujt6tpmdftydrieig7 + ==> Ran patch() for mpileaks + ==> Building mpileaks [AutotoolsPackage] + ==> Executing phase : 'autoreconf' + ==> Executing phase : 'configure' + ==> './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-otqo2opkhan5ksujt6tpmdftydrieig7' '--with-adept-utils=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz' '--with-callpath=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube' '--with-stack-start-c=4' '--with-stack-start-fortran=4' + +--------------- +The Spec Object +--------------- + +This tutorial has glossed over a few important features, which weren't +too relevant for mpileaks but may be useful for other packages. There +were several places we references the ``self.spec`` object. This is a +powerful class for querying information about what we're building. For +example, you could use the spec to query information about how a +package's dependencies were built, or what compiler was being used, or +what version of a package is being installed. Full documentation can be +found in the :ref:`packaging-guide`, but here's some quick snippets with +common queries: + +- Am I building ``mpileaks`` version ``1.1`` or greater? + +.. code-block:: python + + if self.spec.satisfies('@1.1:'): + # Do things needed for 1.1+ + +- Is ``openmpi`` the MPI I'm building with? + +.. code-block:: python + + if self.spec['mpi'].name == 'openmpi': + # Do openmpi things + +- Am I building with ``gcc`` version less than ``5.0.0``: + +.. code-block:: python + + if self.spec.satisfies('%gcc@:5.0.0'): + # Add arguments specific to gcc's earlier than 5.0.0 + +- Am I built with the ``debug`` variant: + +.. code-block:: python + + if self.spec.satisfies('+debug'): + # Add -g option to configure flags + +- Is my ``dyninst`` dependency greater than version ``8.0``? + +.. code-block:: python + + if self.spec['dyninst'].satisfies('@8.0:'): + # Use newest dyninst options + +More examples can be found in the thousands of packages already added to +Spack in ``$SPACK_ROOT/var/spack/repos/builtin/packages``. + +Good Luck! diff --git a/lib/spack/docs/tutorial_sc16.rst b/lib/spack/docs/tutorial_sc16.rst deleted file mode 100644 index a95eee989c..0000000000 --- a/lib/spack/docs/tutorial_sc16.rst +++ /dev/null @@ -1,48 +0,0 @@ -.. _spack-101: - -============================= -Tutorial: Spack 101 -============================= - -This is a 3-hour introduction to Spack with lectures and live demos. It -was presented as a tutorial at `Supercomputing 2016 -`_. You can use these materials to teach -a course on Spack at your own site, or you can just skip ahead and read -the live demo scripts to see how Spack is used in practice. - -.. _sc16-slides: - -.. rubric:: Slides - -.. figure:: tutorial/sc16-tutorial-slide-preview.png - :target: http://llnl.github.io/spack/files/Spack-SC16-Tutorial.pdf - :height: 72px - :align: left - :alt: Slide Preview - -`Download Slides `_. - -**Full citation:** Todd Gamblin, Massimiliano Culpo, Gregory Becker, Matt -Legendre, Greg Lee, Elizabeth Fischer, and Benedikt Hegner. -`Managing HPC Software Complexity with Spack -`_. -Tutorial presented at Supercomputing 2016. November 13, 2016, Salt Lake -City, UT, USA. - -.. _sc16-live-demos: - -.. rubric:: Live Demos - -These scripts will take you step-by-step through basic Spack tasks. They -correspond to sections in the slides above. - - 1. :ref:`basics-tutorial` - 2. :ref:`packaging-tutorial` - 3. :ref:`modules-tutorial` - -Full contents: - -.. toctree:: - tutorial_sc16_spack_basics - tutorial_sc16_packaging - tutorial_sc16_modules diff --git a/lib/spack/docs/tutorial_sc16_modules.rst b/lib/spack/docs/tutorial_sc16_modules.rst deleted file mode 100644 index 00b42251db..0000000000 --- a/lib/spack/docs/tutorial_sc16_modules.rst +++ /dev/null @@ -1,977 +0,0 @@ -.. _modules-tutorial: - -============================= -Module Configuration Tutorial -============================= - -This tutorial will guide you through the customization of both -content and naming of module files generated by Spack. - -Starting from the default Spack settings you will add an increasing -number of directives to the ``modules.yaml`` configuration file to -satisfy a number of constraints that mimic those that you may encounter -in a typical production environment at HPC sites. - -Even though the focus will be for the most part on customizing -TCL non-hierarchical module files, everything -you'll see applies also to other kinds of module files generated by Spack. - -The generation of Lua hierarchical -module files will be addressed at the end of the tutorial, -and you'll see that with minor modifications -to an existing ``modules.yaml`` written for TCL -non-hierarchical modules you'll get almost -for free the possibility to try a hierarchical layout. - -Let's start! - -.. _module_file_tutorial_prerequisites: - -------------- -Prerequisites -------------- - -Before proceeding further ensure: - -- you have LMod or Environment Modules available -- have :ref:`shell support ` activated in Spack - -If you need to install Lmod or Environment module you can refer -to the documentation :ref:`here `. - - -^^^^^^^^^^^^^^^^^^ -Add a new compiler -^^^^^^^^^^^^^^^^^^ - -Spack automatically scans the environment to search for available -compilers on first use. On Ubuntu 14.04, a fresh clone will show -something like this: - -.. code-block:: console - - $ uname -a - Linux nuvolari 4.4.0-45-generic #66~14.04.1-Ubuntu SMP Wed Oct 19 15:05:38 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux - - $ spack compilers - ==> Available compilers - -- gcc ---------------------------------------------------------- - gcc@4.8 - -In order to showcase the capabilities of module customization, we will want to -build a limited set of packages with multiple compilers. If you do not already -have multiple compilers listed by ``spack compilers``, you should build one -with Spack: - -.. code-block:: console - - $ spack install gcc@6.2.0 - # ... - # Wait a long time - # ... - -Then we can use shell support for modules to add it to the list of known compilers: - -.. code-block:: console - - # The name of the generated module may vary - $ module load gcc-6.2.0-gcc-4.8-twd5nqg - - $ spack compiler add - ==> Added 1 new compiler to ~/.spack/linux/compilers.yaml - gcc@6.2.0 - - $ spack compilers - ==> Available compilers - -- gcc ---------------------------------------------------------- - gcc@6.2.0 gcc@4.8 - -Note that the 7-digit hash at the end of the generated module may vary depending -on architecture or package version. - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Build software that will be used in the tutorial -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Next you should install a few modules that will be used in the tutorial: - -.. code-block:: console - - $ spack install netlib-scalapack ^openmpi ^openblas - $ spack install netlib-scalapack ^mpich ^openblas - $ spack install netlib-scalapack ^openmpi ^netlib-lapack - $ spack install netlib-scalapack ^mpich ^netlib-lapack - $ spack install py-scipy ^openblas - -In the end your environment should look something like: - -.. code-block:: console - - $ module avail - - ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ - binutils-2.27-gcc-4.8-dz3xevw libpciaccess-0.13.4-gcc-6.2.0-eo2siet lzo-2.09-gcc-6.2.0-jcngz72 netlib-scalapack-2.0.2-gcc-6.2.0-wnimqhw python-2.7.12-gcc-6.2.0-qu7rc5p - bzip2-1.0.6-gcc-6.2.0-csoc2mq libsigsegv-2.10-gcc-4.8-avb6azw m4-1.4.17-gcc-4.8-iggewke netlib-scalapack-2.0.2-gcc-6.2.0-wojunhq sqlite-3.8.5-gcc-6.2.0-td3zfe7 - cmake-3.5.2-gcc-6.2.0-6poypqg libsigsegv-2.10-gcc-6.2.0-g3qpmbi m4-1.4.17-gcc-6.2.0-lhgqa6s nettle-3.2-gcc-6.2.0-djdthlh tcl-8.6.5-gcc-4.8-atddxu7 - curl-7.50.3-gcc-6.2.0-2ffacqm libtool-2.4.6-gcc-6.2.0-kiepac6 mpc-1.0.3-gcc-4.8-lylv7lk openblas-0.2.19-gcc-6.2.0-js33umc util-macros-1.19.0-gcc-6.2.0-uoukuqk - expat-2.2.0-gcc-6.2.0-bxqnjar libxml2-2.9.4-gcc-6.2.0-3k4ykbe mpfr-3.1.4-gcc-4.8-bldfx3w openmpi-2.0.1-gcc-6.2.0-s3qbtby xz-5.2.2-gcc-6.2.0-t5lk6in - gcc-6.2.0-gcc-4.8-twd5nqg lmod-6.4.5-gcc-4.8-7v7bh7b mpich-3.2-gcc-6.2.0-5n5xoep openssl-1.0.2j-gcc-6.2.0-hibnfda zlib-1.2.8-gcc-4.8-bds4ies - gmp-6.1.1-gcc-4.8-uq52e2n lua-5.3.2-gcc-4.8-xozf2hx ncurses-6.0-gcc-4.8-u62fit4 pkg-config-0.29.1-gcc-6.2.0-rslsgcs zlib-1.2.8-gcc-6.2.0-asydrba - gmp-6.1.1-gcc-6.2.0-3cfh3hi lua-luafilesystem-1_6_3-gcc-4.8-sbzejlz ncurses-6.0-gcc-6.2.0-7tb426s py-nose-1.3.7-gcc-6.2.0-4gl5c42 - hwloc-1.11.4-gcc-6.2.0-3ostwel lua-luaposix-33.4.0-gcc-4.8-xf7y2p5 netlib-lapack-3.6.1-gcc-6.2.0-mirer2l py-numpy-1.11.1-gcc-6.2.0-i3rpk4e - isl-0.14-gcc-4.8-cq73t5m lz4-131-gcc-6.2.0-cagoem4 netlib-scalapack-2.0.2-gcc-6.2.0-6bqlxqy py-scipy-0.18.1-gcc-6.2.0-e6uljfi - libarchive-3.2.1-gcc-6.2.0-2b54aos lzma-4.32.7-gcc-6.2.0-sfmeynw netlib-scalapack-2.0.2-gcc-6.2.0-hpqb3dp py-setuptools-25.2.0-gcc-6.2.0-hkqauaa - ------------------------------------------------- -Filter unwanted modifications to the environment ------------------------------------------------- - -The non-hierarchical TCL module files that have been generated so far -follow the default rules for module generation, which are given -:ref:`here ` in the reference part of the manual. Taking a -look at the ``gcc`` module you'll see something like: - -.. code-block:: console - - $ module show gcc-6.2.0-gcc-4.8-twd5nqg - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc-6.2.0-gcc-4.8-twd5nqg: - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("gcc @6.2.0 ") - prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") - prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") - prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") - prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") - prepend_path("LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") - prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") - prepend_path("CPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/include") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, and Java. - ]]) - -As expected, a few environment variables representing paths will be modified -by the modules according to the default prefix inspection rules. - -Consider now the case that your site has decided that e.g. ``CPATH`` and -``LIBRARY_PATH`` modifications should not be present in module files. What you can -do to abide by the rules is to create a configuration file ``~/.spack/modules.yaml`` -with the following content: - -.. code-block:: yaml - - modules: - tcl: - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -Next you should regenerate all the module files: - -.. code-block:: console - - $ spack module refresh --module-type tcl - ==> You are about to regenerate tcl module files for: - - -- linux-Ubuntu14-x86_64 / gcc@4.8 ------------------------------ - dz3xevw binutils@2.27 uq52e2n gmp@6.1.1 avb6azw libsigsegv@2.10 xozf2hx lua@5.3.2 xf7y2p5 lua-luaposix@33.4.0 lylv7lk mpc@1.0.3 u62fit4 ncurses@6.0 bds4ies zlib@1.2.8 - twd5nqg gcc@6.2.0 cq73t5m isl@0.14 7v7bh7b lmod@6.4.5 sbzejlz lua-luafilesystem@1_6_3 iggewke m4@1.4.17 bldfx3w mpfr@3.1.4 atddxu7 tcl@8.6.5 - - ... - - ==> Do you want to proceed? [y/n] y - ==> Regenerating tcl module files - -If you take a look now at the module for ``gcc`` you'll see that the unwanted -paths have disappeared: - -.. code-block:: console - - $ module show gcc-6.2.0-gcc-4.8-twd5nqg - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc-6.2.0-gcc-4.8-twd5nqg: - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("gcc @6.2.0 ") - prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") - prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") - prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") - prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") - prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, and Java. - ]]) - ----------------------------------------------- -Prevent some module files from being generated ----------------------------------------------- - -Another common request at many sites is to avoid exposing software that -is only needed as an intermediate step when building a newer stack. -Let's try to prevent the generation of -module files for anything that is compiled with ``gcc@4.8`` (the OS provided compiler). - -To do this you should add a ``blacklist`` keyword to the configuration file: - -.. code-block:: yaml - :emphasize-lines: 3,4 - - modules: - tcl: - blacklist: - - '%gcc@4.8' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -and regenerate the module files: - -.. code-block:: console - - $ spack module refresh --module-type tcl --delete-tree - ==> You are about to regenerate tcl module files for: - - -- linux-Ubuntu14-x86_64 / gcc@4.8 ------------------------------ - dz3xevw binutils@2.27 uq52e2n gmp@6.1.1 avb6azw libsigsegv@2.10 xozf2hx lua@5.3.2 xf7y2p5 lua-luaposix@33.4.0 lylv7lk mpc@1.0.3 u62fit4 ncurses@6.0 bds4ies zlib@1.2.8 - twd5nqg gcc@6.2.0 cq73t5m isl@0.14 7v7bh7b lmod@6.4.5 sbzejlz lua-luafilesystem@1_6_3 iggewke m4@1.4.17 bldfx3w mpfr@3.1.4 atddxu7 tcl@8.6.5 - - -- linux-Ubuntu14-x86_64 / gcc@6.2.0 ---------------------------- - csoc2mq bzip2@1.0.6 2b54aos libarchive@3.2.1 sfmeynw lzma@4.32.7 wnimqhw netlib-scalapack@2.0.2 s3qbtby openmpi@2.0.1 hkqauaa py-setuptools@25.2.0 - 6poypqg cmake@3.5.2 eo2siet libpciaccess@0.13.4 jcngz72 lzo@2.09 6bqlxqy netlib-scalapack@2.0.2 hibnfda openssl@1.0.2j qu7rc5p python@2.7.12 - 2ffacqm curl@7.50.3 g3qpmbi libsigsegv@2.10 lhgqa6s m4@1.4.17 wojunhq netlib-scalapack@2.0.2 rslsgcs pkg-config@0.29.1 td3zfe7 sqlite@3.8.5 - bxqnjar expat@2.2.0 kiepac6 libtool@2.4.6 5n5xoep mpich@3.2 hpqb3dp netlib-scalapack@2.0.2 4gl5c42 py-nose@1.3.7 uoukuqk util-macros@1.19.0 - 3cfh3hi gmp@6.1.1 3k4ykbe libxml2@2.9.4 7tb426s ncurses@6.0 djdthlh nettle@3.2 i3rpk4e py-numpy@1.11.1 t5lk6in xz@5.2.2 - 3ostwel hwloc@1.11.4 cagoem4 lz4@131 mirer2l netlib-lapack@3.6.1 js33umc openblas@0.2.19 e6uljfi py-scipy@0.18.1 asydrba zlib@1.2.8 - - ==> Do you want to proceed? [y/n] y - - $ module avail - - ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ - bzip2-1.0.6-gcc-6.2.0-csoc2mq libsigsegv-2.10-gcc-6.2.0-g3qpmbi ncurses-6.0-gcc-6.2.0-7tb426s openmpi-2.0.1-gcc-6.2.0-s3qbtby sqlite-3.8.5-gcc-6.2.0-td3zfe7 - cmake-3.5.2-gcc-6.2.0-6poypqg libtool-2.4.6-gcc-6.2.0-kiepac6 netlib-lapack-3.6.1-gcc-6.2.0-mirer2l openssl-1.0.2j-gcc-6.2.0-hibnfda util-macros-1.19.0-gcc-6.2.0-uoukuqk - curl-7.50.3-gcc-6.2.0-2ffacqm libxml2-2.9.4-gcc-6.2.0-3k4ykbe netlib-scalapack-2.0.2-gcc-6.2.0-6bqlxqy pkg-config-0.29.1-gcc-6.2.0-rslsgcs xz-5.2.2-gcc-6.2.0-t5lk6in - expat-2.2.0-gcc-6.2.0-bxqnjar lz4-131-gcc-6.2.0-cagoem4 netlib-scalapack-2.0.2-gcc-6.2.0-hpqb3dp py-nose-1.3.7-gcc-6.2.0-4gl5c42 zlib-1.2.8-gcc-6.2.0-asydrba - gmp-6.1.1-gcc-6.2.0-3cfh3hi lzma-4.32.7-gcc-6.2.0-sfmeynw netlib-scalapack-2.0.2-gcc-6.2.0-wnimqhw py-numpy-1.11.1-gcc-6.2.0-i3rpk4e - hwloc-1.11.4-gcc-6.2.0-3ostwel lzo-2.09-gcc-6.2.0-jcngz72 netlib-scalapack-2.0.2-gcc-6.2.0-wojunhq py-scipy-0.18.1-gcc-6.2.0-e6uljfi - libarchive-3.2.1-gcc-6.2.0-2b54aos m4-1.4.17-gcc-6.2.0-lhgqa6s nettle-3.2-gcc-6.2.0-djdthlh py-setuptools-25.2.0-gcc-6.2.0-hkqauaa - libpciaccess-0.13.4-gcc-6.2.0-eo2siet mpich-3.2-gcc-6.2.0-5n5xoep openblas-0.2.19-gcc-6.2.0-js33umc python-2.7.12-gcc-6.2.0-qu7rc5p - -This time it is convenient to pass the option ``--delete-tree`` to the command that -regenerates the module files to instruct it to delete the existing tree and regenerate -a new one instead of overwriting the files in the existing directory. - -If you pay careful attention you'll see though that we went too far in blacklisting modules: -the module for ``gcc@6.2.0`` disappeared as it was bootstrapped with ``gcc@4.8``. To specify -exceptions to the blacklist rules you can use ``whitelist``: - -.. code-block:: yaml - :emphasize-lines: 3,4 - - modules: - tcl: - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -``whitelist`` rules always have precedence over ``blacklist`` rules. If you regenerate the modules again: - -.. code-block:: console - - $ spack module refresh --module-type tcl -y - -you'll see that now the module for ``gcc@6.2.0`` has reappeared: - -.. code-block:: console - - $ module avail gcc-6.2.0-gcc-4.8-twd5nqg - - ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ - gcc-6.2.0-gcc-4.8-twd5nqg - -------------------------- -Change module file naming -------------------------- - -The next step in making module files more user-friendly is to -improve their naming scheme. -To reduce the length of the hash or remove it altogether you can -use the ``hash_length`` keyword in the configuration file: - -.. TODO: give reasons to remove hashes if they are not evident enough? - -.. code-block:: yaml - :emphasize-lines: 3 - - modules: - tcl: - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - -If you try to regenerate the module files now you will get an error: - -.. code-block:: console - - $ spack module refresh --module-type tcl --delete-tree -y - ==> Error: Name clashes detected in module files: - - file : ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/netlib-scalapack-2.0.2-gcc-6.2.0 - spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 - spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 - spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 - spec : netlib-scalapack@2.0.2%gcc@6.2.0~fpic+shared arch=linux-Ubuntu14-x86_64 - - ==> Error: Operation aborted - -.. note:: - We try to check for errors upfront! - In Spack we check for errors upfront whenever possible, so don't worry about your module files: - as a name clash was detected nothing has been changed on disk. - -The problem here is that without -the hashes the four different flavors of ``netlib-scalapack`` map to the same module file -name. We have the possibility to add suffixes to differentiate them: - -.. code-block:: yaml - :emphasize-lines: 9-11,14-17 - - modules: - tcl: - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -As you can see it is possible to specify rules that applies only to a -restricted set of packages using :ref:`anonymous specs `. -Regenerating module files now we obtain: - -.. code-block:: console - - $ spack module refresh --module-type tcl --delete-tree -y - ==> Regenerating tcl module files - $ module avail - - ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ - bzip2-1.0.6-gcc-6.2.0 libpciaccess-0.13.4-gcc-6.2.0 mpich-3.2-gcc-6.2.0 openblas-0.2.19-gcc-6.2.0 python-2.7.12-gcc-6.2.0 - cmake-3.5.2-gcc-6.2.0 libsigsegv-2.10-gcc-6.2.0 ncurses-6.0-gcc-6.2.0 openmpi-2.0.1-gcc-6.2.0 sqlite-3.8.5-gcc-6.2.0 - curl-7.50.3-gcc-6.2.0 libtool-2.4.6-gcc-6.2.0 netlib-lapack-3.6.1-gcc-6.2.0 openssl-1.0.2j-gcc-6.2.0 util-macros-1.19.0-gcc-6.2.0 - expat-2.2.0-gcc-6.2.0 libxml2-2.9.4-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-netlib-mpich pkg-config-0.29.1-gcc-6.2.0 xz-5.2.2-gcc-6.2.0 - gcc-6.2.0-gcc-4.8 lz4-131-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-netlib-openmpi py-nose-1.3.7-gcc-6.2.0 zlib-1.2.8-gcc-6.2.0 - gmp-6.1.1-gcc-6.2.0 lzma-4.32.7-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-openblas-mpich py-numpy-1.11.1-gcc-6.2.0-openblas - hwloc-1.11.4-gcc-6.2.0 lzo-2.09-gcc-6.2.0 netlib-scalapack-2.0.2-gcc-6.2.0-openblas-openmpi py-scipy-0.18.1-gcc-6.2.0-openblas - libarchive-3.2.1-gcc-6.2.0 m4-1.4.17-gcc-6.2.0 nettle-3.2-gcc-6.2.0 py-setuptools-25.2.0-gcc-6.2.0 - -Finally we can set a ``naming_scheme`` to prevent users from loading -modules that refer to different flavors of the same library/application: - -.. code-block:: yaml - :emphasize-lines: 4,10,11 - - modules: - tcl: - hash_length: 0 - naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - conflict: - - '${PACKAGE}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -The final result should look like: - -.. code-block:: console - - $ module avail - - ------------------------------------------------------------------------ ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 ------------------------------------------------------------------------ - bzip2/1.0.6-gcc-6.2.0 libpciaccess/0.13.4-gcc-6.2.0 mpich/3.2-gcc-6.2.0 openblas/0.2.19-gcc-6.2.0 python/2.7.12-gcc-6.2.0 - cmake/3.5.2-gcc-6.2.0 libsigsegv/2.10-gcc-6.2.0 ncurses/6.0-gcc-6.2.0 openmpi/2.0.1-gcc-6.2.0 sqlite/3.8.5-gcc-6.2.0 - curl/7.50.3-gcc-6.2.0 libtool/2.4.6-gcc-6.2.0 netlib-lapack/3.6.1-gcc-6.2.0 openssl/1.0.2j-gcc-6.2.0 util-macros/1.19.0-gcc-6.2.0 - expat/2.2.0-gcc-6.2.0 libxml2/2.9.4-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-netlib-mpich pkg-config/0.29.1-gcc-6.2.0 xz/5.2.2-gcc-6.2.0 - gcc/6.2.0-gcc-4.8 lz4/131-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-netlib-openmpi py-nose/1.3.7-gcc-6.2.0 zlib/1.2.8-gcc-6.2.0 - gmp/6.1.1-gcc-6.2.0 lzma/4.32.7-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-openblas-mpich py-numpy/1.11.1-gcc-6.2.0-openblas - hwloc/1.11.4-gcc-6.2.0 lzo/2.09-gcc-6.2.0 netlib-scalapack/2.0.2-gcc-6.2.0-openblas-openmpi (D) py-scipy/0.18.1-gcc-6.2.0-openblas - libarchive/3.2.1-gcc-6.2.0 m4/1.4.17-gcc-6.2.0 nettle/3.2-gcc-6.2.0 py-setuptools/25.2.0-gcc-6.2.0 - -.. note:: - TCL specific directive - The directives ``naming_scheme`` and ``conflict`` are TCL specific and do not apply - to the ``dotkit`` or ``lmod`` sections in the configuration file. - ------------------------------------- -Add custom environment modifications ------------------------------------- - -At many sites it is customary to set an environment variable in a -package's module file that points to the folder in which the package -is installed. You can achieve this with Spack by adding an -``environment`` directive to the configuration file: - -.. code-block:: yaml - :emphasize-lines: 17-19 - - modules: - tcl: - hash_length: 0 - naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - conflict: - - '${PACKAGE}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '${PACKAGE}_ROOT': '${PREFIX}' - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -There are many variable tokens available to use in the ``environment`` -and ``naming_scheme`` directives, such as ``${PACKAGE}``, -``${VERSION}``, etc. (see the :meth:`~spack.spec.Spec.format` API -documentation for the complete list). - -Regenerating the module files should result in something like: - -.. code-block:: console - :emphasize-lines: 14 - - $ spack module refresh -y --module-type tcl - ==> Regenerating tcl module files - - $ module show gcc - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc/6.2.0-gcc-4.8: - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("gcc @6.2.0 ") - prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") - prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") - prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") - prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") - prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") - setenv("GCC_ROOT","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u") - conflict("gcc") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, and Java. - ]]) - -As you can see, the ``gcc`` module has the environment variable ``GCC_ROOT`` set. - -Sometimes it's also useful to apply environment modifications selectively and target -only certain packages. You can, for instance set the common variables ``CC``, ``CXX``, -etc. in the ``gcc`` module file and apply other custom modifications to the -``openmpi`` modules as follows: - -.. code-block:: yaml - :emphasize-lines: 20-32 - - modules: - tcl: - hash_length: 0 - naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - conflict: - - '${PACKAGE}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '${PACKAGE}_ROOT': '${PREFIX}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - -This time we will be more selective and regenerate only the ``gcc`` and -``openmpi`` module files: - -.. code-block:: console - - $ spack module refresh -y --module-type tcl gcc - ==> Regenerating tcl module files - - $ spack module refresh -y --module-type tcl openmpi - ==> Regenerating tcl module files - - $ module show gcc - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/gcc/6.2.0-gcc-4.8: - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("gcc @6.2.0 ") - prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/bin") - prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/") - prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/share/man") - prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64/pkgconfig") - prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u/lib64") - setenv("GCC_ROOT","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-4.8/gcc-6.2.0-twd5nqg33hrrssqclcfi5k42eccwxz5u") - setenv("CC","gcc") - setenv("CXX","g++") - setenv("F90","gfortran") - setenv("FC","gfortran") - setenv("F77","gfortran") - conflict("gcc") - help([[The GNU Compiler Collection includes front ends for C, C++, Objective-C, - Fortran, and Java. - ]]) - - $ module show openmpi - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - ~/spack/share/spack/modules/linux-Ubuntu14-x86_64/openmpi/2.0.1-gcc-6.2.0: - --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - whatis("openmpi @2.0.1 ") - prepend_path("PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/bin") - prepend_path("CMAKE_PREFIX_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/") - prepend_path("LD_LIBRARY_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/lib") - prepend_path("PKG_CONFIG_PATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/lib/pkgconfig") - prepend_path("MANPATH","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w/share/man") - setenv("SLURM_MPI_TYPE","pmi2") - setenv("OMPI_MCA_BTL_OPENIB_WARN_DEFAULT_GID_PREFIX","0") - setenv("OPENMPI_ROOT","~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/openmpi-2.0.1-s3qbtbyh3y5y4gkchmhcuak7th44l53w") - conflict("openmpi") - help([[The Open MPI Project is an open source Message Passing Interface - implementation that is developed and maintained by a consortium of - academic, research, and industry partners. Open MPI is therefore able to - combine the expertise, technologies, and resources from all across the - High Performance Computing community in order to build the best MPI - library available. Open MPI offers advantages for system and software - vendors, application developers and computer science researchers. - ]]) - - ---------------------- -Autoload dependencies ---------------------- - -Spack can also generate module files that contain code to load the -dependencies automatically. You can, for instance generate python -modules that load their dependencies by adding the ``autoload`` -directive and assigning it the value ``direct``: - -.. code-block:: yaml - :emphasize-lines: 37,38 - - modules: - tcl: - hash_length: 0 - naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - conflict: - - '${PACKAGE}' - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '${PACKAGE}_ROOT': '${PREFIX}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - netlib-scalapack: - suffixes: - '^openmpi': openmpi - '^mpich': mpich - ^python: - autoload: 'direct' - -and regenerating the module files for every package that depends on ``python``: - -.. code-block:: console - - $ spack module refresh -y --module-type tcl ^python - ==> Regenerating tcl module files - -Now the ``py-scipy`` module will be: - -.. code-block:: tcl - - #%Module1.0 - ## Module file created by spack (https://github.com/LLNL/spack) on 2016-11-02 20:53:21.283547 - ## - ## py-scipy@0.18.1%gcc@6.2.0 arch=linux-Ubuntu14-x86_64-e6uljfi - ## - module-whatis "py-scipy @0.18.1" - - proc ModulesHelp { } { - puts stderr "SciPy (pronounced "Sigh Pie") is a Scientific Library for Python. It" - puts stderr "provides many user-friendly and efficient numerical routines such as" - puts stderr "routines for numerical integration and optimization." - } - - if ![ is-loaded python/2.7.12-gcc-6.2.0 ] { - puts stderr "Autoloading python/2.7.12-gcc-6.2.0" - module load python/2.7.12-gcc-6.2.0 - } - - if ![ is-loaded openblas/0.2.19-gcc-6.2.0 ] { - puts stderr "Autoloading openblas/0.2.19-gcc-6.2.0" - module load openblas/0.2.19-gcc-6.2.0 - } - - if ![ is-loaded py-numpy/1.11.1-gcc-6.2.0-openblas ] { - puts stderr "Autoloading py-numpy/1.11.1-gcc-6.2.0-openblas" - module load py-numpy/1.11.1-gcc-6.2.0-openblas - } - - prepend-path CMAKE_PREFIX_PATH "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh/" - prepend-path LD_LIBRARY_PATH "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh/lib" - prepend-path PYTHONPATH "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh/lib/python2.7/site-packages" - setenv PY_SCIPY_ROOT "~/spack/opt/spack/linux-Ubuntu14-x86_64/gcc-6.2.0/py-scipy-0.18.1-e6uljfiffgym4xvj6wveevqxfqnfb3gh" - conflict py-scipy - -and will contain code to autoload all the dependencies: - -.. code-block:: console - - $ module load py-scipy - Autoloading python/2.7.12-gcc-6.2.0 - Autoloading openblas/0.2.19-gcc-6.2.0 - Autoloading py-numpy/1.11.1-gcc-6.2.0-openblas - ------------------------------ -Lua hierarchical module files ------------------------------ - -In the final part of this tutorial you will modify ``modules.yaml`` to generate -Lua hierarchical module files. You will see that most of the directives used before -are also valid in the ``lmod`` context. - -^^^^^^^^^^^^^^^^^ -Core/Compiler/MPI -^^^^^^^^^^^^^^^^^ - -.. warning:: - Only LMod supports Lua hierarchical module files - For this part of the tutorial you need to be using LMod to - manage your environment. - -The most common hierarchy is the so called ``Core/Compiler/MPI``. To have an idea -how a hierarchy is organized you may refer to the -`Lmod guide `_. -Since ``lmod`` is not enabled by default, you need to add it to the list of -enabled module file generators. The other things you need to do are: - -- change the ``tcl`` tag to ``lmod`` -- remove ``tcl`` specific directives (``naming_scheme`` and ``conflict``) -- set which compilers are considered ``core`` -- remove the ``mpi`` related suffixes (as they will be substituted by hierarchies) - -After modifications the configuration file will be: - -.. code-block:: yaml - :emphasize-lines: 2-6 - - modules: - enable:: - - lmod - lmod: - core_compilers: - - 'gcc@4.8' - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - all: - suffixes: - '^openblas': openblas - '^netlib-lapack': netlib - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '${PACKAGE}_ROOT': '${PREFIX}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - - -.. note:: - The double colon - The double colon after ``enable`` is intentional and it serves the - purpose of overriding the default list of enabled generators so - that only ``lmod`` will be active (see :ref:`the reference - manual ` for a more detailed explanation of - config scopes). If a single colon is used, it will append instead - of override. - -The directive ``core_compilers`` accepts a list of compilers; everything built -using these compilers will create a module in the ``Core`` part of the hierarchy. It is -common practice to put the OS provided compilers in the list and only build common utilities -and other compilers in ``Core``. - -If you regenerate the module files - -.. code-block:: console - - $ spack module refresh --module-type lmod --delete-tree -y - -and update ``MODULEPATH`` to point to the ``Core`` folder, and -list the available modules, you'll see: - -.. code-block:: console - - $ module unuse ~/spack/share/spack/modules/linux-Ubuntu14-x86_64 - $ module use ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core - $ module avail - - ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- - gcc/6.2.0 - -The only module visible now is ``gcc``. Loading that you will make -visible the ``Compiler`` part of the software stack that was built with ``gcc/6.2.0``: - -.. code-block:: console - - $ module load gcc - $ module avail - - -------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/gcc/6.2.0 --------------------------------------------------------------------- - binutils/2.27 curl/7.50.3 hwloc/1.11.4 libtool/2.4.6 lzo/2.09 netlib-lapack/3.6.1 openssl/1.0.2j py-scipy/0.18.1-openblas util-macros/1.19.0 - bison/3.0.4 expat/2.2.0 libarchive/3.2.1 libxml2/2.9.4 m4/1.4.17 nettle/3.2 pkg-config/0.29.1 py-setuptools/25.2.0 xz/5.2.2 - bzip2/1.0.6 flex/2.6.0 libpciaccess/0.13.4 lz4/131 mpich/3.2 openblas/0.2.19 py-nose/1.3.7 python/2.7.12 zlib/1.2.8 - cmake/3.6.1 gmp/6.1.1 libsigsegv/2.10 lzma/4.32.7 ncurses/6.0 openmpi/2.0.1 py-numpy/1.11.1-openblas sqlite/3.8.5 - - ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- - gcc/6.2.0 (L) - -The same holds true for the ``MPI`` part of the stack, that you can enable by loading -either ``mpich`` or ``openmpi``. The nice features of LMod will become evident -once you'll try switching among different stacks: - -.. code-block:: console - - $ module load mpich - $ module avail - - ----------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/mpich/3.2-5n5xoep/gcc/6.2.0 ------------------------------------------------------------ - netlib-scalapack/2.0.2-netlib netlib-scalapack/2.0.2-openblas (D) - - -------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/gcc/6.2.0 --------------------------------------------------------------------- - binutils/2.27 curl/7.50.3 hwloc/1.11.4 libtool/2.4.6 lzo/2.09 netlib-lapack/3.6.1 openssl/1.0.2j py-scipy/0.18.1-openblas util-macros/1.19.0 - bison/3.0.4 expat/2.2.0 libarchive/3.2.1 libxml2/2.9.4 m4/1.4.17 nettle/3.2 pkg-config/0.29.1 py-setuptools/25.2.0 xz/5.2.2 - bzip2/1.0.6 flex/2.6.0 libpciaccess/0.13.4 lz4/131 mpich/3.2 (L) openblas/0.2.19 py-nose/1.3.7 python/2.7.12 zlib/1.2.8 - cmake/3.6.1 gmp/6.1.1 libsigsegv/2.10 lzma/4.32.7 ncurses/6.0 openmpi/2.0.1 py-numpy/1.11.1-openblas sqlite/3.8.5 - - ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- - gcc/6.2.0 (L) - - $ module load openblas netlib-scalapack/2.0.2-openblas - $ module list - - Currently Loaded Modules: - 1) gcc/6.2.0 2) mpich/3.2 3) openblas/0.2.19 4) netlib-scalapack/2.0.2-openblas - - $ module load openmpi - - Lmod is automatically replacing "mpich/3.2" with "openmpi/2.0.1" - - - Due to MODULEPATH changes the following have been reloaded: - 1) netlib-scalapack/2.0.2-openblas - -This layout is already a great improvement over the usual non-hierarchical layout, -but it still has an asymmetry: ``LAPACK`` providers are semantically the same as ``MPI`` -providers, but they are still not part of the hierarchy. We'll see a possible solution -next. - -.. Activate lmod and turn the previous modifications into lmod: - Add core compilers - -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Extend the hierarchy to other virtual providers -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. warning:: - This is an experimental feature - Having a hierarchy deeper than ``Core``/``Compiler``/``MPI`` is an experimental - feature, still not fully supported by ``module spider``, - see `here `_. Furthermore its use - with hierarchies more complex than ``Core``/``Compiler``/``MPI``/``LAPACK`` - has not been thoroughly tested in production environments. - -Spack permits you to generate Lua hierarchical module files where users -can add an arbitrary list of virtual providers to the triplet -``Core``/``Compiler``/``MPI``. A configuration file like: - -.. code-block:: yaml - :emphasize-lines: 7,8 - - modules: - enable:: - - lmod - lmod: - core_compilers: - - 'gcc@4.8' - hierarchical_scheme: - - lapack - hash_length: 0 - whitelist: - - gcc - blacklist: - - '%gcc@4.8' - - readline - all: - filter: - environment_blacklist: ['CPATH', 'LIBRARY_PATH'] - environment: - set: - '${PACKAGE}_ROOT': '${PREFIX}' - gcc: - environment: - set: - CC: gcc - CXX: g++ - FC: gfortran - F90: gfortran - F77: gfortran - openmpi: - environment: - set: - SLURM_MPI_TYPE: pmi2 - OMPI_MCA_btl_openib_warn_default_gid_prefix: '0' - -will add ``lapack`` providers to the mix. After the usual regeneration of module files: - -.. code-block:: console - - $ module purge - $ spack module refresh --module-type lmod --delete-tree -y - ==> Regenerating lmod module files - -you will have something like: - -.. code-block:: console - - $ module load gcc - $ module load openblas - $ module load openmpi - $ module avail - - --------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/openblas/0.2.19-js33umc/openmpi/2.0.1-s3qbtby/gcc/6.2.0 ---------------------------------------------- - netlib-scalapack/2.0.2 - - -------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/openblas/0.2.19-js33umc/gcc/6.2.0 --------------------------------------------------------- - py-numpy/1.11.1 py-scipy/0.18.1 - - -------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/gcc/6.2.0 --------------------------------------------------------------------- - binutils/2.27 curl/7.50.3 hwloc/1.11.4 libtool/2.4.6 lzo/2.09 netlib-lapack/3.6.1 openssl/1.0.2j python/2.7.12 zlib/1.2.8 - bison/3.0.4 expat/2.2.0 libarchive/3.2.1 libxml2/2.9.4 m4/1.4.17 nettle/3.2 pkg-config/0.29.1 sqlite/3.8.5 - bzip2/1.0.6 flex/2.6.0 libpciaccess/0.13.4 lz4/131 mpich/3.2 openblas/0.2.19 (L) py-nose/1.3.7 util-macros/1.19.0 - cmake/3.6.1 gmp/6.1.1 libsigsegv/2.10 lzma/4.32.7 ncurses/6.0 openmpi/2.0.1 (L) py-setuptools/25.2.0 xz/5.2.2 - - ----------------------------------------------------------------------- ~/spack/share/spack/lmod/linux-Ubuntu14-x86_64/Core ----------------------------------------------------------------------- - gcc/6.2.0 (L) - -Now both the ``MPI`` and the ``LAPACK`` providers are handled by LMod as hierarchies: - -.. code-block:: console - - $ module load py-numpy netlib-scalapack - $ module load mpich - - Lmod is automatically replacing "openmpi/2.0.1" with "mpich/3.2" - - - Due to MODULEPATH changes the following have been reloaded: - 1) netlib-scalapack/2.0.2 - - $ module load netlib-lapack - - Lmod is automatically replacing "openblas/0.2.19" with "netlib-lapack/3.6.1" - - - Inactive Modules: - 1) py-numpy - - Due to MODULEPATH changes the following have been reloaded: - 1) netlib-scalapack/2.0.2 - -making the use of tags to differentiate them unnecessary. -Note that because we only compiled ``py-numpy`` with ``openblas`` the module -is made inactive when we switch the ``LAPACK`` provider. The user -environment will now be consistent by design! diff --git a/lib/spack/docs/tutorial_sc16_packaging.rst b/lib/spack/docs/tutorial_sc16_packaging.rst deleted file mode 100644 index e250ab835e..0000000000 --- a/lib/spack/docs/tutorial_sc16_packaging.rst +++ /dev/null @@ -1,462 +0,0 @@ -.. _packaging-tutorial: - -========================= -Package Creation Tutorial -========================= - -This tutorial will walk you through the steps behind building a simple -package installation script. We'll focus building an mpileaks package, -which is a MPI debugging tool. By creating a package file we're -essentially giving Spack a recipe for how to build a particular piece of -software. We're describing some of the software's dependencies, where to -find the package, what commands and options are used to build the package -from source, and more. Once we've specified a package's recipe, we can -ask Spack to build that package in many different ways. - -This tutorial assumes you have a basic familiarity with some of the Spack -commands, and that you have a working version of Spack installed. If -not, we suggest looking at Spack's *Getting Started* guide. This -tutorial also assumes you have at least a beginner's-level familiarity -with Python. - -Also note that this document is a tutorial. It can help you get started -with packaging, but is not intended to be complete. See Spack's -:ref:`packaging-guide` for more complete documentation on this topic. - ---------------- -Getting Started ---------------- - -A few things before we get started: - -- We'll refer to the Spack installation location via the environment - variable ``SPACK_ROOT``. You should point ``SPACK_ROOT`` at wherever - you have Spack installed. -- Add ``$SPACK_ROOT/bin`` to your ``PATH`` before you start. -- Make sure your ``EDITOR`` environment variable is set to some text - editor you like. -- We'll be writing Python code as part of this tutorial. You can find - successive versions of the Python code in - ``$SPACK_ROOT/lib/spack/docs/tutorial/examples``. - -------------------------- -Creating the Package File -------------------------- - -Spack comes with a handy command to create a new package: ``spack create`` - -This command is given the location of a package's source code, downloads -the code, and sets up some basic packaging infrastructure for you. The -mpileaks source code can be found on GitHub, and here's what happens when -we run ``spack create`` on it: - -.. code-block:: console - - $ spack create -f https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - ==> This looks like a URL for mpileaks version 1.0 - ==> Creating template for package mpileaks - ==> Downloading... - ==> Fetching https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - ###################################################################################### 100.0% - -And Spack should spawn a text editor with this file: - -.. literalinclude:: tutorial/examples/0.package.py - :language: python - -Spack has created this file in -``$SPACK_ROOT/var/spack/repos/builtin/packages/mpileaks/package.py``. Take a -moment to look over the file. There's a few placeholders that Spack has -created, which we'll fill in as part of this tutorial: - -- We'll document some information about this package in the comments. -- We'll fill in the dependency list for this package. -- We'll fill in some of the configuration arguments needed to build this - package. - -For the moment, exit your editor and let's see what happens when we try -to build this package: - -.. code-block:: console - - $ spack install mpileaks - ==> Installing mpileaks - ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Staging archive: /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-hufwhwpq5benv3sslie6ryflk5s6nm35/mpileaks-1.0.tar.gz - ==> Created stage in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-hufwhwpq5benv3sslie6ryflk5s6nm35 - ==> Ran patch() for mpileaks - ==> Building mpileaks [AutotoolsPackage] - ==> Executing phase : 'autoreconf' - ==> Executing phase : 'configure' - ==> Error: ProcessError: Command exited with status 1: - './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-hufwhwpq5benv3sslie6ryflk5s6nm35' - /usr/workspace/wsa/legendre/spack/lib/spack/spack/build_systems/autotools.py:150, in configure: - 145 def configure(self, spec, prefix): - 146 """Runs configure with the arguments specified in `configure_args` - 147 and an appropriately set prefix - 148 """ - 149 options = ['--prefix={0}'.format(prefix)] + self.configure_args() - >> 150 inspect.getmodule(self).configure(*options) - - See build log for details: - /tmp/legendre/spack-stage/spack-stage-8HVzqu/mpileaks-1.0/spack-build.out - -This obviously didn't work; we need to fill in the package-specific -information. Specifically, Spack didn't try to build any of mpileaks' -dependencies, nor did it use the proper configure arguments. Let's start -fixing things - ---------------------- -Package Documentation ---------------------- - -We can bring the ``package.py`` file back into our ``EDITOR`` with the -``spack edit`` command: - -.. code-block:: console - - $ spack edit mpileaks - -Let's remove some of the ``FIXME`` comments, and add links to the mpileaks -homepage and document what mpileaks does. I'm also going to cut out the -Copyright clause at this point to keep this tutorial document shorter, -but you shouldn't do that normally. The results of these changes can be -found in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/1.package.py`` -and are below. Make these changes to your ``package.py``: - -.. literalinclude:: tutorial/examples/1.package.py - :lines: 25- - :language: python - -We've filled in the comment that describes what this package does and -added a link to the web site. That won't help us build yet, but it will -allow Spack to provide some documentation on this package to other users: - -.. code-block:: console - - $ spack info mpileaks - AutotoolsPackage: mpileaks - Homepage: https://github.com/hpc/mpileaks - - Safe versions: - 1.0 https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz - - Variants: - None - - Installation Phases: - autoreconf configure build install - - Build Dependencies: - None - - Link Dependencies: - None - - Run Dependencies: - None - - Virtual Packages: - None - - Description: - Tool to detect and report MPI objects like MPI_Requests and - MPI_Datatypes - -As we fill in more information about this package the ``spack info`` command -will become more informative. Now let's start making this package build. - ------------- -Dependencies ------------- - -The mpileaks packages depends on three other package: ``MPI``, -``adept-utils``, and ``callpath``. Let's add those via the -``depends_on`` command in our ``package.py`` (this version is in -``$SPACK_ROOT/lib/spack/docs/tutorial/examples/2.package.py``): - -.. literalinclude:: tutorial/examples/2.package.py - :lines: 25- - :language: python - -Now when we go to build mpileaks, Spack will fetch and build these -dependencies before building mpileaks. Note that the mpi dependency is a -different kind of beast than the adept-utils and callpath dependencies; -there is no mpi package available in Spack. Instead mpi is a virtual -dependency. Spack may satisfy that dependency by installing packages -such as ``openmpi`` or ``mvapich``. See the :ref:`packaging-guide` for more -information on virtual dependencies. - -Now when we try to install this package a lot more happens: - -.. code-block:: console - - $ spack install mpileaks - ==> Installing mpileaks - ==> openmpi is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz - ==> callpath is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube - ==> adept-utils is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz - ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Already staged mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk - ==> Already patched mpileaks - ==> Building mpileaks [AutotoolsPackage] - ==> Executing phase : 'autoreconf' - ==> Executing phase : 'configure' - ==> Error: ProcessError: Command exited with status 1: - './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk' - /usr/workspace/wsa/legendre/spack/lib/spack/spack/build_systems/autotools.py:150, in configure: - 145 def configure(self, spec, prefix): - 146 """Runs configure with the arguments specified in `configure_args` - 147 and an appropriately set prefix - 148 """ - 149 options = ['--prefix={0}'.format(prefix)] + self.configure_args() - >> 150 inspect.getmodule(self).configure(*options) - - See build log for details: - /tmp/legendre/spack-stage/spack-stage-7V5yyk/mpileaks-1.0/spack-build.out - -Note that this command may take a while to run and produce more output if -you don't have an MPI already installed or configured in Spack. - -Now Spack has identified and made sure all of our dependencies have been -built. It found the ``openmpi`` package that will satisfy our ``mpi`` -dependency, and the ``callpath`` and ``adept-utils`` package to satisfy our -concrete dependencies. - ------------------------- -Debugging Package Builds ------------------------- - -Our ``mpileaks`` package is still not building. It may be obvious to -many of you that we're still missing the configure options. But let's -pretend we're not all intelligent developers and use this opportunity -spend some time debugging. We a few options that can tell us about -what's going wrong: - -As per the error message, Spack has given us a ``spack-build.out`` debug log: - -.. code-block:: console - - ==> './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk' - checking metadata... no - checking installation directory variables... yes - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - checking for a thread-safe mkdir -p... /usr/bin/mkdir -p - checking for gawk... gawk - checking whether make sets $(MAKE)... yes - checking for gcc... /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc - checking for C compiler default output file name... a.out - checking whether the C compiler works... yes - checking whether we are cross compiling... no - checking for suffix of executables... - checking for suffix of object files... o - checking whether we are using the GNU C compiler... yes - checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc accepts -g... yes - checking for /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc option to accept ISO C89... none needed - checking for style of include used by make... GNU - checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc... gcc3 - checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc and cc understand -c and -o together... yes - checking whether we are using the GNU C++ compiler... yes - checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++ accepts -g... yes - checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++... gcc3 - checking for /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc... /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc - Checking whether /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc responds to '-showme:compile'... yes - configure: error: unable to locate ``adept-utils`` installation - -This gives us the output from the build, and it's fairly obvious that -mpileaks isn't finding its ``adept-utils`` package. Spack has -automatically added the include and library directories of -``adept-utils`` to the compiler's search path, but some packages like -mpileaks can sometimes be picky and still want things spelled out on -their command line. But let's continue to pretend we're not brilliant -developers, and explore some other debugging paths: - -We can also enter the build area and try to manually run the build: - -.. code-block:: console - - $ spack env mpileaks bash - $ spack cd mpileaks - -The ``spack env`` command spawned a new shell that contains the same -environment that Spack used to build the mpileaks package (you can -substitute bash for your favorite shell). The ``spack cd`` command -changed our working dirctory to the last attempted build for mpileaks. -From here we can manually re-run the build: - -.. code-block:: console - - $ ./configure - checking metadata... no - checking installation directory variables... yes - checking for a BSD-compatible install... /usr/bin/install -c - checking whether build environment is sane... yes - checking for a thread-safe mkdir -p... /usr/bin/mkdir -p - checking for gawk... gawk - checking whether make sets $(MAKE)... yes - checking for gcc... /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc - checking for C compiler default output file name... a.out - checking whether the C compiler works... yes - checking whether we are cross compiling... no - checking for suffix of executables... - checking for suffix of object files... o - checking whether we are using the GNU C compiler... yes - checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc accepts -g... yes - checking for /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc option to accept ISO C89... none needed - checking for style of include used by make... GNU - checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc... gcc3 - checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/gcc and cc understand -c and -o together... yes - checking whether we are using the GNU C++ compiler... yes - checking whether /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++ accepts -g... yes - checking dependency style of /usr/workspace/wsa/legendre/spack/lib/spack/env/gcc/g++... gcc3 - checking for /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc... /usr/workspace/wsa /legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc - Checking whether /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz/bin/mpicc responds to '-showme:compile'... yes - configure: error: unable to locate adept-utils installation - -We're seeing the same error, but now we're in a shell where we can run -the command ourselves and debug as needed. We could, for example, run -``./configure --help`` to see what options we can use to specify -dependencies. - -We can use the ``exit`` command to leave the shell spawned by ``spack -env``. - ------------------------------- -Specifying Configure Arguments ------------------------------- - -Let's add the configure arguments to the mpileaks' ``package.py``. This -version can be found in -``$SPACK_ROOT/lib/spack/docs/tutorial/examples/3.package.py``: - -.. literalinclude:: tutorial/examples/3.package.py - :lines: 25- - :language: python - -This is all we need for working mpileaks! If we install now we'll see: - -.. code-block:: console - - $ spack install mpileaks - spack install mpileaks - ==> Installing mpileaks - ==> openmpi is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz - ==> callpath is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube - ==> adept-utils is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz - ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Already staged mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk - ==> Already patched mpileaks - ==> Building mpileaks [AutotoolsPackage] - ==> Executing phase : 'autoreconf' - ==> Executing phase : 'configure' - ==> Executing phase : 'build' - ==> Executing phase : 'install' - ==> Successfully installed mpileaks - Fetch: 0.00s. Build: 14.08s. Total: 14.08s. - [+] /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-eum4hmnlt6ovalwjnciaygfb3beja4gk - -We took a few shortcuts for this package that are worth highlighting. -Spack automatically detected that mpileaks was an Autotools-based package -when we ran ``spack create``. If this had been a CMake-based package we -would have been filling in a ``cmake_args`` function instead of -``configure_args``. If Spack hadn't been able to detect the build -system, we'd be filling in a generic install method that would manually -be calling build commands, such as is found in the ``zlib`` package: - -.. code-block:: python - - def install(self, spec, prefix): - configure('--prefix={0}'.format(prefix)) - make() - make('install') - --------- -Variants --------- - -We have a successful mpileaks build, but let's take some time to improve -it. ``mpileaks`` has a build-time option to truncate parts of the stack -that it walks. Let's add a variant to allow users to set this when they -build in Spack. - -To do this, we'll add a variant to our package, as per the following (see -``$SPACK_ROOT/lib/spack/docs/tutorial/examples/4.package.py``): - -.. literalinclude:: tutorial/examples/4.package.py - :lines: 25- - :language: python - -We've added the variant ``stackstart``, and given it a default value of -``0``. If we install now we can see the stackstart variant added to the -configure line (output truncated for length): - -.. code-block:: console - - $ spack install --verbose mpileaks stackstart=4 - ==> Installing mpileaks - ==> openmpi is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/openmpi-2.0.1-5ee5j34c2y4kb5c3joygrgahidqnwhnz - ==> callpath is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube - ==> adept-utils is already installed in /usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz - ==> Using cached archive: /usr/workspace/wsa/legendre/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz - ==> Staging archive: /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-otqo2opkhan5ksujt6tpmdftydrieig7/mpileaks-1.0.tar.gz - ==> Created stage in /usr/workspace/wsa/legendre/spack/var/spack/stage/mpileaks-1.0-otqo2opkhan5ksujt6tpmdftydrieig7 - ==> Ran patch() for mpileaks - ==> Building mpileaks [AutotoolsPackage] - ==> Executing phase : 'autoreconf' - ==> Executing phase : 'configure' - ==> './configure' '--prefix=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/mpileaks-1.0-otqo2opkhan5ksujt6tpmdftydrieig7' '--with-adept-utils=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/adept-utils-1.0.1-7p7ezxwtajdglj6cmojy2vybjct4j4jz' '--with-callpath=/usr/workspace/wsa/legendre/spack/opt/spack/linux-rhel7-x86_64/gcc-4.9.3/callpath-1.0.2-zm4pf3gasgxeibyu2y262suktvaazube' '--with-stack-start-c=4' '--with-stack-start-fortran=4' - ---------------- -The Spec Object ---------------- - -This tutorial has glossed over a few important features, which weren't -too relevant for mpileaks but may be useful for other packages. There -were several places we references the ``self.spec`` object. This is a -powerful class for querying information about what we're building. For -example, you could use the spec to query information about how a -package's dependencies were built, or what compiler was being used, or -what version of a package is being installed. Full documentation can be -found in the :ref:`packaging-guide`, but here's some quick snippets with -common queries: - -- Am I building ``mpileaks`` version ``1.1`` or greater? - -.. code-block:: python - - if self.spec.satisfies('@1.1:'): - # Do things needed for 1.1+ - -- Is ``openmpi`` the MPI I'm building with? - -.. code-block:: python - - if self.spec['mpi'].name == 'openmpi': - # Do openmpi things - -- Am I building with ``gcc`` version less than ``5.0.0``: - -.. code-block:: python - - if self.spec.satisfies('%gcc@:5.0.0'): - # Add arguments specific to gcc's earlier than 5.0.0 - -- Am I built with the ``debug`` variant: - -.. code-block:: python - - if self.spec.satisfies('+debug'): - # Add -g option to configure flags - -- Is my ``dyninst`` dependency greater than version ``8.0``? - -.. code-block:: python - - if self.spec['dyninst'].satisfies('@8.0:'): - # Use newest dyninst options - -More examples can be found in the thousands of packages already added to -Spack in ``$SPACK_ROOT/var/spack/repos/builtin/packages``. - -Good Luck! diff --git a/lib/spack/docs/tutorial_sc16_spack_basics.rst b/lib/spack/docs/tutorial_sc16_spack_basics.rst deleted file mode 100644 index 8d9a8fbaea..0000000000 --- a/lib/spack/docs/tutorial_sc16_spack_basics.rst +++ /dev/null @@ -1,1252 +0,0 @@ -.. _basics-tutorial: - -========================================= -Basic Installation Tutorial -========================================= - -This tutorial will guide you through the process of installing software -using Spack. We will first cover the `spack install` command, focusing on -the power of the spec syntax and the flexibility it gives to users. We -will also cover the `spack find` command for viewing installed packages -and the `spack uninstall` command. Finally, we will touch on how Spack -manages compilers, especially as it relates to using Spack-built -compilers within Spack. We will include full output from all of the -commands demonstrated, although we will frequently call attention to only -small portions of that output (or merely to the fact that it -succeeded). The provided output is all from a cluster running Red Hat -Enterprise Linux. - -.. _basics-tutorial-install: - ----------------- -Installing Spack ----------------- - -Spack works out of the box. Simply clone spack and get going. - -.. code-block:: console - - $ git clone https://github.com/LLNL/spack.git - Initialized empty Git repository in ~/spack/.git/ - remote: Counting objects: 47125, done. - remote: Compressing objects: 100% (68/68), done. - remote: Total 47125 (delta 16), reused 2 (delta 2), pack-reused 47047 - Receiving objects: 100% (47125/47125), 12.02 MiB | 2.11 MiB/s, done. - Resolving deltas: 100% (23044/23044), done. - $ cd spack - -Then add Spack to your path. - -.. code-block:: console - - $ export PATH=~/spack/bin:$PATH - -You're good to go! - ------------------ -What is in Spack? ------------------ - -The ``spack list`` command shows available packages. - -.. code-block:: console - - $ spack list - ==> 1016 packages. - abinit hwloc piranha r-rjava - ack hydra pixman r-rjson - activeharmony hypre pkg-config r-rjsonio - ... - -The ``spack list`` command can also take a query string. Spack -automatically adds wildcards to both ends of the string. For example, -we can view all available python packages. - -.. code-block:: console - - $ spack list py - ==> 129 packages. - py-3to2 py-epydoc py-nestle py-pycparser py-six - py-alabaster py-flake8 py-netcdf py-pydatalog py-sncosmo - py-argcomplete py-funcsigs py-networkx py-pyelftools py-snowballstemmer - ... - -------------------- -Installing Packages -------------------- - -Installing a package with Spack is very simple. To install a piece of -software, simply type ``spack install `` - -.. code-block:: console - - $ spack install libelf - ==> Installing libelf - ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz - curl: (37) Couldn't open file ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz - ==> Fetching from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz failed. - ==> Trying to fetch from http://www.mr511.de/software/libelf-0.8.13.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a/libelf-0.8.13.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a - ==> No patches needed for libelf - ==> Building libelf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libelf - Fetch: 1.21s. Build: 8.42s. Total: 9.62s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a - - -Spack's spec syntax is the interface by which we can request specific -configurations of the package. The ``%`` sigil is used to specify -compilers. - -.. code-block:: console - - $ spack install libelf %intel - ==> Installing libelf - ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj/libelf-0.8.13.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj - ==> No patches needed for libelf - ==> Building libelf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libelf - Fetch: 0.09s. Build: 50.64s. Total: 50.72s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj - -Note that this installation is located separately from the previous -one. We will discuss this in more detail later, but this is part of what -allows Spack to support arbitrarily versioned software. - -You can check for particular versions before requesting them. We will -use the ``spack versions`` command to see the available versions, and then -install a different version of ``libelf``. - -.. code-block:: console - - $ spack versions libelf - ==> Safe versions (already checksummed): - 0.8.13 - 0.8.12 - ==> Remote versions (not yet checksummed): - 0.8.11 - 0.8.10 - 0.8.9 - 0.8.8 - 0.8.7 - 0.8.6 - 0.8.5 - 0.8.4 - 0.8.3 - 0.8.2 - 0.8.0 - 0.7.0 - 0.6.4 - 0.5.2 - - -The ``@`` sigil is used to specify versions, both of packages and of -compilers. - -.. code-block:: console - - $ spack install libelf @0.8.12 - ==> Installing libelf - ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz - curl: (37) Couldn't open file ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz - ==> Fetching from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz failed. - ==> Trying to fetch from http://www.mr511.de/software/libelf-0.8.12.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy/libelf-0.8.12.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy - ==> No patches needed for libelf - ==> Building libelf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libelf - Fetch: 1.12s. Build: 7.88s. Total: 9.00s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy - - - - $ spack install libelf %intel@15.0.4 - ==> Installing libelf - ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.13.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.13-w33hrejdyqu2j2gggdswitls2zv6kdsi/libelf-0.8.13.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.13-w33hrejdyqu2j2gggdswitls2zv6kdsi - ==> No patches needed for libelf - ==> Building libelf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libelf - Fetch: 0.09s. Build: 55.51s. Total: 55.60s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-15.0.4/libelf-0.8.13-w33hrejdyqu2j2gggdswitls2zv6kdsi - - -The spec syntax also includes compiler flags. Spack accepts -``cppflags``, ``cflags``, ``cxxflags``, ``fflags``, ``ldflags``, and -``ldlibs`` parameters. The values of these fields must be quoted on -the command line if they include spaces. These values are injected -into the compile line automatically by the Spack compiler wrappers. - -.. code-block:: console - - $ spack install libelf @0.8.12 cppflags="-O3" - ==> Installing libelf - ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw/libelf-0.8.12.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw - ==> No patches needed for libelf - ==> Building libelf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libelf - Fetch: 0.04s. Build: 7.95s. Total: 7.99s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw - - -The ``spack find`` command is used to query installed packages. Note that -some packages appear identical with the default output. The ``-l`` flag -shows the hash of each package, and the ``-f`` flag shows any non-empty -compiler flags of those packages. - -.. code-block:: console - - $ spack find - ==> 5 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - libelf@0.8.12 - libelf@0.8.12 - libelf@0.8.13 - - -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- - libelf@0.8.13 - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - libelf@0.8.13 - - - - $ spack find -lf - ==> 5 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - ipggckv libelf@0.8.12%gcc - - vrv2ttb libelf@0.8.12%gcc cppflags="-O3" - - csrt4qx libelf@0.8.13%gcc - - - -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- - w33hrej libelf@0.8.13%intel - - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - 7wgp32x libelf@0.8.13%intel - - -Spack generates a hash for each spec. This hash is a function of the full -provenance of the package, so any change to the spec affects the -hash. Spack uses this value to compare specs and to generate unique -installation directories for every combinatorial version. As we move into -more complicated packages with software dependencies, we can see that -Spack reuses existing packages to satisfy a dependency only when the -existing package's hash matches the desired spec. - -.. code-block:: console - - $ spack install libdwarf - ==> Installing libdwarf - ==> libelf is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a - ==> Can not find version 20160507 in url_list - ==> Trying to fetch from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz - curl: (37) Couldn't open file ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz - ==> Fetching from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz failed. - ==> Trying to fetch from http://www.prevanders.net/libdwarf-20160507.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz/libdwarf-20160507.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz - ==> No patches needed for libdwarf - ==> Building libdwarf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libdwarf - Fetch: 1.56s. Build: 33.59s. Total: 35.15s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz - - -Dependencies can be explicitly requested using the ``^`` sigil. Note that -the spec syntax is recursive. Anything we could specify about the -top-level package, we can also specify about a dependency using ``^``. - -.. code-block:: console - - $ spack install libdwarf ^libelf @0.8.12 %intel - ==> Installing libdwarf - ==> Installing libelf - ==> Trying to fetch from ~/spack/var/spack/cache/libelf/libelf-0.8.12.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libelf-0.8.12-4blbe3qxqct3ymrfoxxnxysmybvbxay7/libelf-0.8.12.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libelf-0.8.12-4blbe3qxqct3ymrfoxxnxysmybvbxay7 - ==> No patches needed for libelf - ==> Building libelf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libelf - Fetch: 0.04s. Build: 52.16s. Total: 52.19s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libelf-0.8.12-4blbe3qxqct3ymrfoxxnxysmybvbxay7 - ==> Can not find version 20160507 in url_list - ==> Trying to fetch from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz - ################################################################################################################################################################################# 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libdwarf-20160507-csruprgucaujkfkrcywhwou7nbeis5fo/libdwarf-20160507.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libdwarf-20160507-csruprgucaujkfkrcywhwou7nbeis5fo - ==> No patches needed for libdwarf - ==> Building libdwarf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libdwarf - Fetch: 0.40s. Build: 2m 17.29s. Total: 2m 17.69s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libdwarf-20160507-csruprgucaujkfkrcywhwou7nbeis5fo - - -Packages can also be referred to from the command line by their package -hash. Using the ``spack find -lf`` command earlier we saw that the hash -of our optimized installation of libelf (``cppflags="-O3"``) began with -``vrv2ttb``. We can now explicitly build with that package without typing -the entire spec, by using the ``/`` sigil to refer to it by hash. As with -other tools like git, you do not need to specify an *entire* hash on the -command line. You can specify just enough digits to identify a hash -uniquely. If a hash prefix is ambiguous (i.e., two or more installed -packages share the prefix) then spack will report an error. - -.. code-block:: console - - $ spack install libdwarf ^/vrv2ttb - ==> Installing libdwarf - ==> libelf is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw - ==> Can not find version 20160507 in url_list - ==> Trying to fetch from ~/spack/var/spack/cache/libdwarf/libdwarf-20160507.tar.gz - #################################################################################################################################################################################################################################################### 100.0% - ==> Staging archive: ~/spack/var/spack/stage/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t/libdwarf-20160507.tar.gz - ==> Created stage in ~/spack/var/spack/stage/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t - ==> No patches needed for libdwarf - ==> Building libdwarf [Package] - ==> Executing phase : 'install' - ==> Successfully installed libdwarf - Fetch: 0.96s. Build: 24.03s. Total: 24.99s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t - - -The ``spack find`` command can also take a ``-d`` flag, which can show -dependency information. Note that each package has a top-level entry, -even if it also appears as a dependency. - -.. code-block:: console - - $ spack find -ldf - ==> 9 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - dtg3tgn libdwarf@20160507%gcc - vrv2ttb ^libelf@0.8.12%gcc cppflags="-O3" - - yfx6p3g libdwarf@20160507%gcc - csrt4qx ^libelf@0.8.13%gcc - - ipggckv libelf@0.8.12%gcc - - vrv2ttb libelf@0.8.12%gcc cppflags="-O3" - - csrt4qx libelf@0.8.13%gcc - - - -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- - w33hrej libelf@0.8.13%intel - - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - csruprg libdwarf@20160507%intel - 4blbe3q ^libelf@0.8.12%intel - - 4blbe3q libelf@0.8.12%intel - - 7wgp32x libelf@0.8.13%intel - - -As we get to more complex packages, full installs will take too long to -build in the time allotted for this tutorial. Our collaborators at CERN -have been working on binary caching for Spack, which would allow for very -fast installs of previously built packages. We are still working out the -security ramifications of the feature, but it is coming soon. - -For now, we will switch to doing "fake" installs. When supplied with the -``--fake`` flag (primarily used for debugging), Spack computes build -metadata the same way it normally would, but it does not download the -source or run the install script for a pacakge. We can use this to -quickly demonstrate some of the more advanced Spack features in our -limited tutorial time. - -``HDF5`` is an example of a more complicated package, with an MPI -dependency. If we install it "out of the box," it will build with -``openmpi``. - -.. code-block:: console - - $ spack install --fake hdf5 - ==> Installing hdf5 - ==> Installing zlib - ==> Building zlib [Package] - ==> Successfully installed zlib - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Installing openmpi - ==> Installing hwloc - ==> Installing libpciaccess - ==> Installing util-macros - ==> Building util-macros [Package] - ==> Successfully installed util-macros - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/util-macros-1.19.0-pc6zhs4cnkmg2cv4et4fizsp6scuvacg - ==> Installing libtool - ==> Installing m4 - ==> Installing libsigsegv - ==> Building libsigsegv [Package] - ==> Successfully installed libsigsegv - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libsigsegv-2.10-q4cok3yber7lhf3jswg6mysg7oi53unh - ==> Building m4 [Package] - ==> Successfully installed m4 - Fetch: . Build: 0.23s. Total: 0.23s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> Building libtool [Package] - ==> Successfully installed libtool - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libtool-2.4.6-rdx5nkfjwlvcanz5il3ys2pe34j4vxx5 - ==> Installing pkg-config - ==> Building pkg-config [Package] - ==> Successfully installed pkg-config - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/pkg-config-0.29.1-wpjnlzahdw6ahkrgmqyeugkj2zhv4tui - ==> Building libpciaccess [Package] - ==> Successfully installed libpciaccess - Fetch: . Build: 0.10s. Total: 0.10s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libpciaccess-0.13.4-m2f6fpm22rpprq2ihkmfx6llf363264m - ==> Building hwloc [Package] - ==> Successfully installed hwloc - Fetch: . Build: 0.23s. Total: 0.23s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hwloc-1.11.4-xpb6hbl2hsze25cgdgfnoppn6rchhzaz - ==> Building openmpi [Package] - ==> Successfully installed openmpi - Fetch: . Build: 0.35s. Total: 0.35s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> Building hdf5 [AutotoolsPackage] - ==> Successfully installed hdf5 - Fetch: . Build: 0.61s. Total: 0.61s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es - - -Spack packages can also have variants. Boolean variants can be specified -using the ``+`` and ``~`` or ``-`` sigils. There are two sigils for -``False`` to avoid conflicts with shell parsing in different -situations. Variants (boolean or otherwise) can also be specified using -the same syntax as compiler flags. Here we can install HDF5 without MPI -support. - -.. code-block:: console - - $ spack install --fake hdf5~mpi - ==> Installing hdf5 - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Building hdf5 [AutotoolsPackage] - ==> Successfully installed hdf5 - Fetch: . Build: 0.22s. Total: 0.22s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-twppaioxqn6lti4grgopnmhwcq3h2rpw - - -We might also want to install HDF5 with a different MPI -implementation. While MPI is not a package itself, packages can depend on -abstract interfaces like MPI. Spack handles these through "virtual -dependencies." A package, such as HDF5, can depend on the MPI -interface. Other packages (``openmpi``, ``mpich``, ``mvapich``, etc.) -provide the MPI interface. Any of these providers can be requested for -an MPI dependency. For example, we can build HDF5 with MPI support -provided by mpich by specifying a dependency on ``mpich``. Spack also -supports versioning of virtual dependencies. A package can depend on the -MPI interface at version 3, and provider packages specify what version of -the interface *they* provide. The partial spec ``^mpi@3`` can be safisfied -by any of several providers. - -.. code-block:: console - - $ spack install --fake hdf5+mpi ^mpich - ==> Installing hdf5 - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Building hdf5 [AutotoolsPackage] - ==> Successfully installed hdf5 - Fetch: . Build: 0.38s. Total: 0.38s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m - - -We'll do a quick check in on what we have installed so far. - -.. code-block:: console - - $ spack find -ldf - ==> 22 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - twppaio hdf5@1.10.0-patch1%gcc - ayc4jq7 ^zlib@1.2.8%gcc - - j36yfw2 hdf5@1.10.0-patch1%gcc - 5jlp2nd ^mpich@3.2%gcc - ayc4jq7 ^zlib@1.2.8%gcc - - ezvtnox hdf5@1.10.0-patch1%gcc - j4cgoq4 ^openmpi@2.0.1%gcc - xpb6hbl ^hwloc@1.11.4%gcc - m2f6fpm ^libpciaccess@0.13.4%gcc - ayc4jq7 ^zlib@1.2.8%gcc - - xpb6hbl hwloc@1.11.4%gcc - m2f6fpm ^libpciaccess@0.13.4%gcc - - dtg3tgn libdwarf@20160507%gcc - vrv2ttb ^libelf@0.8.12%gcc cppflags="-O3" - - yfx6p3g libdwarf@20160507%gcc - csrt4qx ^libelf@0.8.13%gcc - - ipggckv libelf@0.8.12%gcc - - vrv2ttb libelf@0.8.12%gcc cppflags="-O3" - - csrt4qx libelf@0.8.13%gcc - - m2f6fpm libpciaccess@0.13.4%gcc - - q4cok3y libsigsegv@2.10%gcc - - rdx5nkf libtool@2.4.6%gcc - - qijdzvh m4@1.4.17%gcc - q4cok3y ^libsigsegv@2.10%gcc - - 5jlp2nd mpich@3.2%gcc - - j4cgoq4 openmpi@2.0.1%gcc - xpb6hbl ^hwloc@1.11.4%gcc - m2f6fpm ^libpciaccess@0.13.4%gcc - - wpjnlza pkg-config@0.29.1%gcc - - pc6zhs4 util-macros@1.19.0%gcc - - ayc4jq7 zlib@1.2.8%gcc - - - -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- - w33hrej libelf@0.8.13%intel - - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - csruprg libdwarf@20160507%intel - 4blbe3q ^libelf@0.8.12%intel - - 4blbe3q libelf@0.8.12%intel - - 7wgp32x libelf@0.8.13%intel - - -Spack models the dependencies of packages as a directed acyclic graph -(DAG). The ``spack find -d`` command shows the tree representation of -that graph. We can also use the ``spack graph`` command to view the entire -DAG as a graph. - -.. code-block:: console - - $ spack graph hdf5+mpi ^mpich - o hdf5 - |\ - o | zlib - / - o mpich - -You may also have noticed that there are some packages shown in the -``spack find -d`` output that we didn't install explicitly. These are -dependencies that were installed implicitly. A few packages installed -implicitly are not shown as dependencies in the ``spack find -d`` -output. These are build dependencies. For example, ``libpciaccess`` is a -dependency of openmpi and requires m4 to build. Spack will build `m4`` as -part of the installation of ``openmpi``, but it does not become a part of -the DAG because it is not linked in at run time. Spack handles build -dependencies differently because of their different (less strict) -consistency requirements. It is entirely possible to have two packages -using different versions of a dependency to build, which obviously cannot -be done with linked dependencies. - -``HDF5`` is more complicated than our basic example of libelf and -libdwarf, but it's still within the realm of software that an experienced -HPC user could reasonably expect to install given a bit of time. Now -let's look at a more complicated package. - -.. code-block:: console - - $ spack install --fake trilinos - ==> Installing trilinos - ==> Installing superlu-dist - ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> Installing parmetis - ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> Installing cmake - ==> Installing bzip2 - ==> Building bzip2 [Package] - ==> Successfully installed bzip2 - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bzip2-1.0.6-gll2xsahysy7ji5gkmfxwkofdt3mwjhs - ==> expat is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/expat-2.2.0-mg5kwd3kluxdgorj32vzbp7aksg3vqej - ==> Installing ncurses - ==> Building ncurses [Package] - ==> Successfully installed ncurses - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/ncurses-6.0-fttg4astvrtq2buey4wq66tnyu7bgj2c - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Installing openssl - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Building openssl [Package] - ==> Successfully installed openssl - Fetch: . Build: 0.23s. Total: 0.23s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openssl-1.0.2j-kt5xyk2dkho6tzadnqlbnbujmljprylg - ==> Installing libarchive - ==> Installing lzma - ==> Building lzma [Package] - ==> Successfully installed lzma - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/lzma-4.32.7-hah2cdo3zbulz6yg5do6dvnfn6en5v5c - ==> Installing nettle - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> Installing gmp - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> Building gmp [AutotoolsPackage] - ==> Successfully installed gmp - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf - ==> Building nettle [Package] - ==> Successfully installed nettle - Fetch: . Build: 0.18s. Total: 0.18s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/nettle-3.2-w4ieitifcmrldo4ra7as63apagzf56ja - ==> bzip2 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bzip2-1.0.6-gll2xsahysy7ji5gkmfxwkofdt3mwjhs - ==> expat is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/expat-2.2.0-mg5kwd3kluxdgorj32vzbp7aksg3vqej - ==> Installing libxml2 - ==> Installing xz - ==> Building xz [Package] - ==> Successfully installed xz - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/xz-5.2.2-bxh6cpyqqozazm5okvjqk23sww3gccnf - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Building libxml2 [Package] - ==> Successfully installed libxml2 - Fetch: . Build: 0.35s. Total: 0.35s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libxml2-2.9.4-un323rppyu5qipkegyf7flmymvtmunrx - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Installing lz4 - ==> Building lz4 [Package] - ==> Successfully installed lz4 - Fetch: . Build: 0.12s. Total: 0.12s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/lz4-131-ivy2fcaw7ywujx74weebdi5bsm7q4vkc - ==> openssl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openssl-1.0.2j-kt5xyk2dkho6tzadnqlbnbujmljprylg - ==> xz is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/xz-5.2.2-bxh6cpyqqozazm5okvjqk23sww3gccnf - ==> Installing lzo - ==> Building lzo [AutotoolsPackage] - ==> Successfully installed lzo - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/lzo-2.09-dlgnm74ozo6baactkft5oah2jre2ri2i - ==> Building libarchive [Package] - ==> Successfully installed libarchive - Fetch: . Build: 1.35s. Total: 1.35s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libarchive-3.2.1-biq3kebw7vel7njusill7vv7mjldkqjv - ==> xz is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/xz-5.2.2-bxh6cpyqqozazm5okvjqk23sww3gccnf - ==> Installing curl - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> openssl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openssl-1.0.2j-kt5xyk2dkho6tzadnqlbnbujmljprylg - ==> Building curl [Package] - ==> Successfully installed curl - Fetch: . Build: 0.36s. Total: 0.36s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/curl-7.50.3-oze4gqutj4x2isbkcn5ob2bhhxbskod4 - ==> Building cmake [Package] - ==> Successfully installed cmake - Fetch: . Build: 1.64s. Total: 1.64s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> Installing metis - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> Building metis [Package] - ==> Successfully installed metis - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> Building parmetis [Package] - ==> Successfully installed parmetis - Fetch: . Build: 0.62s. Total: 0.62s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-rtg6hml5t6acdcnxomn3l5zfiful4d2t - ==> Installing openblas - ==> Building openblas [Package] - ==> Successfully installed openblas - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> Building superlu-dist [Package] - ==> Successfully installed superlu-dist - Fetch: . Build: 0.85s. Total: 0.85s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/superlu-dist-5.1.1-25r6jlvkpjnkiuwt2rtbzhk3l3htuxs7 - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> Installing glm - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> Building glm [Package] - ==> Successfully installed glm - Fetch: . Build: 0.12s. Total: 0.12s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/glm-0.9.7.1-7a6oho4aerz7vftxd5ur7lywscht2iry - ==> Installing hypre - ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building hypre [Package] - ==> Successfully installed hypre - Fetch: . Build: 0.61s. Total: 0.61s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hypre-2.11.1-lf7hcejiiww5peesh57quda72z67veit - ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> Installing netlib-scalapack - ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building netlib-scalapack [Package] - ==> Successfully installed netlib-scalapack - Fetch: . Build: 0.61s. Total: 0.61s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dvcanz2qq4dfcexznbhbmzbxfj43uz4q - ==> Installing suite-sparse - ==> Installing tbb - ==> Building tbb [Package] - ==> Successfully installed tbb - Fetch: . Build: 0.12s. Total: 0.12s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/tbb-4.4.4-zawzkkhrmdonbjpj3a5bb6gkgnqlrjeu - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> Building suite-sparse [Package] - ==> Successfully installed suite-sparse - Fetch: . Build: 0.49s. Total: 0.49s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/suite-sparse-4.5.3-lvur6hriy2j7xfjwh5punp3exwpynzm6 - ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> Installing netcdf - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> curl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/curl-7.50.3-oze4gqutj4x2isbkcn5ob2bhhxbskod4 - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es - ==> Building netcdf [Package] - ==> Successfully installed netcdf - Fetch: . Build: 0.90s. Total: 0.90s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netcdf-4.4.1-tcl4zbrmdfrit2cqlaxig6xieu5h552j - ==> Installing mumps - ==> netlib-scalapack is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dvcanz2qq4dfcexznbhbmzbxfj43uz4q - ==> openmpi is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openmpi-2.0.1-j4cgoq4furxvr73pq72r2qgywgksw3qn - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building mumps [Package] - ==> Successfully installed mumps - Fetch: . Build: 0.74s. Total: 0.74s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mumps-5.0.2-kr5r4nnx5tfcacxnk3ii5dsxbe6pu5fy - ==> Installing matio - ==> Building matio [Package] - ==> Successfully installed matio - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/matio-1.5.2-4zrozucookychlvc4q53omp2zyfk2bed - ==> Installing boost - ==> bzip2 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bzip2-1.0.6-gll2xsahysy7ji5gkmfxwkofdt3mwjhs - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> Building boost [Package] - ==> Successfully installed boost - Fetch: . Build: 0.35s. Total: 0.35s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/boost-1.62.0-je7eqvzt74kezwhh55y5lwt5dy6pnali - ==> parmetis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-rtg6hml5t6acdcnxomn3l5zfiful4d2t - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es - ==> Building trilinos [Package] - ==> Successfully installed trilinos - Fetch: . Build: 2.63s. Total: 2.63s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/trilinos-12.8.1-uvd6dfd7x4uyvck4awo3r3frudihn4ar - - -Now we're starting to see the power of Spack. Trilinos has 11 top level -dependecies, many of which have dependencies of their own. Installing -more complex packages can take days or weeks even for an experienced -user. Although we've done a fake installation for the tutorial, a real -installation of trilinos using Spack takes about 3 hours (depending on -the system), but only 20 seconds of programmer time. - -Spack manages constistency of the entire DAG. Every MPI dependency will -be satisfied by the same configuration of MPI, etc. If we install -``trilinos`` again specifying a dependency on our previous HDF5 built -with ``mpich``: - -.. code-block:: console - - $ spack install --fake trilinos ^hdf5+mpi ^mpich - ==> Installing trilinos - ==> Installing superlu-dist - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> Installing parmetis - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> Building parmetis [Package] - ==> Successfully installed parmetis - Fetch: . Build: 0.38s. Total: 0.38s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-43kbtni6p5y446c6qdkybq4htj7ot4zn - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building superlu-dist [Package] - ==> Successfully installed superlu-dist - Fetch: . Build: 0.61s. Total: 0.61s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/superlu-dist-5.1.1-46uuupehmonx5jicc6xnegnud2n5jqyl - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> glm is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/glm-0.9.7.1-7a6oho4aerz7vftxd5ur7lywscht2iry - ==> Installing hypre - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building hypre [Package] - ==> Successfully installed hypre - Fetch: . Build: 0.37s. Total: 0.37s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hypre-2.11.1-6ajnyymoivs5apajd7thjisae36jv4lz - ==> metis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/metis-5.1.0-ithifyl4xvqbn76js23wsb4tjnztrbdv - ==> Installing netlib-scalapack - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> cmake is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/cmake-3.6.1-n2nkknrku6dvuneo3rjumim7axt7n36e - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building netlib-scalapack [Package] - ==> Successfully installed netlib-scalapack - Fetch: . Build: 0.37s. Total: 0.37s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dayeep27omm26wksd3iqvbu3gezc2eoh - ==> suite-sparse is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/suite-sparse-4.5.3-lvur6hriy2j7xfjwh5punp3exwpynzm6 - ==> Installing netcdf - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> curl is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/curl-7.50.3-oze4gqutj4x2isbkcn5ob2bhhxbskod4 - ==> zlib is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/zlib-1.2.8-ayc4jq7vxuzge5n444gutvskeytfdruh - ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m - ==> Building netcdf [Package] - ==> Successfully installed netcdf - Fetch: . Build: 0.67s. Total: 0.67s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netcdf-4.4.1-gfemi4jk4qltvp33xhtpkam7dozbqvhq - ==> Installing mumps - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> netlib-scalapack is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/netlib-scalapack-2.0.2-dayeep27omm26wksd3iqvbu3gezc2eoh - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> Building mumps [Package] - ==> Successfully installed mumps - Fetch: . Build: 0.49s. Total: 0.49s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mumps-5.0.2-w7t5pl3jhhwitfiyer63zj6zv7idkt3m - ==> mpich is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpich-3.2-5jlp2ndnsb67txggraglu47vjmayx5za - ==> matio is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/matio-1.5.2-4zrozucookychlvc4q53omp2zyfk2bed - ==> boost is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/boost-1.62.0-je7eqvzt74kezwhh55y5lwt5dy6pnali - ==> parmetis is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/parmetis-4.0.3-43kbtni6p5y446c6qdkybq4htj7ot4zn - ==> openblas is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/openblas-0.2.19-bwofa7fhff6od5zn56vy3j4eeyupsqgt - ==> hdf5 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m - ==> Building trilinos [Package] - ==> Successfully installed trilinos - Fetch: . Build: 2.42s. Total: 2.42s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/trilinos-12.8.1-ffwrpxnq7lhiw2abxn2u7ffr4jjsdwep - -We see that every package in the trilinos DAG that depends on MPI now -uses ``mpich``. - -.. code-block:: console - - $ spack find -d trilinos - ==> 2 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - trilinos@12.8.1 - ^boost@1.62.0 - ^bzip2@1.0.6 - ^zlib@1.2.8 - ^glm@0.9.7.1 - ^hdf5@1.10.0-patch1 - ^mpich@3.2 - ^hypre@2.11.1 - ^openblas@0.2.19 - ^matio@1.5.2 - ^metis@5.1.0 - ^mumps@5.0.2 - ^netlib-scalapack@2.0.2 - ^netcdf@4.4.1 - ^curl@7.50.3 - ^openssl@1.0.2j - ^parmetis@4.0.3 - ^suite-sparse@4.5.3 - ^tbb@4.4.4 - ^superlu-dist@5.1.1 - - trilinos@12.8.1 - ^boost@1.62.0 - ^bzip2@1.0.6 - ^zlib@1.2.8 - ^glm@0.9.7.1 - ^hdf5@1.10.0-patch1 - ^openmpi@2.0.1 - ^hwloc@1.11.4 - ^libpciaccess@0.13.4 - ^hypre@2.11.1 - ^openblas@0.2.19 - ^matio@1.5.2 - ^metis@5.1.0 - ^mumps@5.0.2 - ^netlib-scalapack@2.0.2 - ^netcdf@4.4.1 - ^curl@7.50.3 - ^openssl@1.0.2j - ^parmetis@4.0.3 - ^suite-sparse@4.5.3 - ^tbb@4.4.4 - ^superlu-dist@5.1.1 - - -As we discussed before, the ``spack find -d`` command shows the -dependency information as a tree. While that is often sufficient, many -complicated packages, including trilinos, have dependencies that -cannot be fully represented as a tree. Again, the ``spack graph`` -command shows the full DAG of the dependency information. - -.. code-block:: console - - $ spack graph trilinos - o trilinos - |\ - | |\ - | | |\ - | | | |\ - | | | | |\ - | | | | | |\ - | | | | | | |\ - | o | | | | | | netcdf - | |\ \ \ \ \ \ \ - | | |\ \ \ \ \ \ \ - | | | o | | | | | | curl - | | |/| | | | | | | - | |/| | | | | | | | - | | | o | | | | | | openssl - | | |/ / / / / / / - | |/| | | | | | | - | | o | | | | | | hdf5 - | |/| | | | | | | - | | |/ / / / / / - | o | | | | | | zlib - | / / / / / / - o | | | | | | swig - o | | | | | | pcre - / / / / / / - o | | | | | mpi - / / / / / - o | | | | matio - / / / / - o | | | lapack - / / / - o | | glm - / / - o | boost - / - o blas - - -You can control how the output is displayed with a number of options. - -The ASCII output from ``spack graph`` can be difficult to parse for -complicated packages. The output can be changed to the ``graphviz`` -``.dot`` format using the `--dot` flag. - -.. code-block:: console - - $ spack graph --dot trilinos | dot -Tpdf trilinos_graph.pdf - -.. _basics-tutorial-uninstall: - ---------------------- -Uninstalling Packages ---------------------- - -Earlier we installed many configurations each of libelf and -libdwarf. Now we will go through and uninstall some of those packages -that we didn't really need. - -.. code-block:: console - - $ spack find -d libdwarf - ==> 3 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - libdwarf@20160507 - ^libelf@0.8.12 - - libdwarf@20160507 - ^libelf@0.8.13 - - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - libdwarf@20160507 - ^libelf@0.8.12 - - $ spack find libelf - ==> 6 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - libelf@0.8.12 libelf@0.8.12 libelf@0.8.13 - - -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- - libelf@0.8.13 - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - libelf@0.8.12 libelf@0.8.13 - - -We can uninstall packages by spec using the same syntax as install. - -.. code-block:: console - - $ spack uninstall libelf%intel@15.0.4 - ==> The following packages will be uninstalled : - - -- linux-redhat6-x86_64 / intel@15.0.4 -------------------------- - w33hrej libelf@0.8.13%intel - - - ==> Do you want to proceed? [y/n] y - ==> Successfully uninstalled libelf@0.8.13%intel@15.0.4 arch=linux-redhat6-x86_64-w33hrej - - - - $ spack find -lf libelf - ==> 5 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - ipggckv libelf@0.8.12%gcc - - vrv2ttb libelf@0.8.12%gcc cppflags="-O3" - - csrt4qx libelf@0.8.13%gcc - - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - 4blbe3q libelf@0.8.12%intel - - 7wgp32x libelf@0.8.13%intel - - -We can uninstall packages by referring only to their hash. - - -We can use either ``-f`` (force) or ``-R`` (remove dependents as well) to -remove packages that are required by another installed package. - -.. code-block:: console - - $ spack uninstall /4blb - ==> Error: Will not uninstall libelf@0.8.12%intel@16.0.3-4blbe3q - - The following packages depend on it: - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - csruprg libdwarf@20160507%intel - - - ==> Error: You can use spack uninstall --dependents to uninstall these dependencies as well - $ spack uninstall -R /4blb - ==> The following packages will be uninstalled : - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - csruprg libdwarf@20160507%intel - - 4blbe3q libelf@0.8.12%intel - - - ==> Do you want to proceed? [y/n] y - ==> Successfully uninstalled libdwarf@20160507%intel@16.0.3 arch=linux-redhat6-x86_64-csruprg - ==> Successfully uninstalled libelf@0.8.12%intel@16.0.3 arch=linux-redhat6-x86_64-4blbe3q - - -Spack will not uninstall packages that are not sufficiently -specified. The ``-a`` (all) flag can be used to uninstall multiple -packages at once. - -.. code-block:: console - - $ spack uninstall trilinos - ==> Error: trilinos matches multiple packages: - - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - ffwrpxn trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist - - uvd6dfd trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist - - - ==> Error: You can either: - a) Use a more specific spec, or - b) use spack uninstall -a to uninstall ALL matching specs. - - - - $ spack uninstall /ffwr - ==> The following packages will be uninstalled : - - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - ffwrpxn trilinos@12.8.1%gcc+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist - - - ==> Do you want to proceed? [y/n] y - ==> Successfully uninstalled trilinos@12.8.1%gcc@4.4.7+boost~debug+hdf5+hypre+metis+mumps~python+shared+suite-sparse+superlu-dist arch=linux-redhat6-x86_64-ffwrpxn - ------------------------------ -Advanced ``spack find`` Usage ------------------------------ - -We will go over some additional uses for the `spack find` command not -already covered in the :ref:`basics-tutorial-install` and -:ref:`basics-tutorial-uninstall` sections. - -The ``spack find`` command can accept what we call "anonymous specs." -These are expressions in spec syntax that do not contain a package -name. For example, `spack find %intel` will return every package built -with the intel compiler, and ``spack find cppflags="-O3"`` will -return every package which was built with ``cppflags="-O3"``. - -.. code-block:: console - - $ spack find %intel - ==> 1 installed packages. - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - libelf@0.8.13 - - - - $ spack find cppflags="-O3" - ==> 1 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - libelf@0.8.12 - - -The ``find`` command can also show which packages were installed -explicitly (rather than pulled in as a dependency) using the ``-e`` -flag. The ``-E`` flag shows implicit installs only. The ``find`` command can -also show the path to which a spack package was installed using the ``-p`` -command. - -.. code-block:: console - - $ spack find -pe - ==> 10 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - hdf5@1.10.0-patch1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-twppaioxqn6lti4grgopnmhwcq3h2rpw - hdf5@1.10.0-patch1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-j36yfw25i6gdd3q4vwlupgkpwic4ua6m - hdf5@1.10.0-patch1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/hdf5-1.10.0-patch1-ezvtnox35albuaxqryuondweyjgeo6es - libdwarf@20160507 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-dtg3tgnp7htccoly26gduqlrgvnwcp5t - libdwarf@20160507 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libdwarf-20160507-yfx6p3g3rkmqvcqbmtb34o6pln7pqvcz - libelf@0.8.12 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-ipggckv6i7h44iryzfa4dwdela32a7fy - libelf@0.8.12 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.12-vrv2ttbd34xlfoxy4jwt6qsjrcbalmmw - libelf@0.8.13 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/libelf-0.8.13-csrt4qxfkhjgn5xg3zjpkir7xdnszl2a - trilinos@12.8.1 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/trilinos-12.8.1-uvd6dfd7x4uyvck4awo3r3frudihn4ar - - -- linux-redhat6-x86_64 / intel@16.0.3 -------------------------- - libelf@0.8.13 ~/spack/opt/spack/linux-redhat6-x86_64/intel-16.0.3/libelf-0.8.13-7wgp32xksatkvw2tbssmehw2t5tnxndj - - ---------------------- -Customizing Compilers ---------------------- - - -Spack manages a list of available compilers on the system, detected -automatically from from the user's ``PATH`` variable. The ``spack -compilers`` command is an alias for the command ``spack compiler list``. - -.. code-block:: console - - $ spack compilers - ==> Available compilers - -- gcc ---------------------------------------------------------- - gcc@4.4.7 - - -- intel -------------------------------------------------------- - intel@16.0.3 intel@15.0.1 intel@14.0.0 intel@12.1.3 intel@10.0 - intel@16.0.2 intel@15.0.0 intel@13.1.1 intel@12.1.2 intel@9.1 - intel@16.0.1 intel@14.0.4 intel@13.1.0 intel@12.1.0 - intel@16.0.0 intel@14.0.3 intel@13.0.1 intel@12.0.4 - intel@15.0.4 intel@14.0.2 intel@13.0.0 intel@11.1 - intel@15.0.3 intel@14.0.1 intel@12.1.5 intel@10.1 - - -- pgi ---------------------------------------------------------- - pgi@16.5-0 pgi@15.7-0 pgi@14.7-0 pgi@13.2-0 pgi@11.10-0 pgi@9.0-4 - pgi@16.3-0 pgi@15.5-0 pgi@14.3-0 pgi@13.1-1 pgi@11.1-0 pgi@8.0-1 - pgi@16.1-0 pgi@15.1-0 pgi@13.10-0 pgi@12.8-0 pgi@10.9-0 pgi@7.1-3 - pgi@15.10-0 pgi@14.10-0 pgi@13.6-0 pgi@12.1-0 pgi@10.2-0 pgi@7.0-6 - -The compilers are maintained in a YAML file that can be hand-edited -for special cases. Spack also has tools to add compilers, and -compilers built with Spack can be added to the configuration. - -.. code-block:: console - - $ spack install --fake gcc@6.1.0 - ==> Installing gcc - ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf - ==> Installing isl - ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf - ==> Building isl [Package] - ==> Successfully installed isl - Fetch: . Build: 0.19s. Total: 0.19s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/isl-0.14-hs2w7mjjjaakkmbbv5yvfqf7yyzhorl6 - ==> Installing mpc - ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf - ==> Installing mpfr - ==> gmp is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gmp-6.1.1-uwn4gfdtq3sywy5uf4f7znrh66oybikf - ==> Building mpfr [Package] - ==> Successfully installed mpfr - Fetch: . Build: 0.17s. Total: 0.17s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpfr-3.1.4-7kt5ij437khredfq4bvnyu22t3fmtfvt - ==> Building mpc [Package] - ==> Successfully installed mpc - Fetch: . Build: 0.28s. Total: 0.28s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpc-1.0.3-g5taq6lt3zuy5l2jtggi5lctxnl4la5u - ==> Installing binutils - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> Installing bison - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> Building bison [Package] - ==> Successfully installed bison - Fetch: . Build: 0.12s. Total: 0.12s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bison-3.0.4-hkhfysfvq5l6rsns67g2htmkpxauvnwa - ==> Installing flex - ==> m4 is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/m4-1.4.17-qijdzvhjyybrtwbqm73vykhmkaqro3je - ==> bison is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/bison-3.0.4-hkhfysfvq5l6rsns67g2htmkpxauvnwa - ==> Building flex [Package] - ==> Successfully installed flex - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/flex-2.6.0-qd6d73rdfrozdrsdpimvl4tj7d5ps7qg - ==> Building binutils [Package] - ==> Successfully installed binutils - Fetch: . Build: 0.11s. Total: 0.11s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/binutils-2.27-iq2hry3gvaxszmwwbnll7njgdgaek56o - ==> mpfr is already installed in ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/mpfr-3.1.4-7kt5ij437khredfq4bvnyu22t3fmtfvt - ==> Building gcc [Package] - ==> Successfully installed gcc - Fetch: . Build: 0.66s. Total: 0.66s. - [+] ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh - - - - $ spack find -p gcc - ==> 1 installed packages. - -- linux-redhat6-x86_64 / gcc@4.4.7 ----------------------------- - gcc@6.1.0 ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh - - -If we had done a "real" install of gcc, we could add it to our -configuration now using the `spack compiler add` command, but we would -also be waiting for it to install. If we run the command now, it will -return no new compilers. - -.. code-block:: console - - $ spack compiler add ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh/bin - ==> Found no new compilers - -If we had done a real install, the output would have been as follows: - -.. code-block:: console - - $ spack compiler add ~/spack/opt/spack/linux-redhat6-x86_64/gcc-4.4.7/gcc-6.1.0-j5576zbsot2ydljlthjzhsirsesnogvh/bin - ==> Added 1 new compiler to ~/.spack/linux/compilers.yaml - gcc@6.1.0 -- cgit v1.2.3-70-g09d2 From 58f2a947db98bdecb061133a7b6780fa405fbd33 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 25 Apr 2017 13:01:25 -0500 Subject: Properly ignore flake8 F811 redefinition errors (#3932) * Properly ignore flake8 F811 redefinition errors * Add unit tests for flake8 command * Allow spack flake8 to work on systems with older git * Skip flake8 unit tests for Python 2.6 and 3.3 --- .flake8 | 4 +- lib/spack/spack/cmd/flake8.py | 91 +++++++++++++-------- lib/spack/spack/test/cmd/flake8.py | 95 ++++++++++++++++++++++ .../repos/builtin.mock/packages/boost/package.py | 83 +++++++++++++++++++ ...m-bug-that-probably-only-affects-one-user.patch | 1 + .../repos/builtin.mock/packages/flake8/package.py | 79 ++++++++++++++++++ var/spack/repos/builtin/packages/metis/package.py | 4 +- var/spack/repos/builtin/packages/qt/package.py | 8 +- 8 files changed, 324 insertions(+), 41 deletions(-) create mode 100644 lib/spack/spack/test/cmd/flake8.py create mode 100644 var/spack/repos/builtin.mock/packages/boost/package.py create mode 100644 var/spack/repos/builtin.mock/packages/flake8/hyper-specific-patch-that-fixes-some-random-bug-that-probably-only-affects-one-user.patch create mode 100644 var/spack/repos/builtin.mock/packages/flake8/package.py (limited to 'lib') diff --git a/.flake8 b/.flake8 index 023f392952..e697d5ea04 100644 --- a/.flake8 +++ b/.flake8 @@ -11,12 +11,12 @@ # - E272: multiple spaces before keyword # # Let people use terse Python features: -# - E731 : lambda expressions +# - E731: lambda expressions # # Spack allows wildcard imports: # - F403: disable wildcard import # -# These are required to get the package.py files to test clean. +# These are required to get the package.py files to test clean: # - F405: `name` may be undefined, or undefined from star imports: `module` # - F821: undefined name `name` (needed for cmake, configure, etc.) # - F999: syntax error in doctest diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 546a27c765..33c06155ae 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -37,8 +37,6 @@ import spack from spack.util.executable import * description = "runs source code style checks on Spack. requires flake8" -flake8 = None -include_untracked = True """List of directories to exclude from checks.""" exclude_directories = [spack.external_path] @@ -53,24 +51,34 @@ exemptions = { # exemptions applied only to package.py files. r'package.py$': { # Exempt lines with urls and descriptions from overlong line errors. - 501: [r'^\s*homepage\s*=', - r'^\s*url\s*=', - r'^\s*git\s*=', - r'^\s*svn\s*=', - r'^\s*hg\s*=', - r'^\s*version\(.*\)', - r'^\s*variant\(.*\)', - r'^\s*depends_on\(.*\)', - r'^\s*extends\(.*\)', - r'^\s*patch\(.*\)'], + 'E501': [ + r'^\s*homepage\s*=', + r'^\s*url\s*=', + r'^\s*git\s*=', + r'^\s*svn\s*=', + r'^\s*hg\s*=', + r'^\s*list_url\s*=', + r'^\s*version\(.*\)', + r'^\s*variant\(.*\)', + r'^\s*provides\(.*\)', + r'^\s*extends\(.*\)', + r'^\s*depends_on\(.*\)', + r'^\s*conflicts\(.*\)', + r'^\s*resource\(.*\)', + r'^\s*patch\(.*\)', + ], # Exempt '@when' decorated functions from redefinition errors. - 811: [r'^\s*\@when\(.*\)'], + 'F811': [ + r'^\s*@when\(.*\)', + ], }, # exemptions applied to all files. r'.py$': { # Exempt lines with URLs from overlong line errors. - 501: [r'(https?|ftp|file)\:'] + 'E501': [ + r'(https?|ftp|file)\:', + ] }, } @@ -81,7 +89,7 @@ exemptions = dict((re.compile(file_pattern), for file_pattern, error_dict in exemptions.items()) -def changed_files(): +def changed_files(args): """Get list of changed files in the Spack repository.""" git = which('git', required=True) @@ -92,23 +100,30 @@ def changed_files(): # Add changed files that have been staged but not yet committed ['diff', '--name-only', '--diff-filter=ACMR', '--cached'], # Add changed files that are unstaged - ['diff', '--name-only', '--diff-filter=ACMR']] + ['diff', '--name-only', '--diff-filter=ACMR'], + ] # Add new files that are untracked - if include_untracked: + if args.untracked: git_args.append(['ls-files', '--exclude-standard', '--other']) excludes = [os.path.realpath(f) for f in exclude_directories] changed = set() - for git_arg_list in git_args: - arg_list = git_arg_list + ['--', '*.py'] - files = [f for f in git(*arg_list, output=str).split('\n') if f] + for arg_list in git_args: + files = git(*arg_list, output=str).split('\n') + for f in files: - # don't look at files that are in the exclude locations + # Ignore non-Python files + if not f.endswith('.py'): + continue + + # Ignore files in the exclude locations if any(os.path.realpath(f).startswith(e) for e in excludes): continue + changed.add(f) + return sorted(changed) @@ -120,7 +135,17 @@ def filter_file(source, dest, output=False): with open(dest, 'w') as outfile: for line in infile: - line = line.rstrip() + # Only strip newline characters + # We still want to catch trailing whitespace warnings + line = line.rstrip('\n') + + if line == '# flake8: noqa': + # Entire file is ignored + break + + if line.endswith('# noqa'): + # Line is already ignored + continue for file_pattern, errors in exemptions.items(): if not file_pattern.search(source): @@ -129,7 +154,10 @@ def filter_file(source, dest, output=False): for code, patterns in errors.items(): for pattern in patterns: if pattern.search(line): - line += (" # NOQA: E%d" % code) + if '# noqa: ' in line: + line += ',{0}'.format(code) + else: + line += ' # noqa: {0}'.format(code) break oline = line + '\n' @@ -157,10 +185,7 @@ def setup_parser(subparser): def flake8(parser, args): - # Just use this to check for flake8 -- we actually execute it with Popen. - global flake8, include_untracked flake8 = which('flake8', required=True) - include_untracked = args.untracked temp = tempfile.mkdtemp() try: @@ -174,7 +199,7 @@ def flake8(parser, args): with working_dir(spack.prefix): if not file_list: - file_list = changed_files() + file_list = changed_files(args) shutil.copy('.flake8', os.path.join(temp, '.flake8')) print('=======================================================') @@ -182,7 +207,7 @@ def flake8(parser, args): print() print('Modified files:') for filename in file_list: - print(" %s" % filename.strip()) + print(' {0}'.format(filename.strip())) print('=======================================================') # filter files into a temporary directory with exemptions added. @@ -202,20 +227,20 @@ def flake8(parser, args): else: # print results relative to current working directory def cwd_relative(path): - return '%s: [' % os.path.relpath( - os.path.join(spack.prefix, path.group(1)), os.getcwd()) + return '{0}: ['.format(os.path.relpath( + os.path.join(spack.prefix, path.group(1)), os.getcwd())) for line in output.split('\n'): print(re.sub(r'^(.*): \[', cwd_relative, line)) if flake8.returncode != 0: - print("Flake8 found errors.") + print('Flake8 found errors.') sys.exit(1) else: - print("Flake8 checks were clean.") + print('Flake8 checks were clean.') finally: if args.keep_temp: - print("temporary files are in ", temp) + print('Temporary files are in: ', temp) else: shutil.rmtree(temp, ignore_errors=True) diff --git a/lib/spack/spack/test/cmd/flake8.py b/lib/spack/spack/test/cmd/flake8.py new file mode 100644 index 0000000000..bde8d199a7 --- /dev/null +++ b/lib/spack/spack/test/cmd/flake8.py @@ -0,0 +1,95 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import argparse +import os +import pytest +import sys + +from llnl.util.filesystem import FileFilter + +import spack +from spack.cmd.flake8 import * +from spack.repository import Repo + + +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the ``flake8`` command""" + parser = argparse.ArgumentParser() + setup_parser(parser) + return parser + + +@pytest.fixture(scope='module') +def flake8_package(): + """Flake8 only checks files that have been modified. + This fixture makes a small change to the ``flake8`` + mock package, yields the filename, then undoes the + change on cleanup. + """ + repo = Repo(spack.mock_packages_path) + filename = repo.filename_for_package_name('flake8') + package = FileFilter(filename) + + # Make the change + package.filter('unmodified', 'modified') + + yield filename + + # Undo the change + package.filter('modified', 'unmodified') + + +def test_changed_files(parser, flake8_package): + args = parser.parse_args() + + # changed_files returns file paths relative to the root + # directory of Spack. Convert to absolute file paths. + files = changed_files(args) + files = [os.path.join(spack.spack_root, path) for path in files] + + # There will likely be other files that have changed + # when these tests are run + assert flake8_package in files + + +# As of flake8 3.0.0, Python 2.6 and 3.3 are no longer supported +# http://flake8.pycqa.org/en/latest/release-notes/3.0.0.html +@pytest.mark.skipif( + sys.version_info[:2] <= (2, 6) or + (3, 0) <= sys.version_info[:2] <= (3, 3), + reason='flake8 no longer supports Python 2.6 or 3.3 and older') +def test_flake8(parser, flake8_package): + # Only test the flake8_package that we modified + # Otherwise, the unit tests would fail every time + # the flake8 tests fail + args = parser.parse_args([flake8_package]) + + flake8(parser, args) + + # Get even more coverage + args = parser.parse_args(['--output', '--root-relative', flake8_package]) + + flake8(parser, args) diff --git a/var/spack/repos/builtin.mock/packages/boost/package.py b/var/spack/repos/builtin.mock/packages/boost/package.py new file mode 100644 index 0000000000..5d86c4559f --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/boost/package.py @@ -0,0 +1,83 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Boost(Package): + """Fake boost package.""" + + homepage = "http://www.boost.org" + url = "http://downloads.sourceforge.net/project/boost/boost/1.63.0/boost_1_63_0.tar.bz2" + + version('1.63.0', '1c837ecd990bb022d07e7aab32b09847') + + default_install_libs = set(['atomic', + 'chrono', + 'date_time', + 'filesystem', + 'graph', + 'iostreams', + 'locale', + 'log', + 'math', + 'program_options', + 'random', + 'regex', + 'serialization', + 'signals', + 'system', + 'test', + 'thread', + 'timer', + 'wave']) + + # mpi/python are not installed by default because they pull in many + # dependencies and/or because there is a great deal of customization + # possible (and it would be difficult to choose sensible defaults) + default_noinstall_libs = set(['mpi', 'python']) + + all_libs = default_install_libs | default_noinstall_libs + + for lib in all_libs: + variant(lib, default=(lib not in default_noinstall_libs), + description="Compile with {0} library".format(lib)) + + variant('debug', default=False, + description='Switch to the debug version of Boost') + variant('shared', default=True, + description="Additionally build shared libraries") + variant('multithreaded', default=True, + description="Build multi-threaded versions of libraries") + variant('singlethreaded', default=False, + description="Build single-threaded versions of libraries") + variant('icu', default=False, + description="Build with Unicode and ICU suport") + variant('graph', default=False, + description="Build the Boost Graph library") + variant('taggedlayout', default=False, + description="Augment library names with build options") + + def install(self, spec, prefix): + pass diff --git a/var/spack/repos/builtin.mock/packages/flake8/hyper-specific-patch-that-fixes-some-random-bug-that-probably-only-affects-one-user.patch b/var/spack/repos/builtin.mock/packages/flake8/hyper-specific-patch-that-fixes-some-random-bug-that-probably-only-affects-one-user.patch new file mode 100644 index 0000000000..b8c9065e4b --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/flake8/hyper-specific-patch-that-fixes-some-random-bug-that-probably-only-affects-one-user.patch @@ -0,0 +1 @@ +Fake patch diff --git a/var/spack/repos/builtin.mock/packages/flake8/package.py b/var/spack/repos/builtin.mock/packages/flake8/package.py new file mode 100644 index 0000000000..bd062d71bc --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/flake8/package.py @@ -0,0 +1,79 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Flake8(Package): + """Package containing as many PEP 8 violations as possible. + All of these violations are exceptions that we allow in + package.py files.""" + + # Used to tell whether or not the package has been modified + state = 'unmodified' + + # Make sure pre-existing noqa is not interfered with + blatant_violation = 'line-that-has-absolutely-no-execuse-for-being-over-79-characters' # noqa + blatant_violation = 'line-that-has-absolutely-no-execuse-for-being-over-79-characters' # noqa: E501 + + # Keywords exempt from line-length checks + homepage = '#####################################################################' + url = '#####################################################################' + git = '#####################################################################' + svn = '#####################################################################' + hg = '#####################################################################' + list_url = '#####################################################################' + + # URL strings exempt from line-length checks + # http://######################################################################## + # https://####################################################################### + # ftp://######################################################################### + # file://######################################################################## + + # Directives exempt from line-length checks + version('2.0', '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef') + version('1.0', '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef') + + variant('super-awesome-feature', default=True, description='Enable super awesome feature') + variant('somewhat-awesome-feature', default=False, description='Enable somewhat awesome feature') + + provides('lapack', when='@2.0+super-awesome-feature+somewhat-awesome-feature') + + extends('python', ignore='bin/(why|does|every|package|that|depends|on|numpy|need|to|copy|f2py3?)') + + depends_on('boost+atomic+chrono+date_time~debug+filesystem~graph~icu+iostreams+locale+log+math~mpi+multithreaded+program_options~python+random+regex+serialization+shared+signals~singlethreaded+system~taggedlayout+test+thread+timer+wave') + + conflicts('+super-awesome-feature', when='%intel@16:17+somewhat-awesome-feature') + + resource(name='Deez-Nuts', destination='White-House', placement='President', when='@2020', url='www.elect-deez-nuts.com') + + patch('hyper-specific-patch-that-fixes-some-random-bug-that-probably-only-affects-one-user.patch', when='%gcc@3.2.2:3.2.3') + + def install(self, spec, prefix): + pass + + # '@when' decorated functions are exempt from redefinition errors + @when('@2.0') + def install(self, spec, prefix): + pass diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py index c927c22a1b..454bb97037 100644 --- a/var/spack/repos/builtin/packages/metis/package.py +++ b/var/spack/repos/builtin/packages/metis/package.py @@ -84,7 +84,7 @@ class Metis(Package): filter_file('#define MAX_JBUFS 128', '#define MAX_JBUFS 24', join_path(source_path, 'GKlib', 'error.c')) - @when('@:4') # noqa: F811 + @when('@:4') def install(self, spec, prefix): # Process library spec and options if any('+{0}'.format(v) in spec for v in ['gdb', 'int64', 'real64']): @@ -175,7 +175,7 @@ class Metis(Package): Executable(test_bin('mesh2dual'))(test_graph('metis.mesh')) """ - @when('@5:') # noqa: F811 + @when('@5:') def install(self, spec, prefix): source_directory = self.stage.source_path build_directory = join_path(source_directory, 'build') diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index b27bc3fe07..b9c7e1f5c3 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -251,7 +251,7 @@ class Qt(Package): # Don't disable all the database drivers, but should # really get them into spack at some point. - @when('@3') # noqa: F811 + @when('@3') def configure(self): # A user reported that this was necessary to link Qt3 on ubuntu. # However, if LD_LIBRARY_PATH is not set the qt build fails, check @@ -268,7 +268,7 @@ class Qt(Package): '-release', '-fast') - @when('@4') # noqa: F811 + @when('@4') def configure(self): configure('-fast', '-{0}gtkstyle'.format('' if '+gtk' in self.spec else 'no-'), @@ -276,7 +276,7 @@ class Qt(Package): '-arch', str(self.spec.architecture.target), *self.common_config_args) - @when('@5.0:5.6') # noqa: F811 + @when('@5.0:5.6') def configure(self): webkit_args = [] if '+webkit' in self.spec else ['-skip', 'qtwebkit'] configure('-no-eglfs', @@ -284,7 +284,7 @@ class Qt(Package): '-{0}gtkstyle'.format('' if '+gtk' in self.spec else 'no-'), *(webkit_args + self.common_config_args)) - @when('@5.7:') # noqa: F811 + @when('@5.7:') def configure(self): config_args = self.common_config_args -- cgit v1.2.3-70-g09d2 From fc9896ed45afe1b5ec228ed3ceb2b27ea2a1854c Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 25 Apr 2017 21:54:53 +0200 Subject: hooks take spec as an argument (instead of pkg) (#3967) --- lib/spack/spack/hooks/__init__.py | 9 +++++---- lib/spack/spack/hooks/extensions.py | 5 +++-- lib/spack/spack/hooks/licensing.py | 9 ++++++--- lib/spack/spack/hooks/module_file_generation.py | 8 ++++---- lib/spack/spack/hooks/sbang.py | 6 +++--- lib/spack/spack/package.py | 13 ++++++------- 6 files changed, 27 insertions(+), 23 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/hooks/__init__.py b/lib/spack/spack/hooks/__init__.py index 6454a865b6..9ed04a4768 100644 --- a/lib/spack/spack/hooks/__init__.py +++ b/lib/spack/spack/hooks/__init__.py @@ -31,10 +31,11 @@ Currently the following hooks are supported: - * pre_install() - * post_install() - * pre_uninstall() - * post_uninstall() + * pre_run() + * pre_install(spec) + * post_install(spec) + * pre_uninstall(spec) + * post_uninstall(spec) This can be used to implement support for things like module systems (e.g. modules, dotkit, etc.) or to add other custom diff --git a/lib/spack/spack/hooks/extensions.py b/lib/spack/spack/hooks/extensions.py index 070b309a43..7d2a39e24f 100644 --- a/lib/spack/spack/hooks/extensions.py +++ b/lib/spack/spack/hooks/extensions.py @@ -24,8 +24,9 @@ ############################################################################## -def pre_uninstall(pkg): - assert(pkg.spec.concrete) +def pre_uninstall(spec): + pkg = spec.package + assert spec.concrete if pkg.is_extension: if pkg.activated: diff --git a/lib/spack/spack/hooks/licensing.py b/lib/spack/spack/hooks/licensing.py index 9a244dbdef..85f7a96c31 100644 --- a/lib/spack/spack/hooks/licensing.py +++ b/lib/spack/spack/hooks/licensing.py @@ -29,8 +29,9 @@ import llnl.util.tty as tty from llnl.util.filesystem import join_path, mkdirp -def pre_install(pkg): +def pre_install(spec): """This hook handles global license setup for licensed software.""" + pkg = spec.package if pkg.license_required and not pkg.spec.external: set_up_license(pkg) @@ -142,9 +143,11 @@ def write_license_file(pkg, license_path): license.close() -def post_install(pkg): +def post_install(spec): """This hook symlinks local licenses to the global license for - licensed software.""" + licensed software. + """ + pkg = spec.package if pkg.license_required and not pkg.spec.external: symlink_license(pkg) diff --git a/lib/spack/spack/hooks/module_file_generation.py b/lib/spack/spack/hooks/module_file_generation.py index ff9617ff1c..b02c2e871d 100644 --- a/lib/spack/spack/hooks/module_file_generation.py +++ b/lib/spack/spack/hooks/module_file_generation.py @@ -26,13 +26,13 @@ import spack.modules from six import iteritems -def post_install(pkg): +def post_install(spec): for item, cls in iteritems(spack.modules.module_types): - generator = cls(pkg.spec) + generator = cls(spec) generator.write() -def post_uninstall(pkg): +def post_uninstall(spec): for item, cls in iteritems(spack.modules.module_types): - generator = cls(pkg.spec) + generator = cls(spec) generator.remove() diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py index fb824470e2..17f6ac2528 100644 --- a/lib/spack/spack/hooks/sbang.py +++ b/lib/spack/spack/hooks/sbang.py @@ -102,14 +102,14 @@ def filter_shebangs_in_directory(directory, filenames=None): filter_shebang(path) -def post_install(pkg): +def post_install(spec): """This hook edits scripts so that they call /bin/bash $spack_prefix/bin/sbang instead of something longer than the shebang limit. """ - if pkg.spec.external: + if spec.external: tty.debug('SKIP: shebang filtering [external package]') return - for directory, _, filenames in os.walk(pkg.prefix): + for directory, _, filenames in os.walk(spec.prefix): filter_shebangs_in_directory(directory, filenames) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 4a42fef337..506e44ec45 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1112,7 +1112,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): # post-install hooks to generate module files message = '{s.name}@{s.version} : generating module file' tty.msg(message.format(s=self)) - spack.hooks.post_install(self) + spack.hooks.post_install(self.spec) # Add to the DB message = '{s.name}@{s.version} : registering into DB' tty.msg(message.format(s=self)) @@ -1248,7 +1248,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): with self._stage_and_write_lock(): # Run the pre-install hook in the child process after # the directory is created. - spack.hooks.pre_install(self) + spack.hooks.pre_install(self.spec) if fake: self.do_fake_install() else: @@ -1288,7 +1288,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.spec, self.prefix) self.log() # Run post install hooks before build stage is removed. - spack.hooks.post_install(self) + spack.hooks.post_install(self.spec) # Stop timer. self._total_time = time.time() - start_time @@ -1526,9 +1526,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Pre-uninstall hook runs first. with spack.store.db.prefix_write_lock(spec): - # TODO: hooks should take specs, not packages. + if pkg is not None: - spack.hooks.pre_uninstall(pkg) + spack.hooks.pre_uninstall(spec) # Uninstalling in Spack only requires removing the prefix. if not spec.external: @@ -1541,9 +1541,8 @@ class PackageBase(with_metaclass(PackageMeta, object)): spack.store.db.remove(spec) tty.msg("Successfully uninstalled %s" % spec.short_spec) - # TODO: refactor hooks to use specs, not packages. if pkg is not None: - spack.hooks.post_uninstall(pkg) + spack.hooks.post_uninstall(spec) tty.msg("Successfully uninstalled %s" % spec.short_spec) -- cgit v1.2.3-70-g09d2 From 3e508884fac8a52ea0d2a1887fd6bdb0fc5a0abe Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 25 Apr 2017 12:58:24 -0700 Subject: spack flake8 should exempt line-wrapped directives (#3990) - Omit final paren from regular expressions in cmd/flake8.py - Allows long directives to be exempted even if they are wrapped. --- lib/spack/spack/cmd/flake8.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 33c06155ae..6cfd98dbb4 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -58,14 +58,14 @@ exemptions = { r'^\s*svn\s*=', r'^\s*hg\s*=', r'^\s*list_url\s*=', - r'^\s*version\(.*\)', - r'^\s*variant\(.*\)', - r'^\s*provides\(.*\)', - r'^\s*extends\(.*\)', - r'^\s*depends_on\(.*\)', - r'^\s*conflicts\(.*\)', - r'^\s*resource\(.*\)', - r'^\s*patch\(.*\)', + r'^\s*version\(', + r'^\s*variant\(', + r'^\s*provides\(', + r'^\s*extends\(', + r'^\s*depends_on\(', + r'^\s*conflicts\(', + r'^\s*resource\(', + r'^\s*patch\(', ], # Exempt '@when' decorated functions from redefinition errors. 'F811': [ -- cgit v1.2.3-70-g09d2 From 11dae722c25e4b494615c10f899c6601e06694d4 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 26 Apr 2017 00:23:01 -0500 Subject: Fix bug with '# noqa' filtering (#3993) --- lib/spack/spack/cmd/flake8.py | 13 ++++--------- var/spack/repos/builtin.mock/packages/flake8/package.py | 6 +++++- 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 6cfd98dbb4..42d36a3beb 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -139,14 +139,6 @@ def filter_file(source, dest, output=False): # We still want to catch trailing whitespace warnings line = line.rstrip('\n') - if line == '# flake8: noqa': - # Entire file is ignored - break - - if line.endswith('# noqa'): - # Line is already ignored - continue - for file_pattern, errors in exemptions.items(): if not file_pattern.search(source): continue @@ -154,7 +146,10 @@ def filter_file(source, dest, output=False): for code, patterns in errors.items(): for pattern in patterns: if pattern.search(line): - if '# noqa: ' in line: + if line.endswith('# noqa'): + # Line is already ignored + pass + elif '# noqa: ' in line: line += ',{0}'.format(code) else: line += ' # noqa: {0}'.format(code) diff --git a/var/spack/repos/builtin.mock/packages/flake8/package.py b/var/spack/repos/builtin.mock/packages/flake8/package.py index bd062d71bc..22598bead1 100644 --- a/var/spack/repos/builtin.mock/packages/flake8/package.py +++ b/var/spack/repos/builtin.mock/packages/flake8/package.py @@ -71,7 +71,11 @@ class Flake8(Package): patch('hyper-specific-patch-that-fixes-some-random-bug-that-probably-only-affects-one-user.patch', when='%gcc@3.2.2:3.2.3') def install(self, spec, prefix): - pass + # Make sure lines with '# noqa' work as expected. Don't just + # remove them entirely. This will mess up the indentation of + # the following lines. + if 'really-long-if-statement' != 'that-goes-over-the-line-length-limit-and-requires-noqa': # noqa + pass # '@when' decorated functions are exempt from redefinition errors @when('@2.0') -- cgit v1.2.3-70-g09d2 From eaa50d3b7ca88b912e06b5d2aaffa75759d1b2d3 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 26 Apr 2017 00:24:02 -0500 Subject: Add API Docs for lib/spack/llnl (#3982) * Add API Docs for lib/spack/llnl * Clean up after previous builds * Better fix for purging API docs --- lib/spack/docs/.gitignore | 2 +- lib/spack/docs/Makefile | 7 ++-- lib/spack/docs/conf.py | 17 ++++++++-- lib/spack/docs/index.rst | 3 +- lib/spack/llnl/util/lang.py | 57 ++++++++++++++++--------------- lib/spack/llnl/util/lock.py | 20 +++++------ lib/spack/llnl/util/tty/__init__.py | 7 ++-- lib/spack/llnl/util/tty/colify.py | 42 +++++++++++------------ lib/spack/llnl/util/tty/color.py | 68 ++++++++++++++++++++++--------------- lib/spack/llnl/util/tty/log.py | 8 +++-- 10 files changed, 130 insertions(+), 101 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/.gitignore b/lib/spack/docs/.gitignore index 0bbf78cce0..9afb658706 100644 --- a/lib/spack/docs/.gitignore +++ b/lib/spack/docs/.gitignore @@ -1,5 +1,5 @@ package_list.rst command_index.rst spack*.rst -modules.rst +llnl*.rst _build diff --git a/lib/spack/docs/Makefile b/lib/spack/docs/Makefile index bcba423d94..1054d91a50 100644 --- a/lib/spack/docs/Makefile +++ b/lib/spack/docs/Makefile @@ -9,7 +9,7 @@ PAPER = BUILDDIR = _build export PYTHONPATH := ../../spack:$(PYTHONPATH) -APIDOC_FILES = spack*.rst +APIDOC_FILES = spack*.rst llnl*.rst # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 @@ -58,7 +58,8 @@ upload: git push -f github gh-pages apidoc: - sphinx-apidoc -T -o . $(PYTHONPATH)/spack + sphinx-apidoc -f -T -o . ../spack + sphinx-apidoc -f -T -o . ../llnl help: @echo "Please use \`make ' where is one of" @@ -83,7 +84,7 @@ help: @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: - -rm -f package_list.rst command_index.rst modules.rst + -rm -f package_list.rst command_index.rst -rm -rf $(BUILDDIR)/* $(APIDOC_FILES) html: diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index 35637093da..48f1fda47e 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -95,10 +95,21 @@ with open('command_index.rst', 'a') as index: for cmd in sorted(command_names): index.write(' * :ref:`%s`\n' % cmd) - +# # Run sphinx-apidoc -sphinx_apidoc(['-T', '-o', '.', '../spack']) -os.remove('modules.rst') +# +# Remove any previous API docs +# Read the Docs doesn't clean up after previous builds +# Without this, the API Docs will never actually update +# +apidoc_args = [ + 'sphinx_apidoc', # The first arugment is ignored + '--force', # Overwrite existing files + '--no-toc', # Don't create a table of contents file + '--output-dir=.', # Directory to place all output +] +sphinx_apidoc(apidoc_args + ['../spack']) +sphinx_apidoc(apidoc_args + ['../llnl']) # # Exclude everything in spack.__all__ from indexing. All of these diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 5dd6fe23be..f4918b58db 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -73,7 +73,8 @@ or refer to the full manual below. contribution_guide packaging_guide developer_guide - API Docs + Spack API Docs + LLNL API Docs ================== Indices and tables diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index ec4c25fead..4943c9df67 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -43,7 +43,7 @@ def index_by(objects, *funcs): """Create a hierarchy of dictionaries by splitting the supplied set of objects on unique values of the supplied functions. Values are used as keys. For example, suppose you have four - objects with attributes that look like this: + objects with attributes that look like this:: a = Spec(name="boost", compiler="gcc", arch="bgqos_0") b = Spec(name="mrnet", compiler="intel", arch="chaos_5_x86_64_ib") @@ -55,15 +55,15 @@ def index_by(objects, *funcs): lambda s: s.compiler) index2 = index_by(list_of_specs, lambda s: s.compiler) - ``index1'' now has two levels of dicts, with lists at the - leaves, like this: + ``index1`` now has two levels of dicts, with lists at the + leaves, like this:: { 'bgqos_0' : { 'gcc' : [a], 'xlc' : [c] }, 'chaos_5_x86_64_ib' : { 'intel' : [b, d] } } - And ``index2'' is a single level dictionary of lists that looks - like this: + And ``index2`` is a single level dictionary of lists that looks + like this:: { 'gcc' : [a], 'intel' : [b,d], @@ -72,12 +72,12 @@ def index_by(objects, *funcs): If any elemnts in funcs is a string, it is treated as the name of an attribute, and acts like getattr(object, name). So - shorthand for the above two indexes would be: + shorthand for the above two indexes would be:: index1 = index_by(list_of_specs, 'arch', 'compiler') index2 = index_by(list_of_specs, 'compiler') - You can also index by tuples by passing tuples: + You can also index by tuples by passing tuples:: index1 = index_by(list_of_specs, ('arch', 'compiler')) @@ -204,7 +204,7 @@ class memoized(object): def list_modules(directory, **kwargs): - """Lists all of the modules, excluding __init__.py, in a + """Lists all of the modules, excluding ``__init__.py``, in a particular directory. Listed packages have no particular order.""" list_directories = kwargs.setdefault('directories', True) @@ -226,14 +226,16 @@ def list_modules(directory, **kwargs): def key_ordering(cls): """Decorates a class with extra methods that implement rich comparison - operations and __hash__. The decorator assumes that the class - implements a function called _cmp_key(). The rich comparison operations - will compare objects using this key, and the __hash__ function will - return the hash of this key. - - If a class already has __eq__, __ne__, __lt__, __le__, __gt__, or __ge__ - defined, this decorator will overwrite them. If the class does not - have a _cmp_key method, then this will raise a TypeError. + operations and ``__hash__``. The decorator assumes that the class + implements a function called ``_cmp_key()``. The rich comparison + operations will compare objects using this key, and the ``__hash__`` + function will return the hash of this key. + + If a class already has ``__eq__``, ``__ne__``, ``__lt__``, ``__le__``, + ``__gt__``, or ``__ge__`` defined, this decorator will overwrite them. + + Raises: + TypeError: If the class does not have a ``_cmp_key`` method """ def setter(name, value): value.__name__ = name @@ -322,14 +324,14 @@ def match_predicate(*args): """Utility function for making string matching predicates. Each arg can be a: - - regex - - list or tuple of regexes - - predicate that takes a string. + * regex + * list or tuple of regexes + * predicate that takes a string. This returns a predicate that is true if: - - any arg regex matches - - any regex in a list or tuple of regexes matches. - - any predicate in args matches. + * any arg regex matches + * any regex in a list or tuple of regexes matches. + * any predicate in args matches. """ def match(string): for arg in args: @@ -374,11 +376,12 @@ class RequiredAttributeError(ValueError): def duplicate_stream(original): """Duplicates a stream at the os level. - :param stream original: original stream to be duplicated. Must have a - `fileno` callable attribute. + Args: + original (stream): original stream to be duplicated. Must have a + ``fileno`` callable attribute. - :return: duplicate of the original stream - :rtype: file like object + Returns: + file like object: duplicate of the original stream """ return os.fdopen(os.dup(original.fileno())) @@ -388,7 +391,7 @@ class ObjectWrapper(object): while staying undercover. This class is modeled after the stackoverflow answer: - - http://stackoverflow.com/a/1445289/771663 + * http://stackoverflow.com/a/1445289/771663 """ def __init__(self, wrapped_object): wrapped_cls = type(wrapped_object) diff --git a/lib/spack/llnl/util/lock.py b/lib/spack/llnl/util/lock.py index 2e44a94798..a45ddec691 100644 --- a/lib/spack/llnl/util/lock.py +++ b/lib/spack/llnl/util/lock.py @@ -45,7 +45,7 @@ _sleep_time = 1e-5 class Lock(object): """This is an implementation of a filesystem lock using Python's lockf. - In Python, `lockf` actually calls `fcntl`, so this should work with + In Python, ``lockf`` actually calls ``fcntl``, so this should work with any filesystem implementation that supports locking through the fcntl calls. This includes distributed filesystems like Lustre (when flock is enabled) and recent NFS versions. @@ -60,7 +60,7 @@ class Lock(object): This exposes a subset of fcntl locking functionality. It does not currently expose the ``whence`` parameter -- ``whence`` is - always os.SEEK_SET and ``start`` is always evaluated from the + always ``os.SEEK_SET`` and ``start`` is always evaluated from the beginning of the file. """ self.path = path @@ -80,7 +80,7 @@ class Lock(object): """This takes a lock using POSIX locks (``fnctl.lockf``). The lock is implemented as a spin lock using a nonblocking call - to lockf(). + to ``lockf()``. On acquiring an exclusive lock, the lock writes this process's pid and host to the lock file, in case the holding process needs @@ -276,14 +276,14 @@ class LockTransaction(object): This class can trigger actions when the lock is acquired for the first time and released for the last. - If the acquire_fn returns a value, it is used as the return value for - __enter__, allowing it to be passed as the `as` argument of a `with` - statement. + If the ``acquire_fn`` returns a value, it is used as the return value for + ``__enter__``, allowing it to be passed as the ``as`` argument of a + ``with`` statement. - If acquire_fn returns a context manager, *its* `__enter__` function will be - called in `__enter__` after acquire_fn, and its `__exit__` funciton will be - called before `release_fn` in `__exit__`, allowing you to nest a context - manager to be used along with the lock. + If ``acquire_fn`` returns a context manager, *its* ``__enter__`` function + will be called in ``__enter__`` after ``acquire_fn``, and its ``__exit__`` + funciton will be called before ``release_fn`` in ``__exit__``, allowing you + to nest a context manager to be used along with the lock. Timeout for lock is customizable. diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index 5acd61bc37..e5c3ba8110 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -213,9 +213,10 @@ def get_yes_or_no(prompt, **kwargs): def hline(label=None, **kwargs): """Draw a labeled horizontal line. - Options: - char Char to draw the line with. Default '-' - max_width Maximum width of the line. Default is 64 chars. + + Keyword Arguments: + char (str): Char to draw the line with. Default '-' + max_width (int): Maximum width of the line. Default is 64 chars. """ char = kwargs.pop('char', '-') max_width = kwargs.pop('max_width', 64) diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py index 83de530ef1..774f4035fd 100644 --- a/lib/spack/llnl/util/tty/colify.py +++ b/lib/spack/llnl/util/tty/colify.py @@ -23,7 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """ -Routines for printing columnar output. See colify() for more information. +Routines for printing columnar output. See ``colify()`` for more information. """ from __future__ import division @@ -124,26 +124,22 @@ def colify(elts, **options): uniform-width and variable-width (tighter) columns. If elts is not a list of strings, each element is first conveted - using str(). - - Keyword arguments: - - output= A file object to write to. Default is sys.stdout. - indent= Optionally indent all columns by some number of spaces. - padding= Spaces between columns. Default is 2. - width= Width of the output. Default is 80 if tty not detected. - - cols= Force number of columns. Default is to size to terminal, - or single-column if no tty - - tty= Whether to attempt to write to a tty. Default is to - autodetect a tty. Set to False to force - single-column output. - - method= Method to use to fit columns. Options are variable or - uniform. Variable-width columns are tighter, uniform - columns are all the same width and fit less data on - the screen. + using ``str()``. + + Keyword Arguments: + output (stream): A file object to write to. Default is ``sys.stdout`` + indent (int): Optionally indent all columns by some number of spaces + padding (int): Spaces between columns. Default is 2 + width (int): Width of the output. Default is 80 if tty not detected + cols (int): Force number of columns. Default is to size to + terminal, or single-column if no tty + tty (bool): Whether to attempt to write to a tty. Default is to + autodetect a tty. Set to False to force single-column + output + method (str): Method to use to fit columns. Options are variable or + uniform. Variable-width columns are tighter, uniform + columns are all the same width and fit less data on + the screen """ # Get keyword arguments or set defaults cols = options.pop("cols", 0) @@ -220,7 +216,7 @@ def colify(elts, **options): def colify_table(table, **options): - """Version of colify() for data expressed in rows, (list of lists). + """Version of ``colify()`` for data expressed in rows, (list of lists). Same as regular colify but takes a list of lists, where each sub-list must be the same length, and each is interpreted as a @@ -247,7 +243,7 @@ def colify_table(table, **options): def colified(elts, **options): - """Invokes the colify() function but returns the result as a string + """Invokes the ``colify()`` function but returns the result as a string instead of writing it to an output string.""" sio = StringIO() options['output'] = sio diff --git a/lib/spack/llnl/util/tty/color.py b/lib/spack/llnl/util/tty/color.py index b0c00f1502..bb1563f82b 100644 --- a/lib/spack/llnl/util/tty/color.py +++ b/lib/spack/llnl/util/tty/color.py @@ -23,39 +23,45 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """ -This file implements an expression syntax, similar to printf, for adding +This file implements an expression syntax, similar to ``printf``, for adding ANSI colors to text. -See colorize(), cwrite(), and cprint() for routines that can generate -colored output. +See ``colorize()``, ``cwrite()``, and ``cprint()`` for routines that can +generate colored output. -colorize will take a string and replace all color expressions with -ANSI control codes. If the isatty keyword arg is set to False, then +``colorize`` will take a string and replace all color expressions with +ANSI control codes. If the ``isatty`` keyword arg is set to False, then the color expressions will be converted to null strings, and the returned string will have no color. -cwrite and cprint are equivalent to write() and print() calls in -python, but they colorize their output. If the stream argument is -not supplied, they write to sys.stdout. +``cwrite`` and ``cprint`` are equivalent to ``write()`` and ``print()`` +calls in python, but they colorize their output. If the ``stream`` argument is +not supplied, they write to ``sys.stdout``. Here are some example color expressions: - @r Turn on red coloring - @R Turn on bright red coloring - @*{foo} Bold foo, but don't change text color - @_{bar} Underline bar, but don't change text color - @*b Turn on bold, blue text - @_B Turn on bright blue text with an underline - @. Revert to plain formatting - @*g{green} Print out 'green' in bold, green text, then reset to plain. - @*ggreen@. Print out 'green' in bold, green text, then reset to plain. +========== ============================================================ +Expression Meaning +========== ============================================================ +@r Turn on red coloring +@R Turn on bright red coloring +@*{foo} Bold foo, but don't change text color +@_{bar} Underline bar, but don't change text color +@*b Turn on bold, blue text +@_B Turn on bright blue text with an underline +@. Revert to plain formatting +@*g{green} Print out 'green' in bold, green text, then reset to plain. +@*ggreen@. Print out 'green' in bold, green text, then reset to plain. +========== ============================================================ The syntax consists of: - color-expr = '@' [style] color-code '{' text '}' | '@.' | '@@' - style = '*' | '_' - color-code = [krgybmcwKRGYBMCW] - text = .* +========== ================================================= +color-expr '@' [style] color-code '{' text '}' | '@.' | '@@' +style '*' | '_' +color-code [krgybmcwKRGYBMCW] +text .* +========== ================================================= '@' indicates the start of a color expression. It can be followed by an optional * or _ that indicates whether the font should be bold or @@ -82,6 +88,7 @@ class ColorParseError(Exception): def __init__(self, message): super(ColorParseError, self).__init__(message) + # Text styles for ansi codes styles = {'*': '1', # bold '_': '4', # underline @@ -118,8 +125,8 @@ class match_to_ansi(object): return '' def __call__(self, match): - """Convert a match object generated by color_re into an ansi color code - This can be used as a handler in re.sub. + """Convert a match object generated by ``color_re`` into an ansi + color code. This can be used as a handler in ``re.sub``. """ style, color, text = match.groups() m = match.group(0) @@ -147,10 +154,17 @@ class match_to_ansi(object): def colorize(string, **kwargs): - """Take a string and replace all color expressions with ANSI control - codes. Return the resulting string. - If color=False is supplied, output will be plain text without - control codes, for output to non-console devices. + """Replace all color expressions in a string with ANSI control codes. + + Args: + string (str): The string to replace + + Returns: + str: The filtered string + + Keyword Arguments: + color (bool): If False, output will be plain text without control + codes, for output to non-console devices. """ color = kwargs.get('color', True) return re.sub(color_re, match_to_ansi(color), string) diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index 50e07c0b97..34916ef7e7 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -51,7 +51,7 @@ class _SkipWithBlock(): class keyboard_input(object): """Disable canonical input and echo on a stream within a with block. - Use this with sys.stdin for keyboard input, e.g.: + Use this with ``sys.stdin`` for keyboard input, e.g.:: with keyboard_input(sys.stdin): r, w, x = select.select([sys.stdin], [], []) @@ -103,14 +103,16 @@ class keyboard_input(object): class log_output(object): """Spawns a daemon that reads from a pipe and writes to a file - Usage: + Usage:: + # Spawns the daemon with log_output('logfile.txt', 'w') as log_redirection: # do things ... output is not redirected with log_redirection: # do things ... output will be logged - or: + or:: + with log_output('logfile.txt', echo=True) as log_redirection: # do things ... output is not redirected with log_redirection: -- cgit v1.2.3-70-g09d2 From b3ba9bdb377728bb4886dbc4ae11ac3a57a59bae Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Wed, 26 Apr 2017 11:06:34 -0700 Subject: Add __format__ support to version for fancy formatting. (#3996) - add Version.__format__ to support new-style formatting. - Python3 doesn't handle this well -- it delegates to object.__format__(), which raises an error for fancy format strings. - not sure why it doesn't call str(self).__format__ instead, but that's hwo things are. --- lib/spack/spack/version.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 89fcc9aaa7..1c931ae90a 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -226,6 +226,9 @@ class Version(object): def __str__(self): return self.string + def __format__(self, format_spec): + return self.string.format(format_spec) + @property def concrete(self): return self -- cgit v1.2.3-70-g09d2 From 0403a0850946fda51738a3be88b884ffdfddf10f Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 27 Apr 2017 00:36:35 +0200 Subject: link_tree: ported to pytest (#4008) --- lib/spack/spack/test/link_tree.py | 187 ++++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 89 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/link_tree.py b/lib/spack/spack/test/link_tree.py index 5d0a7430b6..9fb4e8216e 100644 --- a/lib/spack/spack/test/link_tree.py +++ b/lib/spack/spack/test/link_tree.py @@ -23,121 +23,130 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import os -import unittest +import pytest from llnl.util.filesystem import * from llnl.util.link_tree import LinkTree - from spack.stage import Stage -class LinkTreeTest(unittest.TestCase): - """Tests Spack's LinkTree class.""" +@pytest.fixture() +def stage(): + """Creates a stage with the directory structure for the tests.""" + s = Stage('link-tree-test') + s.create() + + with working_dir(s.path): + touchp('source/1') + touchp('source/a/b/2') + touchp('source/a/b/3') + touchp('source/c/4') + touchp('source/c/d/5') + touchp('source/c/d/6') + touchp('source/c/d/e/7') + + yield s + + s.destroy() + + +@pytest.fixture() +def link_tree(stage): + """Return a properly initialized LinkTree instance.""" + source_path = os.path.join(stage.path, 'source') + return LinkTree(source_path) + + +def check_file_link(filename): + assert os.path.isfile(filename) + assert os.path.islink(filename) + + +def check_dir(filename): + assert os.path.isdir(filename) + - def setUp(self): - self.stage = Stage('link-tree-test') - self.stage.create() +def test_merge_to_new_directory(stage, link_tree): + with working_dir(stage.path): + link_tree.merge('dest') - with working_dir(self.stage.path): - touchp('source/1') - touchp('source/a/b/2') - touchp('source/a/b/3') - touchp('source/c/4') - touchp('source/c/d/5') - touchp('source/c/d/6') - touchp('source/c/d/e/7') + check_file_link('dest/1') + check_file_link('dest/a/b/2') + check_file_link('dest/a/b/3') + check_file_link('dest/c/4') + check_file_link('dest/c/d/5') + check_file_link('dest/c/d/6') + check_file_link('dest/c/d/e/7') - source_path = os.path.join(self.stage.path, 'source') - self.link_tree = LinkTree(source_path) + link_tree.unmerge('dest') - def tearDown(self): - self.stage.destroy() + assert not os.path.exists('dest') - def check_file_link(self, filename): - self.assertTrue(os.path.isfile(filename)) - self.assertTrue(os.path.islink(filename)) - def check_dir(self, filename): - self.assertTrue(os.path.isdir(filename)) +def test_merge_to_existing_directory(stage, link_tree): + with working_dir(stage.path): - def test_merge_to_new_directory(self): - with working_dir(self.stage.path): - self.link_tree.merge('dest') + touchp('dest/x') + touchp('dest/a/b/y') - self.check_file_link('dest/1') - self.check_file_link('dest/a/b/2') - self.check_file_link('dest/a/b/3') - self.check_file_link('dest/c/4') - self.check_file_link('dest/c/d/5') - self.check_file_link('dest/c/d/6') - self.check_file_link('dest/c/d/e/7') + link_tree.merge('dest') - self.link_tree.unmerge('dest') + check_file_link('dest/1') + check_file_link('dest/a/b/2') + check_file_link('dest/a/b/3') + check_file_link('dest/c/4') + check_file_link('dest/c/d/5') + check_file_link('dest/c/d/6') + check_file_link('dest/c/d/e/7') - self.assertFalse(os.path.exists('dest')) + assert os.path.isfile('dest/x') + assert os.path.isfile('dest/a/b/y') - def test_merge_to_existing_directory(self): - with working_dir(self.stage.path): + link_tree.unmerge('dest') - touchp('dest/x') - touchp('dest/a/b/y') + assert os.path.isfile('dest/x') + assert os.path.isfile('dest/a/b/y') - self.link_tree.merge('dest') + assert not os.path.isfile('dest/1') + assert not os.path.isfile('dest/a/b/2') + assert not os.path.isfile('dest/a/b/3') + assert not os.path.isfile('dest/c/4') + assert not os.path.isfile('dest/c/d/5') + assert not os.path.isfile('dest/c/d/6') + assert not os.path.isfile('dest/c/d/e/7') - self.check_file_link('dest/1') - self.check_file_link('dest/a/b/2') - self.check_file_link('dest/a/b/3') - self.check_file_link('dest/c/4') - self.check_file_link('dest/c/d/5') - self.check_file_link('dest/c/d/6') - self.check_file_link('dest/c/d/e/7') - self.assertTrue(os.path.isfile('dest/x')) - self.assertTrue(os.path.isfile('dest/a/b/y')) +def test_merge_with_empty_directories(stage, link_tree): + with working_dir(stage.path): + mkdirp('dest/f/g') + mkdirp('dest/a/b/h') - self.link_tree.unmerge('dest') + link_tree.merge('dest') + link_tree.unmerge('dest') - self.assertTrue(os.path.isfile('dest/x')) - self.assertTrue(os.path.isfile('dest/a/b/y')) + assert not os.path.exists('dest/1') + assert not os.path.exists('dest/a/b/2') + assert not os.path.exists('dest/a/b/3') + assert not os.path.exists('dest/c/4') + assert not os.path.exists('dest/c/d/5') + assert not os.path.exists('dest/c/d/6') + assert not os.path.exists('dest/c/d/e/7') - self.assertFalse(os.path.isfile('dest/1')) - self.assertFalse(os.path.isfile('dest/a/b/2')) - self.assertFalse(os.path.isfile('dest/a/b/3')) - self.assertFalse(os.path.isfile('dest/c/4')) - self.assertFalse(os.path.isfile('dest/c/d/5')) - self.assertFalse(os.path.isfile('dest/c/d/6')) - self.assertFalse(os.path.isfile('dest/c/d/e/7')) + assert os.path.isdir('dest/a/b/h') + assert os.path.isdir('dest/f/g') - def test_merge_with_empty_directories(self): - with working_dir(self.stage.path): - mkdirp('dest/f/g') - mkdirp('dest/a/b/h') - self.link_tree.merge('dest') - self.link_tree.unmerge('dest') +def test_ignore(stage, link_tree): + with working_dir(stage.path): + touchp('source/.spec') + touchp('dest/.spec') - self.assertFalse(os.path.exists('dest/1')) - self.assertFalse(os.path.exists('dest/a/b/2')) - self.assertFalse(os.path.exists('dest/a/b/3')) - self.assertFalse(os.path.exists('dest/c/4')) - self.assertFalse(os.path.exists('dest/c/d/5')) - self.assertFalse(os.path.exists('dest/c/d/6')) - self.assertFalse(os.path.exists('dest/c/d/e/7')) + link_tree.merge('dest', ignore=lambda x: x == '.spec') + link_tree.unmerge('dest', ignore=lambda x: x == '.spec') - self.assertTrue(os.path.isdir('dest/a/b/h')) - self.assertTrue(os.path.isdir('dest/f/g')) + assert not os.path.exists('dest/1') + assert not os.path.exists('dest/a') + assert not os.path.exists('dest/c') - def test_ignore(self): - with working_dir(self.stage.path): - touchp('source/.spec') - touchp('dest/.spec') - - self.link_tree.merge('dest', ignore=lambda x: x == '.spec') - self.link_tree.unmerge('dest', ignore=lambda x: x == '.spec') - - self.assertFalse(os.path.exists('dest/1')) - self.assertFalse(os.path.exists('dest/a')) - self.assertFalse(os.path.exists('dest/c')) - - self.assertTrue(os.path.isfile('source/.spec')) - self.assertTrue(os.path.isfile('dest/.spec')) + assert os.path.isfile('source/.spec') + assert os.path.isfile('dest/.spec') -- cgit v1.2.3-70-g09d2 From 91b32f67ccbb2217804461a0a64d2e09289b486b Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 26 Apr 2017 17:55:35 -0500 Subject: Fix alignment of versions and urls in spack checksum (#4003) --- lib/spack/spack/cmd/checksum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index 4ea31efe08..e0b7fd897d 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -78,7 +78,7 @@ def get_checksums(url_dict, name, **kwargs): num_ver, '' if num_ver == 1 else 's', name), "", *spack.cmd.elide_list( - ["{0:{1}} {2}".format(v, max_len, url_dict[v]) + ["{0:{1}} {2}".format(str(v), max_len, url_dict[v]) for v in sorted_versions])) print() -- cgit v1.2.3-70-g09d2 From a6986312ba1a1bc3c77c7582c991f3848ca8f008 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 27 Apr 2017 16:45:04 +0200 Subject: pattern: ported to pytest (#4015) --- lib/spack/spack/test/pattern.py | 117 ++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 57 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/pattern.py b/lib/spack/spack/test/pattern.py index b76f88e670..bd75206563 100644 --- a/lib/spack/spack/test/pattern.py +++ b/lib/spack/spack/test/pattern.py @@ -23,85 +23,88 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import unittest - +import pytest import spack.util.pattern as pattern -class CompositeTest(unittest.TestCase): +@pytest.fixture() +def interface(): + """Returns the interface class for the composite.""" + class Base: + counter = 0 - def setUp(self): - class Base: - counter = 0 + def add(self): + raise NotImplemented('add not implemented') - def add(self): - raise NotImplemented('add not implemented') + def subtract(self): + raise NotImplemented('subtract not implemented') - def subtract(self): - raise NotImplemented('subtract not implemented') + return Base - class One(Base): - def add(self): - Base.counter += 1 +@pytest.fixture() +def implementation(interface): + """Returns an implementation of the interface""" + class Implementation(interface): - def subtract(self): - Base.counter -= 1 - - class Two(Base): + def __init__(self, value): + self.value = value def add(self): - Base.counter += 2 + interface.counter += self.value def subtract(self): - Base.counter -= 2 - - self.Base = Base - self.One = One - self.Two = Two - - def test_composite_from_method_list(self): + interface.counter -= self.value + + return Implementation + + +@pytest.fixture(params=[ + 'interface', + 'method_list' +]) +def composite(interface, implementation, request): + """Returns a composite that contains an instance of `implementation(1)` + and one of `implementation(2)`. + """ + if request.param == 'interface': + @pattern.composite(interface=interface) + class Composite: + pass + else: @pattern.composite(method_list=['add', 'subtract']) - class CompositeFromMethodList: + class Composite: pass - composite = CompositeFromMethodList() - composite.append(self.One()) - composite.append(self.Two()) - composite.add() - self.assertEqual(self.Base.counter, 3) - composite.pop() - composite.subtract() - self.assertEqual(self.Base.counter, 2) + c = Composite() + c.append(implementation(1)) + c.append(implementation(2)) - def test_composite_from_interface(self): + return c - @pattern.composite(interface=self.Base) - class CompositeFromInterface: - pass - composite = CompositeFromInterface() - composite.append(self.One()) - composite.append(self.Two()) - composite.add() - self.assertEqual(self.Base.counter, 3) +def test_composite_interface_calls(interface, composite): + + composite.add() + assert interface.counter == 3 - composite.pop() - composite.subtract() - self.assertEqual(self.Base.counter, 2) + composite.pop() + composite.subtract() + assert interface.counter == 2 - def test_error_conditions(self): - def wrong_container(): - @pattern.composite(interface=self.Base, container=2) - class CompositeFromInterface: - pass +def test_composite_wrong_container(interface): - def no_methods(): - @pattern.composite() - class CompositeFromInterface: - pass + with pytest.raises(TypeError): + @pattern.composite(interface=interface, container=2) + class CompositeFromInterface: + pass - self.assertRaises(TypeError, wrong_container) - self.assertRaises(TypeError, no_methods) + +def test_composite_no_methods(): + + with pytest.raises(TypeError): + @pattern.composite() + class CompositeFromInterface: + pass -- cgit v1.2.3-70-g09d2 From 455cae01c29d6da491507b277bf9ec33b0fdcb16 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Thu, 27 Apr 2017 07:45:34 -0700 Subject: Convert rest docstrings to Google docstrings. (#3994) - Sometimes you need something mindless to do. - Sometimes it can be helpful, as well. --- lib/spack/llnl/util/filesystem.py | 73 ++++++++++---------- lib/spack/spack/build_environment.py | 54 +++++++++------ lib/spack/spack/build_systems/python.py | 8 ++- lib/spack/spack/cmd/checksum.py | 15 +++-- lib/spack/spack/cmd/create.py | 45 +++++++------ lib/spack/spack/cmd/edit.py | 7 +- lib/spack/spack/cmd/url.py | 48 +++++++------ lib/spack/spack/directives.py | 20 +++--- lib/spack/spack/environment.py | 13 ++-- lib/spack/spack/fetch_strategy.py | 15 +++-- lib/spack/spack/mirror.py | 9 +-- lib/spack/spack/package.py | 115 +++++++++++++++++--------------- lib/spack/spack/spec.py | 54 ++++++++------- lib/spack/spack/test/modules.py | 10 +-- lib/spack/spack/test/python_version.py | 9 ++- lib/spack/spack/url.py | 108 +++++++++++++++++------------- lib/spack/spack/util/naming.py | 12 ++-- lib/spack/spack/util/pattern.py | 29 ++++---- 18 files changed, 360 insertions(+), 284 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 86122f42c8..035f9a13ff 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -584,32 +584,32 @@ class LibraryList(collections.Sequence): return self.joined() -def find_system_libraries(args, shared=True): - """Searches the usual system library locations for the libraries - specified in args. +def find_system_libraries(library_names, shared=True): + """Searches the usual system library locations for ``library_names``. Search order is as follows: - 1. /lib64 - 2. /lib - 3. /usr/lib64 - 4. /usr/lib - 5. /usr/local/lib64 - 6. /usr/local/lib + 1. ``/lib64`` + 2. ``/lib`` + 3. ``/usr/lib64`` + 4. ``/usr/lib`` + 5. ``/usr/local/lib64`` + 6. ``/usr/local/lib`` - :param args: Library name(s) to search for - :type args: str or collections.Sequence - :param bool shared: if True searches for shared libraries, + Args: + library_names (str or list of str): Library name(s) to search for + shared (bool): searches for shared libraries if True - :returns: The libraries that have been found - :rtype: LibraryList + Returns: + LibraryList: The libraries that have been found """ - if isinstance(args, str): - args = [args] - elif not isinstance(args, collections.Sequence): + if isinstance(library_names, str): + library_names = [library_names] + elif not isinstance(library_names, collections.Sequence): message = '{0} expects a string or sequence of strings as the ' message += 'first argument [got {1} instead]' - message = message.format(find_system_libraries.__name__, type(args)) + message = message.format( + find_system_libraries.__name__, type(library_names)) raise TypeError(message) libraries_found = [] @@ -622,7 +622,7 @@ def find_system_libraries(args, shared=True): '/usr/local/lib', ] - for library in args: + for library in library_names: for root in search_locations: result = find_libraries(library, root, shared, recurse=True) if result: @@ -632,27 +632,26 @@ def find_system_libraries(args, shared=True): return libraries_found -def find_libraries(args, root, shared=True, recurse=False): - """Returns an iterable object containing a list of full paths to - libraries if found. - - :param args: Library name(s) to search for - :type args: str or collections.Sequence - :param str root: The root directory to start searching from - :param bool shared: if True searches for shared libraries, - otherwise for static - :param bool recurse: if False search only root folder, - if True descends top-down from the root +def find_libraries(library_names, root, shared=True, recurse=False): + """Returns an iterable of full paths to libraries found in a root dir. - :returns: The libraries that have been found - :rtype: LibraryList + Args: + library_names (str or list of str): Library names to search for + root (str): The root directory to start searching from + shared (bool): if True searches for shared libraries, otherwise static. + recurse (bool): if False search only root folder, + if True descends top-down from the root + + Returns: + LibraryList: The libraries that have been found """ - if isinstance(args, str): - args = [args] - elif not isinstance(args, collections.Sequence): + if isinstance(library_names, str): + library_names = [library_names] + elif not isinstance(library_names, collections.Sequence): message = '{0} expects a string or sequence of strings as the ' message += 'first argument [got {1} instead]' - raise TypeError(message.format(find_libraries.__name__, type(args))) + raise TypeError(message.format( + find_libraries.__name__, type(library_names))) # Construct the right suffix for the library if shared is True: @@ -660,7 +659,7 @@ def find_libraries(args, root, shared=True, recurse=False): else: suffix = 'a' # List of libraries we are searching with suffixes - libraries = ['{0}.{1}'.format(lib, suffix) for lib in args] + libraries = ['{0}.{1}'.format(lib, suffix) for lib in library_names] # Search method if recurse is False: search_method = _find_libraries_non_recursive diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 06ac65f552..9c3768b65b 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -438,12 +438,17 @@ def get_rpaths(pkg): def get_std_cmake_args(pkg): - """Returns the list of standard arguments that would be used if this - package was a CMakePackage instance. + """List of standard arguments used if a package is a CMakePackage. - :param pkg: pkg under consideration + Returns: + list of str: standard arguments that would be used if this + package were a CMakePackage instance. - :return: list of arguments for cmake + Args: + pkg (PackageBase): package under consideration + + Returns: + list of str: arguments for cmake """ return spack.CMakePackage._std_args(pkg) @@ -465,10 +470,13 @@ def parent_class_modules(cls): def load_external_modules(pkg): - """Traverse the spec list associated with a package - and find any specs that have external modules. + """Traverse a package's spec DAG and load any external modules. - :param pkg: package under consideration + Traverse a package's dependencies and load any external modules + associated with them. + + Args: + pkg (PackageBase): package to load deps for """ for dep in list(pkg.spec.traverse()): if dep.external_module: @@ -531,25 +539,29 @@ def setup_package(pkg, dirty=False): def fork(pkg, function, dirty=False): """Fork a child process to do part of a spack build. - :param pkg: pkg whose environemnt we should set up the forked process for. - :param function: arg-less function to run in the child process. - :param dirty: If True, do NOT clean the environment before building. + Args: + + pkg (PackageBase): package whose environemnt we should set up the + forked process for. + function (callable): argless function to run in the child + process. + dirty (bool): If True, do NOT clean the environment before + building. Usage:: - def child_fun(): - # do stuff - build_env.fork(pkg, child_fun) + def child_fun(): + # do stuff + build_env.fork(pkg, child_fun) Forked processes are run with the build environment set up by - spack.build_environment. This allows package authors to have - full control over the environment, etc. without affecting - other builds that might be executed in the same spack call. - - If something goes wrong, the child process is expected to print - the error and the parent process will exit with error as - well. If things go well, the child exits and the parent - carries on. + spack.build_environment. This allows package authors to have full + control over the environment, etc. without affecting other builds + that might be executed in the same spack call. + + If something goes wrong, the child process is expected to print the + error and the parent process will exit with error as well. If things + go well, the child exits and the parent carries on. """ def child_execution(child_connection, input_stream): diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 7a8650bfce..3fae6671f0 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -137,9 +137,11 @@ class PythonPackage(PackageBase): def _setup_command_available(self, command): """Determines whether or not a setup.py command exists. - :param str command: The command to look for - :return: True if the command is found, else False - :rtype: bool + Args: + command (str): The command to look for + + Returns: + bool: True if the command is found, else False """ kwargs = { 'output': os.devnull, diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index e0b7fd897d..fda9beed27 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -57,13 +57,14 @@ def get_checksums(url_dict, name, **kwargs): The ``first_stage_function`` kwarg allows ``spack create`` to determine things like the build system of the archive. - :param dict url_dict: A dictionary of the form: version -> URL - :param str name: The name of the package - :param callable first_stage_function: Function to run on first staging area - :param bool keep_stage: Don't clean up staging area when command completes - - :returns: A multi-line string containing versions and corresponding hashes - :rtype: str + Args: + url_dict (dict): A dictionary of the form: version -> URL + name (str): The name of the package + first_stage_function (callable): Function to run on first staging area + keep_stage (bool): Don't clean up staging area when command completes + + Returns: + str: A multi-line string containing versions and corresponding hashes """ first_stage_function = kwargs.get('first_stage_function', None) keep_stage = kwargs.get('keep_stage', False) diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index d839cc91ad..504ac9d844 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -451,10 +451,12 @@ def get_name(args): If a name was provided, always use that. Otherwise, if a URL was provided, extract the name from that. Otherwise, use a default. - :param argparse.Namespace args: The arguments given to ``spack create`` + Args: + args (param argparse.Namespace): The arguments given to + ``spack create`` - :returns: The name of the package - :rtype: str + Returns: + str: The name of the package """ # Default package name @@ -487,10 +489,11 @@ def get_url(args): Use a default URL if none is provided. - :param argparse.Namespace args: The arguments given to ``spack create`` + Args: + args (argparse.Namespace): The arguments given to ``spack create`` - :returns: The URL of the package - :rtype: str + Returns: + str: The URL of the package """ # Default URL @@ -510,11 +513,13 @@ def get_versions(args, name): Returns default values if no URL is provided. - :param argparse.Namespace args: The arguments given to ``spack create`` - :param str name: The name of the package + Args: + args (argparse.Namespace): The arguments given to ``spack create`` + name (str): The name of the package - :returns: Versions and hashes, and a BuildSystemGuesser object - :rtype: str and BuildSystemGuesser + Returns: + str and BuildSystemGuesser: Versions and hashes, and a + BuildSystemGuesser object """ # Default version, hash, and guesser @@ -552,12 +557,13 @@ def get_build_system(args, guesser): is provided, download the tarball and peek inside to guess what build system it uses. Otherwise, use a generic template by default. - :param argparse.Namespace args: The arguments given to ``spack create`` - :param BuildSystemGuesser guesser: The first_stage_function given to \ - ``spack checksum`` which records the build system it detects + Args: + args (argparse.Namespace): The arguments given to ``spack create`` + guesser (BuildSystemGuesser): The first_stage_function given to + ``spack checksum`` which records the build system it detects - :returns: The name of the build system template to use - :rtype: str + Returns: + str: The name of the build system template to use """ # Default template @@ -584,11 +590,12 @@ def get_repository(args, name): """Returns a Repo object that will allow us to determine the path where the new package file should be created. - :param argparse.Namespace args: The arguments given to ``spack create`` - :param str name: The name of the package to create + Args: + args (argparse.Namespace): The arguments given to ``spack create`` + name (str): The name of the package to create - :returns: A Repo object capable of determining the path to the package file - :rtype: Repo + Returns: + Repo: A Repo object capable of determining the path to the package file """ spec = Spec(name) # Figure out namespace for spec diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py index f439736192..01f2b61887 100644 --- a/lib/spack/spack/cmd/edit.py +++ b/lib/spack/spack/cmd/edit.py @@ -38,9 +38,10 @@ description = "open package files in $EDITOR" def edit_package(name, repo_path, namespace): """Opens the requested package file in your favorite $EDITOR. - :param str name: The name of the package - :param str repo_path: The path to the repository containing this package - :param str namespace: A valid namespace registered with Spack + Args: + name (str): The name of the package + repo_path (str): The path to the repository containing this package + namespace (str): A valid namespace registered with Spack """ # Find the location of the package if repo_path: diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py index 1128e08a43..e5cfce0de3 100644 --- a/lib/spack/spack/cmd/url.py +++ b/lib/spack/spack/cmd/url.py @@ -244,7 +244,8 @@ def print_name_and_version(url): """Prints a URL. Underlines the detected name with dashes and the detected version with tildes. - :param str url: The url to parse + Args: + url (str): The url to parse """ name, ns, nl, ntup, ver, vs, vl, vtup = substitution_offsets(url) underlines = [' '] * max(ns + nl, vs + vl) @@ -260,13 +261,15 @@ def print_name_and_version(url): def url_list_parsing(args, urls, url, pkg): """Helper function for :func:`url_list`. - :param argparse.Namespace args: The arguments given to ``spack url list`` - :param set urls: List of URLs that have already been added - :param url: A URL to potentially add to ``urls`` depending on ``args`` - :type url: str or None - :param spack.package.PackageBase pkg: The Spack package - :returns: The updated ``urls`` list - :rtype: set + Args: + args (argparse.Namespace): The arguments given to ``spack url list`` + urls (set): List of URLs that have already been added + url (str or None): A URL to potentially add to ``urls`` depending on + ``args`` + pkg (spack.package.PackageBase): The Spack package + + Returns: + set: The updated set of ``urls`` """ if url: if args.correct_name or args.incorrect_name: @@ -310,10 +313,12 @@ def url_list_parsing(args, urls, url, pkg): def name_parsed_correctly(pkg, name): """Determine if the name of a package was correctly parsed. - :param spack.package.PackageBase pkg: The Spack package - :param str name: The name that was extracted from the URL - :returns: True if the name was correctly parsed, else False - :rtype: bool + Args: + pkg (spack.package.PackageBase): The Spack package + name (str): The name that was extracted from the URL + + Returns: + bool: True if the name was correctly parsed, else False """ pkg_name = pkg.name @@ -336,10 +341,12 @@ def name_parsed_correctly(pkg, name): def version_parsed_correctly(pkg, version): """Determine if the version of a package was correctly parsed. - :param spack.package.PackageBase pkg: The Spack package - :param str version: The version that was extracted from the URL - :returns: True if the name was correctly parsed, else False - :rtype: bool + Args: + pkg (spack.package.PackageBase): The Spack package + version (str): The version that was extracted from the URL + + Returns: + bool: True if the name was correctly parsed, else False """ version = remove_separators(version) @@ -359,10 +366,11 @@ def remove_separators(version): Make sure 1.2.3, 1-2-3, 1_2_3, and 123 are considered equal. Unfortunately, this also means that 1.23 and 12.3 are equal. - :param version: A version - :type version: str or Version - :returns: The version with all separator characters removed - :rtype: str + Args: + version (str or Version): A version + + Returns: + str: The version with all separator characters removed """ version = str(version) diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index e2219d1f49..7a245f606c 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -265,20 +265,22 @@ def _depends_on(pkg, spec, when=None, type=None): @directive('conflicts') def conflicts(conflict_spec, when=None): - """Allows a package to define a conflict, i.e. a concretized configuration - that is known to be non-valid. + """Allows a package to define a conflict. - For example a package that is known not to be buildable with intel - compilers can declare: + Currently, a "conflict" is a concretized configuration that is known + to be non-valid. For example, a package that is known not to be + buildable with intel compilers can declare:: - conflicts('%intel') + conflicts('%intel') - To express the same constraint only when the 'foo' variant is activated: + To express the same constraint only when the 'foo' variant is + activated:: - conflicts('%intel', when='+foo') + conflicts('%intel', when='+foo') - :param conflict_spec: constraint defining the known conflict - :param when: optional constraint that triggers the conflict + Args: + conflict_spec (Spec): constraint defining the known conflict + when (Spec): optional constraint that triggers the conflict """ def _execute(pkg): # If when is not specified the conflict always holds diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index eadfa45efb..83a5139410 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -262,12 +262,15 @@ class EnvironmentModifications(object): @staticmethod def from_sourcing_files(*args, **kwargs): - """Creates an instance of EnvironmentModifications that, if executed, - has the same effect on the environment as sourcing the files passed as - parameters + """Returns modifications that would be made by sourcing files. - :param \*args: list of files to be sourced - :rtype: instance of EnvironmentModifications + Args: + *args (list of str): list of files to be sourced + + Returns: + EnvironmentModifications: an object that, if executed, has + the same effect on the environment as sourcing the files + passed as parameters """ env = EnvironmentModifications() diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index c694610856..5c872ae1b6 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -911,11 +911,18 @@ def from_url(url): def from_kwargs(**kwargs): - """ - Construct the appropriate FetchStrategy from the given keyword arguments. + """Construct an appropriate FetchStrategy from the given keyword arguments. + + Args: + **kwargs: dictionary of keyword arguments, e.g. from a + ``version()`` directive in a package. + + Returns: + fetch_strategy: The fetch strategy that matches the args, based + on attribute names (e.g., ``git``, ``hg``, etc.) - :param kwargs: dictionary of keyword arguments - :return: fetcher or raise a FetchError exception + Raises: + FetchError: If no ``fetch_strategy`` matches the args. """ for fetcher in all_strategies: if fetcher.matches(kwargs): diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py index aef5e2e8ee..c9ed617dc8 100644 --- a/lib/spack/spack/mirror.py +++ b/lib/spack/spack/mirror.py @@ -117,13 +117,10 @@ def get_matching_versions(specs, **kwargs): def suggest_archive_basename(resource): - """ - Return a tentative basename for an archive. - - Raises an exception if the name is not an allowed archive type. + """Return a tentative basename for an archive. - :param fetcher: - :return: + Raises: + RuntimeError: if the name is not an allowed archive type. """ basename = os.path.basename(resource.fetcher.url) if not allowed_archive(basename): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 506e44ec45..4d93b6304c 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -73,7 +73,7 @@ _ALLOWED_URL_SCHEMES = ["http", "https", "ftp", "file", "git"] class InstallPhase(object): - """Manages a single phase of the installation + """Manages a single phase of the installation. This descriptor stores at creation time the name of the method it should search for execution. The method is retrieved at __get__ time, so that @@ -214,11 +214,14 @@ def run_after(*phases): def on_package_attributes(**attr_dict): - """Executes the decorated method only if at the moment of calling - the instance has attributes that are equal to certain values. + """Decorator: executes instance function only if object has attr valuses. - :param dict attr_dict: dictionary mapping attribute names to their - required values + Executes the decorated method only if at the moment of calling the + instance has attributes that are equal to certain values. + + Args: + attr_dict (dict): dictionary mapping attribute names to their + required values """ def _execute_under_condition(func): @@ -1082,12 +1085,14 @@ class PackageBase(with_metaclass(PackageMeta, object)): yield def _process_external_package(self, explicit): - """Helper function to process external packages. It runs post install - hooks and registers the package in the DB. + """Helper function to process external packages. - :param bool explicit: True if the package was requested explicitly by - the user, False if it was pulled in as a dependency of an explicit - package. + Runs post install hooks and registers the package in the DB. + + Args: + explicit (bool): if the package was requested explicitly by + the user, False if it was pulled in as a dependency of an + explicit package. """ if self.spec.external_module: message = '{s.name}@{s.version} : has external module in {module}' @@ -1143,24 +1148,25 @@ class PackageBase(with_metaclass(PackageMeta, object)): Package implementations should override install() to describe their build process. - :param bool keep_prefix: Keep install prefix on failure. By default, - destroys it. - :param bool keep_stage: By default, stage is destroyed only if there - are no exceptions during build. Set to True to keep the stage - even with exceptions. - :param bool install_deps: Install dependencies before installing this - package - :param bool skip_patch: Skip patch stage of build if True. - :param bool verbose: Display verbose build output (by default, - suppresses it) - :param int make_jobs: Number of make jobs to use for install. Default - is ncpus - :param bool run_tests: Run tests within the package's install() - :param bool fake: Don't really build; install fake stub files instead. - :param bool explicit: True if package was explicitly installed, False - if package was implicitly installed (as a dependency). - :param bool dirty: Don't clean the build environment before installing. - :param bool force: Install again, even if already installed. + Args: + keep_prefix (bool): Keep install prefix on failure. By default, + destroys it. + keep_stage (bool): By default, stage is destroyed only if there + are no exceptions during build. Set to True to keep the stage + even with exceptions. + install_deps (bool): Install dependencies before installing this + package + skip_patch (bool): Skip patch stage of build if True. + verbose (bool): Display verbose build output (by default, + suppresses it) + make_jobs (int): Number of make jobs to use for install. Default + is ncpus + run_tests (bool): Run tests within the package's install() + fake (bool): Don't really build; install fake stub files instead. + explicit (bool): True if package was explicitly installed, False + if package was implicitly installed (as a dependency). + dirty (bool): Don't clean the build environment before installing. + force (bool): Install again, even if already installed. """ if not self.spec.concrete: raise ValueError("Can only install concrete packages: %s." @@ -1423,12 +1429,13 @@ class PackageBase(with_metaclass(PackageMeta, object)): 1. Qt extensions need ``QTDIR`` set. - :param EnvironmentModifications spack_env: List of environment - modifications to be applied when this package is built - within Spack. - :param EnvironmentModifications run_env: List of environment - modifications to be applied when this package is run outside - of Spack. These are added to the resulting module file. + Args: + spack_env (EnvironmentModifications): List of environment + modifications to be applied when this package is built + within Spack. + run_env (EnvironmentModifications): List of environment + modifications to be applied when this package is run outside + of Spack. These are added to the resulting module file. """ pass @@ -1450,17 +1457,18 @@ class PackageBase(with_metaclass(PackageMeta, object)): to the ``lib/pythonX.Y/site-packages`` directory in the module's install prefix. This method could be used to set that variable. - :param EnvironmentModifications spack_env: List of environment - modifications to be applied when the dependent package is - built within Spack. - :param EnvironmentModifications run_env: List of environment - modifications to be applied when the dependent package is - run outside of Spack. These are added to the resulting - module file. - :param Spec dependent_spec: The spec of the dependent package - about to be built. This allows the extendee (self) to query - the dependent's state. Note that *this* package's spec is - available as ``self.spec``. + Args: + spack_env (EnvironmentModifications): List of environment + modifications to be applied when the dependent package is + built within Spack. + run_env (EnvironmentModifications): List of environment + modifications to be applied when the dependent package is + run outside of Spack. These are added to the resulting + module file. + dependent_spec (Spec): The spec of the dependent package + about to be built. This allows the extendee (self) to query + the dependent's state. Note that *this* package's spec is + available as ``self.spec``. """ pass @@ -1489,14 +1497,15 @@ class PackageBase(with_metaclass(PackageMeta, object)): indicating the path to their libraries, since these paths differ by BLAS/LAPACK implementation. - :param spack.package.PackageBase.module module: The Python ``module`` - object of the dependent package. Packages can use this to set - module-scope variables for the dependent to use. - - :param Spec dependent_spec: The spec of the dependent package - about to be built. This allows the extendee (self) to - query the dependent's state. Note that *this* - package's spec is available as ``self.spec``. + Args: + module (spack.package.PackageBase.module): The Python ``module`` + object of the dependent package. Packages can use this to set + module-scope variables for the dependent to use. + + dependent_spec (Spec): The spec of the dependent package + about to be built. This allows the extendee (self) to + query the dependent's state. Note that *this* + package's spec is available as ``self.spec``. """ pass diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 3d067e083f..4cd89f59bf 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -758,32 +758,35 @@ class DependencyMap(HashableMap): def _libs_default_handler(descriptor, spec, cls): - """Default handler when looking for 'libs' attribute. The default - tries to search for 'lib{spec.name}' recursively starting from + """Default handler when for ``libs`` attribute in Spec interface. + + Tries to search for ``lib{spec.name}`` recursively starting from `spec.prefix`. - :param ForwardQueryToPackage descriptor: descriptor that triggered - the call - :param Spec spec: spec that is being queried - :param type(spec) cls: type of spec, to match the signature of the - descriptor `__get__` method + Args: + descriptor (ForwardQueryToPackage): descriptor that triggered + the call + spec (Spec): spec that is being queried + cls (type(spec)): type of spec, to match the signature of the + descriptor `__get__` method """ name = 'lib' + spec.name shared = '+shared' in spec - return find_libraries( - name, root=spec.prefix, shared=shared, recurse=True - ) + return find_libraries(name, root=spec.prefix, shared=shared, recurse=True) def _cppflags_default_handler(descriptor, spec, cls): - """Default handler when looking for cppflags attribute. The default - just returns '-I{spec.prefix.include}'. - - :param ForwardQueryToPackage descriptor: descriptor that triggered - the call - :param Spec spec: spec that is being queried - :param type(spec) cls: type of spec, to match the signature of the - descriptor `__get__` method + """Default handler for the ``cppflags`` attribute in the Spec interface. + + The default just returns ``-I{spec.prefix.include}``. + + Args: + descriptor (ForwardQueryToPackage): descriptor that triggered + the call + spec (Spec): spec that is being queried + + cls (type(spec)): type of spec, to match the signature of the + descriptor ``__get__`` method """ return '-I' + spec.prefix.include @@ -792,13 +795,14 @@ class ForwardQueryToPackage(object): """Descriptor used to forward queries from Spec to Package""" def __init__(self, attribute_name, default_handler=None): - """Initializes the instance of the descriptor - - :param str attribute_name: name of the attribute to be - searched for in the Package instance - :param callable default_handler: [optional] default function - to be called if the attribute was not found in the Package - instance + """Create a new descriptor. + + Args: + attribute_name (str): name of the attribute to be + searched for in the Package instance + default_handler (callable, optional): default function to be + called if the attribute was not found in the Package + instance """ self.attribute_name = attribute_name # Turn the default handler into a function with the right diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py index 0eb54cba2c..e8ebebf736 100644 --- a/lib/spack/spack/test/modules.py +++ b/lib/spack/spack/test/modules.py @@ -63,10 +63,12 @@ def stringio_open(monkeypatch): def get_modulefile_content(factory, spec): """Writes the module file and returns the content as a string. - :param factory: module file factory - :param spec: spec of the module file to be written - :return: content of the module file - :rtype: str + Args: + factory: module file factory + spec: spec of the module file to be written + + Returns: + str: content of the module file """ spec.concretize() generator = factory(spec) diff --git a/lib/spack/spack/test/python_version.py b/lib/spack/spack/test/python_version.py index d58df1a0aa..35b6ad7da7 100644 --- a/lib/spack/spack/test/python_version.py +++ b/lib/spack/spack/test/python_version.py @@ -67,9 +67,12 @@ else: def pyfiles(search_paths, exclude=()): """Generator that yields all the python files in the search paths. - :param search_paths: list of paths to search for python files - :param exclude: file paths to exclude from search - :return: python files + Args: + search_paths (list of str): list of paths to search for python files + exclude (list of str): file paths to exclude from search + + Yields: + python files in the search path. """ # first file is the spack script. yield spack.spack_file diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 7a597073d6..736c0f2efd 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -116,9 +116,11 @@ def strip_version_suffixes(path): * ``libevent-2.0.21`` * ``cuda_8.0.44`` - :param str path: The filename or URL for the package - :return: The ``path`` with any extraneous suffixes removed - :rtype: str + Args: + path (str): The filename or URL for the package + + Returns: + str: The ``path`` with any extraneous suffixes removed """ # NOTE: This could be done with complicated regexes in parse_version_offset # NOTE: The problem is that we would have to add these regexes to the end @@ -227,10 +229,12 @@ def strip_name_suffixes(path, version): * ``converge`` * ``jpeg`` - :param str path: The filename or URL for the package - :param str version: The version detected for this URL - :return: The ``path`` with any extraneous suffixes removed - :rtype: str + Args: + path (str): The filename or URL for the package + version (str): The version detected for this URL + + Returns: + str: The ``path`` with any extraneous suffixes removed """ # NOTE: This could be done with complicated regexes in parse_name_offset # NOTE: The problem is that we would have to add these regexes to every @@ -339,18 +343,19 @@ def determine_url_file_extension(path): def parse_version_offset(path): """Try to extract a version string from a filename or URL. - :param str path: The filename or URL for the package - - :return: A tuple containing: - version of the package, - first index of version, - length of version string, - the index of the matching regex - the matching regex + Args: + path (str): The filename or URL for the package - :rtype: tuple + Returns: + tuple of (Version, int, int, int, str): A tuple containing: + version of the package, + first index of version, + length of version string, + the index of the matching regex + the matching regex - :raises UndetectableVersionError: If the URL does not match any regexes + Raises: + UndetectableVersionError: If the URL does not match any regexes """ original_path = path @@ -524,12 +529,14 @@ def parse_version_offset(path): def parse_version(path): """Try to extract a version string from a filename or URL. - :param str path: The filename or URL for the package + Args: + path (str): The filename or URL for the package - :return: The version of the package - :rtype: spack.version.Version + Returns: + spack.version.Version: The version of the package - :raises UndetectableVersionError: If the URL does not match any regexes + Raises: + UndetectableVersionError: If the URL does not match any regexes """ version, start, length, i, regex = parse_version_offset(path) return Version(version) @@ -538,19 +545,20 @@ def parse_version(path): def parse_name_offset(path, v=None): """Try to determine the name of a package from its filename or URL. - :param str path: The filename or URL for the package - :param str v: The version of the package + Args: + path (str): The filename or URL for the package + v (str): The version of the package - :return: A tuple containing: - name of the package, - first index of name, - length of name, - the index of the matching regex - the matching regex + Returns: + tuple of (str, int, int, int, str): A tuple containing: + name of the package, + first index of name, + length of name, + the index of the matching regex + the matching regex - :rtype: tuple - - :raises UndetectableNameError: If the URL does not match any regexes + Raises: + UndetectableNameError: If the URL does not match any regexes """ original_path = path @@ -651,13 +659,15 @@ def parse_name_offset(path, v=None): def parse_name(path, ver=None): """Try to determine the name of a package from its filename or URL. - :param str path: The filename or URL for the package - :param str ver: The version of the package + Args: + path (str): The filename or URL for the package + ver (str): The version of the package - :return: The name of the package - :rtype: str + Returns: + str: The name of the package - :raises UndetectableNameError: If the URL does not match any regexes + Raises: + UndetectableNameError: If the URL does not match any regexes """ name, start, length, i, regex = parse_name_offset(path, ver) return name @@ -667,16 +677,17 @@ def parse_name_and_version(path): """Try to determine the name of a package and extract its version from its filename or URL. - :param str path: The filename or URL for the package - - :return: A tuple containing: - The name of the package - The version of the package + Args: + path (str): The filename or URL for the package - :rtype: tuple + Returns: + tuple of (str, Version)A tuple containing: + The name of the package + The version of the package - :raises UndetectableVersionError: If the URL does not match any regexes - :raises UndetectableNameError: If the URL does not match any regexes + Raises: + UndetectableVersionError: If the URL does not match any regexes + UndetectableNameError: If the URL does not match any regexes """ ver = parse_version(path) name = parse_name(path, ver) @@ -804,9 +815,10 @@ def color_url(path, **kwargs): | Green: Instances of version string from :func:`substitute_version`. | Magenta: Instances of the name (protected from substitution). - :param str path: The filename or URL for the package - :keyword bool errors: Append parse errors at end of string. - :keyword bool subs: Color substitutions as well as parsed name/version. + Args: + path (str): The filename or URL for the package + errors (bool): Append parse errors at end of string. + subs (bool): Color substitutions as well as parsed name/version. """ errors = kwargs.get('errors', False) subs = kwargs.get('subs', False) diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py index cd35008aed..18142bd83f 100644 --- a/lib/spack/spack/util/naming.py +++ b/lib/spack/spack/util/naming.py @@ -110,13 +110,17 @@ def possible_spack_module_names(python_mod_name): def simplify_name(name): - """Simplifies a name which may include uppercase letters, periods, + """Simplify package name to only lowercase, digits, and dashes. + + Simplifies a name which may include uppercase letters, periods, underscores, and pluses. In general, we want our package names to only contain lowercase letters, digits, and dashes. - :param str name: The original name of the package - :return: The new name of the package - :rtype: str + Args: + name (str): The original name of the package + + Returns: + str: The new name of the package """ # Convert CamelCase to Dashed-Names # e.g. ImageMagick -> Image-Magick diff --git a/lib/spack/spack/util/pattern.py b/lib/spack/spack/util/pattern.py index 7a1109f2d2..bebca1f419 100644 --- a/lib/spack/spack/util/pattern.py +++ b/lib/spack/spack/util/pattern.py @@ -28,20 +28,23 @@ import functools def composite(interface=None, method_list=None, container=list): - """Returns a class decorator that patches a class adding all the methods - it needs to be a composite for a given interface. + """Decorator implementing the GoF composite pattern. + + Args: + interface (type): class exposing the interface to which the + composite object must conform. Only non-private and + non-special methods will be taken into account + method_list (list of str): names of methods that should be part + of the composite + container (MutableSequence): container for the composite object + (default = list). Must fulfill the MutableSequence + contract. The composite class will expose the container API + to manage object composition + + Returns: + a class decorator that patches a class adding all the methods + it needs to be a composite for a given interface. - :param interface: class exposing the interface to which the composite \ - object must conform. Only non-private and non-special methods will \ - be taken into account - - :param method_list: names of methods that should be part of the composite - - :param container: container for the composite object (default = list). \ - Must fulfill the MutableSequence contract. The composite class will \ - expose the container API to manage object composition - - :return: class decorator """ # Check if container fulfills the MutableSequence contract and raise an # exception if it doesn't. The patched class returned by the decorator will -- cgit v1.2.3-70-g09d2 From 2d9dac9af087679086e9341519a317ff4094a555 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Thu, 27 Apr 2017 09:21:35 -0700 Subject: Fix Python3 issue with sbang checking; add tests. (#4017) --- lib/spack/spack/hooks/sbang.py | 7 ++- lib/spack/spack/test/sbang.py | 118 +++++++++++++++++++++++++---------------- 2 files changed, 76 insertions(+), 49 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py index 17f6ac2528..09691b3f0f 100644 --- a/lib/spack/spack/hooks/sbang.py +++ b/lib/spack/spack/hooks/sbang.py @@ -38,9 +38,12 @@ shebang_limit = 127 def shebang_too_long(path): """Detects whether a file has a shebang line that is too long.""" - with open(path, 'r') as script: + if not os.path.isfile(path): + return False + + with open(path, 'rb') as script: bytes = script.read(2) - if bytes != '#!': + if bytes != b'#!': return False line = bytes + script.readline() diff --git a/lib/spack/spack/test/sbang.py b/lib/spack/spack/test/sbang.py index 12abce7b35..b1e2da3c3b 100644 --- a/lib/spack/spack/test/sbang.py +++ b/lib/spack/spack/test/sbang.py @@ -27,13 +27,16 @@ Test that Spack's shebang filtering works correctly. """ import os import stat -import unittest +import pytest import tempfile import shutil from llnl.util.filesystem import * -from spack.hooks.sbang import filter_shebangs_in_directory + import spack +from spack.hooks.sbang import * +from spack.util.executable import which + short_line = "#!/this/is/short/bin/bash\n" long_line = "#!/this/" + ('x' * 200) + "/is/long\n" @@ -43,14 +46,13 @@ sbang_line = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root last_line = "last!\n" -class SbangTest(unittest.TestCase): - - def setUp(self): +class ScriptDirectory(object): + """Directory full of test scripts to run sbang instrumentation on.""" + def __init__(self): self.tempdir = tempfile.mkdtemp() - # make sure we can ignore non-files - directory = os.path.join(self.tempdir, 'dir') - mkdirp(directory) + self.directory = os.path.join(self.tempdir, 'dir') + mkdirp(self.directory) # Script with short shebang self.short_shebang = os.path.join(self.tempdir, 'short') @@ -71,48 +73,70 @@ class SbangTest(unittest.TestCase): f.write(last_line) # Script already using sbang. - self.has_shebang = os.path.join(self.tempdir, 'shebang') - with open(self.has_shebang, 'w') as f: + self.has_sbang = os.path.join(self.tempdir, 'shebang') + with open(self.has_sbang, 'w') as f: f.write(sbang_line) f.write(long_line) f.write(last_line) - def tearDown(self): + # Fake binary file. + self.binary = os.path.join(self.tempdir, 'binary') + tar = which('tar', required=True) + tar('czf', self.binary, self.has_sbang) + + def destroy(self): shutil.rmtree(self.tempdir, ignore_errors=True) - def test_shebang_handling(self): - filter_shebangs_in_directory(self.tempdir) - - # Make sure this is untouched - with open(self.short_shebang, 'r') as f: - self.assertEqual(f.readline(), short_line) - self.assertEqual(f.readline(), last_line) - - # Make sure this got patched. - with open(self.long_shebang, 'r') as f: - self.assertEqual(f.readline(), sbang_line) - self.assertEqual(f.readline(), long_line) - self.assertEqual(f.readline(), last_line) - - # Make sure this got patched. - with open(self.lua_shebang, 'r') as f: - self.assertEqual(f.readline(), sbang_line) - self.assertEqual(f.readline(), lua_line_patched) - self.assertEqual(f.readline(), last_line) - - # Make sure this is untouched - with open(self.has_shebang, 'r') as f: - self.assertEqual(f.readline(), sbang_line) - self.assertEqual(f.readline(), long_line) - self.assertEqual(f.readline(), last_line) - - def test_shebang_handles_non_writable_files(self): - # make a file non-writable - st = os.stat(self.long_shebang) - not_writable_mode = st.st_mode & ~stat.S_IWRITE - os.chmod(self.long_shebang, not_writable_mode) - - self.test_shebang_handling() - - st = os.stat(self.long_shebang) - self.assertEqual(oct(not_writable_mode), oct(st.st_mode)) + +@pytest.fixture +def script_dir(): + sdir = ScriptDirectory() + yield sdir + sdir.destroy() + + +def test_shebang_handling(script_dir): + assert shebang_too_long(script_dir.lua_shebang) + assert shebang_too_long(script_dir.long_shebang) + + assert not shebang_too_long(script_dir.short_shebang) + assert not shebang_too_long(script_dir.has_sbang) + assert not shebang_too_long(script_dir.binary) + assert not shebang_too_long(script_dir.directory) + + filter_shebangs_in_directory(script_dir.tempdir) + + # Make sure this is untouched + with open(script_dir.short_shebang, 'r') as f: + assert f.readline() == short_line + assert f.readline() == last_line + + # Make sure this got patched. + with open(script_dir.long_shebang, 'r') as f: + assert f.readline() == sbang_line + assert f.readline() == long_line + assert f.readline() == last_line + + # Make sure this got patched. + with open(script_dir.lua_shebang, 'r') as f: + assert f.readline() == sbang_line + assert f.readline() == lua_line_patched + assert f.readline() == last_line + + # Make sure this is untouched + with open(script_dir.has_sbang, 'r') as f: + assert f.readline() == sbang_line + assert f.readline() == long_line + assert f.readline() == last_line + + +def test_shebang_handles_non_writable_files(script_dir): + # make a file non-writable + st = os.stat(script_dir.long_shebang) + not_writable_mode = st.st_mode & ~stat.S_IWRITE + os.chmod(script_dir.long_shebang, not_writable_mode) + + test_shebang_handling(script_dir) + + st = os.stat(script_dir.long_shebang) + assert oct(not_writable_mode) == oct(st.st_mode) -- cgit v1.2.3-70-g09d2 From d83ae6dcff6264ca833444bdb61ac5081fc6e2a7 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 27 Apr 2017 12:11:35 -0500 Subject: Don't print successfully uninstalled twice (#4019) --- lib/spack/spack/package.py | 1 - 1 file changed, 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 4d93b6304c..1e2210f928 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1548,7 +1548,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): msg = 'Deleting DB entry [{0}]' tty.debug(msg.format(spec.short_spec)) spack.store.db.remove(spec) - tty.msg("Successfully uninstalled %s" % spec.short_spec) if pkg is not None: spack.hooks.post_uninstall(spec) -- cgit v1.2.3-70-g09d2 From a0ebce0cb3824d154e405d8044ded1aea5e26e12 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 27 Apr 2017 12:11:59 -0500 Subject: Remove 'release' suffix from package name (#4014) --- lib/spack/spack/test/url_parse.py | 4 ++++ lib/spack/spack/url.py | 1 + 2 files changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 2af7c6ae0b..effbb4b2c4 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -224,6 +224,10 @@ class UrlStripNameSuffixesTest(unittest.TestCase): # Download version + def test_release(self): + self.check('cbench_release_1.3.0.tar.gz', '1.3.0', + 'cbench') + def test_snapshot(self): self.check('gts-snapshot-121130', '121130', 'gts') diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 736c0f2efd..8f2129b84a 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -258,6 +258,7 @@ def strip_name_suffixes(path, version): '[._-]std', # Download version + 'release', 'snapshot', 'distrib', -- cgit v1.2.3-70-g09d2 From 0488654f67b8e177dbf598484a5220d92ad91ac2 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 27 Apr 2017 15:18:38 -0500 Subject: Prevent spack test flake8 from making changes (#4023) --- lib/spack/spack/test/cmd/flake8.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/cmd/flake8.py b/lib/spack/spack/test/cmd/flake8.py index bde8d199a7..438791c988 100644 --- a/lib/spack/spack/test/cmd/flake8.py +++ b/lib/spack/spack/test/cmd/flake8.py @@ -54,12 +54,12 @@ def flake8_package(): package = FileFilter(filename) # Make the change - package.filter('unmodified', 'modified') + package.filter("state = 'unmodified'", "state = 'modified'", string=True) yield filename # Undo the change - package.filter('modified', 'unmodified') + package.filter("state = 'modified'", "state = 'unmodified'", string=True) def test_changed_files(parser, flake8_package): -- cgit v1.2.3-70-g09d2 From 9a67e95686dc3b9ccefa12bafe0ed23cf2f1e235 Mon Sep 17 00:00:00 2001 From: scheibelp Date: Thu, 27 Apr 2017 15:23:09 -0700 Subject: Reindex checks install for non-external packages (#4027) Fixes #4026 #1167 updated Database.reindex to keep old installation records to support external packages. However, when a user manually removes a prefix and reindexes this kept the records so the packages were still installed according to "spack find" etc. This adds a check for non-external packages to ensure they are properly installed according to the directory layout. --- lib/spack/spack/database.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 33eb7bea4c..38ea8d584c 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -473,13 +473,18 @@ class Database(object): layout = spack.store.layout if entry.spec.external: layout = None - kwargs = { - 'spec': entry.spec, - 'directory_layout': layout, - 'explicit': entry.explicit - } - self._add(**kwargs) - processed_specs.add(entry.spec) + install_check = True + else: + install_check = layout.check_installed(entry.spec) + + if install_check: + kwargs = { + 'spec': entry.spec, + 'directory_layout': layout, + 'explicit': entry.explicit + } + self._add(**kwargs) + processed_specs.add(entry.spec) except Exception as e: # Something went wrong, so the spec was not restored # from old data -- cgit v1.2.3-70-g09d2 From 59ac047996f0391f6e7d102930be91a5e7311d86 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 28 Apr 2017 15:37:47 +0200 Subject: No compiler found: fixed error message (#4034) When a compiler was not found a stacktrace was displayed to user because there were three arguments to be substituted in a string with only two substitutions to be done. --- lib/spack/spack/concretize.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 0b29d2874e..5507b599ff 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -451,10 +451,11 @@ class UnavailableCompilerVersionError(spack.error.SpackError): compiler spec.""" def __init__(self, compiler_spec, arch=None): - err_msg = "No compilers with spec %s found" % compiler_spec + err_msg = "No compilers with spec {0} found".format(compiler_spec) if arch: - err_msg += (" for operating system %s and target %s." % - (compiler_spec, arch.platform_os, arch.target)) + err_msg += " for operating system {0} and target {1}.".format( + arch.platform_os, arch.target + ) super(UnavailableCompilerVersionError, self).__init__( err_msg, "Run 'spack compiler find' to add compilers.") -- cgit v1.2.3-70-g09d2 From 4bfba146d5d6285e66d9f26d69e2dbdbb0573d3b Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 28 Apr 2017 14:55:28 -0500 Subject: Add tests to MakefilePackage (#4039) --- lib/spack/spack/build_systems/makefile.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index 7274384478..a014ed7c15 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -72,6 +72,9 @@ class MakefilePackage(PackageBase): #: phase install_targets = ['install'] + #: Callback names for build-time test + build_time_test_callbacks = ['check'] + @property def build_directory(self): """Returns the directory containing the main Makefile @@ -100,5 +103,15 @@ class MakefilePackage(PackageBase): with working_dir(self.build_directory): inspect.getmodule(self).make(*self.install_targets) + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + def check(self): + """Searches the Makefile for targets ``test`` and ``check`` + and runs them if found. + """ + with working_dir(self.build_directory): + self._if_make_target_execute('test') + self._if_make_target_execute('check') + # Check that self.prefix is there after installation run_after('install')(PackageBase.sanity_check_prefix) -- cgit v1.2.3-70-g09d2 From ce3ab503ded78d19aae45a938084d1f8670cc625 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 29 Apr 2017 19:24:13 -0500 Subject: Python command, libraries, and headers (#3367) ## Motivation Python installations are both important and unfortunately inconsistent. Depending on the Python version, OS, and the strength of the Earth's magnetic field when it was installed, the name of the Python executable, directory containing its libraries, library names, and the directory containing its headers can vary drastically. I originally got into this mess with #3274, where I discovered that Boost could not be built with Python 3 because the executable is called `python3` and we were telling it to use `python`. I got deeper into this mess when I started hacking on #3140, where I discovered just how difficult it is to find the location and name of the Python libraries and headers. Currently, half of the packages that depend on Python and need to know this information jump through hoops to determine the correct information. The other half are hard-coded to use `python`, `spec['python'].prefix.lib`, and `spec['python'].prefix.include`. Obviously, none of these packages would work for Python 3, and there's no reason to duplicate the effort. The Python package itself should contain all of the information necessary to use it properly. This is in line with the recent work by @alalazo and @davydden with respect to `spec['blas'].libs` and friends. ## Prefix For most packages in Spack, we assume that the installation directory is `spec['python'].prefix`. This generally works for anything installed with Spack, but gets complicated when we include external packages. Python is a commonly used external package (it needs to be installed just to run Spack). If it was installed with Homebrew, `which python` would return `/usr/local/bin/python`, and most users would erroneously assume that `/usr/local` is the installation directory. If you peruse through #2173, you'll immediately see why this is not the case. Homebrew actually installs Python in `/usr/local/Cellar/python/2.7.12_2` and symlinks the executable to `/usr/local/bin/python`. `PYTHONHOME` (and presumably most things that need to know where Python is installed) needs to be set to the actual installation directory, not `/usr/local`. Normally I would say, "sounds like user error, make sure to use the real installation directory in your `packages.yaml`". But I think we can make a special case for Python. That's what we decided in #2173 anyway. If we change our minds, I would be more than happy to simplify things. To solve this problem, I created a `spec['python'].home` attribute that works the same way as `spec['python'].prefix` but queries Python to figure out where it was actually installed. @tgamblin Is there any way to overwrite `spec['python'].prefix`? I think it's currently immutable. ## Command In general, Python 2 comes with both `python` and `python2` commands, while Python 3 only comes with a `python3` command. But this is up to the OS developers. For example, `/usr/bin/python` on Gentoo is actually Python 3. Worse yet, if someone is using an externally installed Python, all 3 commands may exist in the same directory! Here's what I'm thinking: If the spec is for Python 3, try searching for the `python3` command. If the spec is for Python 2, try searching for the `python2` command. If neither are found, try searching for the `python` command. ## Libraries Spack installs Python libraries in `spec['python'].prefix.lib`. Except on openSUSE 13, where it installs to `spec['python'].prefix.lib64` (see #2295 and #2253). On my CentOS 6 machine, the Python libraries are installed in `/usr/lib64`. Both need to work. The libraries themselves change name depending on OS and Python version. For Python 2.7 on macOS, I'm seeing: ``` lib/libpython2.7.dylib ``` For Python 3.6 on CentOS 6, I'm seeing: ``` lib/libpython3.so lib/libpython3.6m.so.1.0 lib/libpython3.6m.so -> lib/libpython3.6m.so.1.0 ``` Notice the `m` after the version number. Yeah, that's a thing. ## Headers In Python 2.7, I'm seeing: ``` include/python2.7/pyconfig.h ``` In Python 3.6, I'm seeing: ``` include/python3.6m/pyconfig.h ``` It looks like all Python 3 installations have this `m`. Tested with Python 3.2 and 3.6 on macOS and CentOS 6 Spack has really nice support for libraries (`find_libraries` and `LibraryList`), but nothing for headers. Fixed. --- lib/spack/llnl/util/filesystem.py | 503 ++++++++++++++------- lib/spack/spack/package.py | 21 +- lib/spack/spack/spec.py | 127 ++++-- lib/spack/spack/test/database.py | 11 +- lib/spack/spack/test/file_list.py | 225 +++++++++ lib/spack/spack/test/library_list.py | 111 ----- lib/spack/spack/util/executable.py | 23 + var/spack/repos/builtin/packages/abinit/package.py | 12 +- var/spack/repos/builtin/packages/ack/package.py | 2 +- .../repos/builtin/packages/blast-plus/package.py | 2 +- var/spack/repos/builtin/packages/boost/package.py | 23 +- .../repos/builtin/packages/cantera/package.py | 6 +- .../repos/builtin/packages/conduit/package.py | 18 +- .../repos/builtin/packages/cosmomc/package.py | 2 +- var/spack/repos/builtin/packages/cp2k/package.py | 8 +- .../repos/builtin/packages/foam-extend/package.py | 4 +- var/spack/repos/builtin/packages/gcc/package.py | 2 +- var/spack/repos/builtin/packages/gdal/package.py | 2 +- var/spack/repos/builtin/packages/geos/package.py | 5 +- var/spack/repos/builtin/packages/git/package.py | 3 +- var/spack/repos/builtin/packages/go/package.py | 2 +- .../repos/builtin/packages/hdf5-blosc/package.py | 2 +- var/spack/repos/builtin/packages/hdf5/package.py | 2 +- .../repos/builtin/packages/hoomd-blue/package.py | 2 +- var/spack/repos/builtin/packages/julia/package.py | 4 +- .../repos/builtin/packages/libxml2/package.py | 2 +- var/spack/repos/builtin/packages/llvm/package.py | 2 +- var/spack/repos/builtin/packages/nwchem/package.py | 2 +- .../repos/builtin/packages/openblas/package.py | 2 +- var/spack/repos/builtin/packages/opencv/package.py | 19 +- .../builtin/packages/openspeedshop/package.py | 18 +- var/spack/repos/builtin/packages/pagmo/package.py | 2 +- .../repos/builtin/packages/paraview/package.py | 3 +- var/spack/repos/builtin/packages/perl/package.py | 3 +- var/spack/repos/builtin/packages/plumed/package.py | 2 +- var/spack/repos/builtin/packages/pocl/package.py | 2 +- var/spack/repos/builtin/packages/psi4/package.py | 3 +- var/spack/repos/builtin/packages/python/package.py | 258 ++++++++--- var/spack/repos/builtin/packages/scotch/package.py | 5 +- .../repos/builtin/packages/shiny-server/package.py | 4 +- var/spack/repos/builtin/packages/spark/package.py | 5 +- var/spack/repos/builtin/packages/stat/package.py | 2 +- .../repos/builtin/packages/subversion/package.py | 3 +- .../repos/builtin/packages/superlu-dist/package.py | 4 +- var/spack/repos/builtin/packages/visit/package.py | 2 +- 45 files changed, 985 insertions(+), 480 deletions(-) create mode 100644 lib/spack/spack/test/file_list.py delete mode 100644 lib/spack/spack/test/library_list.py (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 035f9a13ff..25dc747499 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -25,27 +25,32 @@ import collections import errno import fileinput +import fnmatch import glob import numbers import os import re import shutil +import six import stat import subprocess import sys from contextlib import contextmanager -import llnl.util.tty as tty +from llnl.util import tty from llnl.util.lang import dedupe __all__ = [ 'FileFilter', + 'HeaderList', 'LibraryList', 'ancestor', 'can_access', 'change_sed_delimiter', 'copy_mode', 'filter_file', + 'find', + 'find_headers', 'find_libraries', 'find_system_libraries', 'fix_darwin_install_name', @@ -66,25 +71,32 @@ __all__ = [ 'touchp', 'traverse_tree', 'unset_executable_mode', - 'working_dir'] + 'working_dir' +] def filter_file(regex, repl, *filenames, **kwargs): - """Like sed, but uses python regular expressions. - - Filters every line of each file through regex and replaces the file - with a filtered version. Preserves mode of filtered files. - - As with re.sub, ``repl`` can be either a string or a callable. - If it is a callable, it is passed the match object and should - return a suitable replacement string. If it is a string, it - can contain ``\1``, ``\2``, etc. to represent back-substitution - as sed would allow. - - Keyword Options: - string[=False] If True, treat regex as a plain string. - backup[=True] Make backup file(s) suffixed with ~ - ignore_absent[=False] Ignore any files that don't exist. + r"""Like sed, but uses python regular expressions. + + Filters every line of each file through regex and replaces the file + with a filtered version. Preserves mode of filtered files. + + As with re.sub, ``repl`` can be either a string or a callable. + If it is a callable, it is passed the match object and should + return a suitable replacement string. If it is a string, it + can contain ``\1``, ``\2``, etc. to represent back-substitution + as sed would allow. + + Parameters: + regex (str): The regular expression to search for + repl (str): The string to replace matches with + *filenames: One or more files to search and replace + + Keyword Arguments: + string (bool): Treat regex as a plain string. Default it False + backup (bool): Make backup file(s) suffixed with ``~``. Default is True + ignore_absent (bool): Ignore any files that don't exist. + Default is False """ string = kwargs.get('string', False) backup = kwargs.get('backup', True) @@ -128,7 +140,7 @@ def filter_file(regex, repl, *filenames, **kwargs): class FileFilter(object): - """Convenience class for calling filter_file a lot.""" + """Convenience class for calling ``filter_file`` a lot.""" def __init__(self, *filenames): self.filenames = filenames @@ -139,12 +151,18 @@ class FileFilter(object): def change_sed_delimiter(old_delim, new_delim, *filenames): """Find all sed search/replace commands and change the delimiter. - e.g., if the file contains seds that look like 's///', you can - call change_sed_delimiter('/', '@', file) to change the - delimiter to '@'. - NOTE that this routine will fail if the delimiter is ' or ". - Handling those is left for future work. + e.g., if the file contains seds that look like ``'s///'``, you can + call ``change_sed_delimiter('/', '@', file)`` to change the + delimiter to ``'@'``. + + Note that this routine will fail if the delimiter is ``'`` or ``"``. + Handling those is left for future work. + + Parameters: + old_delim (str): The delimiter to search for + new_delim (str): The delimiter to replace with + *filenames: One or more files to search and replace """ assert(len(old_delim) == 1) assert(len(new_delim) == 1) @@ -239,7 +257,7 @@ def mkdirp(*paths): def force_remove(*paths): - """Remove files without printing errors. Like rm -f, does NOT + """Remove files without printing errors. Like ``rm -f``, does NOT remove directories.""" for path in paths: try: @@ -278,7 +296,8 @@ def touch(path): def touchp(path): - """Like touch, but creates any parent directories needed for the file.""" + """Like ``touch``, but creates any parent directories needed for the file. + """ mkdirp(os.path.dirname(path)) touch(path) @@ -335,17 +354,13 @@ def traverse_tree(source_root, dest_root, rel_path='', **kwargs): ('root/b', 'dest/b') ('root/b/file3', 'dest/b/file3') - Optional args: - - order=[pre|post] -- Whether to do pre- or post-order traversal. - - ignore= -- Predicate indicating which files to ignore. - - follow_nonexisting -- Whether to descend into directories in - src that do not exit in dest. Default True. - - follow_links -- Whether to descend into symlinks in src. - + Keyword Arguments: + order (str): Whether to do pre- or post-order traversal. Accepted + values are 'pre' and 'post' + ignore (str): Predicate indicating which files to ignore + follow_nonexisting (bool): Whether to descend into directories in + ``src`` that do not exit in ``dest``. Default is True + follow_links (bool): Whether to descend into symlinks in ``src`` """ follow_nonexisting = kwargs.get('follow_nonexisting', True) follow_links = kwargs.get('follow_link', False) @@ -406,12 +421,10 @@ def set_executable(path): def remove_dead_links(root): - """ - Removes any dead link that is present in root - - Args: - root: path where to search for dead links + """Removes any dead link that is present in root. + Parameters: + root (str): path where to search for dead links """ for file in os.listdir(root): path = join_path(root, file) @@ -419,11 +432,10 @@ def remove_dead_links(root): def remove_if_dead_link(path): - """ - Removes the argument if it is a dead link, does nothing otherwise + """Removes the argument if it is a dead link. - Args: - path: the potential dead link + Parameters: + path (str): The potential dead link """ if os.path.islink(path): real_path = os.path.realpath(path) @@ -432,14 +444,13 @@ def remove_if_dead_link(path): def remove_linked_tree(path): - """ - Removes a directory and its contents. If the directory is a - symlink, follows the link and removes the real directory before - removing the link. + """Removes a directory and its contents. - Args: - path: directory to be removed + If the directory is a symlink, follows the link and removes the real + directory before removing the link. + Parameters: + path (str): Directory to be removed """ if os.path.exists(path): if os.path.islink(path): @@ -450,17 +461,17 @@ def remove_linked_tree(path): def fix_darwin_install_name(path): - """ - Fix install name of dynamic libraries on Darwin to have full 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 located + 1. Use ``install_name('-id', ...)`` to change install name of a single lib + 2. 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. + Parameters: + path (str): directory in which .dylib files are located """ libs = glob.glob(join_path(path, "*.dylib")) for lib in libs: @@ -486,29 +497,108 @@ def fix_darwin_install_name(path): stdout=subprocess.PIPE).communicate()[0] break -# Utilities for libraries +def find(root, files, recurse=True): + """Search for ``files`` starting from the ``root`` directory. -class LibraryList(collections.Sequence): - """Sequence of absolute paths to libraries + Like GNU/BSD find but written entirely in Python. - Provides a few convenience methods to manipulate library paths and get - commonly used compiler flags or names + Examples: + + .. code-block:: console + + $ find /usr -name python + + is equivalent to: + + >>> find('/usr', 'python') + + .. code-block:: console + + $ find /usr/local/bin -maxdepth 1 -name python + + is equivalent to: + + >>> find('/usr/local/bin', 'python', recurse=False) + + Accepts any glob characters accepted by fnmatch: + + ======= ==================================== + Pattern Meaning + ======= ==================================== + * matches everything + ? matches any single character + [seq] matches any character in ``seq`` + [!seq] matches any character not in ``seq`` + ======= ==================================== + + Parameters: + root (str): The root directory to start searching from + files (str or collections.Sequence): Library name(s) to search for + recurse (bool, optional): if False search only root folder, + if True descends top-down from the root. Defaults to True. + + Returns: + :func:`list`: The files that have been found """ + if isinstance(files, six.string_types): + files = [files] + + if recurse: + return _find_recursive(root, files) + else: + return _find_non_recursive(root, files) + + +def _find_recursive(root, search_files): + found_files = [] + + for path, _, list_files in os.walk(root): + for search_file in search_files: + for list_file in list_files: + if fnmatch.fnmatch(list_file, search_file): + found_files.append(join_path(path, list_file)) - def __init__(self, libraries): - self.libraries = list(libraries) + return found_files + + +def _find_non_recursive(root, search_files): + found_files = [] + + for list_file in os.listdir(root): + for search_file in search_files: + if fnmatch.fnmatch(list_file, search_file): + found_files.append(join_path(root, list_file)) + + return found_files + + +# Utilities for libraries and headers + + +class FileList(collections.Sequence): + """Sequence of absolute paths to files. + + Provides a few convenience methods to manipulate file paths. + """ + + def __init__(self, files): + if isinstance(files, six.string_types): + files = [files] + + self.files = list(dedupe(files)) @property def directories(self): - """Stable de-duplication of the directories where the libraries - reside + """Stable de-duplication of the directories where the files reside. >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir1/libc.a']) >>> assert l.directories == ['/dir1', '/dir2'] + >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) + >>> assert h.directories == ['/dir1', '/dir2'] """ return list(dedupe( - os.path.dirname(x) for x in self.libraries if os.path.dirname(x) + os.path.dirname(x) for x in self.files if os.path.dirname(x) )) @property @@ -517,8 +607,150 @@ class LibraryList(collections.Sequence): >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir3/liba.a']) >>> assert l.basenames == ['liba.a', 'libb.a'] + >>> h = HeaderList(['/dir1/a.h', '/dir2/b.h', '/dir3/a.h']) + >>> assert h.basenames == ['a.h', 'b.h'] """ - return list(dedupe(os.path.basename(x) for x in self.libraries)) + return list(dedupe(os.path.basename(x) for x in self.files)) + + @property + def names(self): + """Stable de-duplication of file names in the list + + >>> h = HeaderList(['/dir1/a.h', '/dir2/b.h', '/dir3/a.h']) + >>> assert h.names == ['a', 'b'] + """ + return list(dedupe(x.split('.')[0] for x in self.basenames)) + + def __getitem__(self, item): + cls = type(self) + if isinstance(item, numbers.Integral): + return self.files[item] + return cls(self.files[item]) + + def __add__(self, other): + return self.__class__(dedupe(self.files + list(other))) + + def __radd__(self, other): + return self.__add__(other) + + def __eq__(self, other): + return self.files == other.files + + def __len__(self): + return len(self.files) + + def joined(self, separator=' '): + return separator.join(self.files) + + def __repr__(self): + return self.__class__.__name__ + '(' + repr(self.files) + ')' + + def __str__(self): + return self.joined() + + +class HeaderList(FileList): + """Sequence of absolute paths to headers. + + Provides a few convenience methods to manipulate header paths and get + commonly used compiler flags or names. + """ + + def __init__(self, files): + super(HeaderList, self).__init__(files) + + self._macro_definitions = [] + + @property + def headers(self): + return self.files + + @property + def include_flags(self): + """Include flags + + >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) + >>> assert h.cpp_flags == '-I/dir1 -I/dir2' + """ + return ' '.join(['-I' + x for x in self.directories]) + + @property + def macro_definitions(self): + """Macro definitions + + >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) + >>> h.add_macro('-DBOOST_LIB_NAME=boost_regex') + >>> h.add_macro('-DBOOST_DYN_LINK') + >>> assert h.macro_definitions == '-DBOOST_LIB_NAME=boost_regex -DBOOST_DYN_LINK' # noqa + """ + return ' '.join(self._macro_definitions) + + @property + def cpp_flags(self): + """Include flags + macro definitions + + >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) + >>> h.add_macro('-DBOOST_DYN_LINK') + >>> assert h.macro_definitions == '-I/dir1 -I/dir2 -DBOOST_DYN_LINK' + """ + return self.include_flags + ' ' + self.macro_definitions + + def add_macro(self, macro): + """Add a macro definition""" + self._macro_definitions.append(macro) + + +def find_headers(headers, root, recurse=False): + """Returns an iterable object containing a list of full paths to + headers if found. + + Accepts any glob characters accepted by fnmatch: + + ======= ==================================== + Pattern Meaning + ======= ==================================== + * matches everything + ? matches any single character + [seq] matches any character in ``seq`` + [!seq] matches any character not in ``seq`` + ======= ==================================== + + Parameters: + headers (str or list of str): Header name(s) to search for + root (str): The root directory to start searching from + recurses (bool, optional): if False search only root folder, + if True descends top-down from the root. Defaults to False. + + Returns: + HeaderList: The headers that have been found + """ + if isinstance(headers, six.string_types): + headers = [headers] + elif not isinstance(headers, collections.Sequence): + message = '{0} expects a string or sequence of strings as the ' + message += 'first argument [got {1} instead]' + message = message.format(find_headers.__name__, type(headers)) + raise TypeError(message) + + # Construct the right suffix for the headers + suffix = 'h' + + # List of headers we are searching with suffixes + headers = ['{0}.{1}'.format(header, suffix) for header in headers] + + return HeaderList(find(root, headers, recurse)) + + +class LibraryList(FileList): + """Sequence of absolute paths to libraries + + Provides a few convenience methods to manipulate library paths and get + commonly used compiler flags or names + """ + + @property + def libraries(self): + return self.files @property def names(self): @@ -556,36 +788,9 @@ class LibraryList(collections.Sequence): """ return self.search_flags + ' ' + self.link_flags - def __getitem__(self, item): - cls = type(self) - if isinstance(item, numbers.Integral): - return self.libraries[item] - return cls(self.libraries[item]) - - def __add__(self, other): - return LibraryList(dedupe(self.libraries + list(other))) - - def __radd__(self, other): - return self.__add__(other) - - def __eq__(self, other): - return self.libraries == other.libraries - - def __len__(self): - return len(self.libraries) - - def joined(self, separator=' '): - return separator.join(self.libraries) - - def __repr__(self): - return self.__class__.__name__ + '(' + repr(self.libraries) + ')' - - def __str__(self): - return self.joined() - -def find_system_libraries(library_names, shared=True): - """Searches the usual system library locations for ``library_names``. +def find_system_libraries(libraries, shared=True): + """Searches the usual system library locations for ``libraries``. Search order is as follows: @@ -596,20 +801,32 @@ def find_system_libraries(library_names, shared=True): 5. ``/usr/local/lib64`` 6. ``/usr/local/lib`` - Args: - library_names (str or list of str): Library name(s) to search for - shared (bool): searches for shared libraries if True + Accepts any glob characters accepted by fnmatch: + + ======= ==================================== + Pattern Meaning + ======= ==================================== + * matches everything + ? matches any single character + [seq] matches any character in ``seq`` + [!seq] matches any character not in ``seq`` + ======= ==================================== + + Parameters: + libraries (str or list of str): Library name(s) to search for + shared (bool, optional): if True searches for shared libraries, + otherwise for static. Defaults to True. Returns: LibraryList: The libraries that have been found """ - if isinstance(library_names, str): - library_names = [library_names] - elif not isinstance(library_names, collections.Sequence): + if isinstance(libraries, six.string_types): + libraries = [libraries] + elif not isinstance(libraries, collections.Sequence): message = '{0} expects a string or sequence of strings as the ' message += 'first argument [got {1} instead]' - message = message.format( - find_system_libraries.__name__, type(library_names)) + message = message.format(find_system_libraries.__name__, + type(libraries)) raise TypeError(message) libraries_found = [] @@ -622,7 +839,7 @@ def find_system_libraries(library_names, shared=True): '/usr/local/lib', ] - for library in library_names: + for library in libraries: for root in search_locations: result = find_libraries(library, root, shared, recurse=True) if result: @@ -632,26 +849,38 @@ def find_system_libraries(library_names, shared=True): return libraries_found -def find_libraries(library_names, root, shared=True, recurse=False): +def find_libraries(libraries, root, shared=True, recurse=False): """Returns an iterable of full paths to libraries found in a root dir. - Args: - library_names (str or list of str): Library names to search for + Accepts any glob characters accepted by fnmatch: + + ======= ==================================== + Pattern Meaning + ======= ==================================== + * matches everything + ? matches any single character + [seq] matches any character in ``seq`` + [!seq] matches any character not in ``seq`` + ======= ==================================== + + Parameters: + libraries (str or list of str): Library name(s) to search for root (str): The root directory to start searching from - shared (bool): if True searches for shared libraries, otherwise static. - recurse (bool): if False search only root folder, - if True descends top-down from the root + shared (bool, optional): if True searches for shared libraries, + otherwise for static. Defaults to True. + recurse (bool, optional): if False search only root folder, + if True descends top-down from the root. Defaults to False. Returns: LibraryList: The libraries that have been found """ - if isinstance(library_names, str): - library_names = [library_names] - elif not isinstance(library_names, collections.Sequence): + if isinstance(libraries, six.string_types): + libraries = [libraries] + elif not isinstance(libraries, collections.Sequence): message = '{0} expects a string or sequence of strings as the ' message += 'first argument [got {1} instead]' - raise TypeError(message.format( - find_libraries.__name__, type(library_names))) + message = message.format(find_libraries.__name__, type(libraries)) + raise TypeError(message) # Construct the right suffix for the library if shared is True: @@ -659,38 +888,6 @@ def find_libraries(library_names, root, shared=True, recurse=False): else: suffix = 'a' # List of libraries we are searching with suffixes - libraries = ['{0}.{1}'.format(lib, suffix) for lib in library_names] - # Search method - if recurse is False: - search_method = _find_libraries_non_recursive - else: - search_method = _find_libraries_recursive - - return search_method(libraries, root) - - -def _find_libraries_recursive(libraries, root): - library_dict = collections.defaultdict(list) - for path, _, files in os.walk(root): - for lib in libraries: - if lib in files: - library_dict[lib].append( - join_path(path, lib) - ) - answer = [] - for lib in libraries: - answer.extend(library_dict[lib]) - return LibraryList(answer) - - -def _find_libraries_non_recursive(libraries, root): - - def lib_or_none(lib): - library = join_path(root, lib) - if not os.path.exists(library): - return None - return library + libraries = ['{0}.{1}'.format(lib, suffix) for lib in libraries] - return LibraryList( - [lib_or_none(lib) for lib in libraries if lib_or_none(lib) is not None] - ) + return LibraryList(find(root, libraries, recurse)) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 1e2210f928..12b91bcdb0 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -64,6 +64,7 @@ from llnl.util.lang import * from llnl.util.link_tree import LinkTree from llnl.util.tty.log import log_output from spack import directory_layout +from spack.util.executable import which from spack.stage import Stage, ResourceStage, StageComposite from spack.util.environment import dump_environment from spack.version import * @@ -1025,17 +1026,27 @@ class PackageBase(with_metaclass(PackageMeta, object)): return namespace def do_fake_install(self): - """Make a fake install directory containing a 'fake' file in bin.""" - # FIXME : Make this part of the 'install' behavior ? + """Make a fake install directory containing fake executables, + headers, and libraries.""" + + name = self.name + library_name = 'lib' + self.name + dso_suffix = '.dylib' if sys.platform == 'darwin' else '.so' + chmod = which('chmod') + mkdirp(self.prefix.bin) - touch(join_path(self.prefix.bin, 'fake')) + touch(join_path(self.prefix.bin, name)) + chmod('+x', join_path(self.prefix.bin, name)) + mkdirp(self.prefix.include) + touch(join_path(self.prefix.include, name + '.h')) + mkdirp(self.prefix.lib) - library_name = 'lib' + self.name - dso_suffix = 'dylib' if sys.platform == 'darwin' else 'so' touch(join_path(self.prefix.lib, library_name + dso_suffix)) touch(join_path(self.prefix.lib, library_name + '.a')) + mkdirp(self.prefix.man1) + packages_dir = spack.store.layout.build_packages_path(self.spec) dump_packages(self.spec, packages_dir) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 4cd89f59bf..0d8fb2893b 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -101,6 +101,8 @@ import collections import ctypes import hashlib import itertools +import os + from operator import attrgetter from six import StringIO from six import string_types @@ -115,12 +117,13 @@ import spack.store import spack.util.spack_json as sjson import spack.util.spack_yaml as syaml -from llnl.util.filesystem import find_libraries +from llnl.util.filesystem import find_headers, find_libraries, is_exe from llnl.util.lang import * from llnl.util.tty.color import * from spack.build_environment import get_path_from_module, load_module from spack.provider_index import ProviderIndex from spack.util.crypto import prefix_bits +from spack.util.executable import Executable from spack.util.prefix import Prefix from spack.util.spack_yaml import syaml_dict from spack.util.string import * @@ -745,9 +748,9 @@ class FlagMap(HashableMap): class DependencyMap(HashableMap): - """Each spec has a DependencyMap containing specs for its dependencies. The DependencyMap is keyed by name. """ + @property def concrete(self): return all((d.spec.concrete and d.deptypes) @@ -757,38 +760,104 @@ class DependencyMap(HashableMap): return "{deps: %s}" % ', '.join(str(d) for d in sorted(self.values())) -def _libs_default_handler(descriptor, spec, cls): - """Default handler when for ``libs`` attribute in Spec interface. +def _command_default_handler(descriptor, spec, cls): + """Default handler when looking for the 'command' attribute. - Tries to search for ``lib{spec.name}`` recursively starting from - `spec.prefix`. + Tries to search for ``spec.name`` in the ``spec.prefix.bin`` directory. - Args: - descriptor (ForwardQueryToPackage): descriptor that triggered - the call + Parameters: + descriptor (ForwardQueryToPackage): descriptor that triggered the call spec (Spec): spec that is being queried cls (type(spec)): type of spec, to match the signature of the - descriptor `__get__` method + descriptor ``__get__`` method + + Returns: + Executable: An executable of the command + + Raises: + RuntimeError: If the command is not found """ - name = 'lib' + spec.name - shared = '+shared' in spec - return find_libraries(name, root=spec.prefix, shared=shared, recurse=True) + path = os.path.join(spec.prefix.bin, spec.name) + + if is_exe(path): + return Executable(path) + else: + msg = 'Unable to locate {0} command in {1}' + raise RuntimeError(msg.format(spec.name, spec.prefix.bin)) -def _cppflags_default_handler(descriptor, spec, cls): - """Default handler for the ``cppflags`` attribute in the Spec interface. +def _headers_default_handler(descriptor, spec, cls): + """Default handler when looking for the 'headers' attribute. - The default just returns ``-I{spec.prefix.include}``. + Tries to search for ``*.h`` files recursively starting from + ``spec.prefix.include``. - Args: - descriptor (ForwardQueryToPackage): descriptor that triggered - the call + Parameters: + descriptor (ForwardQueryToPackage): descriptor that triggered the call spec (Spec): spec that is being queried + cls (type(spec)): type of spec, to match the signature of the + descriptor ``__get__`` method + + Returns: + HeaderList: The headers in ``prefix.include`` + + Raises: + RuntimeError: If no headers are found + """ + headers = find_headers('*', root=spec.prefix.include, recurse=True) + + if headers: + return headers + else: + msg = 'Unable to locate {0} headers in {1}' + raise RuntimeError(msg.format(spec.name, spec.prefix.include)) + + +def _libs_default_handler(descriptor, spec, cls): + """Default handler when looking for the 'libs' attribute. + Tries to search for ``lib{spec.name}`` recursively starting from + ``spec.prefix``. + + Parameters: + descriptor (ForwardQueryToPackage): descriptor that triggered the call + spec (Spec): spec that is being queried cls (type(spec)): type of spec, to match the signature of the descriptor ``__get__`` method + + Returns: + LibraryList: The libraries found + + Raises: + RuntimeError: If no libraries are found """ - return '-I' + spec.prefix.include + name = 'lib' + spec.name + + if '+shared' in spec: + libs = find_libraries( + name, root=spec.prefix, shared=True, recurse=True + ) + elif '~shared' in spec: + libs = find_libraries( + name, root=spec.prefix, shared=False, recurse=True + ) + else: + # Prefer shared + libs = find_libraries( + name, root=spec.prefix, shared=True, recurse=True + ) + if libs: + return libs + + libs = find_libraries( + name, root=spec.prefix, shared=False, recurse=True + ) + + if libs: + return libs + else: + msg = 'Unable to recursively locate {0} libraries in {1}' + raise RuntimeError(msg.format(spec.name, spec.prefix)) class ForwardQueryToPackage(object): @@ -797,7 +866,7 @@ class ForwardQueryToPackage(object): def __init__(self, attribute_name, default_handler=None): """Create a new descriptor. - Args: + Parameters: attribute_name (str): name of the attribute to be searched for in the Package instance default_handler (callable, optional): default function to be @@ -815,7 +884,7 @@ class ForwardQueryToPackage(object): """Retrieves the property from Package using a well defined chain of responsibility. - The order of call is : + The order of call is: 1. if the query was through the name of a virtual package try to search for the attribute `{virtual_name}_{attribute_name}` @@ -885,17 +954,21 @@ class ForwardQueryToPackage(object): class SpecBuildInterface(ObjectWrapper): + command = ForwardQueryToPackage( + 'command', + default_handler=_command_default_handler + ) + + headers = ForwardQueryToPackage( + 'headers', + default_handler=_headers_default_handler + ) libs = ForwardQueryToPackage( 'libs', default_handler=_libs_default_handler ) - cppflags = ForwardQueryToPackage( - 'cppflags', - default_handler=_cppflags_default_handler - ) - def __init__(self, spec, name, query_parameters): super(SpecBuildInterface, self).__init__(spec) diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index a4b35e1df7..6f8a2ef5d2 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -32,6 +32,7 @@ import os.path import pytest import spack import spack.store +from spack.util.executable import Executable from llnl.util.tty.colify import colify @@ -114,11 +115,17 @@ def test_default_queries(database): rec = install_db.get_record('zmpi') spec = rec.spec + libraries = spec['zmpi'].libs assert len(libraries) == 1 - cppflags_expected = '-I' + spec.prefix.include - assert spec['zmpi'].cppflags == cppflags_expected + headers = spec['zmpi'].headers + assert len(headers) == 1 + + command = spec['zmpi'].command + assert isinstance(command, Executable) + assert command.name == 'zmpi' + assert os.path.exists(command.path) def test_005_db_exists(database): diff --git a/lib/spack/spack/test/file_list.py b/lib/spack/spack/test/file_list.py new file mode 100644 index 0000000000..09517b4dab --- /dev/null +++ b/lib/spack/spack/test/file_list.py @@ -0,0 +1,225 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import unittest + +from llnl.util.filesystem import LibraryList, HeaderList + + +class LibraryListTest(unittest.TestCase): + def setUp(self): + l = [ + '/dir1/liblapack.a', + '/dir2/libfoo.dylib', + '/dir1/libblas.a', + '/dir3/libbar.so', + 'libbaz.so' + ] + self.liblist = LibraryList(l) + + def test_repr(self): + x = eval(repr(self.liblist)) + self.assertEqual(self.liblist, x) + + def test_joined_and_str(self): + s1 = self.liblist.joined() + self.assertEqual( + s1, + '/dir1/liblapack.a /dir2/libfoo.dylib /dir1/libblas.a /dir3/libbar.so libbaz.so' # NOQA: ignore=E501 + ) + s2 = str(self.liblist) + self.assertEqual(s1, s2) + s3 = self.liblist.joined(';') + self.assertEqual( + s3, + '/dir1/liblapack.a;/dir2/libfoo.dylib;/dir1/libblas.a;/dir3/libbar.so;libbaz.so' # NOQA: ignore=E501 + ) + + def test_flags(self): + search_flags = self.liblist.search_flags + self.assertTrue('-L/dir1' in search_flags) + self.assertTrue('-L/dir2' in search_flags) + self.assertTrue('-L/dir3' in search_flags) + self.assertTrue(isinstance(search_flags, str)) + self.assertEqual( + search_flags, + '-L/dir1 -L/dir2 -L/dir3' + ) + + link_flags = self.liblist.link_flags + self.assertTrue('-llapack' in link_flags) + self.assertTrue('-lfoo' in link_flags) + self.assertTrue('-lblas' in link_flags) + self.assertTrue('-lbar' in link_flags) + self.assertTrue('-lbaz' in link_flags) + self.assertTrue(isinstance(link_flags, str)) + self.assertEqual( + link_flags, + '-llapack -lfoo -lblas -lbar -lbaz' + ) + + ld_flags = self.liblist.ld_flags + self.assertTrue(isinstance(ld_flags, str)) + self.assertEqual( + ld_flags, + search_flags + ' ' + link_flags + ) + + def test_paths_manipulation(self): + names = self.liblist.names + self.assertEqual(names, ['lapack', 'foo', 'blas', 'bar', 'baz']) + + directories = self.liblist.directories + self.assertEqual(directories, ['/dir1', '/dir2', '/dir3']) + + def test_get_item(self): + a = self.liblist[0] + self.assertEqual(a, '/dir1/liblapack.a') + + b = self.liblist[:] + self.assertEqual(type(b), type(self.liblist)) + self.assertEqual(self.liblist, b) + self.assertTrue(self.liblist is not b) + + def test_add(self): + pylist = [ + '/dir1/liblapack.a', # removed from the final list + '/dir2/libbaz.so', + '/dir4/libnew.a' + ] + another = LibraryList(pylist) + l = self.liblist + another + self.assertEqual(len(l), 7) + # Invariant : l == l + l + self.assertEqual(l, l + l) + # Always produce an instance of LibraryList + self.assertEqual( + type(self.liblist), + type(self.liblist + pylist) + ) + self.assertEqual( + type(pylist + self.liblist), + type(self.liblist) + ) + + +class HeaderListTest(unittest.TestCase): + def setUp(self): + h = [ + '/dir1/Python.h', + '/dir2/datetime.h', + '/dir1/pyconfig.h', + '/dir3/core.h', + 'pymem.h' + ] + headlist = HeaderList(h) + headlist.add_macro('-DBOOST_LIB_NAME=boost_regex') + headlist.add_macro('-DBOOST_DYN_LINK') + self.headlist = headlist + + def test_repr(self): + x = eval(repr(self.headlist)) + self.assertEqual(self.headlist, x) + + def test_joined_and_str(self): + s1 = self.headlist.joined() + self.assertEqual( + s1, + '/dir1/Python.h /dir2/datetime.h /dir1/pyconfig.h /dir3/core.h pymem.h' # NOQA: ignore=E501 + ) + s2 = str(self.headlist) + self.assertEqual(s1, s2) + s3 = self.headlist.joined(';') + self.assertEqual( + s3, + '/dir1/Python.h;/dir2/datetime.h;/dir1/pyconfig.h;/dir3/core.h;pymem.h' # NOQA: ignore=E501 + ) + + def test_flags(self): + include_flags = self.headlist.include_flags + self.assertTrue('-I/dir1' in include_flags) + self.assertTrue('-I/dir2' in include_flags) + self.assertTrue('-I/dir3' in include_flags) + self.assertTrue(isinstance(include_flags, str)) + self.assertEqual( + include_flags, + '-I/dir1 -I/dir2 -I/dir3' + ) + + macros = self.headlist.macro_definitions + self.assertTrue('-DBOOST_LIB_NAME=boost_regex' in macros) + self.assertTrue('-DBOOST_DYN_LINK' in macros) + self.assertTrue(isinstance(macros, str)) + self.assertEqual( + macros, + '-DBOOST_LIB_NAME=boost_regex -DBOOST_DYN_LINK' + ) + + cpp_flags = self.headlist.cpp_flags + self.assertTrue(isinstance(cpp_flags, str)) + self.assertEqual( + cpp_flags, + include_flags + ' ' + macros + ) + + def test_paths_manipulation(self): + names = self.headlist.names + self.assertEqual( + names, + ['Python', 'datetime', 'pyconfig', 'core', 'pymem'] + ) + + directories = self.headlist.directories + self.assertEqual(directories, ['/dir1', '/dir2', '/dir3']) + + def test_get_item(self): + a = self.headlist[0] + self.assertEqual(a, '/dir1/Python.h') + + b = self.headlist[:] + self.assertEqual(type(b), type(self.headlist)) + self.assertEqual(self.headlist, b) + self.assertTrue(self.headlist is not b) + + def test_add(self): + pylist = [ + '/dir1/Python.h', # removed from the final list + '/dir2/pyconfig.h', + '/dir4/datetime.h' + ] + another = HeaderList(pylist) + h = self.headlist + another + self.assertEqual(len(h), 7) + # Invariant : l == l + l + self.assertEqual(h, h + h) + # Always produce an instance of HeaderList + self.assertEqual( + type(self.headlist), + type(self.headlist + pylist) + ) + self.assertEqual( + type(pylist + self.headlist), + type(self.headlist) + ) diff --git a/lib/spack/spack/test/library_list.py b/lib/spack/spack/test/library_list.py deleted file mode 100644 index 7fc2fd222f..0000000000 --- a/lib/spack/spack/test/library_list.py +++ /dev/null @@ -1,111 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -############################################################################## - -import unittest - -from llnl.util.filesystem import LibraryList - - -class LibraryListTest(unittest.TestCase): - def setUp(self): - l = [ - '/dir1/liblapack.a', - '/dir2/libfoo.dylib', - '/dir1/libblas.a', - '/dir3/libbar.so', - 'libbaz.so' - ] - self.liblist = LibraryList(l) - - def test_repr(self): - x = eval(repr(self.liblist)) - self.assertEqual(self.liblist, x) - - def test_joined_and_str(self): - s1 = self.liblist.joined() - self.assertEqual( - s1, - '/dir1/liblapack.a /dir2/libfoo.dylib /dir1/libblas.a /dir3/libbar.so libbaz.so' # NOQA: ignore=E501 - ) - s2 = str(self.liblist) - self.assertEqual(s1, s2) - s3 = self.liblist.joined(';') - self.assertEqual( - s3, - '/dir1/liblapack.a;/dir2/libfoo.dylib;/dir1/libblas.a;/dir3/libbar.so;libbaz.so' # NOQA: ignore=E501 - ) - - def test_flags(self): - search_flags = self.liblist.search_flags - self.assertTrue('-L/dir1' in search_flags) - self.assertTrue('-L/dir2' in search_flags) - self.assertTrue('-L/dir3' in search_flags) - self.assertTrue(isinstance(search_flags, str)) - - link_flags = self.liblist.link_flags - self.assertEqual( - link_flags, - '-llapack -lfoo -lblas -lbar -lbaz' - ) - - ld_flags = self.liblist.ld_flags - self.assertEqual(ld_flags, search_flags + ' ' + link_flags) - - def test_paths_manipulation(self): - names = self.liblist.names - self.assertEqual(names, ['lapack', 'foo', 'blas', 'bar', 'baz']) - - directories = self.liblist.directories - self.assertEqual(directories, ['/dir1', '/dir2', '/dir3']) - - def test_get_item(self): - a = self.liblist[0] - self.assertEqual(a, '/dir1/liblapack.a') - - b = self.liblist[:] - self.assertEqual(type(b), type(self.liblist)) - self.assertEqual(self.liblist, b) - self.assertTrue(self.liblist is not b) - - def test_add(self): - pylist = [ - '/dir1/liblapack.a', # removed from the final list - '/dir2/libbaz.so', - '/dir4/libnew.a' - ] - another = LibraryList(pylist) - l = self.liblist + another - self.assertEqual(len(l), 7) - # Invariant : l == l + l - self.assertEqual(l, l + l) - # Always produce an instance of LibraryList - self.assertEqual( - type(self.liblist), - type(self.liblist + pylist) - ) - self.assertEqual( - type(pylist + self.liblist), - type(self.liblist) - ) diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 1d7f019fdf..44865e7bdb 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -53,8 +53,31 @@ class Executable(object): @property def command(self): + """The command-line string. + + Returns: + str: The executable and default arguments + """ return ' '.join(self.exe) + @property + def name(self): + """The executable name. + + Returns: + str: The basename of the executable + """ + return os.path.basename(self.path) + + @property + def path(self): + """The path to the executable. + + Returns: + str: The path to the executable + """ + return self.exe[0] + def __call__(self, *args, **kwargs): """Run this executable in a subprocess. diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py index fe1c7ec778..d73b89ea69 100644 --- a/var/spack/repos/builtin/packages/abinit/package.py +++ b/var/spack/repos/builtin/packages/abinit/package.py @@ -33,9 +33,9 @@ class Abinit(AutotoolsPackage): energy, charge density and electronic structure of systems made of electrons and nuclei (molecules and periodic solids) within Density Functional Theory (DFT), using pseudopotentials and a planewave - or wavelet basis. - - ABINIT also includes options to optimize the geometry according to the + or wavelet basis. + + ABINIT also includes options to optimize the geometry according to the DFT forces and stresses, or to perform molecular dynamics simulations using these forces, or to generate dynamical matrices, Born effective charges, and dielectric tensors, based on Density-Functional @@ -149,7 +149,7 @@ class Abinit(AutotoolsPackage): # LibXC library libxc = spec['libxc:fortran'] options.extend([ - 'with_libxc_incs={0}'.format(libxc.cppflags), + 'with_libxc_incs={0}'.format(libxc.headers.cpp_flags), 'with_libxc_libs={0}'.format(libxc.libs.ld_flags + ' -lm') ]) @@ -161,7 +161,7 @@ class Abinit(AutotoolsPackage): hdf5 = spec['hdf5:hl'] netcdff = spec['netcdf-fortran:shared'] options.extend([ - '--with-netcdf-incs={0}'.format(netcdff.cppflags), + '--with-netcdf-incs={0}'.format(netcdff.headers.cpp_flags), '--with-netcdf-libs={0}'.format( netcdff.libs.ld_flags + ' ' + hdf5.libs.ld_flags ), @@ -175,7 +175,7 @@ class Abinit(AutotoolsPackage): def check(self): """This method is called after the build phase if tests have been - explicitly activated by user. + explicitly activated by user. """ make('check') make('tests_in') diff --git a/var/spack/repos/builtin/packages/ack/package.py b/var/spack/repos/builtin/packages/ack/package.py index dd6685a829..b377c30fe9 100644 --- a/var/spack/repos/builtin/packages/ack/package.py +++ b/var/spack/repos/builtin/packages/ack/package.py @@ -45,7 +45,7 @@ class Ack(Package): ack = 'ack-{0}-single-file'.format(self.version) # rewrite the script's #! line to call the perl dependency - shbang = '#!' + join_path(spec['perl'].prefix.bin, 'perl') + shbang = '#!' + spec['perl'].command.path filter_file(r'^#!/usr/bin/env perl', shbang, ack) install(ack, join_path(prefix.bin, "ack")) diff --git a/var/spack/repos/builtin/packages/blast-plus/package.py b/var/spack/repos/builtin/packages/blast-plus/package.py index 7cab51b0be..3faf852739 100644 --- a/var/spack/repos/builtin/packages/blast-plus/package.py +++ b/var/spack/repos/builtin/packages/blast-plus/package.py @@ -206,7 +206,7 @@ class BlastPlus(AutotoolsPackage): if '+python' in spec: config_args.append( - '--with-python={0}'.format(self.spec['python'].prefix) + '--with-python={0}'.format(self.spec['python'].home) ) else: config_args.append('--without-python') diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index 487445ab10..d4c772ed03 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -25,7 +25,6 @@ from spack import * import sys import os -from glob import glob class Boost(Package): @@ -173,23 +172,11 @@ class Boost(Package): return 'gcc' def bjam_python_line(self, spec): - from os.path import dirname, splitext - pydir = 'python%s.%s*' % spec['python'].version.version[:2] - incs = join_path(spec['python'].prefix.include, pydir, "pyconfig.h") - incs = glob(incs) - incs = " ".join([dirname(u) for u in incs]) - - pylib = 'libpython%s.%s*' % spec['python'].version.version[:2] - all_libs = join_path(spec['python'].prefix.lib, pylib) - libs = [u for u in all_libs if splitext(u)[1] == dso_suffix] - if len(libs) == 0: - libs = [u for u in all_libs if splitext(u)[1] == '.a'] - - libs = " ".join(libs) - return 'using python : %s : %s : %s : %s ;\n' % ( + return 'using python : {0} : {1} : {2} : {3} ;\n'.format( spec['python'].version.up_to(2), - join_path(spec['python'].prefix.bin, 'python'), - incs, libs + spec['python'].command.path, + spec['python'].headers.directories[0], + spec['python'].libs[0] ) def determine_bootstrap_options(self, spec, withLibs, options): @@ -198,7 +185,7 @@ class Boost(Package): options.append("--with-libraries=%s" % ','.join(withLibs)) if '+python' in spec: - options.append('--with-python=%s' % python_exe) + options.append('--with-python=%s' % spec['python'].command.path) with open('user-config.jam', 'w') as f: # Boost may end up using gcc even though clang+gfortran is set in diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py index 0685772f82..aa7c7dc98c 100644 --- a/var/spack/repos/builtin/packages/cantera/package.py +++ b/var/spack/repos/builtin/packages/cantera/package.py @@ -117,15 +117,13 @@ class Cantera(Package): if '+python' in spec: options.extend([ 'python_package=full', - 'python_cmd={0}'.format( - join_path(spec['python'].prefix.bin, 'python')), + 'python_cmd={0}'.format(spec['python'].command.path), 'python_array_home={0}'.format(spec['py-numpy'].prefix) ]) if spec['python'].satisfies('@3'): options.extend([ 'python3_package=y', - 'python3_cmd={0}'.format( - join_path(spec['python'].prefix.bin, 'python')), + 'python3_cmd={0}'.format(spec['python'].command.path), 'python3_array_home={0}'.format(spec['py-numpy'].prefix) ]) else: diff --git a/var/spack/repos/builtin/packages/conduit/package.py b/var/spack/repos/builtin/packages/conduit/package.py index ddefde4fb7..d97c6534e4 100644 --- a/var/spack/repos/builtin/packages/conduit/package.py +++ b/var/spack/repos/builtin/packages/conduit/package.py @@ -174,13 +174,13 @@ class Conduit(Package): ############################################## if "+cmake" in spec: - cmake_exe = join_path(spec['cmake'].prefix.bin, "cmake") + cmake_exe = spec['cmake'].command.path else: cmake_exe = which("cmake") if cmake_exe is None: msg = 'failed to find CMake (and cmake variant is off)' raise RuntimeError(msg) - cmake_exe = cmake_exe.command + cmake_exe = cmake_exe.path host_cfg_fname = "%s-%s-%s.cmake" % (socket.gethostname(), sys_type, @@ -224,21 +224,15 @@ class Conduit(Package): cfg.write("# Python Support\n") if "+python" in spec: - python_exe = join_path(spec['python'].prefix.bin, "python") cfg.write("# Enable python module builds\n") cfg.write(cmake_cache_entry("ENABLE_PYTHON", "ON")) cfg.write("# python from spack \n") - cfg.write(cmake_cache_entry("PYTHON_EXECUTABLE", python_exe)) + cfg.write(cmake_cache_entry("PYTHON_EXECUTABLE", + spec['python'].command.path)) # install module to standard style site packages dir # so we can support spack activate - py_ver_short = "python{0}".format(spec["python"].version.up_to(2)) - pym_prefix = join_path("${CMAKE_INSTALL_PREFIX}", - "lib", - py_ver_short, - "site-packages") - # use pym_prefix as the install path cfg.write(cmake_cache_entry("PYTHON_MODULE_INSTALL_PREFIX", - pym_prefix)) + site_packages_dir)) else: cfg.write(cmake_cache_entry("ENABLE_PYTHON", "OFF")) @@ -251,7 +245,7 @@ class Conduit(Package): cfg.write(cmake_cache_entry("SPHINX_EXECUTABLE", sphinx_build_exe)) cfg.write("# doxygen from uberenv\n") - doxygen_exe = join_path(spec['doxygen'].prefix.bin, "doxygen") + doxygen_exe = spec['doxygen'].command.path cfg.write(cmake_cache_entry("DOXYGEN_EXECUTABLE", doxygen_exe)) else: cfg.write(cmake_cache_entry("ENABLE_DOCS", "OFF")) diff --git a/var/spack/repos/builtin/packages/cosmomc/package.py b/var/spack/repos/builtin/packages/cosmomc/package.py index 1e83e02d65..6c41002079 100644 --- a/var/spack/repos/builtin/packages/cosmomc/package.py +++ b/var/spack/repos/builtin/packages/cosmomc/package.py @@ -178,7 +178,7 @@ class Cosmomc(Package): os.environ.pop('CLIKPATH', '') os.environ.pop('PLANCKLIKE', '') - exe = join_path(prefix.bin, 'cosmomc') + exe = spec['cosmomc'].command.path args = [] if '+mpi' in spec: # Add mpirun prefix diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 9bc1026ba9..06e4697904 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -93,10 +93,10 @@ class Cp2k(Package): cppflags = [ '-D__FFTW3', '-D__LIBINT', - spec['fftw'].cppflags + spec['fftw'].headers.cpp_flags ] fcflags = copy.deepcopy(optflags[self.spec.compiler.name]) - fcflags.append(spec['fftw'].cppflags) + fcflags.append(spec['fftw'].headers.cpp_flags) fftw = find_libraries('libfftw3', root=spec['fftw'].prefix.lib) ldflags = [fftw.search_flags] if 'superlu-dist@4.3' in spec: @@ -161,14 +161,14 @@ class Cp2k(Package): cppflags.append('-D__WANNIER90') fcflags.extend([ - # spec['elpa:fortran'].cppflags + # spec['elpa:fortran'].headers.cpp_flags '-I' + join_path( spec['elpa'].prefix, 'include', 'elpa-{0}'.format(str(spec['elpa'].version)), 'modules' ), - # spec[pexsi:fortran].cppflags + # spec[pexsi:fortran].headers.cpp_flags '-I' + join_path(spec['pexsi'].prefix, 'fortran') ]) scalapack = spec['scalapack'].libs diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py index 559cc45d7a..c68e570c0f 100644 --- a/var/spack/repos/builtin/packages/foam-extend/package.py +++ b/var/spack/repos/builtin/packages/foam-extend/package.py @@ -356,8 +356,8 @@ echo WM_PROJECT_DIR = $WM_PROJECT_DIR 'CMAKE_BIN_DIR': spec['cmake'].prefix.bin, }, 'python': { - 'PYTHON_DIR': spec['python'].prefix, - 'PYTHON_BIN_DIR': spec['python'].prefix.bin, + 'PYTHON_DIR': spec['python'].home, + 'PYTHON_BIN_DIR': spec['python'].home.bin, }, 'flex': { 'FLEX_SYSTEM': 1, diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index 00518c8cf4..b362060e61 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -176,7 +176,7 @@ class Gcc(AutotoolsPackage): self.spec.format('$_$@')) return - gcc = Executable(join_path(self.prefix.bin, 'gcc')) + gcc = self.spec['gcc'].command lines = gcc('-dumpspecs', output=str).strip().split("\n") specs_file = join_path(self.spec_dir, 'specs') with closing(open(specs_file, 'w')) as out: diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py index dc58cc8993..1b9a4f0818 100644 --- a/var/spack/repos/builtin/packages/gdal/package.py +++ b/var/spack/repos/builtin/packages/gdal/package.py @@ -72,7 +72,7 @@ class Gdal(Package): 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("--with-python=%s" % spec['python'].command.path) args.append("--without-libtool") if '+geos' in spec: diff --git a/var/spack/repos/builtin/packages/geos/package.py b/var/spack/repos/builtin/packages/geos/package.py index 324186cfbc..2419eed038 100644 --- a/var/spack/repos/builtin/packages/geos/package.py +++ b/var/spack/repos/builtin/packages/geos/package.py @@ -60,9 +60,8 @@ class Geos(Package): def install(self, spec, prefix): args = ["--prefix=%s" % prefix] # 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') +# os.environ['PYTHON'] = spec['python'].command.path +# os.environ['SWIG'] = spec['swig'].command.path # # args.append("--enable-python") diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py index dfa4e08643..d71f49bff6 100644 --- a/var/spack/repos/builtin/packages/git/package.py +++ b/var/spack/repos/builtin/packages/git/package.py @@ -162,8 +162,7 @@ class Git(AutotoolsPackage): '--with-iconv={0}'.format(spec['libiconv'].prefix), '--with-libpcre={0}'.format(spec['pcre'].prefix), '--with-openssl={0}'.format(spec['openssl'].prefix), - '--with-perl={0}'.format( - join_path(spec['perl'].prefix.bin, 'perl')), + '--with-perl={0}'.format(spec['perl'].command.path), '--with-zlib={0}'.format(spec['zlib'].prefix), ] diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index 7f1523ca6d..05a903ea74 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -117,7 +117,7 @@ class Go(Package): shutil.copytree('bin', os.path.join(prefix, '/bin')) """ # Add a go command/compiler for extensions - module.go = Executable(join_path(self.spec.prefix.bin, 'go')) + module.go = self.spec['go'].command def setup_dependent_environment(self, spack_env, run_env, dependent_spec): if os.environ.get('GOROOT', False): diff --git a/var/spack/repos/builtin/packages/hdf5-blosc/package.py b/var/spack/repos/builtin/packages/hdf5-blosc/package.py index 79f23d7d92..053a4d4852 100644 --- a/var/spack/repos/builtin/packages/hdf5-blosc/package.py +++ b/var/spack/repos/builtin/packages/hdf5-blosc/package.py @@ -69,7 +69,7 @@ class Hdf5Blosc(Package): # if sys.platform == "darwin": # fix_darwin_install_name(prefix.lib) - libtool = Executable(join_path(spec["libtool"].prefix.bin, "libtool")) + libtool = spec["libtool"].command # TODO: these vars are not used. # if "+mpi" in spec["hdf5"]: diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 4da24dd7f1..5a3f9e5657 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -257,7 +257,7 @@ HDF5 version {version} {version} cc = Executable(spec['mpi'].mpicc) else: cc = Executable(self.compiler.cc) - cc(*(['-c', "check.c"] + spec['hdf5'].cppflags.split())) + cc(*(['-c', "check.c"] + spec['hdf5'].headers.cpp_flags.split())) cc(*(['-o', "check", "check.o"] + spec['hdf5'].libs.ld_flags.split())) try: diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py index 3d56f08dc0..0aa9574a6d 100644 --- a/var/spack/repos/builtin/packages/hoomd-blue/package.py +++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py @@ -81,7 +81,7 @@ class HoomdBlue(CMakePackage): spec = self.spec cmake_args = [ - '-DPYTHON_EXECUTABLE={0}/python'.format(spec['python'].prefix.bin), + '-DPYTHON_EXECUTABLE={0}'.format(spec['python'].command.path), ] # MPI support diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py index 4e7c65f53a..007a384f10 100644 --- a/var/spack/repos/builtin/packages/julia/package.py +++ b/var/spack/repos/builtin/packages/julia/package.py @@ -185,7 +185,7 @@ class Julia(Package): juliarc.write('\n') # Install some commonly used packages - julia = Executable(join_path(prefix.bin, "julia")) + julia = spec['julia'].command julia("-e", 'Pkg.init(); Pkg.update()') # Install HDF5 @@ -216,7 +216,7 @@ class Julia(Package): with open(join_path(prefix, "etc", "julia", "juliarc.jl"), "a") as juliarc: juliarc.write('# Python\n') - juliarc.write('ENV["PYTHON"] = "%s"\n' % spec["python"].prefix) + juliarc.write('ENV["PYTHON"] = "%s"\n' % spec["python"].home) juliarc.write('\n') # Python's OpenSSL package installer complains: # Error: PREFIX too long: 166 characters, but only 128 allowed diff --git a/var/spack/repos/builtin/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py index 470998d882..4324b1dcd3 100644 --- a/var/spack/repos/builtin/packages/libxml2/package.py +++ b/var/spack/repos/builtin/packages/libxml2/package.py @@ -49,7 +49,7 @@ class Libxml2(AutotoolsPackage): spec = self.spec if '+python' in spec: python_args = [ - '--with-python={0}'.format(spec['python'].prefix), + '--with-python={0}'.format(spec['python'].home), '--with-python-install-dir={0}'.format(site_packages_dir) ] else: diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index d2bf06e358..868e336778 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -339,7 +339,7 @@ class Llvm(CMakePackage): cmake_args = [ '-DLLVM_REQUIRES_RTTI:BOOL=ON', '-DCLANG_DEFAULT_OPENMP_RUNTIME:STRING=libomp', - '-DPYTHON_EXECUTABLE:PATH=%s/bin/python' % spec['python'].prefix + '-DPYTHON_EXECUTABLE:PATH={0}'.format(spec['python'].command.path), ] if '+gold' in spec: diff --git a/var/spack/repos/builtin/packages/nwchem/package.py b/var/spack/repos/builtin/packages/nwchem/package.py index 3a8be3f56e..10c5ec5701 100644 --- a/var/spack/repos/builtin/packages/nwchem/package.py +++ b/var/spack/repos/builtin/packages/nwchem/package.py @@ -88,7 +88,7 @@ class Nwchem(Package): 'MPI_LOC=%s' % spec['mpi'].prefix, 'USE_PYTHONCONFIG=y', 'PYTHONVERSION=%s' % spec['python'].version.up_to(2), - 'PYTHONHOME=%s' % spec['python'].prefix, + 'PYTHONHOME=%s' % spec['python'].home, 'BLASOPT=%s' % ((lapack + blas).ld_flags), 'BLAS_LIB=%s' % blas.ld_flags, 'LAPACK_LIB=%s' % lapack.ld_flags, diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index 81f4841931..4ebb38aa7a 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -150,7 +150,7 @@ class Openblas(MakefilePackage): blessed_file = join_path(os.path.dirname(self.module.__file__), 'test_cblas_dgemm.output') - include_flags = spec['openblas'].cppflags + include_flags = spec['openblas'].headers.cpp_flags link_flags = spec['openblas'].libs.ld_flags if self.compiler.name == 'intel': link_flags += ' -lifcore' diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py index 8a721032a6..b052cfa12a 100644 --- a/var/spack/repos/builtin/packages/opencv/package.py +++ b/var/spack/repos/builtin/packages/opencv/package.py @@ -23,7 +23,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -from glob import glob class Opencv(Package): @@ -166,22 +165,11 @@ class Opencv(Package): # Python if '+python' in spec: - python = spec['python'] - - try: - python_lib = glob(join_path( - python.prefix.lib, 'libpython*.{0}'.format(dso_suffix)))[0] - except KeyError: - raise InstallError('Cannot find libpython') - - try: - python_include_dir = glob(join_path(python.prefix.include, - 'python*'))[0] - except KeyError: - raise InstallError('Cannot find python include directory') + python_exe = spec['python'].command.path + python_lib = spec['python'].libs[0] + python_include_dir = spec['python'].headers.directories[0] if '^python@3:' in spec: - python_exe = join_path(python.prefix.bin, 'python3') cmake_options.extend([ '-DBUILD_opencv_python3=ON', '-DPYTHON3_EXECUTABLE={0}'.format(python_exe), @@ -190,7 +178,6 @@ class Opencv(Package): '-DBUILD_opencv_python2=OFF', ]) elif '^python@2:3' in spec: - python_exe = join_path(python.prefix.bin, 'python2') cmake_options.extend([ '-DBUILD_opencv_python2=ON', '-DPYTHON2_EXECUTABLE={0}'.format(python_exe), diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index c4b150f56c..6ad28ce3b7 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -167,24 +167,18 @@ class Openspeedshop(Package): # Appends to cmakeOptions the options that will enable # the appropriate base level options to the openspeedshop # cmake build. - python_vers = format(spec['python'].version.up_to(2)) - python_pv = '/python' + python_vers - python_pvs = '/libpython' + python_vers + '.' + format(dso_suffix) + python_exe = spec['python'].command.path + python_library = spec['python'].libs[0] + python_include = spec['python'].headers.directories[0] BaseOptions = [] BaseOptions.append('-DBINUTILS_DIR=%s' % spec['binutils'].prefix) BaseOptions.append('-DLIBELF_DIR=%s' % spec['libelf'].prefix) BaseOptions.append('-DLIBDWARF_DIR=%s' % spec['libdwarf'].prefix) - BaseOptions.append( - '-DPYTHON_EXECUTABLE=%s' - % join_path(spec['python'].prefix + '/bin/python')) - BaseOptions.append( - '-DPYTHON_INCLUDE_DIR=%s' - % join_path(spec['python'].prefix.include) + python_pv) - BaseOptions.append( - '-DPYTHON_LIBRARY=%s' - % join_path(spec['python'].prefix.lib) + python_pvs) + BaseOptions.append('-DPYTHON_EXECUTABLE=%s' % python_exe) + BaseOptions.append('-DPYTHON_INCLUDE_DIR=%s' % python_include) + BaseOptions.append('-DPYTHON_LIBRARY=%s' % python_library) BaseOptions.append('-DBoost_NO_SYSTEM_PATHS=TRUE') BaseOptions.append('-DBoost_NO_BOOST_CMAKE=TRUE') BaseOptions.append('-DBOOST_ROOT=%s' % spec['boost'].prefix) diff --git a/var/spack/repos/builtin/packages/pagmo/package.py b/var/spack/repos/builtin/packages/pagmo/package.py index 5a06b70e38..eeeb437db7 100644 --- a/var/spack/repos/builtin/packages/pagmo/package.py +++ b/var/spack/repos/builtin/packages/pagmo/package.py @@ -110,7 +110,7 @@ class Pagmo(CMakePackage): if '+python' in spec: args.extend([ # By default picks up the system python not the Spack build - '-DPYTHON_EXECUTABLE={0}'.format(python_exe), + '-DPYTHON_EXECUTABLE={0}'.format(spec['python'].command.path), # By default installs to the python prefix not the pagmo prefix '-DPYTHON_MODULES_DIR={0}'.format(site_packages_dir), ]) diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py index 9b2b33625a..ea0722dab8 100644 --- a/var/spack/repos/builtin/packages/paraview/package.py +++ b/var/spack/repos/builtin/packages/paraview/package.py @@ -120,8 +120,7 @@ class Paraview(CMakePackage): if '+python' in spec: cmake_args.extend([ '-DPARAVIEW_ENABLE_PYTHON:BOOL=ON', - '-DPYTHON_EXECUTABLE:FILEPATH=%s/bin/python' - % spec['python'].prefix + '-DPYTHON_EXECUTABLE:FILEPATH=%s' % spec['python'].command.path ]) if '+mpi' in spec: diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py index ad67cae48c..dc1f7be93c 100644 --- a/var/spack/repos/builtin/packages/perl/package.py +++ b/var/spack/repos/builtin/packages/perl/package.py @@ -113,11 +113,10 @@ class Perl(Package): # Perl doesn't use Autotools, it should subclass Package @run_after('install') def install_cpanm(self): spec = self.spec - prefix = self.prefix if '+cpanm' in spec: with working_dir(join_path('cpanm', 'cpanm')): - perl = Executable(join_path(prefix.bin, 'perl')) + perl = spec['perl'].command perl('Makefile.PL') make() make('install') diff --git a/var/spack/repos/builtin/packages/plumed/package.py b/var/spack/repos/builtin/packages/plumed/package.py index 60443cbcc6..3022cd7959 100644 --- a/var/spack/repos/builtin/packages/plumed/package.py +++ b/var/spack/repos/builtin/packages/plumed/package.py @@ -122,7 +122,7 @@ class Plumed(AutotoolsPackage): def setup_dependent_package(self, module, dependent_spec): # Make plumed visible from dependent packages - module.plumed = Executable(join_path(self.spec.prefix.bin, 'plumed')) + module.plumed = self.spec['plumed'].command @run_before('autoreconf') def filter_gslcblas(self): diff --git a/var/spack/repos/builtin/packages/pocl/package.py b/var/spack/repos/builtin/packages/pocl/package.py index b6baee7e07..8becd9e9f7 100644 --- a/var/spack/repos/builtin/packages/pocl/package.py +++ b/var/spack/repos/builtin/packages/pocl/package.py @@ -104,7 +104,7 @@ class Pocl(CMakePackage): with working_dir(checkdir, create=True): source = join_path(os.path.dirname(self.module.__file__), "example1.c") - cflags = spec["pocl"].cppflags.split() + cflags = spec["pocl"].headers.cpp_flags.split() # ldflags = spec["pocl"].libs.ld_flags.split() ldflags = ["-L%s" % spec["pocl"].prefix.lib, "-lOpenCL", "-lpoclu"] diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py index d14aff363b..976b5d3c4e 100644 --- a/var/spack/repos/builtin/packages/psi4/package.py +++ b/var/spack/repos/builtin/packages/psi4/package.py @@ -115,8 +115,7 @@ class Psi4(Package): ' -I'.join([ os.path.join(spec['psi4'].prefix.include, 'psi4'), os.path.join(spec['boost'].prefix.include, 'boost'), - os.path.join(spec['python'].prefix.include, 'python{0}'.format( - spec['python'].version.up_to(2))), + os.path.join(spec['python'].headers.directories[0]), spec['lapack'].prefix.include, spec['blas'].prefix.include, '/usr/include' diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index bc3de0479b..12b77813d1 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -24,7 +24,9 @@ ############################################################################## import ast import os +import platform import re +import sys from contextlib import closing import spack @@ -33,10 +35,11 @@ from llnl.util.lang import match_predicate from llnl.util.filesystem import force_remove from spack import * from spack.util.environment import * +from spack.util.prefix import Prefix import spack.util.spack_json as sjson -class Python(Package): +class Python(AutotoolsPackage): """The Python programming language.""" homepage = "http://www.python.org" @@ -62,6 +65,10 @@ class Python(Package): extendable = True + # --enable-shared is known to cause problems for some users on macOS + # See http://bugs.python.org/issue29846 + variant('shared', default=sys.platform != 'darwin', + description='Enable shared libraries') variant('tk', default=False, description='Provide support for Tkinter') variant('ucs4', default=False, description='Enable UCS4 (wide) unicode strings') @@ -82,13 +89,14 @@ class Python(Package): depends_on("tk", when="+tk") depends_on("tcl", when="+tk") - patch('ncurses.patch') + # Patch does not work for Python 3.1 + patch('ncurses.patch', when='@:2.8,3.2:') _DISTUTIL_VARS_TO_SAVE = ['LDSHARED'] _DISTUTIL_CACHE_FILENAME = 'sysconfig.json' _distutil_vars = None - @when('@2.7,3.4:') + @when('@2.7:2.8,3.4:') def patch(self): # NOTE: Python's default installation procedure makes it possible for a # user's local configurations to change the Spack installation. In @@ -100,7 +108,10 @@ class Python(Package): r'\1setup.py\2 --no-user-cfg \3\6' ) - def install(self, spec, prefix): + def setup_environment(self, spack_env, run_env): + spec = self.spec + prefix = self.prefix + # TODO: The '--no-user-cfg' option for Python installation is only in # Python v2.7 and v3.4+ (see https://bugs.python.org/issue1180) and # adding support for ignoring user configuration will require @@ -110,23 +121,27 @@ class Python(Package): 'user configurations are present.').format(self.version)) # Need this to allow python build to find the Python installation. - env['PYTHONHOME'], env['PYTHONPATH'] = prefix, prefix - env['MACOSX_DEPLOYMENT_TARGET'] = '10.6' + spack_env.set('PYTHONHOME', prefix) + spack_env.set('PYTHONPATH', prefix) + spack_env.set('MACOSX_DEPLOYMENT_TARGET', platform.mac_ver()[0]) + + def configure_args(self): + spec = self.spec - # Rest of install is pretty standard except setup.py needs to - # be able to read the CPPFLAGS and LDFLAGS as it scans for the - # library and headers to build + # setup.py needs to be able to read the CPPFLAGS and LDFLAGS + # as it scans for the library and headers to build dep_pfxs = [dspec.prefix for dspec in spec.dependencies('link')] config_args = [ - '--prefix={0}'.format(prefix), '--with-threads', - '--enable-shared', 'CPPFLAGS=-I{0}'.format(' -I'.join(dp.include for dp in dep_pfxs)), 'LDFLAGS=-L{0}'.format(' -L'.join(dp.lib for dp in dep_pfxs)), ] - if spec.satisfies("platform=darwin") and ('%gcc' in spec): + if spec.satisfies('%gcc platform=darwin'): config_args.append('--disable-toolbox-glue') + if '+shared' in spec: + config_args.append('--enable-shared') + if '+ucs4' in spec: if spec.satisfies('@:2.7'): config_args.append('--enable-unicode=ucs4') @@ -140,18 +155,18 @@ class Python(Package): if spec.satisfies('@3:'): config_args.append('--without-ensurepip') - configure(*config_args) - make() - make('install') + return config_args + + @run_after('install') + def post_install(self): + spec = self.spec + prefix = self.prefix self.sysconfigfilename = '_sysconfigdata.py' if spec.satisfies('@3.6:'): # Python 3.6.0 renamed the sys config file - python3 = os.path.join(prefix.bin, - 'python{0}'.format(self.version.up_to(1))) - python = Executable(python3) sc = 'import sysconfig; print(sysconfig._get_sysconfigdata_name())' - cf = python('-c', sc, output=str).strip('\n') + cf = self.command('-c', sc, output=str).strip() self.sysconfigfilename = '{0}.py'.format(cf) self._save_distutil_vars(prefix) @@ -205,7 +220,7 @@ class Python(Package): Spack partially covers this by setting environment variables that are also accounted for by distutils. Currently there is one more known variable that must be set, which is LDSHARED, so the method saves its - autogenerated value to pass it to the dependant package's setup script. + autogenerated value to pass it to the dependent package's setup script. """ self._distutil_vars = {} @@ -234,20 +249,20 @@ class Python(Package): pass if not input_dict: - tty.warn('Failed to find \'build_time_vars\' dictionary in file ' - '\'%s\'. This might cause the extensions that are ' - 'installed with distutils to call compilers directly ' - 'avoiding Spack\'s wrappers.' % input_filename) + tty.warn("Failed to find 'build_time_vars' dictionary in file " + "'%s'. This might cause the extensions that are " + "installed with distutils to call compilers directly " + "avoiding Spack's wrappers." % input_filename) return for var_name in Python._DISTUTIL_VARS_TO_SAVE: if var_name in input_dict: self._distutil_vars[var_name] = input_dict[var_name] else: - tty.warn('Failed to find key \'%s\' in \'build_time_vars\' ' - 'dictionary in file \'%s\'. This might cause the ' - 'extensions that are installed with distutils to ' - 'call compilers directly avoiding Spack\'s wrappers.' + tty.warn("Failed to find key '%s' in 'build_time_vars' " + "dictionary in file '%s'. This might cause the " + "extensions that are installed with distutils to " + "call compilers directly avoiding Spack's wrappers." % (var_name, input_filename)) if len(self._distutil_vars) > 0: @@ -259,10 +274,10 @@ class Python(Package): with open(output_filename, 'w') as output_file: sjson.dump(self._distutil_vars, output_file) except: - tty.warn('Failed to save metadata for distutils. This might ' - 'cause the extensions that are installed with ' - 'distutils to call compilers directly avoiding ' - 'Spack\'s wrappers.') + tty.warn("Failed to save metadata for distutils. This might " + "cause the extensions that are installed with " + "distutils to call compilers directly avoiding " + "Spack's wrappers.") # We make the cache empty if we failed to save it to file # to provide the same behaviour as in the case when the cache # is initialized by the method load_distutils_data(). @@ -319,6 +334,144 @@ class Python(Package): # Set up environment to make install easy for python extensions. # ======================================================================== + @property + def command(self): + """Returns the Python command, which may vary depending + on the version of Python and how it was installed. + + In general, Python 2 comes with ``python`` and ``python2`` commands, + while Python 3 only comes with a ``python3`` command. + + :returns: The Python command + :rtype: Executable + """ + # We need to be careful here. If the user is using an externally + # installed python, all 3 commands could be in the same directory. + + # Search for `python2` iff using Python 2 + if (self.spec.satisfies('@:2') and + os.path.exists(os.path.join(self.prefix.bin, 'python2'))): + command = 'python2' + # Search for `python3` iff using Python 3 + elif (self.spec.satisfies('@3:') and + os.path.exists(os.path.join(self.prefix.bin, 'python3'))): + command = 'python3' + # If neither were found, try `python` + elif os.path.exists(os.path.join(self.prefix.bin, 'python')): + command = 'python' + else: + msg = 'Unable to locate {0} command in {1}' + raise RuntimeError(msg.format(self.name, self.prefix.bin)) + + # The python command may be a symlink if it was installed + # with Homebrew. Since some packages try to determine the + # location of libraries and headers based on the path, + # return the realpath + path = os.path.realpath(os.path.join(self.prefix.bin, command)) + + return Executable(path) + + def print_string(self, string): + """Returns the appropriate print string depending on the + version of Python. + + Examples: + + * Python 2 + + .. code-block:: python + + >>> self.print_string('sys.prefix') + 'print sys.prefix' + + * Python 3 + + .. code-block:: python + + >>> self.print_string('sys.prefix') + 'print(sys.prefix)' + """ + if self.spec.satisfies('@:2'): + return 'print {0}'.format(string) + else: + return 'print({0})'.format(string) + + def get_config_var(self, key): + """Returns the value of a single variable. Wrapper around + ``distutils.sysconfig.get_config_var()``.""" + + cmd = 'from distutils.sysconfig import get_config_var; ' + cmd += self.print_string("get_config_var('{0}')".format(key)) + + return self.command('-c', cmd, output=str).strip() + + def get_config_h_filename(self): + """Returns the full path name of the configuration header. + Wrapper around ``distutils.sysconfig.get_config_h_filename()``.""" + + cmd = 'from distutils.sysconfig import get_config_h_filename; ' + cmd += self.print_string('get_config_h_filename()') + + return self.command('-c', cmd, output=str).strip() + + @property + def home(self): + """Most of the time, ``PYTHONHOME`` is simply + ``spec['python'].prefix``. However, if the user is using an + externally installed python, it may be symlinked. For example, + Homebrew installs python in ``/usr/local/Cellar/python/2.7.12_2`` + and symlinks it to ``/usr/local``. Users may not know the actual + installation directory and add ``/usr/local`` to their + ``packages.yaml`` unknowingly. Query the python executable to + determine exactly where it is installed.""" + + prefix = self.get_config_var('prefix') + return Prefix(prefix) + + @property + def libs(self): + # Spack installs libraries into lib, except on openSUSE where it + # installs them into lib64. If the user is using an externally + # installed package, it may be in either lib or lib64, so we need + # to ask Python where its LIBDIR is. + libdir = self.get_config_var('LIBDIR') + + # The system Python installation on macOS and Homebrew installations + # install libraries into a Frameworks directory + frameworkprefix = self.get_config_var('PYTHONFRAMEWORKPREFIX') + + if '+shared' in self.spec: + ldlibrary = self.get_config_var('LDLIBRARY') + + if os.path.exists(os.path.join(libdir, ldlibrary)): + return LibraryList(os.path.join(libdir, ldlibrary)) + elif os.path.exists(os.path.join(frameworkprefix, ldlibrary)): + return LibraryList(os.path.join(frameworkprefix, ldlibrary)) + else: + msg = 'Unable to locate {0} libraries in {1}' + raise RuntimeError(msg.format(self.name, libdir)) + else: + library = self.get_config_var('LIBRARY') + + if os.path.exists(os.path.join(libdir, library)): + return LibraryList(os.path.join(libdir, library)) + elif os.path.exists(os.path.join(frameworkprefix, library)): + return LibraryList(os.path.join(frameworkprefix, library)) + else: + msg = 'Unable to locate {0} libraries in {1}' + raise RuntimeError(msg.format(self.name, libdir)) + + @property + def headers(self): + config_h = self.get_config_h_filename() + + if os.path.exists(config_h): + return HeaderList(config_h) + else: + includepy = self.get_config_var('INCLUDEPY') + msg = 'Unable to locate {0} headers in {1}' + raise RuntimeError(msg.format(self.name, includepy)) + @property def python_lib_dir(self): return join_path('lib', 'python{0}'.format(self.version.up_to(2))) @@ -332,29 +485,10 @@ class Python(Package): return join_path(self.python_lib_dir, 'site-packages') def setup_dependent_environment(self, spack_env, run_env, dependent_spec): - """Set PYTHONPATH to include site-packages dir for the + """Set PYTHONPATH to include the site-packages directory for the extension and any other python extensions it depends on.""" - # The python executable for version 3 may be python3 or python - # See https://github.com/LLNL/spack/pull/2173#issuecomment-257170199 - pythonex = 'python{0}'.format('3' if self.spec.satisfies('@3') else '') - if os.path.isdir(self.prefix.bin): - base = self.prefix.bin - else: - base = self.prefix - if not os.path.isfile(os.path.join(base, pythonex)): - if self.spec.satisfies('@3'): - python = Executable(os.path.join(base, 'python')) - version = python('-c', 'import sys; print(sys.version)', - output=str) - if version.startswith('3'): - pythonex = 'python' - else: - raise RuntimeError('Cannot locate python executable') - else: - raise RuntimeError('Cannot locate python executable') - python = Executable(os.path.join(base, pythonex)) - prefix = python('-c', 'import sys; print(sys.prefix)', output=str) - spack_env.set('PYTHONHOME', prefix.strip('\n')) + + spack_env.set('PYTHONHOME', self.home) python_paths = [] for d in dependent_spec.traverse( @@ -378,19 +512,15 @@ class Python(Package): In most cases, extensions will only need to have one line:: setup_py('install', '--prefix={0}'.format(prefix))""" - python_path = join_path( - self.spec.prefix.bin, - 'python{0}'.format('3' if self.spec.satisfies('@3') else '') - ) - module.python_exe = python_path - module.python = Executable(python_path) - module.setup_py = Executable(python_path + ' setup.py --no-user-cfg') + module.python = self.command + module.setup_py = Executable( + self.command.path + ' setup.py --no-user-cfg') distutil_vars = self._load_distutil_vars() if distutil_vars: - for key, value in distutil_vars.iteritems(): + for key, value in distutil_vars.items(): module.setup_py.add_default_env(key, value) # Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs. @@ -429,7 +559,7 @@ class Python(Package): if ext_pkg.name != 'py-pygments': patterns.append(r'bin/pygmentize$') if ext_pkg.name != 'py-numpy': - patterns.append(r'bin/f2py3?$') + patterns.append(r'bin/f2py[0-9.]*$') return match_predicate(ignore_arg, patterns) @@ -457,7 +587,7 @@ class Python(Package): paths.append(line) - site_packages = join_path(self.prefix, self.site_packages_dir) + site_packages = join_path(self.home, self.site_packages_dir) main_pth = join_path(site_packages, "easy-install.pth") if not paths: diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py index 8efb629487..89d1f8e568 100644 --- a/var/spack/repos/builtin/packages/scotch/package.py +++ b/var/spack/repos/builtin/packages/scotch/package.py @@ -22,7 +22,6 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import os from spack import * @@ -165,8 +164,8 @@ class Scotch(Package): # General Features # - flex_path = os.path.join(self.spec['flex'].prefix.bin, 'flex') - bison_path = os.path.join(self.spec['bison'].prefix.bin, 'bison') + flex_path = self.spec['flex'].command.path + bison_path = self.spec['bison'].command.path makefile_inc.extend([ 'EXE =', 'OBJ = .o', diff --git a/var/spack/repos/builtin/packages/shiny-server/package.py b/var/spack/repos/builtin/packages/shiny-server/package.py index e8a899115f..a3a2b2b160 100644 --- a/var/spack/repos/builtin/packages/shiny-server/package.py +++ b/var/spack/repos/builtin/packages/shiny-server/package.py @@ -54,9 +54,7 @@ class ShinyServer(CMakePackage): spec = self.spec options = [] - options.extend([ - "-DPYTHON=%s" % join_path(spec['python'].prefix.bin, 'python'), - ]) + options.append("-DPYTHON=%s" % spec['python'].command.path) return options diff --git a/var/spack/repos/builtin/packages/spark/package.py b/var/spack/repos/builtin/packages/spark/package.py index 24dca5571d..3bc6abd234 100644 --- a/var/spack/repos/builtin/packages/spark/package.py +++ b/var/spack/repos/builtin/packages/spark/package.py @@ -69,8 +69,7 @@ class Spark(Package): env['JAVA_HOME'] = self.spec['jdk'].prefix # spack_env.set('JAVA_HOME', self.spec['jdk'].prefix) - hadoop_bin_path = join_path(self.spec['hadoop'].prefix.bin, 'hadoop') - hadoop_bin = Executable(hadoop_bin_path) - hadoop_classpath = hadoop_bin('classpath', return_output=True) + hadoop = self.spec['hadoop'].command + hadoop_classpath = hadoop('classpath', return_output=True) run_env.set('SPARK_DIST_CLASSPATH', hadoop_classpath) diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py index 6fe82baa2f..59d110330a 100644 --- a/var/spack/repos/builtin/packages/stat/package.py +++ b/var/spack/repos/builtin/packages/stat/package.py @@ -69,7 +69,7 @@ class Stat(AutotoolsPackage): "--with-graphlib=%s" % spec['graphlib'].prefix, "--with-stackwalker=%s" % spec['dyninst'].prefix, "--with-libdwarf=%s" % spec['libdwarf'].prefix, - "--with-python=%s/bin/python" % spec['python'].prefix + "--with-python=%s" % spec['python'].command.path, ] if '+dysect' in spec: args.append('--enable-dysectapi') diff --git a/var/spack/repos/builtin/packages/subversion/package.py b/var/spack/repos/builtin/packages/subversion/package.py index c7057a51df..628dd26d24 100644 --- a/var/spack/repos/builtin/packages/subversion/package.py +++ b/var/spack/repos/builtin/packages/subversion/package.py @@ -72,8 +72,7 @@ class Subversion(Package): if 'swig' in spec: options.append('--with-swig=%s' % spec['swig'].prefix) if 'perl' in spec: - options.append( - 'PERL=%s' % join_path(spec['perl'].prefix.bin, 'perl')) + options.append('PERL=%s' % spec['perl'].command.path) configure(*options) make() diff --git a/var/spack/repos/builtin/packages/superlu-dist/package.py b/var/spack/repos/builtin/packages/superlu-dist/package.py index e19a33a900..e7d7b1587d 100644 --- a/var/spack/repos/builtin/packages/superlu-dist/package.py +++ b/var/spack/repos/builtin/packages/superlu-dist/package.py @@ -72,8 +72,8 @@ class SuperluDist(Package): 'RANLIB = true', 'CC = {0}'.format(self.spec['mpi'].mpicc), 'CFLAGS = -fPIC -std=c99 -O2 %s %s %s' % ( - spec['parmetis'].cppflags, - spec['metis'].cppflags, + spec['parmetis'].headers.cpp_flags, + spec['metis'].headers.cpp_flags, '-D_LONGINT' if '+int64' in spec else ''), 'NOOPTS = -fPIC -std=c99', 'FORTRAN = {0}'.format(self.spec['mpi'].mpif77), diff --git a/var/spack/repos/builtin/packages/visit/package.py b/var/spack/repos/builtin/packages/visit/package.py index 48a3762a2a..3c8505db97 100644 --- a/var/spack/repos/builtin/packages/visit/package.py +++ b/var/spack/repos/builtin/packages/visit/package.py @@ -52,7 +52,7 @@ class Visit(Package): '-DVTK_MINOR_VERSION=1', '-DVISIT_USE_GLEW=OFF', '-DVISIT_LOC_QMAKE_EXE:FILEPATH={0}/qmake-qt4'.format(qt_bin), - '-DPYTHON_DIR:PATH={0}'.format(spec['python'].prefix), + '-DPYTHON_DIR:PATH={0}'.format(spec['python'].home), '-DVISIT_SILO_DIR:PATH={0}'.format(spec['silo'].prefix), '-DVISIT_HDF5_DIR:PATH={0}'.format(spec['hdf5'].prefix), '-DVISIT_VTK_DIR:PATH={0}'.format(spec['vtk'].prefix), -- cgit v1.2.3-70-g09d2 From ea2f6b89e9a8d0019fdc3c02ad8562caf99ffcab Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Sat, 29 Apr 2017 17:58:52 -0700 Subject: fetch: do full clone of git submodules (fix #3956) (#3958) The required hash of a submodule might point to the non-HEAD commit of the current main branch and hence would lead to a "no such remote ref" at checkout in a shallow submodule. --- lib/spack/spack/fetch_strategy.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 5c872ae1b6..8dd3c2b36b 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -686,20 +686,11 @@ class GitFetchStrategy(VCSFetchStrategy): # Init submodules if the user asked for them. if self.submodules: - # only git 1.8.4 and later have --depth option - if self.git_version < ver('1.8.4'): - if spack.debug: - self.git('submodule', 'update', '--init', '--recursive') - else: - self.git('submodule', '--quiet', 'update', '--init', - '--recursive') + if spack.debug: + self.git('submodule', 'update', '--init', '--recursive') else: - if spack.debug: - self.git('submodule', 'update', '--init', '--recursive', - '--depth=1') - else: - self.git('submodule', '--quiet', 'update', '--init', - '--recursive', '--depth=1') + self.git('submodule', '--quiet', 'update', '--init', + '--recursive') def archive(self, destination): super(GitFetchStrategy, self).archive(destination, exclude='.git') -- cgit v1.2.3-70-g09d2 From 6a01612ad4e1f8676b4e0ae477444a2d618096ce Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Sun, 30 Apr 2017 19:09:04 +0200 Subject: file_list: ported to pytest (#4054) --- lib/spack/spack/test/file_list.py | 338 ++++++++++++++++++-------------------- 1 file changed, 158 insertions(+), 180 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/file_list.py b/lib/spack/spack/test/file_list.py index 09517b4dab..be4334f055 100644 --- a/lib/spack/spack/test/file_list.py +++ b/lib/spack/spack/test/file_list.py @@ -23,203 +23,181 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import unittest +import pytest from llnl.util.filesystem import LibraryList, HeaderList -class LibraryListTest(unittest.TestCase): - def setUp(self): - l = [ - '/dir1/liblapack.a', - '/dir2/libfoo.dylib', - '/dir1/libblas.a', - '/dir3/libbar.so', - 'libbaz.so' - ] - self.liblist = LibraryList(l) - - def test_repr(self): - x = eval(repr(self.liblist)) - self.assertEqual(self.liblist, x) - - def test_joined_and_str(self): - s1 = self.liblist.joined() - self.assertEqual( - s1, - '/dir1/liblapack.a /dir2/libfoo.dylib /dir1/libblas.a /dir3/libbar.so libbaz.so' # NOQA: ignore=E501 - ) - s2 = str(self.liblist) - self.assertEqual(s1, s2) - s3 = self.liblist.joined(';') - self.assertEqual( - s3, - '/dir1/liblapack.a;/dir2/libfoo.dylib;/dir1/libblas.a;/dir3/libbar.so;libbaz.so' # NOQA: ignore=E501 - ) - - def test_flags(self): - search_flags = self.liblist.search_flags - self.assertTrue('-L/dir1' in search_flags) - self.assertTrue('-L/dir2' in search_flags) - self.assertTrue('-L/dir3' in search_flags) - self.assertTrue(isinstance(search_flags, str)) - self.assertEqual( - search_flags, - '-L/dir1 -L/dir2 -L/dir3' - ) - - link_flags = self.liblist.link_flags - self.assertTrue('-llapack' in link_flags) - self.assertTrue('-lfoo' in link_flags) - self.assertTrue('-lblas' in link_flags) - self.assertTrue('-lbar' in link_flags) - self.assertTrue('-lbaz' in link_flags) - self.assertTrue(isinstance(link_flags, str)) - self.assertEqual( - link_flags, - '-llapack -lfoo -lblas -lbar -lbaz' - ) - - ld_flags = self.liblist.ld_flags - self.assertTrue(isinstance(ld_flags, str)) - self.assertEqual( - ld_flags, - search_flags + ' ' + link_flags - ) - - def test_paths_manipulation(self): - names = self.liblist.names - self.assertEqual(names, ['lapack', 'foo', 'blas', 'bar', 'baz']) - - directories = self.liblist.directories - self.assertEqual(directories, ['/dir1', '/dir2', '/dir3']) - - def test_get_item(self): - a = self.liblist[0] - self.assertEqual(a, '/dir1/liblapack.a') - - b = self.liblist[:] - self.assertEqual(type(b), type(self.liblist)) - self.assertEqual(self.liblist, b) - self.assertTrue(self.liblist is not b) - - def test_add(self): +@pytest.fixture() +def library_list(): + """Returns an instance of LibraryList.""" + l = [ + '/dir1/liblapack.a', + '/dir2/libfoo.dylib', + '/dir1/libblas.a', + '/dir3/libbar.so', + 'libbaz.so' + ] + + return LibraryList(l) + + +@pytest.fixture() +def header_list(): + """Returns an instance of header list""" + h = [ + '/dir1/Python.h', + '/dir2/datetime.h', + '/dir1/pyconfig.h', + '/dir3/core.h', + 'pymem.h' + ] + h = HeaderList(h) + h.add_macro('-DBOOST_LIB_NAME=boost_regex') + h.add_macro('-DBOOST_DYN_LINK') + return h + + +class TestLibraryList(object): + + def test_repr(self, library_list): + x = eval(repr(library_list)) + assert library_list == x + + def test_joined_and_str(self, library_list): + + s1 = library_list.joined() + expected = '/dir1/liblapack.a /dir2/libfoo.dylib /dir1/libblas.a /dir3/libbar.so libbaz.so' # noqa: E501 + assert s1 == expected + + s2 = str(library_list) + assert s1 == s2 + + s3 = library_list.joined(';') + expected = '/dir1/liblapack.a;/dir2/libfoo.dylib;/dir1/libblas.a;/dir3/libbar.so;libbaz.so' # noqa: E501 + assert s3 == expected + + def test_flags(self, library_list): + + search_flags = library_list.search_flags + assert '-L/dir1' in search_flags + assert '-L/dir2' in search_flags + assert '-L/dir3' in search_flags + assert isinstance(search_flags, str) + assert search_flags == '-L/dir1 -L/dir2 -L/dir3' + + link_flags = library_list.link_flags + assert '-llapack' in link_flags + assert '-lfoo' in link_flags + assert '-lblas' in link_flags + assert '-lbar' in link_flags + assert '-lbaz' in link_flags + assert isinstance(link_flags, str) + assert link_flags == '-llapack -lfoo -lblas -lbar -lbaz' + + ld_flags = library_list.ld_flags + assert isinstance(ld_flags, str) + assert ld_flags == search_flags + ' ' + link_flags + + def test_paths_manipulation(self, library_list): + names = library_list.names + assert names == ['lapack', 'foo', 'blas', 'bar', 'baz'] + + directories = library_list.directories + assert directories == ['/dir1', '/dir2', '/dir3'] + + def test_get_item(self, library_list): + a = library_list[0] + assert a == '/dir1/liblapack.a' + + b = library_list[:] + assert type(b) == type(library_list) + assert library_list == b + assert library_list is not b + + def test_add(self, library_list): pylist = [ '/dir1/liblapack.a', # removed from the final list '/dir2/libbaz.so', '/dir4/libnew.a' ] another = LibraryList(pylist) - l = self.liblist + another - self.assertEqual(len(l), 7) + l = library_list + another + assert len(l) == 7 + # Invariant : l == l + l - self.assertEqual(l, l + l) + assert l == l + l + # Always produce an instance of LibraryList - self.assertEqual( - type(self.liblist), - type(self.liblist + pylist) - ) - self.assertEqual( - type(pylist + self.liblist), - type(self.liblist) - ) - - -class HeaderListTest(unittest.TestCase): - def setUp(self): - h = [ - '/dir1/Python.h', - '/dir2/datetime.h', - '/dir1/pyconfig.h', - '/dir3/core.h', - 'pymem.h' - ] - headlist = HeaderList(h) - headlist.add_macro('-DBOOST_LIB_NAME=boost_regex') - headlist.add_macro('-DBOOST_DYN_LINK') - self.headlist = headlist - - def test_repr(self): - x = eval(repr(self.headlist)) - self.assertEqual(self.headlist, x) - - def test_joined_and_str(self): - s1 = self.headlist.joined() - self.assertEqual( - s1, - '/dir1/Python.h /dir2/datetime.h /dir1/pyconfig.h /dir3/core.h pymem.h' # NOQA: ignore=E501 - ) - s2 = str(self.headlist) - self.assertEqual(s1, s2) - s3 = self.headlist.joined(';') - self.assertEqual( - s3, - '/dir1/Python.h;/dir2/datetime.h;/dir1/pyconfig.h;/dir3/core.h;pymem.h' # NOQA: ignore=E501 - ) - - def test_flags(self): - include_flags = self.headlist.include_flags - self.assertTrue('-I/dir1' in include_flags) - self.assertTrue('-I/dir2' in include_flags) - self.assertTrue('-I/dir3' in include_flags) - self.assertTrue(isinstance(include_flags, str)) - self.assertEqual( - include_flags, - '-I/dir1 -I/dir2 -I/dir3' - ) - - macros = self.headlist.macro_definitions - self.assertTrue('-DBOOST_LIB_NAME=boost_regex' in macros) - self.assertTrue('-DBOOST_DYN_LINK' in macros) - self.assertTrue(isinstance(macros, str)) - self.assertEqual( - macros, - '-DBOOST_LIB_NAME=boost_regex -DBOOST_DYN_LINK' - ) - - cpp_flags = self.headlist.cpp_flags - self.assertTrue(isinstance(cpp_flags, str)) - self.assertEqual( - cpp_flags, - include_flags + ' ' + macros - ) - - def test_paths_manipulation(self): - names = self.headlist.names - self.assertEqual( - names, - ['Python', 'datetime', 'pyconfig', 'core', 'pymem'] - ) - - directories = self.headlist.directories - self.assertEqual(directories, ['/dir1', '/dir2', '/dir3']) - - def test_get_item(self): - a = self.headlist[0] - self.assertEqual(a, '/dir1/Python.h') - - b = self.headlist[:] - self.assertEqual(type(b), type(self.headlist)) - self.assertEqual(self.headlist, b) - self.assertTrue(self.headlist is not b) - - def test_add(self): + assert type(library_list + pylist) == type(library_list) + assert type(pylist + library_list) == type(library_list) + + +class TestHeaderList(object): + + def test_repr(self, header_list): + x = eval(repr(header_list)) + assert header_list == x + + def test_joined_and_str(self, header_list): + s1 = header_list.joined() + expected = '/dir1/Python.h /dir2/datetime.h /dir1/pyconfig.h /dir3/core.h pymem.h' # noqa: E501 + assert s1 == expected + + s2 = str(header_list) + assert s1 == s2 + + s3 = header_list.joined(';') + expected = '/dir1/Python.h;/dir2/datetime.h;/dir1/pyconfig.h;/dir3/core.h;pymem.h' # noqa: E501 + assert s3 == expected + + def test_flags(self, header_list): + include_flags = header_list.include_flags + assert '-I/dir1' in include_flags + assert '-I/dir2' in include_flags + assert '-I/dir3' in include_flags + assert isinstance(include_flags, str) + assert include_flags == '-I/dir1 -I/dir2 -I/dir3' + + macros = header_list.macro_definitions + assert '-DBOOST_LIB_NAME=boost_regex' in macros + assert '-DBOOST_DYN_LINK' in macros + assert isinstance(macros, str) + assert macros == '-DBOOST_LIB_NAME=boost_regex -DBOOST_DYN_LINK' + + cpp_flags = header_list.cpp_flags + assert isinstance(cpp_flags, str) + assert cpp_flags == include_flags + ' ' + macros + + def test_paths_manipulation(self, header_list): + names = header_list.names + assert names == ['Python', 'datetime', 'pyconfig', 'core', 'pymem'] + + directories = header_list.directories + assert directories == ['/dir1', '/dir2', '/dir3'] + + def test_get_item(self, header_list): + a = header_list[0] + assert a == '/dir1/Python.h' + + b = header_list[:] + assert type(b) == type(header_list) + assert header_list == b + assert header_list is not b + + def test_add(self, header_list): pylist = [ '/dir1/Python.h', # removed from the final list '/dir2/pyconfig.h', '/dir4/datetime.h' ] another = HeaderList(pylist) - h = self.headlist + another - self.assertEqual(len(h), 7) + h = header_list + another + assert len(h) == 7 + # Invariant : l == l + l - self.assertEqual(h, h + h) + assert h == h + h + # Always produce an instance of HeaderList - self.assertEqual( - type(self.headlist), - type(self.headlist + pylist) - ) - self.assertEqual( - type(pylist + self.headlist), - type(self.headlist) - ) + assert type(header_list + pylist) == type(header_list) + assert type(pylist + header_list) == type(header_list) -- cgit v1.2.3-70-g09d2 From 8551ef3874e3677d8c5830c9f9f450e3e2f5cdf5 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 1 May 2017 02:27:40 +0200 Subject: spack_yaml: ported to pytest (#4033) --- lib/spack/spack/test/spack_yaml.py | 136 +++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 67 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/spack_yaml.py b/lib/spack/spack/test/spack_yaml.py index fbbb7b8e60..53649eb1ec 100644 --- a/lib/spack/spack/test/spack_yaml.py +++ b/lib/spack/spack/test/spack_yaml.py @@ -22,14 +22,17 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -""" -Test Spack's custom YAML format. -""" -import unittest +"""Test Spack's custom YAML format.""" + +import pytest import spack.util.spack_yaml as syaml -test_file = """\ + +@pytest.fixture() +def data(): + """Returns the data loaded from a test file""" + test_file = """\ config_file: x86_64: foo: /path/to/foo @@ -43,66 +46,65 @@ config_file: [ 1, 2, 3 ] some_key: some_string """ + return syaml.load(test_file) + + +def test_parse(data): + + expected = { + 'config_file': syaml.syaml_dict([ + ('x86_64', syaml.syaml_dict([ + ('foo', '/path/to/foo'), + ('bar', '/path/to/bar'), + ('baz', '/path/to/baz')])), + ('some_list', ['item 1', 'item 2', 'item 3']), + ('another_list', [1, 2, 3]), + ('some_key', 'some_string') + ])} + + assert data == expected + + +def test_dict_order(data): + + expected_order = ['x86_64', 'some_list', 'another_list', 'some_key'] + assert data['config_file'].keys() == expected_order + + expected_order = ['foo', 'bar', 'baz'] + assert data['config_file']['x86_64'].keys() == expected_order + + +def test_line_numbers(data): + def check(obj, start_line, end_line): + assert obj._start_mark.line == start_line + assert obj._end_mark.line == end_line + + check(data, 0, 12) + check(data['config_file'], 1, 12) + check(data['config_file']['x86_64'], 2, 5) + check(data['config_file']['x86_64']['foo'], 2, 2) + check(data['config_file']['x86_64']['bar'], 3, 3) + check(data['config_file']['x86_64']['baz'], 4, 4) + check(data['config_file']['some_list'], 6, 9) + check(data['config_file']['some_list'][0], 6, 6) + check(data['config_file']['some_list'][1], 7, 7) + check(data['config_file']['some_list'][2], 8, 8) + check(data['config_file']['another_list'], 10, 10) + check(data['config_file']['some_key'], 11, 11) + + +def test_yaml_aliases(): + aliased_list_1 = ['foo'] + aliased_list_2 = [] + dict_with_aliases = { + 'a': aliased_list_1, + 'b': aliased_list_1, + 'c': aliased_list_1, + 'd': aliased_list_2, + 'e': aliased_list_2, + 'f': aliased_list_2, + } + string = syaml.dump(dict_with_aliases) -test_data = { - 'config_file': syaml.syaml_dict([ - ('x86_64', syaml.syaml_dict([ - ('foo', '/path/to/foo'), - ('bar', '/path/to/bar'), - ('baz', '/path/to/baz')])), - ('some_list', ['item 1', 'item 2', 'item 3']), - ('another_list', [1, 2, 3]), - ('some_key', 'some_string') - ])} - - -class SpackYamlTest(unittest.TestCase): - - def setUp(self): - self.data = syaml.load(test_file) - - def test_parse(self): - self.assertEqual(test_data, self.data) - - def test_dict_order(self): - self.assertEqual( - ['x86_64', 'some_list', 'another_list', 'some_key'], - self.data['config_file'].keys()) - - self.assertEqual( - ['foo', 'bar', 'baz'], - self.data['config_file']['x86_64'].keys()) - - def test_line_numbers(self): - def check(obj, start_line, end_line): - self.assertEqual(obj._start_mark.line, start_line) - self.assertEqual(obj._end_mark.line, end_line) - - check(self.data, 0, 12) - check(self.data['config_file'], 1, 12) - check(self.data['config_file']['x86_64'], 2, 5) - check(self.data['config_file']['x86_64']['foo'], 2, 2) - check(self.data['config_file']['x86_64']['bar'], 3, 3) - check(self.data['config_file']['x86_64']['baz'], 4, 4) - check(self.data['config_file']['some_list'], 6, 9) - check(self.data['config_file']['some_list'][0], 6, 6) - check(self.data['config_file']['some_list'][1], 7, 7) - check(self.data['config_file']['some_list'][2], 8, 8) - check(self.data['config_file']['another_list'], 10, 10) - check(self.data['config_file']['some_key'], 11, 11) - - def test_yaml_aliases(self): - aliased_list_1 = ['foo'] - aliased_list_2 = [] - dict_with_aliases = { - 'a': aliased_list_1, - 'b': aliased_list_1, - 'c': aliased_list_1, - 'd': aliased_list_2, - 'e': aliased_list_2, - 'f': aliased_list_2, - } - string = syaml.dump(dict_with_aliases) - - # ensure no YAML aliases appear in syaml dumps. - self.assertFalse('*id' in string) + # ensure no YAML aliases appear in syaml dumps. + assert '*id' not in string -- cgit v1.2.3-70-g09d2 From 1f303c9ac89b3eee34ac8c07878f8ba1d00fac62 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sun, 30 Apr 2017 20:43:44 -0500 Subject: Don't add system paths to PATH (#3910) * Filter all system paths introduced by dependencies from PATH * Make sure path filtering works *even* for trailing slashes * Revert some of the changes to `filter_system_paths` * Yes, `bin64` is a real thing (sigh) * add tests: /usr, /usr/, /usr/local/../bin, etc. * Convert from rST to Google-style docstrings --- lib/spack/spack/build_environment.py | 104 ++++++++++++++++++++--------------- lib/spack/spack/test/environment.py | 38 +++---------- lib/spack/spack/util/environment.py | 14 +---- 3 files changed, 72 insertions(+), 84 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 9c3768b65b..2ac935291d 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -236,50 +236,47 @@ def set_compiler_environment_variables(pkg, env): def set_build_environment_variables(pkg, env, dirty=False): - """ - This ensures a clean install environment when we build packages. + """Ensure a clean install environment when we build packages. - Arguments: - dirty -- skip unsetting the user's environment settings. - """ - # Add spack build environment path with compiler wrappers first in - # the path. We add both spack.env_path, which includes default - # wrappers (cc, c++, f77, f90), AND a subdirectory containing - # compiler-specific symlinks. The latter ensures that builds that - # are sensitive to the *name* of the compiler see the right name - # when we're building with the wrappers. - # - # Conflicts on case-insensitive systems (like "CC" and "cc") are - # handled by putting one in the /case-insensitive - # directory. Add that to the path too. - env_paths = [] - compiler_specific = join_path(spack.build_env_path, pkg.compiler.name) - for item in [spack.build_env_path, compiler_specific]: - env_paths.append(item) - ci = join_path(item, 'case-insensitive') - if os.path.isdir(ci): - env_paths.append(ci) - - env_paths = filter_system_paths(env_paths) + This involves unsetting pesky environment variables that may + affect the build. It also involves setting environment variables + used by Spack's compiler wrappers. - for item in reversed(env_paths): - env.prepend_path('PATH', item) - env.set_path(SPACK_ENV_PATH, env_paths) + Args: + pkg: The package we are building + env: The build environment + dirty (bool): Skip unsetting the user's environment settings + """ + # Gather information about various types of dependencies + build_deps = pkg.spec.traverse(root=False, deptype=('build')) + link_deps = pkg.spec.traverse(root=False, deptype=('link')) + build_link_deps = pkg.spec.traverse(root=False, deptype=('build', 'link')) + rpath_deps = get_rpath_deps(pkg) + + build_prefixes = [dep.prefix for dep in build_deps] + link_prefixes = [dep.prefix for dep in link_deps] + build_link_prefixes = [dep.prefix for dep in build_link_deps] + rpath_prefixes = [dep.prefix for dep in rpath_deps] + + # Filter out system paths: ['/', '/usr', '/usr/local'] + # These paths can be introduced into the build when an external package + # is added as a dependency. The problem with these paths is that they often + # contain hundreds of other packages installed in the same directory. + # If these paths come first, they can overshadow Spack installations. + build_prefixes = filter_system_paths(build_prefixes) + link_prefixes = filter_system_paths(link_prefixes) + build_link_prefixes = filter_system_paths(build_link_prefixes) + rpath_prefixes = filter_system_paths(rpath_prefixes) # Prefixes of all of the package's dependencies go in SPACK_DEPENDENCIES - dep_prefixes = [d.prefix for d in - pkg.spec.traverse(root=False, deptype=('build', 'link'))] - dep_prefixes = filter_system_paths(dep_prefixes) - env.set_path(SPACK_DEPENDENCIES, dep_prefixes) + env.set_path(SPACK_DEPENDENCIES, build_link_prefixes) # These variables control compiler wrapper behavior - env.set_path(SPACK_RPATH_DEPS, filter_system_paths([ - d.prefix for d in get_rpath_deps(pkg)])) - env.set_path(SPACK_LINK_DEPS, filter_system_paths([ - d.prefix for d in pkg.spec.traverse(root=False, deptype=('link'))])) + env.set_path(SPACK_RPATH_DEPS, rpath_prefixes) + env.set_path(SPACK_LINK_DEPS, link_prefixes) # Add dependencies to CMAKE_PREFIX_PATH - env.set_path('CMAKE_PREFIX_PATH', dep_prefixes) + env.set_path('CMAKE_PREFIX_PATH', build_link_prefixes) # Install prefix env.set(SPACK_PREFIX, pkg.prefix) @@ -326,12 +323,33 @@ def set_build_environment_variables(pkg, env, dirty=False): env.set('SPACK_COMPILER_EXTRA_RPATHS', extra_rpaths) # Add bin directories from dependencies to the PATH for the build. - bin_dirs = reversed( - [d.prefix.bin for d in pkg.spec.dependencies(deptype='build') - if os.path.isdir(d.prefix.bin)]) - bin_dirs = filter_system_bin_paths(bin_dirs) - for item in bin_dirs: + for prefix in build_prefixes: + for dirname in ['bin', 'bin64']: + bin_dir = os.path.join(prefix, dirname) + if os.path.isdir(bin_dir): + env.prepend_path('PATH', bin_dir) + + # Add spack build environment path with compiler wrappers first in + # the path. We add both spack.env_path, which includes default + # wrappers (cc, c++, f77, f90), AND a subdirectory containing + # compiler-specific symlinks. The latter ensures that builds that + # are sensitive to the *name* of the compiler see the right name + # when we're building with the wrappers. + # + # Conflicts on case-insensitive systems (like "CC" and "cc") are + # handled by putting one in the /case-insensitive + # directory. Add that to the path too. + env_paths = [] + compiler_specific = join_path(spack.build_env_path, pkg.compiler.name) + for item in [spack.build_env_path, compiler_specific]: + env_paths.append(item) + ci = join_path(item, 'case-insensitive') + if os.path.isdir(ci): + env_paths.append(ci) + + for item in reversed(env_paths): env.prepend_path('PATH', item) + env.set_path(SPACK_ENV_PATH, env_paths) # Working directory for the spack command itself, for debug logs. if spack.debug: @@ -340,9 +358,9 @@ def set_build_environment_variables(pkg, env, dirty=False): env.set(SPACK_DEBUG_LOG_DIR, spack.spack_working_dir) # Add any pkgconfig directories to PKG_CONFIG_PATH - for pre in dep_prefixes: + for prefix in build_link_prefixes: for directory in ('lib', 'lib64', 'share'): - pcdir = join_path(pre, directory, 'pkgconfig') + pcdir = join_path(prefix, directory, 'pkgconfig') if os.path.isdir(pcdir): env.prepend_path('PKG_CONFIG_PATH', pcdir) diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index dbad2c5e1f..cdc2e68085 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -29,7 +29,7 @@ from spack import spack_root from spack.environment import EnvironmentModifications from spack.environment import RemovePath, PrependPath, AppendPath from spack.environment import SetEnv, UnsetEnv -from spack.util.environment import filter_system_paths, filter_system_bin_paths +from spack.util.environment import filter_system_paths @pytest.fixture() @@ -64,25 +64,18 @@ def miscellaneous_paths(): '/usr/local/lib64', '/usr/local/opt/some-package/lib', '/usr/opt/lib', + '/usr/local/../bin', '/lib', '/', '/usr', + '/usr/', + '/usr/bin', + '/bin64', '/lib64', '/include', + '/include/', '/opt/some-package/include', - ] - - -@pytest.fixture -def bin_paths(): - """Returns a list of bin paths, including system ones.""" - return [ - '/usr/local/Cellar/gcc/5.3.0/bin', - '/usr/local/bin', - '/usr/local/opt/some-package/bin', - '/usr/opt/bin', - '/bin', - '/opt/some-package/bin', + '/opt/some-package/local/..', ] @@ -137,21 +130,8 @@ def test_filter_system_paths(miscellaneous_paths): '/usr/local/Cellar/gcc/5.3.0/lib', '/usr/local/opt/some-package/lib', '/usr/opt/lib', - '/opt/some-package/include' - ] - assert filtered == expected - - -def test_filter_system_bin_paths(bin_paths): - """Tests that the filtering of system bin paths works as expected.""" - filtered = filter_system_bin_paths(bin_paths) - expected = [ - '/usr/local/bin', - '/bin', - '/usr/local/Cellar/gcc/5.3.0/bin', - '/usr/local/opt/some-package/bin', - '/usr/opt/bin', - '/opt/some-package/bin' + '/opt/some-package/include', + '/opt/some-package/local/..', ] assert filtered == expected diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index 420cce8245..934a999327 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -25,23 +25,13 @@ import os system_paths = ['/', '/usr', '/usr/local'] -suffixes = ['lib', 'lib64', 'include'] +suffixes = ['bin', 'bin64', 'include', 'lib', 'lib64'] system_dirs = [os.path.join(p, s) for s in suffixes for p in system_paths] + \ system_paths -system_bins = [os.path.join(p, 'bin') for p in system_paths] def filter_system_paths(paths): - return [p for p in paths if p not in system_dirs] - - -def filter_system_bin_paths(paths): - # Turn the iterable into a list. Assume it's a list from here on. - _paths = list(paths) - bins = [p for p in _paths if p in system_bins] - nobins = [p for p in _paths if p not in system_bins] - # put bins infront as PATH is set by: prepend_path('PATH', item) - return bins + nobins + return [p for p in paths if os.path.normpath(p) not in system_dirs] def get_path(name): -- cgit v1.2.3-70-g09d2 From 4421013290d0d888b328d9ccc365b15b07a815ec Mon Sep 17 00:00:00 2001 From: Sergey Kosukhin Date: Mon, 1 May 2017 04:08:49 +0200 Subject: Updated cc wrapper: switch from ld to vcheck if version is requested. (#2501) --- lib/spack/env/cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/env/cc b/lib/spack/env/cc index d7212bf89c..e6cca1c51f 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -133,7 +133,7 @@ esac # If any of the arguments below are 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 ]] || [[ $mode == ld ]]; then for arg in "$@"; do if [[ $arg == -v || $arg == -V || $arg == --version || $arg == -dumpversion ]]; then mode=vcheck -- cgit v1.2.3-70-g09d2 From c7a5b2eaa9f5bf50f46567ee831425bef9caa157 Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Mon, 1 May 2017 04:16:28 +0200 Subject: disable rpaths on Darwin when arg=-r mode=ccld (#3930) This fixes build of Ipopt package. --- lib/spack/env/cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/env/cc b/lib/spack/env/cc index e6cca1c51f..aa3c2aa4b1 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -218,7 +218,7 @@ fi add_rpaths=true if [[ ($mode == ld || $mode == ccld) && "$SPACK_SHORT_SPEC" =~ "darwin" ]]; then for arg in "$@"; do - if [[ ($arg == -r && $mode == ld) || ($arg == -Wl,-r && $mode == ccld) ]]; then + if [[ ($arg == -r && $mode == ld) || ($arg == -r && $mode == ccld) || ($arg == -Wl,-r && $mode == ccld) ]]; then add_rpaths=false break fi -- cgit v1.2.3-70-g09d2 From b3ce04cba3262865a1a2242f69c7f11d75e6c595 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 1 May 2017 10:41:48 +0200 Subject: url_substitution: ported to pytest (#4032) --- lib/spack/spack/test/url_substitution.py | 88 ++++++++++++-------------------- 1 file changed, 34 insertions(+), 54 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/url_substitution.py b/lib/spack/spack/test/url_substitution.py index 449a3b29bf..61bd178db8 100644 --- a/lib/spack/spack/test/url_substitution.py +++ b/lib/spack/spack/test/url_substitution.py @@ -25,61 +25,41 @@ """Tests Spack's ability to substitute a different version into a URL.""" import os -import unittest -from spack.url import substitute_version +import pytest +import spack.url -class UrlSubstitutionTest(unittest.TestCase): - def check(self, base, version, new_url): - self.assertEqual(substitute_version(base, version), new_url) +@pytest.mark.parametrize('base_url,version,expected', [ + # Ensures that substituting the same version results in the same URL + ('http://www.mr511.de/software/libelf-0.8.13.tar.gz', '0.8.13', + 'http://www.mr511.de/software/libelf-0.8.13.tar.gz'), + # Test a completely different version syntax + ('http://www.prevanders.net/libdwarf-20130729.tar.gz', '8.12', + 'http://www.prevanders.net/libdwarf-8.12.tar.gz'), + # Test a URL where the version appears twice + # It should get substituted both times + ('https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz', '2.1.3', + 'https://github.com/hpc/mpileaks/releases/download/v2.1.3/mpileaks-2.1.3.tar.gz'), + # Test now with a partial prefix earlier in the URL + # This is hard to figure out so Spack only substitutes + # the last instance of the version + ('https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2', '2.2.0', + 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.2.0.tar.bz2'), + ('https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2', '2.2', + 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.2.tar.bz2'), + # No separator between the name and version of the package + ('file://{0}/turbolinux702.tar.gz'.format(os.getcwd()), '703', + 'file://{0}/turbolinux703.tar.gz'.format(os.getcwd())), - def test_same_version(self): - # Ensures that substituting the same version results in the same URL - self.check( - 'http://www.mr511.de/software/libelf-0.8.13.tar.gz', '0.8.13', - 'http://www.mr511.de/software/libelf-0.8.13.tar.gz') - - def test_different_version(self): - # Test a completely different version syntax - self.check( - 'http://www.prevanders.net/libdwarf-20130729.tar.gz', '8.12', - 'http://www.prevanders.net/libdwarf-8.12.tar.gz') - - def test_double_version(self): - # Test a URL where the version appears twice - # It should get substituted both times - self.check( - 'https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz', '2.1.3', - 'https://github.com/hpc/mpileaks/releases/download/v2.1.3/mpileaks-2.1.3.tar.gz') - - def test_partial_version_prefix(self): - # Test now with a partial prefix earlier in the URL - # This is hard to figure out so Spack only substitutes - # the last instance of the version - self.check( - 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2', '2.2.0', - 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.2.0.tar.bz2') - self.check( - 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.0.tar.bz2', '2.2', - 'https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.2.tar.bz2') - - def test_no_separator(self): - # No separator between the name and version of the package - self.check( - 'file://{0}/turbolinux702.tar.gz'.format(os.getcwd()), '703', - 'file://{0}/turbolinux703.tar.gz'.format(os.getcwd())) - - def test_github_raw(self): - self.check( - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '2.0.7', - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true') - self.check( - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '4.7', - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v4.7.tgz?raw=true') - - def test_regex(self): - # Package name contains regex characters - self.check( - 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz', '1.2.3', - 'http://math.lbl.gov/voro++/download/dir/voro++-1.2.3.tar.gz') + ('https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '2.0.7', + 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true'), + ('https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true', '4.7', + 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v4.7.tgz?raw=true'), + # Package name contains regex characters + ('http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz', '1.2.3', + 'http://math.lbl.gov/voro++/download/dir/voro++-1.2.3.tar.gz'), +]) +def test_url_substitution(base_url, version, expected): + computed = spack.url.substitute_version(base_url, version) + assert computed == expected -- cgit v1.2.3-70-g09d2 From 2511520b32fb6559084684c24ec51f54e30f4bb4 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 1 May 2017 10:00:09 -0500 Subject: Add a WafPackage base class (#3975) * Add a WafPackage base class * Correct comment in docstring * Be more specific about the Python versions supported --- lib/spack/docs/packaging_guide.rst | 55 ++++---- lib/spack/spack/__init__.py | 8 +- lib/spack/spack/build_systems/waf.py | 148 +++++++++++++++++++++ lib/spack/spack/cmd/build.py | 5 +- lib/spack/spack/cmd/configure.py | 5 +- lib/spack/spack/cmd/create.py | 14 +- lib/spack/spack/test/build_system_guess.py | 1 + .../repos/builtin/packages/py-py2cairo/package.py | 17 ++- var/spack/repos/builtin/packages/tut/package.py | 14 +- 9 files changed, 220 insertions(+), 47 deletions(-) create mode 100644 lib/spack/spack/build_systems/waf.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 6f4a3ecf1a..bf6f3f3cf9 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2085,33 +2085,34 @@ The package base class, usually specialized for a given build system, determines actual set of entities available for overriding. The classes that are currently provided by Spack are: - +------------------------------------+----------------------------------+ - | | **Base class purpose** | - +====================================+==================================+ - | :py:class:`.Package` | General base class not | - | | specialized for any build system | - +------------------------------------+----------------------------------+ - | :py:class:`.MakefilePackage` | Specialized class for packages | - | | built invoking | - | | hand-written Makefiles | - +------------------------------------+----------------------------------+ - | :py:class:`.AutotoolsPackage` | Specialized class for packages | - | | built using GNU Autotools | - +------------------------------------+----------------------------------+ - | :py:class:`.CMakePackage` | Specialized class for packages | - | | built using CMake | - +------------------------------------+----------------------------------+ - | :py:class:`.RPackage` | Specialized class for | - | | :py:class:`.R` extensions | - +------------------------------------+----------------------------------+ - | :py:class:`.PythonPackage` | Specialized class for | - | | :py:class:`.Python` extensions | - +------------------------------------+----------------------------------+ - | :py:class:`.PerlPackage` | Specialized class for | - | | :py:class:`.Perl` extensions | - +------------------------------------+----------------------------------+ - - + +-------------------------------+----------------------------------+ + | **Base Class** | **Purpose** | + +===============================+==================================+ + | :py:class:`.Package` | General base class not | + | | specialized for any build system | + +-------------------------------+----------------------------------+ + | :py:class:`.MakefilePackage` | Specialized class for packages | + | | built invoking | + | | hand-written Makefiles | + +-------------------------------+----------------------------------+ + | :py:class:`.AutotoolsPackage` | Specialized class for packages | + | | built using GNU Autotools | + +-------------------------------+----------------------------------+ + | :py:class:`.CMakePackage` | Specialized class for packages | + | | built using CMake | + +-------------------------------+----------------------------------+ + | :py:class:`.WafPackage` | Specialize class for packages | + | | built using Waf | + +-------------------------------+----------------------------------+ + | :py:class:`.RPackage` | Specialized class for | + | | :py:class:`.R` extensions | + +-------------------------------+----------------------------------+ + | :py:class:`.PythonPackage` | Specialized class for | + | | :py:class:`.Python` extensions | + +-------------------------------+----------------------------------+ + | :py:class:`.PerlPackage` | Specialized class for | + | | :py:class:`.Perl` extensions | + +-------------------------------+----------------------------------+ .. note:: diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 85d881a769..73963b848c 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -165,6 +165,7 @@ from spack.package import Package, run_before, run_after, on_package_attributes from spack.build_systems.makefile import MakefilePackage from spack.build_systems.autotools import AutotoolsPackage from spack.build_systems.cmake import CMakePackage +from spack.build_systems.waf import WafPackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage from spack.build_systems.perl import PerlPackage @@ -174,12 +175,13 @@ __all__ += [ 'run_after', 'on_package_attributes', 'Package', - 'CMakePackage', - 'AutotoolsPackage', 'MakefilePackage', + 'AutotoolsPackage', + 'CMakePackage', + 'WafPackage', 'PythonPackage', 'RPackage', - 'PerlPackage' + 'PerlPackage', ] from spack.version import Version, ver diff --git a/lib/spack/spack/build_systems/waf.py b/lib/spack/spack/build_systems/waf.py new file mode 100644 index 0000000000..bb4fa6c369 --- /dev/null +++ b/lib/spack/spack/build_systems/waf.py @@ -0,0 +1,148 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import inspect + +from spack.directives import depends_on +from spack.package import PackageBase, run_after + +from llnl.util.filesystem import working_dir + + +class WafPackage(PackageBase): + """Specialized class for packages that are built using the + Waf build system. See https://waf.io/book/ for more information. + + This class provides the following phases that can be overridden: + + * configure + * build + * install + + These are all standard Waf commands and can be found by running: + + .. code-block:: console + + $ python waf --help + + Each phase provides a function that runs: + + .. code-block:: console + + $ python waf -j + + where is the number of parallel jobs to build with. Each phase + also has a function that can pass arguments to this call. + All of these functions are empty except for the ``configure_args`` + function, which passes ``--prefix=/path/to/installation/prefix``. + """ + # Default phases + phases = ['configure', 'build', 'install'] + + # To be used in UI queries that require to know which + # build-system class we are using + build_system_class = 'WafPackage' + + # Callback names for build-time test + build_time_test_callbacks = ['test'] + + # Callback names for install-time test + install_time_test_callbacks = ['installtest'] + + # Much like AutotoolsPackage does not require automake and autoconf + # to build, WafPackage does not require waf to build. It only requires + # python to run the waf build script. + depends_on('python@2.5:', type='build') + + @property + def build_directory(self): + """The directory containing the ``waf`` file.""" + return self.stage.source_path + + def python(self, *args, **kwargs): + """The python ``Executable``.""" + inspect.getmodule(self).python(*args, **kwargs) + + def waf(self, *args, **kwargs): + """Runs the waf ``Executable``.""" + jobs = inspect.getmodule(self).make_jobs + + with working_dir(self.build_directory): + self.python('waf', '-j{0}'.format(jobs), *args, **kwargs) + + def configure(self, spec, prefix): + """Configures the project.""" + args = self.configure_args(spec, prefix) + + self.waf('configure', *args) + + def configure_args(self, spec, prefix): + """Arguments to pass to configure.""" + return ['--prefix={0}'.format(prefix)] + + def build(self, spec, prefix): + """Executes the build.""" + args = self.build_args(spec, prefix) + + self.waf('build', *args) + + def build_args(self, spec, prefix): + """Arguments to pass to build.""" + return [] + + def install(self, spec, prefix): + """Installs the targets on the system.""" + args = self.install_args(spec, prefix) + + self.waf('install', *args) + + def install_args(self, spec, prefix): + """Arguments to pass to install.""" + return [] + + # Testing + + def test(self): + """Run unit tests after build. + + By default, does nothing. Override this if you want to + add package-specific tests. + """ + pass + + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + def installtest(self): + """Run unit tests after install. + + By default, does nothing. Override this if you want to + add package-specific tests. + """ + pass + + run_after('install')(PackageBase._run_default_install_time_test_callbacks) + + # Check that self.prefix is there after installation + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 90157a85af..877f2ce0cf 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -29,10 +29,11 @@ from spack import * description = 'stops at build stage when installing a package, if possible' build_system_to_phase = { - CMakePackage: 'build', AutotoolsPackage: 'build', + CMakePackage: 'build', + WafPackage: 'build', PythonPackage: 'build', - PerlPackage: 'build' + PerlPackage: 'build', } diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 037705f480..7f6c07c34b 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -34,9 +34,10 @@ description = 'stops at configuration stage when installing a package, if possib build_system_to_phase = { - CMakePackage: 'cmake', AutotoolsPackage: 'configure', - PerlPackage: 'configure' + CMakePackage: 'cmake', + WafPackage: 'configure', + PerlPackage: 'configure', } diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 504ac9d844..adaf388387 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -204,6 +204,16 @@ class SconsPackageTemplate(PackageTemplate): scons('install')""" +class WafPackageTemplate(PackageTemplate): + """Provides appropriate override for Waf-based packages""" + + base_class_name = 'WafPackage' + + body = """\ + # FIXME: Override configure_args(), build_args(), + # or install_args() if necessary.""" + + class BazelPackageTemplate(PackageTemplate): """Provides appropriate overrides for Bazel-based packages""" @@ -347,6 +357,7 @@ templates = { 'autoreconf': AutoreconfPackageTemplate, 'cmake': CMakePackageTemplate, 'scons': SconsPackageTemplate, + 'waf': WafPackageTemplate, 'bazel': BazelPackageTemplate, 'python': PythonPackageTemplate, 'r': RPackageTemplate, @@ -354,7 +365,7 @@ templates = { 'perlbuild': PerlbuildPackageTemplate, 'octave': OctavePackageTemplate, 'makefile': MakefilePackageTemplate, - 'generic': PackageTemplate + 'generic': PackageTemplate, } @@ -413,6 +424,7 @@ class BuildSystemGuesser: ('/Makefile.am$', 'autoreconf'), ('/CMakeLists.txt$', 'cmake'), ('/SConstruct$', 'scons'), + ('/waf$', 'waf'), ('/setup.py$', 'python'), ('/NAMESPACE$', 'r'), ('/WORKSPACE$', 'bazel'), diff --git a/lib/spack/spack/test/build_system_guess.py b/lib/spack/spack/test/build_system_guess.py index 9ea76e7bfc..73b619cb22 100644 --- a/lib/spack/spack/test/build_system_guess.py +++ b/lib/spack/spack/test/build_system_guess.py @@ -35,6 +35,7 @@ import spack.stage ('configure', 'autotools'), ('CMakeLists.txt', 'cmake'), ('SConstruct', 'scons'), + ('waf', 'waf'), ('setup.py', 'python'), ('NAMESPACE', 'r'), ('WORKSPACE', 'bazel'), diff --git a/var/spack/repos/builtin/packages/py-py2cairo/package.py b/var/spack/repos/builtin/packages/py-py2cairo/package.py index 5626784e34..2eacf540c9 100644 --- a/var/spack/repos/builtin/packages/py-py2cairo/package.py +++ b/var/spack/repos/builtin/packages/py-py2cairo/package.py @@ -25,7 +25,7 @@ from spack import * -class PyPy2cairo(Package): +class PyPy2cairo(WafPackage): """Pycairo is a set of Python bindings for the cairo graphics library.""" homepage = "https://www.cairographics.org/pycairo/" @@ -35,10 +35,15 @@ class PyPy2cairo(Package): extends('python') - depends_on('cairo') + depends_on('python', type=('build', 'run')) + depends_on('cairo@1.10.0:') depends_on('pixman') + depends_on('pkg-config', type='build') - def install(self, spec, prefix): - python('waf', 'configure', '--prefix={0}'.format(prefix)) - python('waf', 'build') - python('waf', 'install') + # TODO: Add a 'test' deptype + # depends_on('py-pytest', type='test') + + def installtest(self): + with working_dir('test'): + pytest = which('py.test') + pytest() diff --git a/var/spack/repos/builtin/packages/tut/package.py b/var/spack/repos/builtin/packages/tut/package.py index 9b135e0964..6c6c6bdb27 100644 --- a/var/spack/repos/builtin/packages/tut/package.py +++ b/var/spack/repos/builtin/packages/tut/package.py @@ -25,7 +25,7 @@ from spack import * -class Tut(Package): +class Tut(WafPackage): """TUT is a small and portable unit test framework for C++.""" homepage = "http://mrzechonek.github.io/tut-framework/" @@ -33,9 +33,11 @@ class Tut(Package): version('2016-12-19', '8b1967fa295ae1ce4d4431c2f811e521') - extends('python') + def build_args(self, spec, prefix): + args = [] - def install(self, spec, prefix): - python('waf', 'configure', '--prefix={0}'.format(prefix)) - python('waf', 'build') - python('waf', 'install') + if self.run_tests: + # Run unit tests + args.append('--test') + + return args -- cgit v1.2.3-70-g09d2 From f60134cdb1c72ce247a8891eb60a56911cd6fc2e Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 1 May 2017 17:53:51 +0200 Subject: namespace_trie: ported to pytest (#4060) --- lib/spack/spack/test/namespace_trie.py | 122 +++++++++++++++++---------------- 1 file changed, 63 insertions(+), 59 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/namespace_trie.py b/lib/spack/spack/test/namespace_trie.py index 7927fc8e60..35ded3b7ee 100644 --- a/lib/spack/spack/test/namespace_trie.py +++ b/lib/spack/spack/test/namespace_trie.py @@ -22,88 +22,92 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import unittest +import pytest -from spack.util.naming import NamespaceTrie +import spack.util.naming -class NamespaceTrieTest(unittest.TestCase): +@pytest.fixture() +def trie(): + return spack.util.naming.NamespaceTrie() - def setUp(self): - self.trie = NamespaceTrie() - def test_add_single(self): - self.trie['foo'] = 'bar' +def test_add_single(trie): + trie['foo'] = 'bar' - self.assertTrue(self.trie.is_prefix('foo')) - self.assertTrue(self.trie.has_value('foo')) - self.assertEqual(self.trie['foo'], 'bar') + assert trie.is_prefix('foo') + assert trie.has_value('foo') + assert trie['foo'] == 'bar' - def test_add_multiple(self): - self.trie['foo.bar'] = 'baz' - self.assertFalse(self.trie.has_value('foo')) - self.assertTrue(self.trie.is_prefix('foo')) +def test_add_multiple(trie): + trie['foo.bar'] = 'baz' - self.assertTrue(self.trie.is_prefix('foo.bar')) - self.assertTrue(self.trie.has_value('foo.bar')) - self.assertEqual(self.trie['foo.bar'], 'baz') + assert not trie.has_value('foo') + assert trie.is_prefix('foo') - self.assertFalse(self.trie.is_prefix('foo.bar.baz')) - self.assertFalse(self.trie.has_value('foo.bar.baz')) + assert trie.is_prefix('foo.bar') + assert trie.has_value('foo.bar') + assert trie['foo.bar'] == 'baz' - def test_add_three(self): - # add a three-level namespace - self.trie['foo.bar.baz'] = 'quux' + assert not trie.is_prefix('foo.bar.baz') + assert not trie.has_value('foo.bar.baz') - self.assertTrue(self.trie.is_prefix('foo')) - self.assertFalse(self.trie.has_value('foo')) - self.assertTrue(self.trie.is_prefix('foo.bar')) - self.assertFalse(self.trie.has_value('foo.bar')) +def test_add_three(trie): + # add a three-level namespace + trie['foo.bar.baz'] = 'quux' - self.assertTrue(self.trie.is_prefix('foo.bar.baz')) - self.assertTrue(self.trie.has_value('foo.bar.baz')) - self.assertEqual(self.trie['foo.bar.baz'], 'quux') + assert trie.is_prefix('foo') + assert not trie.has_value('foo') - self.assertFalse(self.trie.is_prefix('foo.bar.baz.quux')) - self.assertFalse(self.trie.has_value('foo.bar.baz.quux')) + assert trie.is_prefix('foo.bar') + assert not trie.has_value('foo.bar') - # Try to add a second element in a prefix namespace - self.trie['foo.bar'] = 'blah' + assert trie.is_prefix('foo.bar.baz') + assert trie.has_value('foo.bar.baz') + assert trie['foo.bar.baz'] == 'quux' - self.assertTrue(self.trie.is_prefix('foo')) - self.assertFalse(self.trie.has_value('foo')) + assert not trie.is_prefix('foo.bar.baz.quux') + assert not trie.has_value('foo.bar.baz.quux') - self.assertTrue(self.trie.is_prefix('foo.bar')) - self.assertTrue(self.trie.has_value('foo.bar')) - self.assertEqual(self.trie['foo.bar'], 'blah') + # Try to add a second element in a prefix namespace + trie['foo.bar'] = 'blah' - self.assertTrue(self.trie.is_prefix('foo.bar.baz')) - self.assertTrue(self.trie.has_value('foo.bar.baz')) - self.assertEqual(self.trie['foo.bar.baz'], 'quux') + assert trie.is_prefix('foo') + assert not trie.has_value('foo') - self.assertFalse(self.trie.is_prefix('foo.bar.baz.quux')) - self.assertFalse(self.trie.has_value('foo.bar.baz.quux')) + assert trie.is_prefix('foo.bar') + assert trie.has_value('foo.bar') + assert trie['foo.bar'] == 'blah' - def test_add_none_single(self): - self.trie['foo'] = None - self.assertTrue(self.trie.is_prefix('foo')) - self.assertTrue(self.trie.has_value('foo')) - self.assertEqual(self.trie['foo'], None) + assert trie.is_prefix('foo.bar.baz') + assert trie.has_value('foo.bar.baz') + assert trie['foo.bar.baz'] == 'quux' - self.assertFalse(self.trie.is_prefix('foo.bar')) - self.assertFalse(self.trie.has_value('foo.bar')) + assert not trie.is_prefix('foo.bar.baz.quux') + assert not trie.has_value('foo.bar.baz.quux') - def test_add_none_multiple(self): - self.trie['foo.bar'] = None - self.assertTrue(self.trie.is_prefix('foo')) - self.assertFalse(self.trie.has_value('foo')) +def test_add_none_single(trie): + trie['foo'] = None + assert trie.is_prefix('foo') + assert trie.has_value('foo') + assert trie['foo'] is None - self.assertTrue(self.trie.is_prefix('foo.bar')) - self.assertTrue(self.trie.has_value('foo.bar')) - self.assertEqual(self.trie['foo.bar'], None) + assert not trie.is_prefix('foo.bar') + assert not trie.has_value('foo.bar') - self.assertFalse(self.trie.is_prefix('foo.bar.baz')) - self.assertFalse(self.trie.has_value('foo.bar.baz')) + +def test_add_none_multiple(trie): + trie['foo.bar'] = None + + assert trie.is_prefix('foo') + assert not trie.has_value('foo') + + assert trie.is_prefix('foo.bar') + assert trie.has_value('foo.bar') + assert trie['foo.bar'] is None + + assert not trie.is_prefix('foo.bar.baz') + assert not trie.has_value('foo.bar.baz') -- cgit v1.2.3-70-g09d2 From aa9da358b53fd414a501ca8ecfaf063395ff3ad4 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 1 May 2017 17:57:49 +0200 Subject: url_parse: ported to pytest (#3430) --- lib/spack/spack/test/url_parse.py | 1084 +++++++++++++------------------------ 1 file changed, 391 insertions(+), 693 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index effbb4b2c4..cf6f262fdf 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -23,709 +23,407 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """Tests Spack's ability to parse the name and version of a package -based on its URL.""" +based on its URL. +""" import os -import unittest +import pytest from spack.url import * -class UrlStripVersionSuffixesTest(unittest.TestCase): - """Tests for spack.url.strip_version_suffixes""" - - def check(self, before, after): - stripped = strip_version_suffixes(before) - self.assertEqual(stripped, after) - - def test_no_suffix(self): - self.check('rgb-1.0.6', - 'rgb-1.0.6') - - def test_misleading_prefix(self): - self.check('jpegsrc.v9b', - 'jpegsrc.v9b') - self.check('turbolinux702', - 'turbolinux702') - self.check('converge_install_2.3.16', - 'converge_install_2.3.16') - - # Download type - - def test_src(self): - self.check('apache-ant-1.9.7-src', - 'apache-ant-1.9.7') - self.check('go1.7.4.src', - 'go1.7.4') - - def test_source(self): - self.check('bowtie2-2.2.5-source', - 'bowtie2-2.2.5') - self.check('grib_api-1.17.0-Source', - 'grib_api-1.17.0') - - def test_full(self): - self.check('julia-0.4.3-full', - 'julia-0.4.3') - - def test_bin(self): - self.check('apache-maven-3.3.9-bin', - 'apache-maven-3.3.9') - - def test_binary(self): - self.check('Jmol-14.8.0-binary', - 'Jmol-14.8.0') - - def test_gem(self): - self.check('rubysl-date-2.0.9.gem', - 'rubysl-date-2.0.9') - - def test_tar(self): - self.check('gromacs-4.6.1-tar', - 'gromacs-4.6.1') - - def test_sh(self): - self.check('Miniconda2-4.3.11-Linux-x86_64.sh', - 'Miniconda2-4.3.11') - - # Download version - - def test_stable(self): - self.check('libevent-2.0.21-stable', - 'libevent-2.0.21') - - def test_final(self): - self.check('2.6.7-final', - '2.6.7') - - def test_rel(self): - self.check('v1.9.5.1rel', - 'v1.9.5.1') - - def test_orig(self): - self.check('dash_0.5.5.1.orig', - 'dash_0.5.5.1') - - def test_plus(self): - self.check('ncbi-blast-2.6.0+-src', - 'ncbi-blast-2.6.0') - +@pytest.mark.parametrize('url,expected', [ + # No suffix + ('rgb-1.0.6', 'rgb-1.0.6'), + # Misleading prefix + ('jpegsrc.v9b', 'jpegsrc.v9b'), + ('turbolinux702', 'turbolinux702'), + ('converge_install_2.3.16', 'converge_install_2.3.16'), + # Download type - src + ('apache-ant-1.9.7-src', 'apache-ant-1.9.7'), + ('go1.7.4.src', 'go1.7.4'), + # Download type - source + ('bowtie2-2.2.5-source', 'bowtie2-2.2.5'), + ('grib_api-1.17.0-Source', 'grib_api-1.17.0'), + # Download type - full + ('julia-0.4.3-full', 'julia-0.4.3'), + # Download type - bin + ('apache-maven-3.3.9-bin', 'apache-maven-3.3.9'), + # Download type - binary + ('Jmol-14.8.0-binary', 'Jmol-14.8.0'), + # Download type - gem + ('rubysl-date-2.0.9.gem', 'rubysl-date-2.0.9'), + # Download type - tar + ('gromacs-4.6.1-tar', 'gromacs-4.6.1'), + # Download type - sh + ('Miniconda2-4.3.11-Linux-x86_64.sh', 'Miniconda2-4.3.11'), + # Download version - stable + ('libevent-2.0.21-stable', 'libevent-2.0.21'), + # Download version - final + ('2.6.7-final', '2.6.7'), + # Download version - rel + ('v1.9.5.1rel', 'v1.9.5.1'), + # Download version - orig + ('dash_0.5.5.1.orig', 'dash_0.5.5.1'), + # Download version - plus + ('ncbi-blast-2.6.0+-src', 'ncbi-blast-2.6.0'), # License - - def test_gpl(self): - self.check('cppad-20170114.gpl', - 'cppad-20170114') - - # OS - - def test_linux(self): - self.check('astyle_2.04_linux', - 'astyle_2.04') - - def test_unix(self): - self.check('install-tl-unx', - 'install-tl') - - def test_macos(self): - self.check('astyle_1.23_macosx', - 'astyle_1.23') - self.check('haxe-2.08-osx', - 'haxe-2.08') - - # PyPI - - def test_wheel(self): - self.check('entrypoints-0.2.2-py2.py3-none-any.whl', - 'entrypoints-0.2.2') - self.check('numpy-1.12.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl', # noqa - 'numpy-1.12.0') - - def test_exe(self): - self.check('PyYAML-3.12.win-amd64-py3.5.exe', - 'PyYAML-3.12') - - # Combinations of multiple patterns - - def test_complex_all(self): - self.check('p7zip_9.04_src_all', - 'p7zip_9.04') - - def test_complex_run(self): - self.check('cuda_8.0.44_linux.run', - 'cuda_8.0.44') - - def test_complex_file(self): - self.check('ack-2.14-single-file', - 'ack-2.14') - - def test_complex_jar(self): - self.check('antlr-3.4-complete.jar', - 'antlr-3.4') - - def test_complex_oss(self): - self.check('tbb44_20160128oss_src_0', - 'tbb44_20160128') - - def test_complex_darwin(self): - self.check('ghc-7.0.4-x86_64-apple-darwin', - 'ghc-7.0.4') - self.check('ghc-7.0.4-i386-apple-darwin', - 'ghc-7.0.4') - - def test_complex_arch(self): - self.check('VizGlow_v2.2alpha17-R21November2016-Linux-x86_64-Install', - 'VizGlow_v2.2alpha17-R21November2016') - self.check('jdk-8u92-linux-x64', - 'jdk-8u92') - self.check('cuda_6.5.14_linux_64.run', - 'cuda_6.5.14') - - def test_complex_with(self): - self.check('mafft-7.221-with-extensions-src', - 'mafft-7.221') - self.check('spark-2.0.0-bin-without-hadoop', - 'spark-2.0.0') - - def test_complex_public(self): - self.check('dakota-6.3-public.src', - 'dakota-6.3') - - def test_complex_universal(self): - self.check('synergy-1.3.6p2-MacOSX-Universal', - 'synergy-1.3.6p2') - - -class UrlStripNameSuffixesTest(unittest.TestCase): - """Tests for spack.url.strip_name_suffixes""" - - def check(self, before, version, after): - stripped = strip_name_suffixes(before, version) - self.assertEqual(stripped, after) - - def test_no_suffix(self): - self.check('rgb-1.0.6', '1.0.6', - 'rgb') - self.check('nauty26r7', '26r7', - 'nauty') - - # Download type - - def test_install(self): - self.check('converge_install_2.3.16', '2.3.16', - 'converge') - - def test_src(self): - self.check('jpegsrc.v9b', '9b', - 'jpeg') - - def test_std(self): - self.check('ghostscript-fonts-std-8.11', '8.11', - 'ghostscript-fonts') - - # Download version - - def test_release(self): - self.check('cbench_release_1.3.0.tar.gz', '1.3.0', - 'cbench') - - def test_snapshot(self): - self.check('gts-snapshot-121130', '121130', - 'gts') - - def test_distrib(self): - self.check('zoltan_distrib_v3.83', '3.83', - 'zoltan') - - # VCS - - def test_bazaar(self): - self.check('libvterm-0+bzr681', '681', - 'libvterm') - - # License - - def test_gpl(self): - self.check('PyQt-x11-gpl-4.11.3', '4.11.3', - 'PyQt-x11') - - -class UrlParseOffsetTest(unittest.TestCase): - - def check(self, name, noffset, ver, voffset, path): - # Make sure parse_name_offset and parse_name_version are working - v, vstart, vlen, vi, vre = parse_version_offset(path) - n, nstart, nlen, ni, nre = parse_name_offset(path, v) - - self.assertEqual(n, name) - self.assertEqual(v, ver) - self.assertEqual(nstart, noffset) - self.assertEqual(vstart, voffset) - - def test_name_in_path(self): - self.check( - 'antlr', 25, '2.7.7', 40, - 'https://github.com/antlr/antlr/tarball/v2.7.7') - - def test_name_in_stem(self): - self.check( - 'gmp', 32, '6.0.0a', 36, - 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2') - - def test_name_in_suffix(self): - # Don't think I've ever seen one of these before - # We don't look for it, so it would probably fail anyway - pass - - def test_version_in_path(self): - self.check( - 'nextflow', 31, '0.20.1', 59, - 'https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow') - - def test_version_in_stem(self): - self.check( - 'zlib', 24, '1.2.10', 29, - 'http://zlib.net/fossils/zlib-1.2.10.tar.gz') - self.check( - 'slepc', 51, '3.6.2', 57, - 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz') - self.check( - 'cloog', 61, '0.18.1', 67, - 'http://www.bastoul.net/cloog/pages/download/count.php3?url=./cloog-0.18.1.tar.gz') - self.check( - 'libxc', 58, '2.2.2', 64, - 'http://www.tddft.org/programs/octopus/down.php?file=libxc/libxc-2.2.2.tar.gz') - - def test_version_in_suffix(self): - self.check( - 'swiftsim', 36, '0.3.0', 76, - 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0') - self.check( - 'sionlib', 30, '1.7.1', 59, - 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') - - def test_regex_in_name(self): - self.check( - 'voro++', 40, '0.4.6', 47, - 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz') - - -class UrlParseNameAndVersionTest(unittest.TestCase): - - def assert_not_detected(self, string): - self.assertRaises( - UndetectableVersionError, parse_name_and_version, string) - - def check(self, name, v, string, **kwargs): - # Make sure correct name and version are extracted. - parsed_name, parsed_v = parse_name_and_version(string) - self.assertEqual(parsed_name, name) - self.assertEqual(parsed_v, Version(v)) - - # Make sure Spack formulates the right URL when we try to - # build one with a specific version. - self.assertEqual(string, substitute_version(string, v)) - - # Common Repositories - - def test_github_downloads(self): - # name/archive/ver.ver - self.check( - 'nco', '4.6.2', - 'https://github.com/nco/nco/archive/4.6.2.tar.gz') - # name/archive/vver.ver - self.check( - 'vim', '8.0.0134', - 'https://github.com/vim/vim/archive/v8.0.0134.tar.gz') - # name/archive/name-ver.ver - self.check( - 'oce', '0.18', - 'https://github.com/tpaviot/oce/archive/OCE-0.18.tar.gz') - # name/releases/download/vver/name-ver.ver - self.check( - 'libmesh', '1.0.0', - 'https://github.com/libMesh/libmesh/releases/download/v1.0.0/libmesh-1.0.0.tar.bz2') - # name/tarball/vver.ver - self.check( - 'git', '2.7.1', - 'https://github.com/git/git/tarball/v2.7.1') - # name/zipball/vver.ver - self.check( - 'git', '2.7.1', - 'https://github.com/git/git/zipball/v2.7.1') - - def test_gitlab_downloads(self): - # name/repository/archive.ext?ref=vver.ver - self.check( - 'swiftsim', '0.3.0', - 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0') - # name/repository/archive.ext?ref=name-ver.ver - self.check( - 'icet', '1.2.3', - 'https://gitlab.kitware.com/icet/icet/repository/archive.tar.gz?ref=IceT-1.2.3') - - def test_bitbucket_downloads(self): - # name/get/ver.ver - self.check( - 'eigen', '3.2.7', - 'https://bitbucket.org/eigen/eigen/get/3.2.7.tar.bz2') - # name/get/vver.ver - self.check( - 'hoomd-blue', '1.3.3', - 'https://bitbucket.org/glotzer/hoomd-blue/get/v1.3.3.tar.bz2') - # name/downloads/name-ver.ver - self.check( - 'dolfin', '2016.1.0', - 'https://bitbucket.org/fenics-project/dolfin/downloads/dolfin-2016.1.0.tar.gz') - - def test_sourceforge_downloads(self): - # name-ver.ver - self.check( - 'libpng', '1.6.27', - 'http://download.sourceforge.net/libpng/libpng-1.6.27.tar.gz') - self.check( - 'lcms2', '2.6', - 'http://downloads.sourceforge.net/project/lcms/lcms/2.6/lcms2-2.6.tar.gz') - self.check( - 'modules', '3.2.10', - 'http://prdownloads.sourceforge.net/modules/modules-3.2.10.tar.gz') - # name-ver.ver.ext/download - self.check( - 'glew', '2.0.0', - 'https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download') - - def test_cran_downloads(self): - # name.name_ver.ver-ver.ver - self.check( - 'TH.data', '1.0-8', - 'https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz') - self.check( - 'knitr', '1.14', - 'https://cran.rstudio.com/src/contrib/knitr_1.14.tar.gz') - self.check( - 'devtools', '1.12.0', - 'https://cloud.r-project.org/src/contrib/devtools_1.12.0.tar.gz') - - def test_pypi_downloads(self): - # name.name_name-ver.ver - self.check( - '3to2', '1.1.1', - 'https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip') - self.check( - 'mpmath', '0.19', - 'https://pypi.python.org/packages/source/m/mpmath/mpmath-all-0.19.tar.gz') - self.check( - 'pandas', '0.16.0', - 'https://pypi.python.org/packages/source/p/pandas/pandas-0.16.0.tar.gz#md5=bfe311f05dc0c351f8955fbd1e296e73') - self.check( - 'sphinx_rtd_theme', '0.1.10a0', - 'https://pypi.python.org/packages/da/6b/1b75f13d8aa3333f19c6cdf1f0bc9f52ea739cae464fbee050307c121857/sphinx_rtd_theme-0.1.10a0.tar.gz') - self.check( - 'backports.ssl_match_hostname', '3.5.0.1', - 'https://pypi.io/packages/source/b/backports.ssl_match_hostname/backports.ssl_match_hostname-3.5.0.1.tar.gz') - - def test_bazaar_downloads(self): - self.check( - 'libvterm', '681', - 'http://www.leonerd.org.uk/code/libvterm/libvterm-0+bzr681.tar.gz') + ('cppad-20170114.gpl', 'cppad-20170114'), + # OS - linux + ('astyle_2.04_linux', 'astyle_2.04'), + # OS - unix + ('install-tl-unx', 'install-tl'), + # OS - macos + ('astyle_1.23_macosx', 'astyle_1.23'), + ('haxe-2.08-osx', 'haxe-2.08'), + # PyPI - wheel + ('entrypoints-0.2.2-py2.py3-none-any.whl', 'entrypoints-0.2.2'), + ('numpy-1.12.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl', 'numpy-1.12.0'), # noqa + # PyPI - exe + ('PyYAML-3.12.win-amd64-py3.5.exe', 'PyYAML-3.12'), + # Combinations of multiple patterns - all + ('p7zip_9.04_src_all', 'p7zip_9.04'), + # Combinations of multiple patterns - run + ('cuda_8.0.44_linux.run', 'cuda_8.0.44'), + # Combinations of multiple patterns - file + ('ack-2.14-single-file', 'ack-2.14'), + # Combinations of multiple patterns - jar + ('antlr-3.4-complete.jar', 'antlr-3.4'), + # Combinations of multiple patterns - oss + ('tbb44_20160128oss_src_0', 'tbb44_20160128'), + # Combinations of multiple patterns - darwin + ('ghc-7.0.4-x86_64-apple-darwin', 'ghc-7.0.4'), + ('ghc-7.0.4-i386-apple-darwin', 'ghc-7.0.4'), + # Combinations of multiple patterns - arch + ('VizGlow_v2.2alpha17-R21November2016-Linux-x86_64-Install', + 'VizGlow_v2.2alpha17-R21November2016'), + ('jdk-8u92-linux-x64', 'jdk-8u92'), + ('cuda_6.5.14_linux_64.run', 'cuda_6.5.14'), + # Combinations of multiple patterns - with + ('mafft-7.221-with-extensions-src', 'mafft-7.221'), + ('spark-2.0.0-bin-without-hadoop', 'spark-2.0.0'), + # Combinations of multiple patterns - public + ('dakota-6.3-public.src', 'dakota-6.3'), + # Combinations of multiple patterns - universal + ('synergy-1.3.6p2-MacOSX-Universal', 'synergy-1.3.6p2') +]) +def test_url_strip_version_suffixes(url, expected): + stripped = strip_version_suffixes(url) + assert stripped == expected + + +@pytest.mark.parametrize('url,version,expected', [ + # No suffix + ('rgb-1.0.6', '1.0.6', 'rgb'), + ('nauty26r7', '26r7', 'nauty'), + # Download type - install + ('converge_install_2.3.16', '2.3.16', 'converge'), + # Download type - src + ('jpegsrc.v9b', '9b', 'jpeg'), + # Download type - std + ('ghostscript-fonts-std-8.11', '8.11', 'ghostscript-fonts'), + # Download version - release + ('cbench_release_1.3.0.tar.gz', '1.3.0', 'cbench'), + # Download version - snapshot + ('gts-snapshot-121130', '121130', 'gts'), + # Download version - distrib + ('zoltan_distrib_v3.83', '3.83', 'zoltan'), + # VCS - bazaar + ('libvterm-0+bzr681', '681', 'libvterm'), + # License - gpl + ('PyQt-x11-gpl-4.11.3', '4.11.3', 'PyQt-x11') +]) +def test_url_strip_name_suffixes(url, version, expected): + stripped = strip_name_suffixes(url, version) + assert stripped == expected + + +@pytest.mark.parametrize('name,noffset,ver,voffset,path', [ + # Name in path + ('antlr', 25, '2.7.7', 40, 'https://github.com/antlr/antlr/tarball/v2.7.7'), + # Name in stem + ('gmp', 32, '6.0.0a', 36, 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2'), + # Name in suffix + + # Don't think I've ever seen one of these before + # We don't look for it, so it would probably fail anyway + + # Version in path + ('nextflow', 31, '0.20.1', 59, 'https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow'), + # Version in stem + ('zlib', 24, '1.2.10', 29, 'http://zlib.net/fossils/zlib-1.2.10.tar.gz'), + ('slepc', 51, '3.6.2', 57, 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz'), + ('cloog', 61, '0.18.1', 67, 'http://www.bastoul.net/cloog/pages/download/count.php3?url=./cloog-0.18.1.tar.gz'), + ('libxc', 58, '2.2.2', 64, 'http://www.tddft.org/programs/octopus/down.php?file=libxc/libxc-2.2.2.tar.gz'), + # Version in suffix + ('swiftsim', 36, '0.3.0', 76, 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0'), + ('sionlib', 30, '1.7.1', 59, 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1'), + # Regex in name + ('voro++', 40, '0.4.6', 47, 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz'), +]) +def test_url_parse_offset(name, noffset, ver, voffset, path): + """Tests that the name, version and offsets are computed correctly. + + Args: + name (str): expected name + noffset (int): name offset + ver (str): expected version + voffset (int): version offset + path (str): url to be parsed + """ + # Make sure parse_name_offset and parse_name_version are working + v, vstart, vlen, vi, vre = parse_version_offset(path) + n, nstart, nlen, ni, nre = parse_name_offset(path, v) + + assert n == name + assert v == ver + assert nstart == noffset + assert vstart == voffset + + +@pytest.mark.parametrize('name,version,url', [ + # Common Repositories - github downloads + + ('nco', '4.6.2', 'https://github.com/nco/nco/archive/4.6.2.tar.gz'), + # name/archive/vver.ver + ('vim', '8.0.0134', 'https://github.com/vim/vim/archive/v8.0.0134.tar.gz'), + # name/archive/name-ver.ver + ('oce', '0.18', 'https://github.com/tpaviot/oce/archive/OCE-0.18.tar.gz'), + # name/releases/download/vver/name-ver.ver + ('libmesh', '1.0.0', 'https://github.com/libMesh/libmesh/releases/download/v1.0.0/libmesh-1.0.0.tar.bz2'), + # name/tarball/vver.ver + ('git', '2.7.1', 'https://github.com/git/git/tarball/v2.7.1'), + # name/zipball/vver.ver + ('git', '2.7.1', 'https://github.com/git/git/zipball/v2.7.1'), + # Common Repositories - gitlab downloads + + # name/repository/archive.ext?ref=vver.ver + ('swiftsim', '0.3.0', + 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0'), + # name/repository/archive.ext?ref=name-ver.ver + ('icet', '1.2.3', + 'https://gitlab.kitware.com/icet/icet/repository/archive.tar.gz?ref=IceT-1.2.3'), + + # Common Repositories - bitbucket downloads + + # name/get/ver.ver + ('eigen', '3.2.7', 'https://bitbucket.org/eigen/eigen/get/3.2.7.tar.bz2'), + # name/get/vver.ver + ('hoomd-blue', '1.3.3', + 'https://bitbucket.org/glotzer/hoomd-blue/get/v1.3.3.tar.bz2'), + # name/downloads/name-ver.ver + ('dolfin', '2016.1.0', + 'https://bitbucket.org/fenics-project/dolfin/downloads/dolfin-2016.1.0.tar.gz'), + # Common Repositories - sourceforge downloads + + # name-ver.ver + ('libpng', '1.6.27', + 'http://download.sourceforge.net/libpng/libpng-1.6.27.tar.gz'), + ('lcms2', '2.6', + 'http://downloads.sourceforge.net/project/lcms/lcms/2.6/lcms2-2.6.tar.gz'), + ('modules', '3.2.10', + 'http://prdownloads.sourceforge.net/modules/modules-3.2.10.tar.gz'), + # name-ver.ver.ext/download + ('glew', '2.0.0', + 'https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download'), + + # Common Repositories - cran downloads + + # name.name_ver.ver-ver.ver + ('TH.data', '1.0-8', 'https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz'), + ('knitr', '1.14', 'https://cran.rstudio.com/src/contrib/knitr_1.14.tar.gz'), + ('devtools', '1.12.0', 'https://cloud.r-project.org/src/contrib/devtools_1.12.0.tar.gz'), + + # Common Repositories - pypi downloads + + # name.name_name-ver.ver + ('3to2', '1.1.1', 'https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip'), + ('mpmath', '0.19', + 'https://pypi.python.org/packages/source/m/mpmath/mpmath-all-0.19.tar.gz'), + ('pandas', '0.16.0', + 'https://pypi.python.org/packages/source/p/pandas/pandas-0.16.0.tar.gz#md5=bfe311f05dc0c351f8955fbd1e296e73'), + ('sphinx_rtd_theme', '0.1.10a0', + 'https://pypi.python.org/packages/da/6b/1b75f13d8aa3333f19c6cdf1f0bc9f52ea739cae464fbee050307c121857/sphinx_rtd_theme-0.1.10a0.tar.gz'), + ('backports.ssl_match_hostname', '3.5.0.1', + 'https://pypi.io/packages/source/b/backports.ssl_match_hostname/backports.ssl_match_hostname-3.5.0.1.tar.gz'), + # Common Repositories - bazaar downloads + ('libvterm', '681', 'http://www.leonerd.org.uk/code/libvterm/libvterm-0+bzr681.tar.gz'), # Common Tarball Formats - def test_version_only(self): - # ver.ver - self.check( - 'eigen', '3.2.7', - 'https://bitbucket.org/eigen/eigen/get/3.2.7.tar.bz2') - # ver.ver-ver - self.check( - 'ImageMagick', '7.0.2-7', - 'https://github.com/ImageMagick/ImageMagick/archive/7.0.2-7.tar.gz') - # vver.ver - self.check( - 'CGNS', '3.3.0', - 'https://github.com/CGNS/CGNS/archive/v3.3.0.tar.gz') - # vver_ver - self.check( - 'luafilesystem', '1_6_3', - 'https://github.com/keplerproject/luafilesystem/archive/v1_6_3.tar.gz') - - def test_no_separators(self): - # namever - self.check( - 'turbolinux', '702', - 'file://{0}/turbolinux702.tar.gz'.format(os.getcwd())) - self.check( - 'nauty', '26r7', - 'http://pallini.di.uniroma1.it/nauty26r7.tar.gz') - - def test_dashes_only(self): - # name-name-ver-ver - self.check( - 'Trilinos', '12-10-1', - 'https://github.com/trilinos/Trilinos/archive/trilinos-release-12-10-1.tar.gz') - self.check( - 'panda', '2016-03-07', - 'http://comopt.ifi.uni-heidelberg.de/software/PANDA/downloads/panda-2016-03-07.tar') - self.check( - 'gts', '121130', - 'http://gts.sourceforge.net/tarballs/gts-snapshot-121130.tar.gz') - self.check( - 'cdd', '061a', - 'http://www.cs.mcgill.ca/~fukuda/download/cdd/cdd-061a.tar.gz') - - def test_underscores_only(self): - # name_name_ver_ver - self.check( - 'tinyxml', '2_6_2', - 'https://sourceforge.net/projects/tinyxml/files/tinyxml/2.6.2/tinyxml_2_6_2.tar.gz') - self.check( - 'boost', '1_55_0', - 'http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2') - self.check( - 'yorick', '2_2_04', - 'https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz') - # name_namever_ver - self.check( - 'tbb', '44_20160413', - 'https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160413oss_src.tgz') - - def test_dots_only(self): - # name.name.ver.ver - self.check( - 'prank', '150803', - 'http://wasabiapp.org/download/prank/prank.source.150803.tgz') - self.check( - 'jpeg', '9b', - 'http://www.ijg.org/files/jpegsrc.v9b.tar.gz') - self.check( - 'openjpeg', '2.1', - 'https://github.com/uclouvain/openjpeg/archive/version.2.1.tar.gz') - # name.namever.ver - self.check( - 'atlas', '3.11.34', - 'http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.34/atlas3.11.34.tar.bz2') - self.check( - 'visit', '2.10.1', - 'http://portal.nersc.gov/project/visit/releases/2.10.1/visit2.10.1.tar.gz') - self.check( - 'geant', '4.10.01.p03', - 'http://geant4.cern.ch/support/source/geant4.10.01.p03.tar.gz') - self.check( - 'tcl', '8.6.5', - 'http://prdownloads.sourceforge.net/tcl/tcl8.6.5-src.tar.gz') - - def test_dash_dot(self): - # name-name-ver.ver - # digit in name - self.check( - 'm4', '1.4.17', - 'https://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz') - # letter in version - self.check( - 'gmp', '6.0.0a', - 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2') - # version starts with 'v' - self.check( - 'LaunchMON', '1.0.2', - 'https://github.com/LLNL/LaunchMON/releases/download/v1.0.2/launchmon-v1.0.2.tar.gz') - # name-ver-ver.ver - self.check( - 'libedit', '20150325-3.1', - 'http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz') - - def test_dash_underscore(self): - # name-name-ver_ver - self.check( - 'icu4c', '57_1', - 'http://download.icu-project.org/files/icu4c/57.1/icu4c-57_1-src.tgz') - - def test_underscore_dot(self): - # name_name_ver.ver - self.check( - 'superlu_dist', '4.1', - 'http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_dist_4.1.tar.gz') - self.check( - 'pexsi', '0.9.0', - 'https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v0.9.0.tar.gz') - # name_name.ver.ver - self.check( - 'fer', '696', - 'ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v696.tar.gz') - - def test_dash_dot_dash_dot(self): - # name-name-ver.ver-ver.ver - self.check( - 'sowing', '1.1.23-p1', - 'http://ftp.mcs.anl.gov/pub/petsc/externalpackages/sowing-1.1.23-p1.tar.gz') - self.check( - 'bib2xhtml', '3.0-15-gf506', - 'http://www.spinellis.gr/sw/textproc/bib2xhtml/bib2xhtml-v3.0-15-gf506.tar.gz') - # namever.ver-ver.ver - self.check( - 'go', '1.4-bootstrap-20161024', - 'https://storage.googleapis.com/golang/go1.4-bootstrap-20161024.tar.gz') - - def test_underscore_dash_dot(self): - # name_name-ver.ver - self.check( - 'the_silver_searcher', '0.32.0', - 'http://geoff.greer.fm/ag/releases/the_silver_searcher-0.32.0.tar.gz') - self.check( - 'sphinx_rtd_theme', '0.1.10a0', - 'https://pypi.python.org/packages/source/s/sphinx_rtd_theme/sphinx_rtd_theme-0.1.10a0.tar.gz') - - def test_dot_underscore_dot_dash_dot(self): - # name.name_ver.ver-ver.ver - self.check( - 'TH.data', '1.0-8', - 'https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz') - self.check( - 'XML', '3.98-1.4', - 'https://cran.r-project.org/src/contrib/XML_3.98-1.4.tar.gz') - - def test_dash_dot_underscore_dot(self): - # name-name-ver.ver_ver.ver - self.check( - 'pypar', '2.1.5_108', - 'https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-2.1.5_108.tgz') - # name-namever.ver_ver.ver - self.check( - 'STAR-CCM+', '11.06.010_02', - 'file://{0}/STAR-CCM+11.06.010_02_linux-x86_64.tar.gz'.format(os.getcwd())) + # ver.ver + ('eigen', '3.2.7', 'https://bitbucket.org/eigen/eigen/get/3.2.7.tar.bz2'), + # ver.ver-ver + ('ImageMagick', '7.0.2-7', 'https://github.com/ImageMagick/ImageMagick/archive/7.0.2-7.tar.gz'), + # vver.ver + ('CGNS', '3.3.0', 'https://github.com/CGNS/CGNS/archive/v3.3.0.tar.gz'), + # vver_ver + ('luafilesystem', '1_6_3', 'https://github.com/keplerproject/luafilesystem/archive/v1_6_3.tar.gz'), + + # No separators + ('turbolinux', '702', 'file://{0}/turbolinux702.tar.gz'.format(os.getcwd())), + ('nauty', '26r7', 'http://pallini.di.uniroma1.it/nauty26r7.tar.gz'), + # Dashes only + ('Trilinos', '12-10-1', + 'https://github.com/trilinos/Trilinos/archive/trilinos-release-12-10-1.tar.gz'), + ('panda', '2016-03-07', + 'http://comopt.ifi.uni-heidelberg.de/software/PANDA/downloads/panda-2016-03-07.tar'), + ('gts', '121130', + 'http://gts.sourceforge.net/tarballs/gts-snapshot-121130.tar.gz'), + ('cdd', '061a', + 'http://www.cs.mcgill.ca/~fukuda/download/cdd/cdd-061a.tar.gz'), + # Only underscores + ('tinyxml', '2_6_2', + 'https://sourceforge.net/projects/tinyxml/files/tinyxml/2.6.2/tinyxml_2_6_2.tar.gz'), + ('boost', '1_55_0', + 'http://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2'), + ('yorick', '2_2_04', + 'https://github.com/dhmunro/yorick/archive/y_2_2_04.tar.gz'), + ('tbb', '44_20160413', + 'https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160413oss_src.tgz'), + + # Only dots + + # name.name.ver.ver + ('prank', '150803', 'http://wasabiapp.org/download/prank/prank.source.150803.tgz'), + ('jpeg', '9b', 'http://www.ijg.org/files/jpegsrc.v9b.tar.gz'), + ('openjpeg', '2.1', + 'https://github.com/uclouvain/openjpeg/archive/version.2.1.tar.gz'), + # name.namever.ver + ('atlas', '3.11.34', + 'http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.11.34/atlas3.11.34.tar.bz2'), + ('visit', '2.10.1', 'http://portal.nersc.gov/project/visit/releases/2.10.1/visit2.10.1.tar.gz'), + ('geant', '4.10.01.p03', 'http://geant4.cern.ch/support/source/geant4.10.01.p03.tar.gz'), + ('tcl', '8.6.5', 'http://prdownloads.sourceforge.net/tcl/tcl8.6.5-src.tar.gz'), + + # Dash and dots + + # name-name-ver.ver + # digit in name + ('m4', '1.4.17', 'https://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz'), + # letter in version + ('gmp', '6.0.0a', 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2'), + # version starts with 'v' + ('LaunchMON', '1.0.2', + 'https://github.com/LLNL/LaunchMON/releases/download/v1.0.2/launchmon-v1.0.2.tar.gz'), + # name-ver-ver.ver + ('libedit', '20150325-3.1', 'http://thrysoee.dk/editline/libedit-20150325-3.1.tar.gz'), + + # Dash and unserscores + + # name-name-ver_ver + ('icu4c', '57_1', 'http://download.icu-project.org/files/icu4c/57.1/icu4c-57_1-src.tgz'), + + # Underscores and dots + + # name_name_ver.ver + ('superlu_dist', '4.1', 'http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_dist_4.1.tar.gz'), + ('pexsi', '0.9.0', 'https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v0.9.0.tar.gz'), + # name_name.ver.ver + ('fer', '696', 'ftp://ftp.pmel.noaa.gov/ferret/pub/source/fer_source.v696.tar.gz'), + + # Dash dot dah dot + + # name-name-ver.ver-ver.ver + ('sowing', '1.1.23-p1', 'http://ftp.mcs.anl.gov/pub/petsc/externalpackages/sowing-1.1.23-p1.tar.gz'), + ('bib2xhtml', '3.0-15-gf506', 'http://www.spinellis.gr/sw/textproc/bib2xhtml/bib2xhtml-v3.0-15-gf506.tar.gz'), + # namever.ver-ver.ver + ('go', '1.4-bootstrap-20161024', 'https://storage.googleapis.com/golang/go1.4-bootstrap-20161024.tar.gz'), + + # Underscore dash dot + + # name_name-ver.ver + ('the_silver_searcher', '0.32.0', 'http://geoff.greer.fm/ag/releases/the_silver_searcher-0.32.0.tar.gz'), + ('sphinx_rtd_theme', '0.1.10a0', + 'https://pypi.python.org/packages/source/s/sphinx_rtd_theme/sphinx_rtd_theme-0.1.10a0.tar.gz'), + + # Dot underscore dot dash dot + + # name.name_ver.ver-ver.ver + ('TH.data', '1.0-8', 'https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz'), + ('XML', '3.98-1.4', 'https://cran.r-project.org/src/contrib/XML_3.98-1.4.tar.gz'), + + # Dash dot underscore dot + + # name-name-ver.ver_ver.ver + ('pypar', '2.1.5_108', + 'https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pypar/pypar-2.1.5_108.tgz'), + # name-namever.ver_ver.ver + ('STAR-CCM+', '11.06.010_02', + 'file://{0}/STAR-CCM+11.06.010_02_linux-x86_64.tar.gz'.format(os.getcwd())), # Weird URLS - def test_version_in_path(self): - # github.com/repo/name/releases/download/name-vver/name - self.check( - 'nextflow', '0.20.1', - 'https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow') - - def test_suffix_queries(self): - self.check( - 'swiftsim', '0.3.0', - 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0') - self.check( - 'sionlib', '1.7.1', - 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') - - def test_stem_queries(self): - self.check( - 'slepc', '3.6.2', - 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz') - self.check( - 'otf', '1.12.5salmon', - 'http://wwwpub.zih.tu-dresden.de/%7Emlieber/dcount/dcount.php?package=otf&get=OTF-1.12.5salmon.tar.gz') - - def test_single_character_name(self): - self.check( - 'R', '3.3.2', - 'https://cloud.r-project.org/src/base/R-3/R-3.3.2.tar.gz') - - def test_single_digit_version(self): - pass - - def test_name_starts_with_digit(self): - self.check( - '3to2', '1.1.1', - 'https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip') - - def plus_in_name(self): - self.check( - 'gtk+', '2.24.31', - 'http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.31.tar.xz') - self.check( - 'voro++', '0.4.6', - 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz') - - def test_no_version(self): - self.assert_not_detected('http://www.netlib.org/blas/blast-forum/cblas.tgz') - self.assert_not_detected('http://www.netlib.org/voronoi/triangle.zip') - - def test_download_php(self): - # Name comes before download.php - self.check( - 'sionlib', '1.7.1', - 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1') - # Ignore download.php - self.check( - 'slepc', '3.6.2', - 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz') - self.check( - 'ScientificPython', '2.8.1', - 'https://sourcesup.renater.fr/frs/download.php/file/4411/ScientificPython-2.8.1.tar.gz') - - def test_gloox_beta_style(self): - self.check( - 'gloox', '1.0-beta7', - 'http://camaya.net/download/gloox-1.0-beta7.tar.bz2') - - def test_sphinx_beta_style(self): - self.check( - 'sphinx', '1.10-beta', - 'http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz') - - def test_ruby_version_style(self): - self.check( - 'ruby', '1.9.1-p243', - 'ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz') - - def test_rc_style(self): - self.check( - 'libvorbis', '1.2.2rc1', - 'http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2') - - def test_dash_rc_style(self): - self.check( - 'js', '1.8.0-rc1', - 'http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz') - - def test_apache_version_style(self): - self.check( - 'apache-cassandra', '1.2.0-rc2', - 'http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz') - - def test_xaw3d_version(self): - self.check( - 'Xaw3d', '1.5E', - 'ftp://ftp.visi.com/users/hawkeyd/X/Xaw3d-1.5E.tar.gz') - - def test_fann_version(self): - self.check( - 'fann', '2.1.0beta', - 'http://downloads.sourceforge.net/project/fann/fann/2.1.0beta/fann-2.1.0beta.zip') - - def test_imap_version(self): - self.check( - 'imap', '2007f', - 'ftp://ftp.cac.washington.edu/imap/imap-2007f.tar.gz') - - def test_suite3270_version(self): - self.check( - 'suite3270', '3.3.12ga7', - 'http://sourceforge.net/projects/x3270/files/x3270/3.3.12ga7/suite3270-3.3.12ga7-src.tgz') - - def test_scalasca_version(self): - self.check( - 'cube', '4.2.3', - 'http://apps.fz-juelich.de/scalasca/releases/cube/4.2/dist/cube-4.2.3.tar.gz') - self.check( - 'cube', '4.3-TP1', - 'http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-4.3-TP1.tar.gz') - - def test_github_raw_url(self): - self.check( - 'CLAMR', '2.0.7', - 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true') - - def test_luaposix_version(self): - self.check( - 'luaposix', '33.4.0', - 'https://github.com/luaposix/luaposix/archive/release-v33.4.0.tar.gz') - - def test_nco_version(self): - self.check( - 'nco', '4.6.2-beta03', - 'https://github.com/nco/nco/archive/4.6.2-beta03.tar.gz') - self.check( - 'nco', '4.6.3-alpha04', - 'https://github.com/nco/nco/archive/4.6.3-alpha04.tar.gz') + # github.com/repo/name/releases/download/name-vver/name + ('nextflow', '0.20.1', 'https://github.com/nextflow-io/nextflow/releases/download/v0.20.1/nextflow'), + # suffix queries + ('swiftsim', '0.3.0', 'http://gitlab.cosma.dur.ac.uk/swift/swiftsim/repository/archive.tar.gz?ref=v0.3.0'), + ('sionlib', '1.7.1', 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1'), + # stem queries + ('slepc', '3.6.2', 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz'), + ('otf', '1.12.5salmon', + 'http://wwwpub.zih.tu-dresden.de/%7Emlieber/dcount/dcount.php?package=otf&get=OTF-1.12.5salmon.tar.gz'), + # single character name + ('R', '3.3.2', 'https://cloud.r-project.org/src/base/R-3/R-3.3.2.tar.gz'), + # name starts with digit + ('3to2', '1.1.1', 'https://pypi.python.org/packages/source/3/3to2/3to2-1.1.1.zip'), + # plus in name + ('gtk+', '2.24.31', 'http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.31.tar.xz'), + ('voro++', '0.4.6', 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz'), + # Name comes before download.php + ('sionlib', '1.7.1', 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1'), + # Ignore download.php + ('slepc', '3.6.2', 'http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz'), + ('ScientificPython', '2.8.1', + 'https://sourcesup.renater.fr/frs/download.php/file/4411/ScientificPython-2.8.1.tar.gz'), + # gloox beta style + ('gloox', '1.0-beta7', 'http://camaya.net/download/gloox-1.0-beta7.tar.bz2'), + # sphinx beta style + ('sphinx', '1.10-beta', 'http://sphinxsearch.com/downloads/sphinx-1.10-beta.tar.gz'), + # ruby version style + ('ruby', '1.9.1-p243', 'ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz'), + # rc style + ('libvorbis', '1.2.2rc1', 'http://downloads.xiph.org/releases/vorbis/libvorbis-1.2.2rc1.tar.bz2'), + # dash rc style + ('js', '1.8.0-rc1', 'http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz'), + # apache version style + ('apache-cassandra', '1.2.0-rc2', + 'http://www.apache.org/dyn/closer.cgi?path=/cassandra/1.2.0/apache-cassandra-1.2.0-rc2-bin.tar.gz'), + # xaw3d version + ('Xaw3d', '1.5E', 'ftp://ftp.visi.com/users/hawkeyd/X/Xaw3d-1.5E.tar.gz'), + # fann version + ('fann', '2.1.0beta', 'http://downloads.sourceforge.net/project/fann/fann/2.1.0beta/fann-2.1.0beta.zip'), + # imap version + ('imap', '2007f', 'ftp://ftp.cac.washington.edu/imap/imap-2007f.tar.gz'), + # suite3270 version + ('suite3270', '3.3.12ga7', + 'http://sourceforge.net/projects/x3270/files/x3270/3.3.12ga7/suite3270-3.3.12ga7-src.tgz'), + # scalasca version + ('cube', '4.2.3', 'http://apps.fz-juelich.de/scalasca/releases/cube/4.2/dist/cube-4.2.3.tar.gz'), + ('cube', '4.3-TP1', 'http://apps.fz-juelich.de/scalasca/releases/cube/4.3/dist/cube-4.3-TP1.tar.gz'), + # github raw url + ('CLAMR', '2.0.7', 'https://github.com/losalamos/CLAMR/blob/packages/PowerParser_v2.0.7.tgz?raw=true'), + # luaposix version + ('luaposix', '33.4.0', 'https://github.com/luaposix/luaposix/archive/release-v33.4.0.tar.gz'), + # nco version + ('nco', '4.6.2-beta03', 'https://github.com/nco/nco/archive/4.6.2-beta03.tar.gz'), + ('nco', '4.6.3-alpha04', 'https://github.com/nco/nco/archive/4.6.3-alpha04.tar.gz'), +]) +def test_url_parse_name_and_version(name, version, url): + # Make sure correct name and version are extracted. + parsed_name, parsed_version = parse_name_and_version(url) + assert parsed_name == name + assert parsed_version == Version(version) + + # Make sure Spack formulates the right URL when we try to + # build one with a specific version. + assert url == substitute_version(url, version) + + +@pytest.mark.parametrize('not_detectable_url', [ + 'http://www.netlib.org/blas/blast-forum/cblas.tgz', + 'http://www.netlib.org/voronoi/triangle.zip', +]) +def test_no_version(not_detectable_url): + with pytest.raises(UndetectableVersionError): + parse_name_and_version(not_detectable_url) -- cgit v1.2.3-70-g09d2 From 32dd20035fd12cad43398fef56918488ed402294 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 1 May 2017 11:53:16 -0700 Subject: Skip fetch tests for tools that are not installed. (#4059) This allows people on systems that don't have all the fetchers to still run Spack tests. Mark tests that require git, subversion, or mercurial to be skipped if they're not installed. --- lib/spack/spack/test/git_fetch.py | 5 +++++ lib/spack/spack/test/hg_fetch.py | 5 +++++ lib/spack/spack/test/mirror.py | 33 ++++++++++++++++++++++++--------- lib/spack/spack/test/svn_fetch.py | 5 +++++ 4 files changed, 39 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py index 34f74df84f..093f0a7053 100644 --- a/lib/spack/spack/test/git_fetch.py +++ b/lib/spack/spack/test/git_fetch.py @@ -29,6 +29,11 @@ import spack from llnl.util.filesystem import * from spack.spec import Spec from spack.version import ver +from spack.util.executable import which + + +pytestmark = pytest.mark.skipif( + not which('git'), reason='requires git to be installed') @pytest.mark.parametrize("type_of_test", ['master', 'branch', 'tag', 'commit']) diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py index 96a23a1c53..c0318c58ff 100644 --- a/lib/spack/spack/test/hg_fetch.py +++ b/lib/spack/spack/test/hg_fetch.py @@ -29,6 +29,11 @@ import spack from llnl.util.filesystem import * from spack.spec import Spec from spack.version import ver +from spack.util.executable import which + + +pytestmark = pytest.mark.skipif( + not which('hg'), reason='requires mercurial to be installed') @pytest.mark.parametrize("type_of_test", ['default', 'rev0']) diff --git a/lib/spack/spack/test/mirror.py b/lib/spack/spack/test/mirror.py index e5e60e3045..21dbb8f4f6 100644 --- a/lib/spack/spack/test/mirror.py +++ b/lib/spack/spack/test/mirror.py @@ -26,18 +26,20 @@ import filecmp import os import pytest +from llnl.util.filesystem import join_path + import spack import spack.mirror import spack.util.executable -from llnl.util.filesystem import join_path from spack.spec import Spec from spack.stage import Stage +from spack.util.executable import which # paths in repos that shouldn't be in the mirror tarballs. exclude = ['.hg', '.git', '.svn'] + repos = {} -svn = spack.util.executable.which('svn', required=True) def set_up_package(name, repository, url_attr): @@ -95,13 +97,17 @@ def check_mirror(): # Stage the archive from the mirror and cd to it. spack.do_checksum = False pkg.do_stage(mirror_only=True) + # Compare the original repo with the expanded archive original_path = mock_repo.path if 'svn' in name: # have to check out the svn repo to compare. original_path = join_path( mock_repo.path, 'checked_out') + + svn = which('svn', required=True) svn('checkout', mock_repo.url, original_path) + dcmp = filecmp.dircmp(original_path, pkg.stage.source_path) # make sure there are no new files in the expanded # tarball @@ -113,33 +119,42 @@ def check_mirror(): @pytest.mark.usefixtures('config', 'refresh_builtin_mock') class TestMirror(object): + def test_url_mirror(self, mock_archive): + set_up_package('trivial-install-test-package', mock_archive, 'url') + check_mirror() + repos.clear() + + @pytest.mark.skipif( + not which('git'), reason='requires git to be installed') def test_git_mirror(self, mock_git_repository): set_up_package('git-test', mock_git_repository, 'git') check_mirror() repos.clear() + @pytest.mark.skipif( + not which('svn'), reason='requires subversion to be installed') def test_svn_mirror(self, mock_svn_repository): set_up_package('svn-test', mock_svn_repository, 'svn') check_mirror() repos.clear() + @pytest.mark.skipif( + not which('hg'), reason='requires mercurial to be installed') def test_hg_mirror(self, mock_hg_repository): set_up_package('hg-test', mock_hg_repository, 'hg') check_mirror() repos.clear() - def test_url_mirror(self, mock_archive): - set_up_package('trivial-install-test-package', mock_archive, 'url') - check_mirror() - repos.clear() - + @pytest.mark.skipif( + not all([which('svn'), which('hg'), which('git')]), + reason='requires subversion, git, and mercurial to be installed') def test_all_mirror( self, mock_git_repository, mock_svn_repository, mock_hg_repository, - mock_archive, - ): + mock_archive): + set_up_package('git-test', mock_git_repository, 'git') set_up_package('svn-test', mock_svn_repository, 'svn') set_up_package('hg-test', mock_hg_repository, 'hg') diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py index 2ffedee7db..1a7cc3ecd1 100644 --- a/lib/spack/spack/test/svn_fetch.py +++ b/lib/spack/spack/test/svn_fetch.py @@ -29,6 +29,11 @@ import spack from llnl.util.filesystem import * from spack.spec import Spec from spack.version import ver +from spack.util.executable import which + + +pytestmark = pytest.mark.skipif( + not which('svn'), reason='requires subversion to be installed') @pytest.mark.parametrize("type_of_test", ['default', 'rev0']) -- cgit v1.2.3-70-g09d2 From 9e4b0eb34a66927ca92df79dedc68d35c9fbd4ae Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 1 May 2017 22:08:47 +0200 Subject: Multi-valued variants (#2386) Modifications: - added support for multi-valued variants - refactored code related to variants into variant.py - added new generic features to AutotoolsPackage that leverage multi-valued variants - modified openmpi to use new features - added unit tests for the new semantics --- lib/spack/llnl/util/lang.py | 20 +- lib/spack/llnl/util/tty/__init__.py | 16 +- lib/spack/spack/build_systems/autotools.py | 45 ++ lib/spack/spack/cmd/info.py | 98 ++- lib/spack/spack/cmd/spec.py | 3 +- lib/spack/spack/concretize.py | 7 +- lib/spack/spack/directives.py | 36 +- lib/spack/spack/error.py | 15 + lib/spack/spack/spec.py | 233 +++----- lib/spack/spack/test/build_systems.py | 30 + lib/spack/spack/test/concretize.py | 2 +- lib/spack/spack/test/conftest.py | 2 +- lib/spack/spack/test/spec_semantics.py | 141 ++++- lib/spack/spack/test/spec_yaml.py | 6 + lib/spack/spack/test/variant.py | 656 +++++++++++++++++++++ lib/spack/spack/variant.py | 580 +++++++++++++++++- var/spack/repos/builtin.mock/packages/a/package.py | 32 +- .../packages/multivalue_variant/package.py | 57 ++ var/spack/repos/builtin/packages/cdo/package.py | 3 +- .../repos/builtin/packages/mvapich2/package.py | 278 ++++----- var/spack/repos/builtin/packages/netcdf/package.py | 26 +- .../repos/builtin/packages/openmpi/package.py | 113 ++-- 22 files changed, 1961 insertions(+), 438 deletions(-) create mode 100644 lib/spack/spack/test/variant.py create mode 100644 var/spack/repos/builtin.mock/packages/multivalue_variant/package.py (limited to 'lib') diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 4943c9df67..9821ec7416 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -266,10 +266,28 @@ def key_ordering(cls): @key_ordering -class HashableMap(dict): +class HashableMap(collections.MutableMapping): """This is a hashable, comparable dictionary. Hash is performed on a tuple of the values in the dictionary.""" + def __init__(self): + self.dict = {} + + def __getitem__(self, key): + return self.dict[key] + + def __setitem__(self, key, value): + self.dict[key] = value + + def __iter__(self): + return iter(self.dict) + + def __len__(self): + return len(self.dict) + + def __delitem__(self, key): + del self.dict[key] + def _cmp_key(self): return tuple(sorted(self.values())) diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index e5c3ba8110..b28ac22c1f 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -22,22 +22,22 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import sys -import os -import textwrap import fcntl -import termios +import os import struct +import sys +import termios +import textwrap import traceback from six import StringIO from six.moves import input from llnl.util.tty.color import * -_debug = False +_debug = False _verbose = False _stacktrace = False -indent = " " +indent = " " def is_verbose(): @@ -100,7 +100,7 @@ def msg(message, *args, **kwargs): def info(message, *args, **kwargs): format = kwargs.get('format', '*b') stream = kwargs.get('stream', sys.stdout) - wrap = kwargs.get('wrap', False) + wrap = kwargs.get('wrap', False) break_long_words = kwargs.get('break_long_words', False) st_countback = kwargs.get('countback', 3) @@ -218,7 +218,7 @@ def hline(label=None, **kwargs): char (str): Char to draw the line with. Default '-' max_width (int): Maximum width of the line. Default is 64 chars. """ - char = kwargs.pop('char', '-') + char = kwargs.pop('char', '-') max_width = kwargs.pop('max_width', 64) if kwargs: raise TypeError( diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index ffd00e7f69..2e4c86ea3e 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -289,6 +289,51 @@ class AutotoolsPackage(PackageBase): self._if_make_target_execute('test') self._if_make_target_execute('check') + def _activate_or_not(self, active, inactive, name, active_parameters=None): + spec = self.spec + args = [] + # For each allowed value in the list of values + for value in self.variants[name].values: + # Check if the value is active in the current spec + condition = '{name}={value}'.format(name=name, value=value) + activated = condition in spec + # Search for an override in the package for this value + override_name = '{0}_or_{1}_{2}'.format(active, inactive, value) + line_generator = getattr(self, override_name, None) + # If not available use a sensible default + if line_generator is None: + def _default_generator(is_activated): + if is_activated: + line = '--{0}-{1}'.format(active, value) + if active_parameters is not None and active_parameters(value): # NOQA=ignore=E501 + line += '={0}'.format(active_parameters(value)) + return line + return '--{0}-{1}'.format(inactive, value) + line_generator = _default_generator + args.append(line_generator(activated)) + return args + + def with_or_without(self, name, active_parameters=None): + """Inspects the multi-valued variant 'name' and returns the configure + arguments that activate / deactivate the selected feature. + + :param str name: name of a valid multi-valued variant + :param callable active_parameters: if present accepts a single value + and returns the parameter to be used leading to an entry of the + type '--with-{name}={parameter} + """ + return self._activate_or_not( + 'with', 'without', name, active_parameters + ) + + def enable_or_disable(self, name, active_parameters=None): + """Inspects the multi-valued variant 'name' and returns the configure + arguments that activate / deactivate the selected feature. + """ + return self._activate_or_not( + 'enable', 'disable', name, active_parameters + ) + run_after('install')(PackageBase._run_default_install_time_test_callbacks) def installcheck(self): diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 799471ffcc..86ec839b90 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -25,7 +25,7 @@ from __future__ import print_function import textwrap - +import itertools from llnl.util.tty.colify import * import spack import spack.fetch_strategy as fs @@ -49,6 +49,81 @@ def setup_parser(subparser): 'name', metavar="PACKAGE", help="name of package to get info for") +class VariantFormatter(object): + def __init__(self, variants, max_widths=(25, 20, 35)): + self.variants = variants + self.headers = ('Name [Default]', 'Allowed values', 'Description') + # Set max headers lengths + self.max_column_widths = max_widths + + # Formats + fmt_name = '{0} [{1}]' + + # Initialize column widths with the length of the + # corresponding headers, as they cannot be shorter + # than that + self.column_widths = [len(x) for x in self.headers] + + # Update according to line lengths + for k, v in variants.items(): + candidate_max_widths = ( + len(fmt_name.format(k, self.default(v))), # Name [Default] + len(v.allowed_values), # Allowed values + len(v.description) # Description + ) + + self.column_widths = ( + max(self.column_widths[0], candidate_max_widths[0]), + max(self.column_widths[1], candidate_max_widths[1]), + max(self.column_widths[2], candidate_max_widths[2]) + ) + + # Reduce to at most the maximum allowed + self.column_widths = ( + min(self.column_widths[0], self.max_column_widths[0]), + min(self.column_widths[1], self.max_column_widths[1]), + min(self.column_widths[2], self.max_column_widths[2]) + ) + + # Compute the format + self.fmt = "%%-%ss%%-%ss%%s" % ( + self.column_widths[0] + 4, + self.column_widths[1] + 4 + ) + + def default(self, v): + s = 'on' if v.default is True else 'off' + if not isinstance(v.default, bool): + s = v.default + return s + + @property + def lines(self): + if not self.variants: + yield " None" + else: + yield " " + self.fmt % self.headers + yield '\n' + for k, v in sorted(self.variants.items()): + name = textwrap.wrap( + '{0} [{1}]'.format(k, self.default(v)), + width=self.column_widths[0] + ) + allowed = textwrap.wrap( + v.allowed_values, + width=self.column_widths[1] + ) + description = textwrap.wrap( + v.description, + width=self.column_widths[2] + ) + for t in itertools.izip_longest( + name, allowed, description, fillvalue='' + ): + yield " " + self.fmt % t + yield '' # Trigger a new line + + def print_text_info(pkg): """Print out a plain text description of a package.""" header = "{0}: ".format(pkg.build_system_class) @@ -70,25 +145,10 @@ def print_text_info(pkg): print() print("Variants:") - if not pkg.variants: - print(" None") - else: - pad = padder(pkg.variants, 4) - - maxv = max(len(v) for v in sorted(pkg.variants)) - fmt = "%%-%ss%%-10s%%s" % (maxv + 4) - - print(" " + fmt % ('Name', 'Default', 'Description')) - print() - for name in sorted(pkg.variants): - v = pkg.variants[name] - default = 'on' if v.default else 'off' - - lines = textwrap.wrap(v.description) - lines[1:] = [" " + (" " * maxv) + l for l in lines[1:]] - desc = "\n".join(lines) - print(" " + fmt % (name, default, desc)) + formatter = VariantFormatter(pkg.variants) + for line in formatter.lines: + print(line) print() print("Installation Phases:") diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index d89707f230..2e917d2ee3 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -69,7 +69,8 @@ def spec(parser, args): for spec in spack.cmd.parse_specs(args.specs): # With -y, just print YAML to output. if args.yaml: - spec.concretize() + if spec.name in spack.repo: + spec.concretize() print(spec.to_yaml()) continue diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index 5507b599ff..d7f21e8c81 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -245,14 +245,15 @@ class DefaultConcretizer(object): """ changed = False preferred_variants = PackagePrefs.preferred_variants(spec.name) - for name, variant in spec.package_class.variants.items(): + pkg_cls = spec.package_class + for name, variant in pkg_cls.variants.items(): if name not in spec.variants: changed = True if name in preferred_variants: spec.variants[name] = preferred_variants.get(name) else: - spec.variants[name] = spack.spec.VariantSpec( - name, variant.default) + spec.variants[name] = variant.make_default() + return changed def concretize_compiler(self, spec): diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 7a245f606c..43ac71c679 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -368,9 +368,37 @@ def patch(url_or_filename, level=1, when=None, **kwargs): @directive('variants') -def variant(name, default=False, description=""): +def variant( + name, + default=None, + description='', + values=(True, False), + multi=False, + validator=None +): """Define a variant for the package. Packager can specify a default - value (on or off) as well as a text description.""" + value as well as a text description. + + Args: + name (str): name of the variant + default (str or bool): default value for the variant, if not + specified otherwise the default will be False for a boolean + variant and 'nothing' for a multi-valued variant + description (str): description of the purpose of the variant + values (tuple or callable): either a tuple of strings containing the + allowed values, or a callable accepting one value and returning + True if it is valid + multi (bool): if False only one value per spec is allowed for + this variant + validator (callable): optional group validator to enforce additional + logic. It receives a tuple of values and should raise an instance + of SpackError if the group doesn't meet the additional constraints + """ + + if default is None: + default = False if values == (True, False) else '' + + default = default description = str(description).strip() def _execute(pkg): @@ -379,7 +407,9 @@ def variant(name, default=False, description=""): msg = "Invalid variant name in {0}: '{1}'" raise DirectiveError(directive, msg.format(pkg.name, name)) - pkg.variants[name] = Variant(default, description) + pkg.variants[name] = Variant( + name, default, description, values, multi, validator + ) return _execute diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index cd1ae5b25c..09969b2b41 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -100,3 +100,18 @@ class NoNetworkConnectionError(SpackError): "No network connection: " + str(message), "URL was: " + str(url)) self.url = url + + +class SpecError(SpackError): + """Superclass for all errors that occur while constructing specs.""" + + +class UnsatisfiableSpecError(SpecError): + """Raised when a spec conflicts with package constraints. + Provide the requirement that was violated when raising.""" + def __init__(self, provided, required, constraint_type): + super(UnsatisfiableSpecError, self).__init__( + "%s does not satisfy %s" % (provided, required)) + self.provided = provided + self.required = required + self.constraint_type = constraint_type diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 0d8fb2893b..0cf392a7ce 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -121,12 +121,14 @@ from llnl.util.filesystem import find_headers, find_libraries, is_exe from llnl.util.lang import * from llnl.util.tty.color import * from spack.build_environment import get_path_from_module, load_module +from spack.error import SpecError, UnsatisfiableSpecError from spack.provider_index import ProviderIndex from spack.util.crypto import prefix_bits from spack.util.executable import Executable from spack.util.prefix import Prefix from spack.util.spack_yaml import syaml_dict from spack.util.string import * +from spack.variant import * from spack.version import * from yaml.error import MarkedYAMLError @@ -606,81 +608,6 @@ class DependencySpec(object): self.spec.name if self.spec else None) -@key_ordering -class VariantSpec(object): - """Variants are named, build-time options for a package. Names depend - on the particular package being built, and each named variant can - be enabled or disabled. - """ - - def __init__(self, name, value): - self.name = name - self.value = value - - def _cmp_key(self): - return (self.name, self.value) - - def copy(self): - return VariantSpec(self.name, self.value) - - def __str__(self): - if type(self.value) == bool: - return '{0}{1}'.format('+' if self.value else '~', self.name) - else: - return ' {0}={1} '.format(self.name, self.value) - - -class VariantMap(HashableMap): - - def __init__(self, spec): - super(VariantMap, self).__init__() - self.spec = spec - - def satisfies(self, other, strict=False): - if strict or self.spec._concrete: - return all(k in self and self[k].value == other[k].value - for k in other) - else: - return all(self[k].value == other[k].value - for k in other if k in self) - - def constrain(self, other): - """Add all variants in other that aren't in self to self. - - Raises an error if any common variants don't match. - Return whether the spec changed. - """ - if other.spec._concrete: - for k in self: - if k not in other: - raise UnsatisfiableVariantSpecError(self[k], '') - - changed = False - for k in other: - if k in self: - if self[k].value != other[k].value: - raise UnsatisfiableVariantSpecError(self[k], other[k]) - else: - self[k] = other[k].copy() - changed = True - return changed - - @property - def concrete(self): - return self.spec._concrete or all( - v in self for v in self.spec.package_class.variants) - - def copy(self): - clone = VariantMap(None) - for name, variant in self.items(): - clone[name] = variant.copy() - return clone - - def __str__(self): - sorted_keys = sorted(self.keys()) - return ''.join(str(self[key]) for key in sorted_keys) - - _valid_compiler_flags = [ 'cflags', 'cxxflags', 'fflags', 'ldflags', 'ldlibs', 'cppflags'] @@ -1094,17 +1021,6 @@ class Spec(object): """Called by the parser to add an allowable version.""" self.versions.add(version) - def _add_variant(self, name, value): - """Called by the parser to add a variant.""" - if name in self.variants: - raise DuplicateVariantError( - "Cannot specify variant '%s' twice" % name) - if isinstance(value, string_types) and value.upper() == 'TRUE': - value = True - elif isinstance(value, string_types) and value.upper() == 'FALSE': - value = False - self.variants[name] = VariantSpec(name, value) - def _add_flag(self, name, value): """Called by the parser to add a known flag. Known flags currently include "arch" @@ -1124,7 +1040,13 @@ class Spec(object): assert(self.compiler_flags is not None) self.compiler_flags[name] = value.split() else: - self._add_variant(name, value) + # All other flags represent variants. 'foo=true' and 'foo=false' + # map to '+foo' and '~foo' respectively. As such they need a + # BoolValuedVariant instance. + if str(value).upper() == 'TRUE' or str(value).upper() == 'FALSE': + self.variants[name] = BoolValuedVariant(name, value) + else: + self.variants[name] = MultiValuedVariant(name, value) def _set_architecture(self, **kwargs): """Called by the parser to set the architecture.""" @@ -1424,8 +1346,11 @@ class Spec(object): if self.namespace: d['namespace'] = self.namespace - params = syaml_dict(sorted( - (name, v.value) for name, v in self.variants.items())) + params = syaml_dict( + sorted( + v.yaml_entry() for _, v in self.variants.items() + ) + ) params.update(sorted(self.compiler_flags.items())) if params: d['parameters'] = params @@ -1491,11 +1416,14 @@ class Spec(object): if name in _valid_compiler_flags: spec.compiler_flags[name] = value else: - spec.variants[name] = VariantSpec(name, value) - + spec.variants[name] = MultiValuedVariant.from_node_dict( + name, value + ) elif 'variants' in node: for name, value in node['variants'].items(): - spec.variants[name] = VariantSpec(name, value) + spec.variants[name] = MultiValuedVariant.from_node_dict( + name, value + ) for name in FlagMap.valid_compiler_flags(): spec.compiler_flags[name] = [] @@ -2076,7 +2004,7 @@ class Spec(object): self._mark_concrete(False) # Ensure first that all packages & compilers in the DAG exist. - self.validate_names() + self.validate_or_raise() # Get all the dependencies into one DependencyMap spec_deps = self.flat_dependencies(copy=False, deptype_query=alldeps) @@ -2110,11 +2038,13 @@ class Spec(object): clone.normalize() return clone - def validate_names(self): - """This checks that names of packages and compilers in this spec are real. - If they're not, it will raise either UnknownPackageError or - UnsupportedCompilerError. + def validate_or_raise(self): + """Checks that names and values in this spec are real. If they're not, + it will raise an appropriate exception. """ + # FIXME: this function should be lazy, and collect all the errors + # FIXME: before raising the exceptions, instead of being greedy and + # FIXME: raise just the first one encountered for spec in self.traverse(): # raise an UnknownPackageError if the spec's package isn't real. if (not spec.virtual) and spec.name: @@ -2125,16 +2055,44 @@ class Spec(object): if not compilers.supported(spec.compiler): raise UnsupportedCompilerError(spec.compiler.name) - # Ensure that variants all exist. - for vname, variant in spec.variants.items(): - if vname not in spec.package_class.variants: - raise UnknownVariantError(spec.name, vname) + # FIXME: Move the logic below into the variant.py module + # Ensure correctness of variants (if the spec is not virtual) + if not spec.virtual: + pkg_cls = spec.package_class + pkg_variants = pkg_cls.variants + not_existing = set(spec.variants) - set(pkg_variants) + if not_existing: + raise UnknownVariantError(spec.name, not_existing) + + for name, v in [(x, y) for (x, y) in spec.variants.items()]: + # When parsing a spec every variant of the form + # 'foo=value' will be interpreted by default as a + # multi-valued variant. During validation of the + # variants we use the information in the package + # to turn any variant that needs it to a single-valued + # variant. + pkg_variant = pkg_variants[name] + pkg_variant.validate_or_raise(v, pkg_cls) + spec.variants.substitute( + pkg_variant.make_variant(v._original_value) + ) def constrain(self, other, deps=True): """Merge the constraints of other with self. Returns True if the spec changed as a result, False if not. """ + # If we are trying to constrain a concrete spec, either the spec + # already satisfies the constraint (and the method returns False) + # or it raises an exception + if self.concrete: + if self.satisfies(other): + return False + else: + raise UnsatisfiableSpecError( + self, other, 'constrain a concrete spec' + ) + other = self._autospec(other) if not (self.name == other.name or @@ -2150,11 +2108,11 @@ class Spec(object): if not self.versions.overlaps(other.versions): raise UnsatisfiableVersionSpecError(self.versions, other.versions) - for v in other.variants: - if (v in self.variants and - self.variants[v].value != other.variants[v].value): - raise UnsatisfiableVariantSpecError(self.variants[v], - other.variants[v]) + for v in [x for x in other.variants if x in self.variants]: + if not self.variants[v].compatible(other.variants[v]): + raise UnsatisfiableVariantSpecError( + self.variants[v], other.variants[v] + ) # TODO: Check out the logic here sarch, oarch = self.architecture, other.architecture @@ -2328,6 +2286,30 @@ class Spec(object): elif strict and (other.compiler and not self.compiler): return False + # If self is a concrete spec, and other is not virtual, then we need + # to substitute every multi-valued variant that needs it with a + # single-valued variant. + if self.concrete: + for name, v in [(x, y) for (x, y) in other.variants.items()]: + # When parsing a spec every variant of the form + # 'foo=value' will be interpreted by default as a + # multi-valued variant. During validation of the + # variants we use the information in the package + # to turn any variant that needs it to a single-valued + # variant. + pkg_cls = type(other.package) + try: + pkg_variant = other.package.variants[name] + pkg_variant.validate_or_raise(v, pkg_cls) + except (SpecError, KeyError): + # Catch the two things that could go wrong above: + # 1. name is not a valid variant (KeyError) + # 2. the variant is not validated (SpecError) + return False + other.variants.substitute( + pkg_variant.make_variant(v._original_value) + ) + var_strict = strict if (not self.name) or (not other.name): var_strict = True @@ -3118,10 +3100,12 @@ class SpecParser(spack.parse.Parser): added_version = True elif self.accept(ON): - spec._add_variant(self.variant(), True) + name = self.variant() + spec.variants[name] = BoolValuedVariant(name, True) elif self.accept(OFF): - spec._add_variant(self.variant(), False) + name = self.variant() + spec.variants[name] = BoolValuedVariant(name, False) elif self.accept(PCT): spec._set_compiler(self.compiler()) @@ -3275,10 +3259,6 @@ def base32_prefix_bits(hash_string, bits): return prefix_bits(hash_bytes, bits) -class SpecError(spack.error.SpackError): - """Superclass for all errors that occur while constructing specs.""" - - class SpecParseError(SpecError): """Wrapper for ParseError for when we're parsing specs.""" def __init__(self, parse_error): @@ -3291,10 +3271,6 @@ class DuplicateDependencyError(SpecError): """Raised when the same dependency occurs in a spec twice.""" -class DuplicateVariantError(SpecError): - """Raised when the same variant occurs in a spec twice.""" - - class DuplicateCompilerSpecError(SpecError): """Raised when the same compiler occurs in a spec twice.""" @@ -3306,13 +3282,6 @@ class UnsupportedCompilerError(SpecError): "The '%s' compiler is not yet supported." % compiler_name) -class UnknownVariantError(SpecError): - """Raised when the same variant occurs in a spec twice.""" - def __init__(self, pkg, variant): - super(UnknownVariantError, self).__init__( - "Package %s has no variant %s!" % (pkg, variant)) - - class DuplicateArchitectureError(SpecError): """Raised when the same architecture occurs in a spec twice.""" @@ -3354,17 +3323,6 @@ class MultipleProviderError(SpecError): self.providers = providers -class UnsatisfiableSpecError(SpecError): - """Raised when a spec conflicts with package constraints. - Provide the requirement that was violated when raising.""" - def __init__(self, provided, required, constraint_type): - super(UnsatisfiableSpecError, self).__init__( - "%s does not satisfy %s" % (provided, required)) - self.provided = provided - self.required = required - self.constraint_type = constraint_type - - class UnsatisfiableSpecNameError(UnsatisfiableSpecError): """Raised when two specs aren't even for the same package.""" def __init__(self, provided, required): @@ -3386,13 +3344,6 @@ class UnsatisfiableCompilerSpecError(UnsatisfiableSpecError): provided, required, "compiler") -class UnsatisfiableVariantSpecError(UnsatisfiableSpecError): - """Raised when a spec variant conflicts with package constraints.""" - def __init__(self, provided, required): - super(UnsatisfiableVariantSpecError, self).__init__( - provided, required, "variant") - - class UnsatisfiableCompilerFlagSpecError(UnsatisfiableSpecError): """Raised when a spec variant conflicts with package constraints.""" def __init__(self, provided, required): diff --git a/lib/spack/spack/test/build_systems.py b/lib/spack/spack/test/build_systems.py index 2cafba0333..8e771c8a68 100644 --- a/lib/spack/spack/test/build_systems.py +++ b/lib/spack/spack/test/build_systems.py @@ -24,6 +24,8 @@ ############################################################################## import spack +import pytest + from spack.build_environment import get_std_cmake_args from spack.spec import Spec @@ -40,3 +42,31 @@ def test_cmake_std_args(config, builtin_mock): s.concretize() pkg = spack.repo.get(s) assert get_std_cmake_args(pkg) + + +@pytest.mark.usefixtures('config', 'builtin_mock') +class TestAutotoolsPackage(object): + + def test_with_or_without(self): + s = Spec('a') + s.concretize() + pkg = spack.repo.get(s) + + # Called without parameters + l = pkg.with_or_without('foo') + assert '--with-bar' in l + assert '--without-baz' in l + assert '--no-fee' in l + + def activate(value): + return 'something' + + l = pkg.with_or_without('foo', active_parameters=activate) + assert '--with-bar=something' in l + assert '--without-baz' in l + assert '--no-fee' in l + + l = pkg.enable_or_disable('foo') + assert '--enable-bar' in l + assert '--disable-baz' in l + assert '--disable-fee' in l diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 2063088184..779d4f8816 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -75,7 +75,7 @@ def check_concretize(abstract_spec): # dag 'callpath', 'mpileaks', 'libelf', # variant - 'mpich+debug', 'mpich~debug', 'mpich debug=2', 'mpich', + 'mpich+debug', 'mpich~debug', 'mpich debug=True', 'mpich', # compiler flags 'mpich cppflags="-O3"', # with virtual diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 120425794f..3c725e229b 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -55,7 +55,7 @@ import spack.util.pattern @pytest.fixture(autouse=True) def no_stdin_duplication(monkeypatch): """Duplicating stdin (or any other stream) returns an empty - cStringIO object. + StringIO object. """ monkeypatch.setattr(llnl.util.lang, 'duplicate_stream', lambda x: StringIO()) diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index f071bcc833..306a6ad98f 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -24,7 +24,9 @@ ############################################################################## import spack.architecture import pytest + from spack.spec import * +from spack.variant import * def check_satisfies(spec, anon_spec, concrete=False): @@ -243,6 +245,128 @@ class TestSpecSematics(object): check_satisfies('mpich~foo', 'mpich foo=FALSE') check_satisfies('mpich foo=False', 'mpich~foo') + def test_satisfies_multi_value_variant(self): + # Check quoting + check_satisfies('multivalue_variant foo="bar,baz"', + 'multivalue_variant foo="bar,baz"') + check_satisfies('multivalue_variant foo=bar,baz', + 'multivalue_variant foo=bar,baz') + check_satisfies('multivalue_variant foo="bar,baz"', + 'multivalue_variant foo=bar,baz') + + # A more constrained spec satisfies a less constrained one + check_satisfies('multivalue_variant foo="bar,baz"', + 'multivalue_variant foo="bar"') + + check_satisfies('multivalue_variant foo="bar,baz"', + 'multivalue_variant foo="baz"') + + check_satisfies('multivalue_variant foo="bar,baz,barbaz"', + 'multivalue_variant foo="bar,baz"') + + check_satisfies('multivalue_variant foo="bar,baz"', + 'foo="bar,baz"') + + check_satisfies('multivalue_variant foo="bar,baz"', + 'foo="bar"') + + def test_satisfies_single_valued_variant(self): + """Tests that the case reported in + https://github.com/LLNL/spack/pull/2386#issuecomment-282147639 + is handled correctly. + """ + a = Spec('a foobar=bar') + a.concretize() + + assert a.satisfies('foobar=bar') + + def test_unsatisfiable_multi_value_variant(self): + + # Semantics for a multi-valued variant is different + # Depending on whether the spec is concrete or not + + a = Spec('multivalue_variant foo="bar"', concrete=True) + spec_str = 'multivalue_variant foo="bar,baz"' + b = Spec(spec_str) + assert not a.satisfies(b) + assert not a.satisfies(spec_str) + # A concrete spec cannot be constrained further + with pytest.raises(UnsatisfiableSpecError): + a.constrain(b) + + a = Spec('multivalue_variant foo="bar"') + spec_str = 'multivalue_variant foo="bar,baz"' + b = Spec(spec_str) + assert not a.satisfies(b) + assert not a.satisfies(spec_str) + # An abstract spec can instead be constrained + assert a.constrain(b) + + a = Spec('multivalue_variant foo="bar,baz"', concrete=True) + spec_str = 'multivalue_variant foo="bar,baz,quux"' + b = Spec(spec_str) + assert not a.satisfies(b) + assert not a.satisfies(spec_str) + # A concrete spec cannot be constrained further + with pytest.raises(UnsatisfiableSpecError): + a.constrain(b) + + a = Spec('multivalue_variant foo="bar,baz"') + spec_str = 'multivalue_variant foo="bar,baz,quux"' + b = Spec(spec_str) + assert not a.satisfies(b) + assert not a.satisfies(spec_str) + # An abstract spec can instead be constrained + assert a.constrain(b) + # ...but will fail during concretization if there are + # values in the variant that are not allowed + with pytest.raises(InvalidVariantValueError): + a.concretize() + + # This time we'll try to set a single-valued variant + a = Spec('multivalue_variant fee="bar"') + spec_str = 'multivalue_variant fee="baz"' + b = Spec(spec_str) + assert not a.satisfies(b) + assert not a.satisfies(spec_str) + # A variant cannot be parsed as single-valued until we try to + # concretize. This means that we can constrain the variant above + assert a.constrain(b) + # ...but will fail during concretization if there are + # multiple values set + with pytest.raises(MultipleValuesInExclusiveVariantError): + a.concretize() + + # FIXME: remove after having checked the correctness of the semantics + # check_unsatisfiable('multivalue_variant foo="bar,baz"', + # 'multivalue_variant foo="bar,baz,quux"', + # concrete=True) + # check_unsatisfiable('multivalue_variant foo="bar,baz"', + # 'multivalue_variant foo="bar,baz,quux"', + # concrete=True) + + # but succeed for abstract ones (b/c they COULD satisfy the + # constraint if constrained) + # check_satisfies('multivalue_variant foo="bar"', + # 'multivalue_variant foo="bar,baz"') + + # check_satisfies('multivalue_variant foo="bar,baz"', + # 'multivalue_variant foo="bar,baz,quux"') + + def test_unsatisfiable_variant_types(self): + # These should fail due to incompatible types + check_unsatisfiable('multivalue_variant +foo', + 'multivalue_variant foo="bar"') + + check_unsatisfiable('multivalue_variant ~foo', + 'multivalue_variant foo="bar"') + + check_unsatisfiable('multivalue_variant foo="bar"', + 'multivalue_variant +foo') + + check_unsatisfiable('multivalue_variant foo="bar"', + 'multivalue_variant ~foo') + def test_satisfies_unconstrained_variant(self): # only asked for mpich, no constraints. Either will do. check_satisfies('mpich+foo', 'mpich') @@ -266,7 +390,7 @@ class TestSpecSematics(object): # No matchi in specs check_unsatisfiable('mpich~foo', 'mpich+foo') check_unsatisfiable('mpich+foo', 'mpich~foo') - check_unsatisfiable('mpich foo=1', 'mpich foo=2') + check_unsatisfiable('mpich foo=True', 'mpich foo=False') def test_satisfies_matching_compiler_flag(self): check_satisfies('mpich cppflags="-O3"', 'mpich cppflags="-O3"') @@ -416,6 +540,19 @@ class TestSpecSematics(object): 'libelf+debug~foo', 'libelf+debug', 'libelf+debug~foo' ) + def test_constrain_multi_value_variant(self): + check_constrain( + 'multivalue_variant foo="bar,baz"', + 'multivalue_variant foo="bar"', + 'multivalue_variant foo="baz"' + ) + + check_constrain( + 'multivalue_variant foo="bar,baz,barbaz"', + 'multivalue_variant foo="bar,barbaz"', + 'multivalue_variant foo="baz"' + ) + def test_constrain_compiler_flags(self): check_constrain( 'libelf cflags="-O3" cppflags="-Wall"', @@ -455,7 +592,7 @@ class TestSpecSematics(object): check_invalid_constraint('libelf+debug', 'libelf~debug') check_invalid_constraint('libelf+debug~foo', 'libelf+debug+foo') - check_invalid_constraint('libelf debug=2', 'libelf debug=1') + check_invalid_constraint('libelf debug=True', 'libelf debug=False') check_invalid_constraint( 'libelf cppflags="-O3"', 'libelf cppflags="-O2"') diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py index adf262a60e..866cdebd26 100644 --- a/lib/spack/spack/test/spec_yaml.py +++ b/lib/spack/spack/test/spec_yaml.py @@ -74,6 +74,12 @@ def test_concrete_spec(config, builtin_mock): check_yaml_round_trip(spec) +def test_yaml_multivalue(): + spec = Spec('multivalue_variant foo="bar,baz"') + spec.concretize() + check_yaml_round_trip(spec) + + def test_yaml_subdag(config, builtin_mock): spec = Spec('mpileaks^mpich+debug') spec.concretize() diff --git a/lib/spack/spack/test/variant.py b/lib/spack/spack/test/variant.py new file mode 100644 index 0000000000..0c546a5dac --- /dev/null +++ b/lib/spack/spack/test/variant.py @@ -0,0 +1,656 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import pytest +import numbers + +from spack.variant import * + + +class TestMultiValuedVariant(object): + + def test_initialization(self): + + # Basic properties + a = MultiValuedVariant('foo', 'bar,baz') + assert repr(a) == "MultiValuedVariant('foo', 'bar,baz')" + assert str(a) == 'foo=bar,baz' + assert a.value == ('bar', 'baz') + assert 'bar' in a + assert 'baz' in a + assert eval(repr(a)) == a + + # Spaces are trimmed + b = MultiValuedVariant('foo', 'bar, baz') + assert repr(b) == "MultiValuedVariant('foo', 'bar, baz')" + assert str(b) == 'foo=bar,baz' + assert b.value == ('bar', 'baz') + assert 'bar' in b + assert 'baz' in b + assert a == b + assert hash(a) == hash(b) + assert eval(repr(b)) == a + + # Order is not important + c = MultiValuedVariant('foo', 'baz, bar') + assert repr(c) == "MultiValuedVariant('foo', 'baz, bar')" + assert str(c) == 'foo=bar,baz' + assert c.value == ('bar', 'baz') + assert 'bar' in c + assert 'baz' in c + assert a == c + assert hash(a) == hash(c) + assert eval(repr(c)) == a + + # Check the copy + d = a.copy() + assert repr(a) == repr(d) + assert str(a) == str(d) + assert d.value == ('bar', 'baz') + assert 'bar' in d + assert 'baz' in d + assert a == d + assert a is not d + assert hash(a) == hash(d) + assert eval(repr(d)) == a + + def test_satisfies(self): + + a = MultiValuedVariant('foo', 'bar,baz') + b = MultiValuedVariant('foo', 'bar') + c = MultiValuedVariant('fee', 'bar,baz') + d = MultiValuedVariant('foo', 'True') + + # 'foo=bar,baz' satisfies 'foo=bar' + assert a.satisfies(b) + + # 'foo=bar' does not satisfy 'foo=bar,baz' + assert not b.satisfies(a) + + # 'foo=bar,baz' does not satisfy 'foo=bar,baz' and vice-versa + assert not a.satisfies(c) + assert not c.satisfies(a) + + # Cannot satisfy the constraint with an object of + # another type + b_sv = SingleValuedVariant('foo', 'bar') + assert not b.satisfies(b_sv) + + d_bv = BoolValuedVariant('foo', 'True') + assert not d.satisfies(d_bv) + + def test_compatible(self): + + a = MultiValuedVariant('foo', 'bar,baz') + b = MultiValuedVariant('foo', 'True') + c = MultiValuedVariant('fee', 'bar,baz') + d = MultiValuedVariant('foo', 'bar,barbaz') + + # If the name of two multi-valued variants is the same, + # they are compatible + assert a.compatible(b) + assert not a.compatible(c) + assert a.compatible(d) + + assert b.compatible(a) + assert not b.compatible(c) + assert b.compatible(d) + + assert not c.compatible(a) + assert not c.compatible(b) + assert not c.compatible(d) + + assert d.compatible(a) + assert d.compatible(b) + assert not d.compatible(c) + + # Can't be compatible with other types + b_bv = BoolValuedVariant('foo', 'True') + assert not b.compatible(b_bv) + + b_sv = SingleValuedVariant('foo', 'True') + assert not b.compatible(b_sv) + + def test_constrain(self): + + # Try to constrain on a value with less constraints than self + a = MultiValuedVariant('foo', 'bar,baz') + b = MultiValuedVariant('foo', 'bar') + + changed = a.constrain(b) + assert not changed + t = MultiValuedVariant('foo', 'bar,baz') + assert a == t + + # Try to constrain on a value with more constraints than self + a = MultiValuedVariant('foo', 'bar,baz') + b = MultiValuedVariant('foo', 'bar') + + changed = b.constrain(a) + assert changed + t = MultiValuedVariant('foo', 'bar,baz') + assert a == t + + # Try to constrain on the same value + a = MultiValuedVariant('foo', 'bar,baz') + b = a.copy() + + changed = a.constrain(b) + assert not changed + t = MultiValuedVariant('foo', 'bar,baz') + assert a == t + + # Try to constrain on a different name + a = MultiValuedVariant('foo', 'bar,baz') + b = MultiValuedVariant('fee', 'bar') + + with pytest.raises(ValueError): + a.constrain(b) + + # Try to constrain on other types + a = MultiValuedVariant('foo', 'bar,baz') + sv = SingleValuedVariant('foo', 'bar') + bv = BoolValuedVariant('foo', 'True') + for v in (sv, bv): + with pytest.raises(TypeError): + a.constrain(v) + + def test_yaml_entry(self): + + a = MultiValuedVariant('foo', 'bar,baz,barbaz') + b = MultiValuedVariant('foo', 'bar, baz, barbaz') + expected = ('foo', sorted(['bar', 'baz', 'barbaz'])) + + assert a.yaml_entry() == expected + assert b.yaml_entry() == expected + + a = MultiValuedVariant('foo', 'bar') + expected = ('foo', sorted(['bar'])) + + assert a.yaml_entry() == expected + + +class TestSingleValuedVariant(object): + + def test_initialization(self): + + # Basic properties + a = SingleValuedVariant('foo', 'bar') + assert repr(a) == "SingleValuedVariant('foo', 'bar')" + assert str(a) == 'foo=bar' + assert a.value == 'bar' + assert 'bar' in a + assert eval(repr(a)) == a + + # Raise if multiple values are passed + with pytest.raises(ValueError): + SingleValuedVariant('foo', 'bar, baz') + + # Check the copy + b = a.copy() + assert repr(a) == repr(b) + assert str(a) == str(b) + assert b.value == 'bar' + assert 'bar' in b + assert a == b + assert a is not b + assert hash(a) == hash(b) + assert eval(repr(b)) == a + + def test_satisfies(self): + a = SingleValuedVariant('foo', 'bar') + b = SingleValuedVariant('foo', 'bar') + c = SingleValuedVariant('foo', 'baz') + d = SingleValuedVariant('fee', 'bar') + e = SingleValuedVariant('foo', 'True') + + # 'foo=bar' can only satisfy 'foo=bar' + assert a.satisfies(b) + assert not a.satisfies(c) + assert not a.satisfies(d) + + assert b.satisfies(a) + assert not b.satisfies(c) + assert not b.satisfies(d) + + assert not c.satisfies(a) + assert not c.satisfies(b) + assert not c.satisfies(d) + + # Cannot satisfy the constraint with an object of + # another type + a_mv = MultiValuedVariant('foo', 'bar') + assert not a.satisfies(a_mv) + + e_bv = BoolValuedVariant('foo', 'True') + assert not e.satisfies(e_bv) + + def test_compatible(self): + + a = SingleValuedVariant('foo', 'bar') + b = SingleValuedVariant('fee', 'bar') + c = SingleValuedVariant('foo', 'baz') + d = SingleValuedVariant('foo', 'bar') + + # If the name of two multi-valued variants is the same, + # they are compatible + assert not a.compatible(b) + assert not a.compatible(c) + assert a.compatible(d) + + assert not b.compatible(a) + assert not b.compatible(c) + assert not b.compatible(d) + + assert not c.compatible(a) + assert not c.compatible(b) + assert not c.compatible(d) + + assert d.compatible(a) + assert not d.compatible(b) + assert not d.compatible(c) + + # Can't be compatible with other types + a_mv = MultiValuedVariant('foo', 'bar') + assert not a.compatible(a_mv) + + e = SingleValuedVariant('foo', 'True') + e_bv = BoolValuedVariant('foo', 'True') + assert not e.compatible(e_bv) + + def test_constrain(self): + + # Try to constrain on a value equal to self + a = SingleValuedVariant('foo', 'bar') + b = SingleValuedVariant('foo', 'bar') + + changed = a.constrain(b) + assert not changed + t = SingleValuedVariant('foo', 'bar') + assert a == t + + # Try to constrain on a value with a different value + a = SingleValuedVariant('foo', 'bar') + b = SingleValuedVariant('foo', 'baz') + + with pytest.raises(UnsatisfiableVariantSpecError): + b.constrain(a) + + # Try to constrain on a value with a different value + a = SingleValuedVariant('foo', 'bar') + b = SingleValuedVariant('fee', 'bar') + + with pytest.raises(ValueError): + b.constrain(a) + + # Try to constrain on the same value + a = SingleValuedVariant('foo', 'bar') + b = a.copy() + + changed = a.constrain(b) + assert not changed + t = SingleValuedVariant('foo', 'bar') + assert a == t + + # Try to constrain on other values + a = SingleValuedVariant('foo', 'True') + mv = MultiValuedVariant('foo', 'True') + bv = BoolValuedVariant('foo', 'True') + for v in (mv, bv): + with pytest.raises(TypeError): + a.constrain(v) + + def test_yaml_entry(self): + a = SingleValuedVariant('foo', 'bar') + expected = ('foo', 'bar') + + assert a.yaml_entry() == expected + + +class TestBoolValuedVariant(object): + + def test_initialization(self): + # Basic properties - True value + for v in (True, 'True', 'TRUE', 'TrUe'): + a = BoolValuedVariant('foo', v) + assert repr(a) == "BoolValuedVariant('foo', {0})".format(repr(v)) + assert str(a) == '+foo' + assert a.value is True + assert True in a + assert eval(repr(a)) == a + + # Copy - True value + b = a.copy() + assert repr(a) == repr(b) + assert str(a) == str(b) + assert b.value is True + assert True in b + assert a == b + assert a is not b + assert hash(a) == hash(b) + assert eval(repr(b)) == a + + # Basic properties - False value + for v in (False, 'False', 'FALSE', 'FaLsE'): + a = BoolValuedVariant('foo', v) + assert repr(a) == "BoolValuedVariant('foo', {0})".format(repr(v)) + assert str(a) == '~foo' + assert a.value is False + assert False in a + assert eval(repr(a)) == a + + # Copy - True value + b = a.copy() + assert repr(a) == repr(b) + assert str(a) == str(b) + assert b.value is False + assert False in b + assert a == b + assert a is not b + assert eval(repr(b)) == a + + # Invalid values + for v in ('bar', 'bar,baz'): + with pytest.raises(ValueError): + BoolValuedVariant('foo', v) + + def test_satisfies(self): + a = BoolValuedVariant('foo', True) + b = BoolValuedVariant('foo', False) + c = BoolValuedVariant('fee', False) + d = BoolValuedVariant('foo', 'True') + + assert not a.satisfies(b) + assert not a.satisfies(c) + assert a.satisfies(d) + + assert not b.satisfies(a) + assert not b.satisfies(c) + assert not b.satisfies(d) + + assert not c.satisfies(a) + assert not c.satisfies(b) + assert not c.satisfies(d) + + assert d.satisfies(a) + assert not d.satisfies(b) + assert not d.satisfies(c) + + # Cannot satisfy the constraint with an object of + # another type + d_mv = MultiValuedVariant('foo', 'True') + assert not d.satisfies(d_mv) + + d_sv = SingleValuedVariant('foo', 'True') + assert not d.satisfies(d_sv) + + def test_compatible(self): + + a = BoolValuedVariant('foo', True) + b = BoolValuedVariant('fee', True) + c = BoolValuedVariant('foo', False) + d = BoolValuedVariant('foo', 'True') + + # If the name of two multi-valued variants is the same, + # they are compatible + assert not a.compatible(b) + assert not a.compatible(c) + assert a.compatible(d) + + assert not b.compatible(a) + assert not b.compatible(c) + assert not b.compatible(d) + + assert not c.compatible(a) + assert not c.compatible(b) + assert not c.compatible(d) + + assert d.compatible(a) + assert not d.compatible(b) + assert not d.compatible(c) + + # Can't be compatible with other types + d_mv = MultiValuedVariant('foo', 'True') + assert not d.compatible(d_mv) + + d_sv = SingleValuedVariant('foo', 'True') + assert not d.compatible(d_sv) + + def test_constrain(self): + # Try to constrain on a value equal to self + a = BoolValuedVariant('foo', 'True') + b = BoolValuedVariant('foo', True) + + changed = a.constrain(b) + assert not changed + t = BoolValuedVariant('foo', True) + assert a == t + + # Try to constrain on a value with a different value + a = BoolValuedVariant('foo', True) + b = BoolValuedVariant('foo', False) + + with pytest.raises(UnsatisfiableVariantSpecError): + b.constrain(a) + + # Try to constrain on a value with a different value + a = BoolValuedVariant('foo', True) + b = BoolValuedVariant('fee', True) + + with pytest.raises(ValueError): + b.constrain(a) + + # Try to constrain on the same value + a = BoolValuedVariant('foo', True) + b = a.copy() + + changed = a.constrain(b) + assert not changed + t = BoolValuedVariant('foo', True) + assert a == t + + # Try to constrain on other values + a = BoolValuedVariant('foo', 'True') + sv = SingleValuedVariant('foo', 'True') + mv = MultiValuedVariant('foo', 'True') + for v in (sv, mv): + with pytest.raises(TypeError): + a.constrain(v) + + def test_yaml_entry(self): + + a = BoolValuedVariant('foo', 'True') + expected = ('foo', True) + assert a.yaml_entry() == expected + + a = BoolValuedVariant('foo', 'False') + expected = ('foo', False) + assert a.yaml_entry() == expected + + +def test_from_node_dict(): + a = MultiValuedVariant.from_node_dict('foo', ['bar']) + assert type(a) == MultiValuedVariant + + a = MultiValuedVariant.from_node_dict('foo', 'bar') + assert type(a) == SingleValuedVariant + + a = MultiValuedVariant.from_node_dict('foo', 'true') + assert type(a) == BoolValuedVariant + + +class TestVariant(object): + + def test_validation(self): + a = Variant( + 'foo', + default='', + description='', + values=('bar', 'baz', 'foobar'), + multi=False + ) + # Valid vspec, shouldn't raise + vspec = a.make_variant('bar') + a.validate_or_raise(vspec) + + # Multiple values are not allowed + with pytest.raises(MultipleValuesInExclusiveVariantError): + vspec.value = 'bar,baz' + + # Inconsistent vspec + vspec.name = 'FOO' + with pytest.raises(InconsistentValidationError): + a.validate_or_raise(vspec) + + # Valid multi-value vspec + a.multi = True + vspec = a.make_variant('bar,baz') + a.validate_or_raise(vspec) + # Add an invalid value + vspec.value = 'bar,baz,barbaz' + with pytest.raises(InvalidVariantValueError): + a.validate_or_raise(vspec) + + def test_callable_validator(self): + + def validator(x): + try: + return isinstance(int(x), numbers.Integral) + except ValueError: + return False + + a = Variant( + 'foo', + default=1024, + description='', + values=validator, + multi=False + ) + vspec = a.make_default() + a.validate_or_raise(vspec) + vspec.value = 2056 + a.validate_or_raise(vspec) + vspec.value = 'foo' + with pytest.raises(InvalidVariantValueError): + a.validate_or_raise(vspec) + + def test_representation(self): + a = Variant( + 'foo', + default='', + description='', + values=('bar', 'baz', 'foobar'), + multi=False + ) + assert a.allowed_values == 'bar, baz, foobar' + + +class TestVariantMapTest(object): + + def test_invalid_values(self): + # Value with invalid type + a = VariantMap(None) + with pytest.raises(TypeError): + a['foo'] = 2 + + # Duplicate variant + a['foo'] = MultiValuedVariant('foo', 'bar,baz') + with pytest.raises(DuplicateVariantError): + a['foo'] = MultiValuedVariant('foo', 'bar') + + with pytest.raises(DuplicateVariantError): + a['foo'] = SingleValuedVariant('foo', 'bar') + + with pytest.raises(DuplicateVariantError): + a['foo'] = BoolValuedVariant('foo', True) + + # Non matching names between key and vspec.name + with pytest.raises(KeyError): + a['bar'] = MultiValuedVariant('foo', 'bar') + + def test_set_item(self): + # Check that all the three types of variants are accepted + a = VariantMap(None) + + a['foo'] = BoolValuedVariant('foo', True) + a['bar'] = SingleValuedVariant('bar', 'baz') + a['foobar'] = MultiValuedVariant('foobar', 'a, b, c, d, e') + + def test_substitute(self): + # Check substitution of a key that exists + a = VariantMap(None) + a['foo'] = BoolValuedVariant('foo', True) + a.substitute(SingleValuedVariant('foo', 'bar')) + + # Trying to substitute something that is not + # in the map will raise a KeyError + with pytest.raises(KeyError): + a.substitute(BoolValuedVariant('bar', True)) + + def test_satisfies_and_constrain(self): + # foo=bar foobar=fee feebar=foo + a = VariantMap(None) + a['foo'] = MultiValuedVariant('foo', 'bar') + a['foobar'] = SingleValuedVariant('foobar', 'fee') + a['feebar'] = SingleValuedVariant('feebar', 'foo') + + # foo=bar,baz foobar=fee shared=True + b = VariantMap(None) + b['foo'] = MultiValuedVariant('foo', 'bar, baz') + b['foobar'] = SingleValuedVariant('foobar', 'fee') + b['shared'] = BoolValuedVariant('shared', True) + + assert not a.satisfies(b) + assert b.satisfies(a) + + assert not a.satisfies(b, strict=True) + assert not b.satisfies(a, strict=True) + + # foo=bar,baz foobar=fee feebar=foo shared=True + c = VariantMap(None) + c['foo'] = MultiValuedVariant('foo', 'bar, baz') + c['foobar'] = SingleValuedVariant('foobar', 'fee') + c['feebar'] = SingleValuedVariant('feebar', 'foo') + c['shared'] = BoolValuedVariant('shared', True) + + assert a.constrain(b) + assert a == c + + def test_copy(self): + a = VariantMap(None) + a['foo'] = BoolValuedVariant('foo', True) + a['bar'] = SingleValuedVariant('bar', 'baz') + a['foobar'] = MultiValuedVariant('foobar', 'a, b, c, d, e') + + c = a.copy() + assert a == c + + def test_str(self): + c = VariantMap(None) + c['foo'] = MultiValuedVariant('foo', 'bar, baz') + c['foobar'] = SingleValuedVariant('foobar', 'fee') + c['feebar'] = SingleValuedVariant('feebar', 'foo') + c['shared'] = BoolValuedVariant('shared', True) + assert str(c) == ' feebar=foo foo=bar,baz foobar=fee +shared' diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index b2c1a73489..7102676b69 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -22,17 +22,583 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -"""Variant is a class describing flags on builds, or "variants". +"""The variant module contains data structures that are needed to manage +variants both in packages and in specs. +""" -Could be generalized later to describe aribitrary parameters, but -currently variants are just flags. +import inspect +import re -""" +import llnl.util.lang as lang +import spack.error as error +from six import StringIO class Variant(object): - """Represents a variant on a build. Can be either on or off.""" + """Represents a variant in a package, as declared in the + variant directive. + """ - def __init__(self, default, description): - self.default = default + def __init__( + self, + name, + default, + description, + values=(True, False), + multi=False, + validator=None + ): + """Initialize a package variant. + + Args: + name (str): name of the variant + default (str): default value for the variant in case + nothing has been specified + description (str): purpose of the variant + values (sequence): sequence of allowed values or a callable + accepting a single value as argument and returning True if the + value is good, False otherwise + multi (bool): whether multiple CSV are allowed + validator (callable): optional callable used to enforce + additional logic on the set of values being validated + """ + self.name = name + self.default = default self.description = str(description) + + if callable(values): + # If 'values' is a callable, assume it is a single value + # validator and reset the values to be explicit during debug + self.single_value_validator = values + self.values = None + else: + # Otherwise assume values is the set of allowed explicit values + self.values = tuple(values) + allowed = self.values + (self.default,) + self.single_value_validator = lambda x: x in allowed + + self.multi = multi + self.group_validator = validator + + def validate_or_raise(self, vspec, pkg=None): + """Validate a variant spec against this package variant. Raises an + exception if any error is found. + + Args: + vspec (VariantSpec): instance to be validated + pkg (Package): the package that required the validation, + if available + + Raises: + InconsistentValidationError: if ``vspec.name != self.name`` + + MultipleValuesInExclusiveVariantError: if ``vspec`` has + multiple values but ``self.multi == False`` + + InvalidVariantValueError: if ``vspec.value`` contains + invalid values + """ + # Check the name of the variant + if self.name != vspec.name: + raise InconsistentValidationError(vspec, self) + + # Check the values of the variant spec + value = vspec.value + if isinstance(vspec.value, (bool, str)): + value = (vspec.value,) + + # If the value is exclusive there must be at most one + if not self.multi and len(value) != 1: + raise MultipleValuesInExclusiveVariantError(vspec, pkg) + + # Check and record the values that are not allowed + not_allowed_values = [ + x for x in value if not self.single_value_validator(x) + ] + if not_allowed_values: + raise InvalidVariantValueError(self, not_allowed_values, pkg) + + # Validate the group of values if needed + if self.group_validator is not None: + self.group_validator(value) + + @property + def allowed_values(self): + """Returns a string representation of the allowed values for + printing purposes + + Returns: + str: representation of the allowed values + """ + # Join an explicit set of allowed values + if self.values is not None: + v = tuple(str(x) for x in self.values) + return ', '.join(v) + # In case we were given a single-value validator + # print the docstring + docstring = inspect.getdoc(self.single_value_validator) + v = docstring if docstring else '' + return v + + def make_default(self): + """Factory that creates a variant holding the default value. + + Returns: + MultiValuedVariant or SingleValuedVariant or BoolValuedVariant: + instance of the proper variant + """ + return self.make_variant(self.default) + + def make_variant(self, value): + """Factory that creates a variant holding the value passed as + a parameter. + + Args: + value: value that will be hold by the variant + + Returns: + MultiValuedVariant or SingleValuedVariant or BoolValuedVariant: + instance of the proper variant + """ + return self.variant_cls(self.name, value) + + @property + def variant_cls(self): + """Proper variant class to be used for this configuration.""" + if self.multi: + return MultiValuedVariant + elif self.values == (True, False): + return BoolValuedVariant + return SingleValuedVariant + + +@lang.key_ordering +class MultiValuedVariant(object): + """A variant that can hold multiple values at once.""" + + @staticmethod + def from_node_dict(name, value): + """Reconstruct a variant from a node dict.""" + if isinstance(value, list): + value = ','.join(value) + return MultiValuedVariant(name, value) + elif str(value).upper() == 'TRUE' or str(value).upper() == 'FALSE': + return BoolValuedVariant(name, value) + return SingleValuedVariant(name, value) + + def __init__(self, name, value): + self.name = name + + # Stores 'value' after a bit of massaging + # done by the property setter + self._value = None + self._original_value = None + + # Invokes property setter + self.value = value + + @property + def value(self): + """Returns a tuple of strings containing the values stored in + the variant. + + Returns: + tuple of str: values stored in the variant + """ + return self._value + + @value.setter + def value(self, value): + self._value_setter(value) + + def _value_setter(self, value): + # Store the original value + self._original_value = value + + # Store a tuple of CSV string representations + # Tuple is necessary here instead of list because the + # values need to be hashed + t = re.split(r'\s*,\s*', str(value)) + + # With multi-value variants it is necessary + # to remove duplicates and give an order + # to a set + self._value = tuple(sorted(set(t))) + + def _cmp_key(self): + return self.name, self.value + + def copy(self): + """Returns an instance of a variant equivalent to self + + Returns: + any variant type: a copy of self + + >>> a = MultiValuedVariant('foo', True) + >>> b = a.copy() + >>> assert a == b + >>> assert a is not b + """ + return type(self)(self.name, self._original_value) + + def satisfies(self, other): + """Returns true if ``other.name == self.name`` and ``other.value`` is + a strict subset of self. Does not try to validate. + + Args: + other: constraint to be met for the method to return True + + Returns: + bool: True or False + """ + # If types are different the constraint is not satisfied + if type(other) != type(self): + return False + + # If names are different then `self` does not satisfy `other` + # (`foo=bar` does not satisfy `baz=bar`) + if other.name != self.name: + return False + + # Otherwise we want all the values in `other` to be also in `self` + return all(v in self.value for v in other.value) + + def compatible(self, other): + """Returns True if self and other are compatible, False otherwise. + + As there is no semantic check, two VariantSpec are compatible if + either they contain the same value or they are both multi-valued. + + Args: + other: instance against which we test compatibility + + Returns: + bool: True or False + """ + # If types are different they are not compatible + if type(other) != type(self): + return False + + # If names are different then they are not compatible + return other.name == self.name + + def constrain(self, other): + """Modify self to match all the constraints for other if both + instances are multi-valued. Returns True if self changed, + False otherwise. + + Args: + other: instance against which we constrain self + + Returns: + bool: True or False + """ + # If types are different they are not compatible + if type(other) != type(self): + msg = 'other must be of type \'{0.__name__}\'' + raise TypeError(msg.format(type(self))) + + if self.name != other.name: + raise ValueError('variants must have the same name') + old_value = self.value + self.value = ','.join(sorted(set(self.value + other.value))) + return old_value != self.value + + def yaml_entry(self): + """Returns a key, value tuple suitable to be an entry in a yaml dict. + + Returns: + tuple: (name, value_representation) + """ + return self.name, list(self.value) + + def __contains__(self, item): + return item in self._value + + def __repr__(self): + cls = type(self) + return '{0.__name__}({1}, {2})'.format( + cls, repr(self.name), repr(self._original_value) + ) + + def __str__(self): + return '{0}={1}'.format( + self.name, ','.join(str(x) for x in self.value) + ) + + +class SingleValuedVariant(MultiValuedVariant): + """A variant that can hold multiple values, but one at a time.""" + + def _value_setter(self, value): + # Treat the value as a multi-valued variant + super(SingleValuedVariant, self)._value_setter(value) + + # Then check if there's only a single value + if len(self._value) != 1: + raise MultipleValuesInExclusiveVariantError(self, None) + self._value = str(self._value[0]) + + def __str__(self): + return '{0}={1}'.format(self.name, self.value) + + def satisfies(self, other): + # If types are different the constraint is not satisfied + if type(other) != type(self): + return False + + # If names are different then `self` does not satisfy `other` + # (`foo=bar` does not satisfy `baz=bar`) + if other.name != self.name: + return False + + return self.value == other.value + + def compatible(self, other): + return self.satisfies(other) + + def constrain(self, other): + if type(other) != type(self): + msg = 'other must be of type \'{0.__name__}\'' + raise TypeError(msg.format(type(self))) + + if self.name != other.name: + raise ValueError('variants must have the same name') + + if self.value != other.value: + raise UnsatisfiableVariantSpecError(other.value, self.value) + return False + + def __contains__(self, item): + return item == self.value + + def yaml_entry(self): + return self.name, self.value + + +class BoolValuedVariant(SingleValuedVariant): + """A variant that can hold either True or False.""" + + def _value_setter(self, value): + # Check the string representation of the value and turn + # it to a boolean + if str(value).upper() == 'TRUE': + self._original_value = value + self._value = True + elif str(value).upper() == 'FALSE': + self._original_value = value + self._value = False + else: + msg = 'cannot construct a BoolValuedVariant from ' + msg += 'a value that does not represent a bool' + raise ValueError(msg) + + def __contains__(self, item): + return item is self.value + + def __str__(self): + return '{0}{1}'.format('+' if self.value else '~', self.name) + + +class VariantMap(lang.HashableMap): + """Map containing variant instances. New values can be added only + if the key is not already present. + """ + + def __init__(self, spec): + super(VariantMap, self).__init__() + self.spec = spec + + def __setitem__(self, name, vspec): + # Raise a TypeError if vspec is not of the right type + if not isinstance(vspec, MultiValuedVariant): + msg = 'VariantMap accepts only values of type VariantSpec' + raise TypeError(msg) + + # Raise an error if the variant was already in this map + if name in self.dict: + msg = 'Cannot specify variant "{0}" twice'.format(name) + raise DuplicateVariantError(msg) + + # Raise an error if name and vspec.name don't match + if name != vspec.name: + msg = 'Inconsistent key "{0}", must be "{1}" to match VariantSpec' + raise KeyError(msg.format(name, vspec.name)) + + # Set the item + super(VariantMap, self).__setitem__(name, vspec) + + def substitute(self, vspec): + """Substitutes the entry under ``vspec.name`` with ``vspec``. + + Args: + vspec: variant spec to be substituted + """ + if vspec.name not in self: + msg = 'cannot substitute a key that does not exist [{0}]' + raise KeyError(msg.format(vspec.name)) + + # Set the item + super(VariantMap, self).__setitem__(vspec.name, vspec) + + def satisfies(self, other, strict=False): + """Returns True if this VariantMap is more constrained than other, + False otherwise. + + Args: + other (VariantMap): VariantMap instance to satisfy + strict (bool): if True return False if a key is in other and + not in self, otherwise discard that key and proceed with + evaluation + + Returns: + bool: True or False + """ + to_be_checked = [k for k in other] + + strict_or_concrete = strict + if self.spec is not None: + strict_or_concrete |= self.spec._concrete + + if not strict_or_concrete: + to_be_checked = filter(lambda x: x in self, to_be_checked) + + return all(k in self and self[k].satisfies(other[k]) + for k in to_be_checked) + + def constrain(self, other): + """Add all variants in other that aren't in self to self. Also + constrain all multi-valued variants that are already present. + Return True if self changed, False otherwise + + Args: + other (VariantMap): instance against which we constrain self + + Returns: + bool: True or False + """ + if other.spec is not None and other.spec._concrete: + for k in self: + if k not in other: + raise UnsatisfiableVariantSpecError(self[k], '') + + changed = False + for k in other: + if k in self: + # If they are not compatible raise an error + if not self[k].compatible(other[k]): + raise UnsatisfiableVariantSpecError(self[k], other[k]) + # If they are compatible merge them + changed |= self[k].constrain(other[k]) + else: + # If it is not present copy it straight away + self[k] = other[k].copy() + changed = True + + return changed + + @property + def concrete(self): + """Returns True if the spec is concrete in terms of variants. + + Returns: + bool: True or False + """ + return self.spec._concrete or all( + v in self for v in self.spec.package_class.variants + ) + + def copy(self): + """Return an instance of VariantMap equivalent to self. + + Returns: + VariantMap: a copy of self + """ + clone = VariantMap(self.spec) + for name, variant in self.items(): + clone[name] = variant.copy() + return clone + + def __str__(self): + # print keys in order + sorted_keys = sorted(self.keys()) + + # add spaces before and after key/value variants. + string = StringIO() + + kv = False + for key in sorted_keys: + vspec = self[key] + + if not isinstance(vspec.value, bool): + # add space before all kv pairs. + string.write(' ') + kv = True + else: + # not a kv pair this time + if kv: + # if it was LAST time, then pad after. + string.write(' ') + kv = False + + string.write(str(vspec)) + + return string.getvalue() + + +class DuplicateVariantError(error.SpecError): + """Raised when the same variant occurs in a spec twice.""" + + +class UnknownVariantError(error.SpecError): + """Raised when an unknown variant occurs in a spec.""" + + def __init__(self, pkg, variant): + super(UnknownVariantError, self).__init__( + 'Package {0} has no variant {1}!'.format(pkg, variant) + ) + + +class InconsistentValidationError(error.SpecError): + """Raised if the wrong validator is used to validate a variant.""" + def __init__(self, vspec, variant): + msg = ('trying to validate variant "{0.name}" ' + 'with the validator of "{1.name}"') + super(InconsistentValidationError, self).__init__( + msg.format(vspec, variant) + ) + + +class MultipleValuesInExclusiveVariantError(error.SpecError, ValueError): + """Raised when multiple values are present in a variant that wants + only one. + """ + def __init__(self, variant, pkg): + msg = 'multiple values are not allowed for variant "{0.name}"{1}' + pkg_info = '' + if pkg is not None: + pkg_info = ' in package "{0}"'.format(pkg.name) + super(MultipleValuesInExclusiveVariantError, self).__init__( + msg.format(variant, pkg_info) + ) + + +class InvalidVariantValueError(error.SpecError): + """Raised when a valid variant has at least an invalid value.""" + + def __init__(self, variant, invalid_values, pkg): + msg = 'invalid values for variant "{0.name}"{2}: {1}\n' + pkg_info = '' + if pkg is not None: + pkg_info = ' in package "{0}"'.format(pkg.name) + super(InvalidVariantValueError, self).__init__( + msg.format(variant, invalid_values, pkg_info) + ) + + +class UnsatisfiableVariantSpecError(error.UnsatisfiableSpecError): + """Raised when a spec variant conflicts with package constraints.""" + + def __init__(self, provided, required): + super(UnsatisfiableVariantSpecError, self).__init__( + provided, required, "variant") diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index 0d75ee1256..b697f4d2a9 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -25,7 +25,7 @@ from spack import * -class A(Package): +class A(AutotoolsPackage): """Simple package with no dependencies""" homepage = "http://www.example.com" @@ -33,5 +33,35 @@ class A(Package): version('1.0', '0123456789abcdef0123456789abcdef') + variant( + 'foo', + values=('bar', 'baz', 'fee'), + default='bar', + description='', + multi=True + ) + + variant( + 'foobar', + values=('bar', 'baz', 'fee'), + default='bar', + description='', + multi=False + ) + + def with_or_without_fee(self, activated): + if not activated: + return '--no-fee' + return '--fee-all-the-time' + + def autoreconf(self, spec, prefix): + pass + + def configure(self, spec, prefix): + pass + + def build(self, spec, prefix): + pass + def install(self, spec, prefix): pass diff --git a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py new file mode 100644 index 0000000000..13c3b02e77 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py @@ -0,0 +1,57 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 MultivalueVariant(Package): + homepage = "http://www.llnl.gov" + url = "http://www.llnl.gov/mpileaks-1.0.tar.gz" + + version(1.0, 'foobarbaz') + version(2.1, 'foobarbaz') + version(2.2, 'foobarbaz') + version(2.3, 'foobarbaz') + + variant('debug', default=False, description='Debug variant') + variant( + 'foo', + description='Multi-valued variant', + values=('bar', 'baz', 'barbaz'), + multi=True + ) + + variant( + 'fee', + description='Single-valued variant', + default='bar', + values=('bar', 'baz', 'barbaz'), + multi=False + ) + + depends_on('mpi') + depends_on('callpath') + + def install(self, spec, prefix): + pass diff --git a/var/spack/repos/builtin/packages/cdo/package.py b/var/spack/repos/builtin/packages/cdo/package.py index 90039d4479..3cee41b299 100644 --- a/var/spack/repos/builtin/packages/cdo/package.py +++ b/var/spack/repos/builtin/packages/cdo/package.py @@ -27,7 +27,8 @@ from spack import * class Cdo(Package): """CDO is a collection of command line Operators to manipulate and analyse - Climate and NWP model Data. """ + Climate and NWP model Data. + """ homepage = "https://code.zmaw.de/projects/cdo" url = "https://code.zmaw.de/attachments/download/12760/cdo-1.7.2.tar.gz" diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py index d952165ac1..3844f804be 100644 --- a/var/spack/repos/builtin/packages/mvapich2/package.py +++ b/var/spack/repos/builtin/packages/mvapich2/package.py @@ -22,11 +22,20 @@ # 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 sys +from spack import * +from spack.error import SpackError + + +def _process_manager_validator(values): + if len(values) > 1 and 'slurm' in values: + raise SpackError( + 'slurm cannot be activated along with other process managers' + ) -class Mvapich2(Package): + +class Mvapich2(AutotoolsPackage): """MVAPICH2 is an MPI implementation for Infiniband networks.""" homepage = "http://mvapich.cse.ohio-state.edu/" url = "http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.2.tar.gz" @@ -55,62 +64,39 @@ class Mvapich2(Package): # serialized - User serializes calls to MPI (MPI_THREAD_SERIALIZED) # multiple - Fully multi-threaded (MPI_THREAD_MULTIPLE) # runtime - Alias to "multiple" - variant('threads', default='multiple', - description='Control the level of thread support') + variant( + 'threads', + default='multiple', + values=('single', 'funneled', 'serialized', 'multiple'), + multi=False, + description='Control the level of thread support' + ) # 32 is needed when job size exceeds 32768 cores - variant('ch3_rank_bits', default=32, - description='Number of bits allocated to the rank field (16 or 32)' - ) - - ########## - # TODO : Process managers should be grouped into the same variant, - # as soon as variant capabilities will be extended See - # https://groups.google.com/forum/#!topic/spack/F8-f8B4_0so - SLURM = 'slurm' - HYDRA = 'hydra' - GFORKER = 'gforker' - REMSHELL = 'remshell' - SLURM_INCOMPATIBLE_PMS = (HYDRA, GFORKER, REMSHELL) - variant(SLURM, default=False, - description='Set slurm as the only process manager') - variant(HYDRA, default=False, - description='Set hydra as one of the process managers') - variant(GFORKER, default=False, - description='Set gforker as one of the process managers') - variant(REMSHELL, default=False, - description='Set remshell as one of the process managers') - ########## - - ########## - # TODO : Network types should be grouped into the same variant, as - # soon as variant capabilities will be extended - PSM = 'psm' - SOCK = 'sock' - NEMESISIBTCP = 'nemesisibtcp' - NEMESISIB = 'nemesisib' - NEMESIS = 'nemesis' - MRAIL = 'mrail' - SUPPORTED_NETWORKS = (PSM, SOCK, NEMESIS, NEMESISIB, NEMESISIBTCP) - variant( - PSM, default=False, - description='Configure for QLogic PSM-CH3') - variant( - SOCK, default=False, - description='Configure for TCP/IP-CH3') - variant( - NEMESISIBTCP, default=False, - description='Configure for both OFA-IB-Nemesis and TCP/IP-Nemesis') variant( - NEMESISIB, default=False, - description='Configure for OFA-IB-Nemesis') + 'ch3_rank_bits', + default='32', + values=('16', '32'), + multi=False, + description='Number of bits allocated to the rank field (16 or 32)' + ) + variant( - NEMESIS, default=False, - description='Configure for TCP/IP-Nemesis') + 'process_managers', + description='List of the process managers to activate', + values=('slurm', 'hydra', 'gforker', 'remshell'), + multi=True, + validator=_process_manager_validator + ) + variant( - MRAIL, default=False, - description='Configure for OFA-IB-CH3') - ########## + 'fabrics', + description='The fabric enabled for this build', + default='psm', + values=( + 'psm', 'sock', 'nemesisib', 'nemesis', 'mrail', 'nemesisibtcp' + ) + ) # FIXME : CUDA support is missing depends_on('bison') @@ -123,110 +109,52 @@ class Mvapich2(Package): else: return "%s/mvapich/mv2/mvapich2-%s.tar.gz" % (base_url, version) - @staticmethod - def enabled(x): - """Given a variant name returns the string that means the variant is - enabled - - :param x: variant name - :return: - """ - return '+' + x - - def set_build_type(self, spec, configure_args): - """Appends to configure_args the flags that depends only on the build - type (i.e. release or debug) - - :param spec: spec - :param configure_args: list of current configure arguments - """ - if '+debug' in spec: - build_type_options = [ - "--disable-fast", - "--enable-error-checking=runtime", - "--enable-error-messages=all", - # Permits debugging with TotalView - "--enable-g=dbg", "--enable-debuginfo" - ] - else: - build_type_options = ["--enable-fast=all"] - - configure_args.extend(build_type_options) + @property + def process_manager_options(self): + spec = self.spec - def set_process_manager(self, spec, configure_args): - """Appends to configure_args the flags that will enable the - appropriate process managers + other_pms = [] + for x in ('hydra', 'gforker', 'remshell'): + if 'process_managers={0}'.format(x) in spec: + other_pms.append(x) + opts = ['--with-pm=%s' % ':'.join(other_pms)] - :param spec: spec - :param configure_args: list of current configure arguments - """ - # Check that slurm variant is not activated together with - # other pm variants - has_slurm_incompatible_variants = \ - any(self.enabled(x) in spec - for x in Mvapich2.SLURM_INCOMPATIBLE_PMS) - - if self.enabled(Mvapich2.SLURM) in spec and \ - has_slurm_incompatible_variants: - raise RuntimeError(" %s : 'slurm' cannot be activated \ - together with other process managers" % self.name) - - process_manager_options = [] # See: http://slurm.schedmd.com/mpi_guide.html#mvapich2 - if self.enabled(Mvapich2.SLURM) in spec: + if 'process_managers=slurm' in spec: if self.version > Version('2.0'): - process_manager_options = [ - "--with-pmi=pmi2", - "--with-pm=slurm" + opts = [ + '--with-pmi=pmi2', + '--with-pm=slurm' ] else: - process_manager_options = [ - "--with-pmi=slurm", - "--with-pm=no" + opts = [ + '--with-pmi=slurm', + '--with-pm=no' ] - elif has_slurm_incompatible_variants: - pms = [] - # The variant name is equal to the process manager name in - # the configuration options - for x in Mvapich2.SLURM_INCOMPATIBLE_PMS: - if self.enabled(x) in spec: - pms.append(x) - process_manager_options = [ - "--with-pm=%s" % ':'.join(pms) - ] - configure_args.extend(process_manager_options) - - def set_network_type(self, spec, configure_args): - # Check that at most one variant has been activated - count = 0 - for x in Mvapich2.SUPPORTED_NETWORKS: - if self.enabled(x) in spec: - count += 1 - if count > 1: - raise RuntimeError('network variants are mutually exclusive \ - (only one can be selected at a time)') - - network_options = [] + return opts + + @property + def network_options(self): + opts = [] # From here on I can suppose that only one variant has been selected - if self.enabled(Mvapich2.PSM) in spec: - network_options = ["--with-device=ch3:psm"] - elif self.enabled(Mvapich2.SOCK) in spec: - network_options = ["--with-device=ch3:sock"] - elif self.enabled(Mvapich2.NEMESISIBTCP) in spec: - network_options = ["--with-device=ch3:nemesis:ib,tcp"] - elif self.enabled(Mvapich2.NEMESISIB) in spec: - network_options = ["--with-device=ch3:nemesis:ib"] - elif self.enabled(Mvapich2.NEMESIS) in spec: - network_options = ["--with-device=ch3:nemesis"] - elif self.enabled(Mvapich2.MRAIL) in spec: - network_options = ["--with-device=ch3:mrail", "--with-rdma=gen2"] - - configure_args.extend(network_options) + if 'fabrics=psm' in self.spec: + opts = ["--with-device=ch3:psm"] + elif 'fabrics=sock' in self.spec: + opts = ["--with-device=ch3:sock"] + elif 'fabrics=nemesisibtcp' in self.spec: + opts = ["--with-device=ch3:nemesis:ib,tcp"] + elif 'fabrics=nemesisib' in self.spec: + opts = ["--with-device=ch3:nemesis:ib"] + elif 'fabrics=nemesis' in self.spec: + opts = ["--with-device=ch3:nemesis"] + elif 'fabrics=mrail' in self.spec: + opts = ["--with-device=ch3:mrail", "--with-rdma=gen2"] + return opts def setup_environment(self, spack_env, run_env): - if self.enabled(Mvapich2.SLURM) in self.spec and \ - self.version > Version('2.0'): + spec = self.spec + if 'process_managers=slurm' in spec and spec.satisfies('@2.0:'): run_env.set('SLURM_MPI_TYPE', 'pmi2') def setup_dependent_environment(self, spack_env, run_env, dependent_spec): @@ -251,48 +179,44 @@ class Mvapich2(Package): join_path(self.prefix.lib, 'libmpi.{0}'.format(dso_suffix)) ] - def install(self, spec, prefix): + @run_before('configure') + def die_without_fortran(self): # Until we can pass variants such as +fortran through virtual # dependencies depends_on('mpi'), require Fortran compiler to # avoid delayed build errors in dependents. if (self.compiler.f77 is None) or (self.compiler.fc is None): - raise InstallError('Mvapich2 requires both C and Fortran ', - 'compilers!') - - # we'll set different configure flags depending on our - # environment - configure_args = [ - "--prefix=%s" % prefix, - "--enable-shared", - "--enable-romio", - "--disable-silent-rules", + raise InstallError( + 'Mvapich2 requires both C and Fortran compilers!' + ) + + def configure_args(self): + args = [ + '--enable-shared', + '--enable-romio', + '-disable-silent-rules', + '--enable-fortran=all', "--enable-threads={0}".format(spec.variants['threads'].value), "--with-ch3-rank-bits={0}".format( spec.variants['ch3_rank_bits'].value), ] - if self.compiler.f77 and self.compiler.fc: - configure_args.append("--enable-fortran=all") - elif self.compiler.f77: - configure_args.append("--enable-fortran=f77") - elif self.compiler.fc: - configure_args.append("--enable-fortran=fc") + if '+debug' in self.spec: + args.extend([ + '--disable-fast', + '--enable-error-checking=runtime', + '--enable-error-messages=all', + # Permits debugging with TotalView + '--enable-g=dbg', + '--enable-debuginfo' + ]) else: - configure_args.append("--enable-fortran=none") - - # Set the type of the build (debug, release) - self.set_build_type(spec, configure_args) - # Set the process manager - self.set_process_manager(spec, configure_args) - # Determine network type by variant - self.set_network_type(spec, configure_args) - - configure(*configure_args) - make() - make("install") + args.append('--enable-fast=all') - self.filter_compilers() + args.extend(self.process_manager_options) + args.extend(self.network_options) + return args + @run_after('install') def filter_compilers(self): """Run after install to make the MPI compilers use the compilers that Spack built the package with. @@ -302,7 +226,7 @@ class Mvapich2(Package): be bound to whatever compiler they were built with. """ bin = self.prefix.bin - mpicc = join_path(bin, 'mpicc') + mpicc = join_path(bin, 'mpicc') mpicxx = join_path(bin, 'mpicxx') mpif77 = join_path(bin, 'mpif77') mpif90 = join_path(bin, 'mpif90') diff --git a/var/spack/repos/builtin/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py index ca6a30e9a4..f3f0ed59a6 100644 --- a/var/spack/repos/builtin/packages/netcdf/package.py +++ b/var/spack/repos/builtin/packages/netcdf/package.py @@ -24,6 +24,16 @@ ############################################################################## from spack import * +import numbers + + +def is_integral(x): + """Any integer value""" + try: + return isinstance(int(x), numbers.Integral) and not isinstance(x, bool) + except ValueError: + return False + class Netcdf(AutotoolsPackage): """NetCDF is a set of software libraries and self-describing, @@ -52,10 +62,18 @@ class Netcdf(AutotoolsPackage): # These variants control the number of dimensions (i.e. coordinates and # attributes) and variables (e.g. time, entity ID, number of coordinates) # that can be used in any particular NetCDF file. - variant('maxdims', default=1024, - description='Defines the maximum dimensions of NetCDF files.') - variant('maxvars', default=8192, - description='Defines the maximum variables of NetCDF files.') + variant( + 'maxdims', + default=1024, + description='Defines the maximum dimensions of NetCDF files.', + values=is_integral + ) + variant( + 'maxvars', + default=8192, + description='Defines the maximum variables of NetCDF files.', + values=is_integral + ) depends_on("m4", type='build') depends_on("hdf", when='+hdf4') diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 63579efe0e..2761df543d 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -22,13 +22,16 @@ # 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 +from spack import * + def _verbs_dir(): """Try to find the directory where the OpenFabrics verbs package is - installed. Return None if not found.""" + installed. Return None if not found. + """ try: # Try to locate Verbs by looking for a utility in the path ibv_devices = which("ibv_devices") @@ -43,7 +46,7 @@ def _verbs_dir(): if path == "/": path = "/usr" return path - except: + except TypeError: return None @@ -82,22 +85,20 @@ class Openmpi(AutotoolsPackage): patch('configure.patch', when="@1.10.0:1.10.1") patch('fix_multidef_pmi_class.patch', when="@2.0.0:2.0.1") - # Fabrics - variant('psm', default=False, description='Build support for the PSM library') - variant('psm2', default=False, - description='Build support for the Intel PSM2 library') - variant('pmi', default=False, - description='Build support for PMI-based launchers') - variant('verbs', default=_verbs_dir() is not None, - description='Build support for OpenFabrics verbs') - variant('mxm', default=False, description='Build Mellanox Messaging support') - - # Schedulers - # TODO: support for alps and loadleveler is missing - variant('tm', default=False, - description='Build TM (Torque, PBSPro, and compatible) support') - variant('slurm', default=False, - description='Build SLURM scheduler component') + variant( + 'fabrics', + default=None if _verbs_dir() is None else 'verbs', + description='List of fabrics that are enabled', + values=('psm', 'psm2', 'pmi', 'verbs', 'mxm'), + multi=True + ) + + variant( + 'schedulers', + description='List of schedulers for which support is enabled', + values=('alps', 'lsf', 'tm', 'slurm', 'sge', 'loadleveler'), + multi=True + ) # Additional support options variant('java', default=False, description='Build Java support') @@ -114,7 +115,7 @@ class Openmpi(AutotoolsPackage): depends_on('hwloc') depends_on('hwloc +cuda', when='+cuda') depends_on('jdk', when='+java') - depends_on('sqlite', when='+sqlite3') + depends_on('sqlite', when='+sqlite3@:1.11') def url_for_version(self, version): return "http://www.open-mpi.org/software/ompi/v%s/downloads/openmpi-%s.tar.bz2" % ( @@ -153,15 +154,22 @@ class Openmpi(AutotoolsPackage): join_path(self.prefix.lib, 'libmpi.{0}'.format(dso_suffix)) ] - @property - def verbs(self): + def with_or_without_verbs(self, activated): # Up through version 1.6, this option was previously named # --with-openib - if self.spec.satisfies('@:1.6'): - return 'openib' + opt = 'openib' # In version 1.7, it was renamed to be --with-verbs - elif self.spec.satisfies('@1.7:'): - return 'verbs' + if self.spec.satisfies('@1.7:'): + opt = 'verbs' + # If the option has not been activated return + # --without-openib or --without-verbs + if not activated: + return '--without-{0}'.format(opt) + line = '--with-{0}'.format(opt) + path = _verbs_dir() + if (path is not None) and (path not in ('/usr', '/usr/local')): + line += '={0}'.format(path) + return line @run_before('autoreconf') def die_without_fortran(self): @@ -175,48 +183,17 @@ class Openmpi(AutotoolsPackage): def configure_args(self): spec = self.spec - config_args = [ '--enable-shared', - '--enable-static', - '--enable-mpi-cxx', - # Schedulers - '--with-tm' if '+tm' in spec else '--without-tm', - '--with-slurm' if '+slurm' in spec else '--without-slurm', - # Fabrics - '--with-psm' if '+psm' in spec else '--without-psm', + '--enable-static' ] + if self.spec.satisfies('@2.0:'): + # for Open-MPI 2.0:, C++ bindings are disabled by default. + config_args.extend(['--enable-mpi-cxx']) - # Intel PSM2 support - if spec.satisfies('@1.10:'): - if '+psm2' in spec: - config_args.append('--with-psm2') - else: - config_args.append('--without-psm2') - - # PMI support - if spec.satisfies('@1.5.5:'): - if '+pmi' in spec: - config_args.append('--with-pmi') - else: - config_args.append('--without-pmi') - - # Mellanox Messaging support - if spec.satisfies('@1.5.4:'): - if '+mxm' in spec: - config_args.append('--with-mxm') - else: - config_args.append('--without-mxm') - - # OpenFabrics verbs support - if '+verbs' in spec: - path = _verbs_dir() - if path is not None and path not in ('/usr', '/usr/local'): - config_args.append('--with-{0}={1}'.format(self.verbs, path)) - else: - config_args.append('--with-{0}'.format(self.verbs)) - else: - config_args.append('--without-{0}'.format(self.verbs)) + # Fabrics and schedulers + config_args.extend(self.with_or_without('fabrics')) + config_args.extend(self.with_or_without('schedulers')) # Hwloc support if spec.satisfies('@1.5.2:'): @@ -270,11 +247,11 @@ class Openmpi(AutotoolsPackage): @run_after('install') def filter_compilers(self): """Run after install to make the MPI compilers use the - compilers that Spack built the package with. + compilers that Spack built the package with. - If this isn't done, they'll have CC, CXX and FC set - to Spack's generic cc, c++ and f90. We want them to - be bound to whatever compiler they were built with. + If this isn't done, they'll have CC, CXX and FC set + to Spack's generic cc, c++ and f90. We want them to + be bound to whatever compiler they were built with. """ kwargs = {'ignore_absent': True, 'backup': False, 'string': False} wrapper_basepath = join_path(self.prefix, 'share', 'openmpi') -- cgit v1.2.3-70-g09d2 From ef5da08f80bec4be4d62e1d16165a9b19ec0ebdf Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Mon, 1 May 2017 22:58:24 +0200 Subject: only add direct build-only dependencies to PATH --- lib/spack/spack/build_environment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 2ac935291d..c3f887fd69 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -248,7 +248,7 @@ def set_build_environment_variables(pkg, env, dirty=False): dirty (bool): Skip unsetting the user's environment settings """ # Gather information about various types of dependencies - build_deps = pkg.spec.traverse(root=False, deptype=('build')) + build_deps = pkg.spec.dependencies(deptype='build') link_deps = pkg.spec.traverse(root=False, deptype=('link')) build_link_deps = pkg.spec.traverse(root=False, deptype=('build', 'link')) rpath_deps = get_rpath_deps(pkg) -- cgit v1.2.3-70-g09d2 From 708d8586eab7c8a1960a7a30269a0c43317746af Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Tue, 2 May 2017 08:43:37 +0200 Subject: add run-time dependencies of direct build-time dependencies to PATH --- lib/spack/spack/build_environment.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index c3f887fd69..ac1eaaa77a 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -258,6 +258,11 @@ def set_build_environment_variables(pkg, env, dirty=False): build_link_prefixes = [dep.prefix for dep in build_link_deps] rpath_prefixes = [dep.prefix for dep in rpath_deps] + # add run-time dependencies of direct build-time dependencies: + for bd in build_deps: + for rd in bd.dependencies(deptype='run'): + build_prefixes.append(rd.prefix) + # Filter out system paths: ['/', '/usr', '/usr/local'] # These paths can be introduced into the build when an external package # is added as a dependency. The problem with these paths is that they often -- cgit v1.2.3-70-g09d2 From 1336630f172bf30c1c3d85a5acbe8295c5e2d852 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 2 May 2017 11:20:45 -0500 Subject: Add link to spack view docs in command index (#4082) --- lib/spack/docs/workflows.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/workflows.rst b/lib/spack/docs/workflows.rst index 7814ebf3cd..84da3b0f44 100644 --- a/lib/spack/docs/workflows.rst +++ b/lib/spack/docs/workflows.rst @@ -476,10 +476,11 @@ if the view is built with hardlinks. .. FIXME: reference the relocation work of Hegner and Gartung (PR #1013) +.. _cmd-spack-view: -"""""""""""""""""""""" -Using Filesystem Views -"""""""""""""""""""""" +"""""""""""""" +``spack view`` +"""""""""""""" A filesystem view is created, and packages are linked in, by the ``spack view`` command's ``symlink`` and ``hardlink`` sub-commands. The -- cgit v1.2.3-70-g09d2 From ae9a9e019a73cb951d4d2a2585ac71a53f351c81 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 3 May 2017 06:21:37 +0200 Subject: spack: no stacktrace if not in debug mode + fix emacs variant (#4098) * spack: no stacktrace if not in debug mode + fix emacs variant * emacs: removed dead code --- bin/spack | 2 ++ lib/spack/spack/variant.py | 4 ++-- var/spack/repos/builtin/packages/emacs/package.py | 13 +++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/bin/spack b/bin/spack index 922e6a6be4..5ab805fe54 100755 --- a/bin/spack +++ b/bin/spack @@ -194,6 +194,8 @@ def _main(args, unknown_args): return_val = command(parser, args) except SpackError as e: e.die() + except Exception as e: + tty.die(str(e)) except KeyboardInterrupt: sys.stderr.write('\n') tty.die("Keyboard interrupt.") diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index 7102676b69..2d02ab1253 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -389,9 +389,9 @@ class BoolValuedVariant(SingleValuedVariant): self._original_value = value self._value = False else: - msg = 'cannot construct a BoolValuedVariant from ' + msg = 'cannot construct a BoolValuedVariant for "{0}" from ' msg += 'a value that does not represent a bool' - raise ValueError(msg) + raise ValueError(msg.format(self.name)) def __contains__(self, item): return item is self.value diff --git a/var/spack/repos/builtin/packages/emacs/package.py b/var/spack/repos/builtin/packages/emacs/package.py index 71733eebd2..195cb1281f 100644 --- a/var/spack/repos/builtin/packages/emacs/package.py +++ b/var/spack/repos/builtin/packages/emacs/package.py @@ -36,8 +36,12 @@ class Emacs(AutotoolsPackage): version('24.5', 'd74b597503a68105e61b5b9f6d065b44') variant('X', default=False, description="Enable an X toolkit") - variant('toolkit', default='gtk', - description="Select an X toolkit (gtk, athena)") + variant( + 'toolkit', + default='gtk', + values=('gtk', 'athena'), + description="Select an X toolkit (gtk, athena)" + ) depends_on('pkg-config@0.9.0:', type='build') @@ -53,12 +57,9 @@ class Emacs(AutotoolsPackage): def configure_args(self): spec = self.spec - args = [] + toolkit = spec.variants['toolkit'].value if '+X' in spec: - if toolkit not in ('gtk', 'athena'): - raise InstallError("toolkit must be in (gtk, athena), not %s" % - toolkit) args = [ '--with-x', '--with-x-toolkit={0}'.format(toolkit) -- cgit v1.2.3-70-g09d2 From 6e14b97f84342d6a99bae5bec0425c505229b8ea Mon Sep 17 00:00:00 2001 From: Matthew Scott Krafczyk Date: Wed, 3 May 2017 12:05:15 -0500 Subject: Update cray compiler options (#4086) --- lib/spack/spack/compilers/cce.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/compilers/cce.py b/lib/spack/spack/compilers/cce.py index 43d000dd69..94956b9d83 100644 --- a/lib/spack/spack/compilers/cce.py +++ b/lib/spack/spack/compilers/cce.py @@ -53,3 +53,15 @@ class Cce(Compiler): @classmethod def default_version(cls, comp): return get_compiler_version(comp, '-V', r'[Vv]ersion.*(\d+(\.\d+)+)') + + @property + def openmp_flag(self): + return "-h omp" + + @property + def cxx11_flag(self): + return "-h std=c++11" + + @property + def pic_flag(self): + return "-h PIC" -- cgit v1.2.3-70-g09d2 From 7592971cb1cdd2af2c2a57cdea1186f2f782eebd Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Thu, 4 May 2017 08:43:06 +0200 Subject: add transitive run dependencies of direct build dependencies --- lib/spack/spack/build_environment.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index ac1eaaa77a..e216d4aa7c 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -259,9 +259,9 @@ def set_build_environment_variables(pkg, env, dirty=False): rpath_prefixes = [dep.prefix for dep in rpath_deps] # add run-time dependencies of direct build-time dependencies: - for bd in build_deps: - for rd in bd.dependencies(deptype='run'): - build_prefixes.append(rd.prefix) + for build_dep in build_deps: + for run_dep in build_dep.traverse(deptype='run'): + build_prefixes.append(run_dep.prefix) # Filter out system paths: ['/', '/usr', '/usr/local'] # These paths can be introduced into the build when an external package -- cgit v1.2.3-70-g09d2 From 85b4b15d9a0d59b0a2a6e405ce7e4ddcc2ec71ba Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 4 May 2017 20:01:02 +0200 Subject: SV variants are evaluated correctly in "when=" (#4118) * SV variants are evaluated correctly in `when=` statements fixes #4113 The problem here was tricky: ```python spec.satisfies(other) ``` changes already the MV variants in others into SV variants (where necessary) if spec is concrete. If it is not concrete it does nothing because we may be acting at a pure syntactical level. When evaluating a `when=` keyword spec is for sure not concrete as it is in the middle of the concretization process. In this case we have to trigger manually the substitution in other to not end up comparing a MV variant "foo=bar" to a SV variant "foo=bar" and having False in return. Which is wrong. * sv variants: improved error message for typos in "when=" statements --- lib/spack/spack/spec.py | 45 ++++++++++------------ lib/spack/spack/test/spec_semantics.py | 28 ++++++-------- lib/spack/spack/variant.py | 16 ++++++++ var/spack/repos/builtin.mock/packages/a/package.py | 2 + var/spack/repos/builtin/packages/wget/package.py | 10 ++++- 5 files changed, 59 insertions(+), 42 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 0cf392a7ce..399f58461f 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1828,6 +1828,18 @@ class Spec(object): # evaluate when specs to figure out constraints on the dependency. dep = None for when_spec, dep_spec in conditions.items(): + # If self was concrete it would have changed the variants in + # when_spec automatically. As here we are for sure during the + # concretization process, self is not concrete and we must change + # the variants in when_spec on our own to avoid using a + # MultiValuedVariant whe it is instead a SingleValuedVariant + try: + substitute_single_valued_variants(when_spec) + except SpecError as e: + msg = 'evaluating a `when=` statement gives ' + e.message + e.message = msg + raise + sat = self.satisfies(when_spec, strict=True) if sat: if dep is None: @@ -2064,18 +2076,7 @@ class Spec(object): if not_existing: raise UnknownVariantError(spec.name, not_existing) - for name, v in [(x, y) for (x, y) in spec.variants.items()]: - # When parsing a spec every variant of the form - # 'foo=value' will be interpreted by default as a - # multi-valued variant. During validation of the - # variants we use the information in the package - # to turn any variant that needs it to a single-valued - # variant. - pkg_variant = pkg_variants[name] - pkg_variant.validate_or_raise(v, pkg_cls) - spec.variants.substitute( - pkg_variant.make_variant(v._original_value) - ) + substitute_single_valued_variants(spec) def constrain(self, other, deps=True): """Merge the constraints of other with self. @@ -2290,25 +2291,19 @@ class Spec(object): # to substitute every multi-valued variant that needs it with a # single-valued variant. if self.concrete: - for name, v in [(x, y) for (x, y) in other.variants.items()]: + try: # When parsing a spec every variant of the form # 'foo=value' will be interpreted by default as a # multi-valued variant. During validation of the # variants we use the information in the package # to turn any variant that needs it to a single-valued # variant. - pkg_cls = type(other.package) - try: - pkg_variant = other.package.variants[name] - pkg_variant.validate_or_raise(v, pkg_cls) - except (SpecError, KeyError): - # Catch the two things that could go wrong above: - # 1. name is not a valid variant (KeyError) - # 2. the variant is not validated (SpecError) - return False - other.variants.substitute( - pkg_variant.make_variant(v._original_value) - ) + substitute_single_valued_variants(other) + except (SpecError, KeyError): + # Catch the two things that could go wrong above: + # 1. name is not a valid variant (KeyError) + # 2. the variant is not validated (SpecError) + return False var_strict = strict if (not self.name) or (not other.name): diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 306a6ad98f..80a2f63bde 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -280,6 +280,18 @@ class TestSpecSematics(object): assert a.satisfies('foobar=bar') + # Assert that an autospec generated from a literal + # gives the right result for a single valued variant + assert 'foobar=bar' in a + assert 'foobar=baz' not in a + assert 'foobar=fee' not in a + + # ... and for a multi valued variant + assert 'foo=bar' in a + + # Check that conditional dependencies are treated correctly + assert '^b' in a + def test_unsatisfiable_multi_value_variant(self): # Semantics for a multi-valued variant is different @@ -337,22 +349,6 @@ class TestSpecSematics(object): with pytest.raises(MultipleValuesInExclusiveVariantError): a.concretize() - # FIXME: remove after having checked the correctness of the semantics - # check_unsatisfiable('multivalue_variant foo="bar,baz"', - # 'multivalue_variant foo="bar,baz,quux"', - # concrete=True) - # check_unsatisfiable('multivalue_variant foo="bar,baz"', - # 'multivalue_variant foo="bar,baz,quux"', - # concrete=True) - - # but succeed for abstract ones (b/c they COULD satisfy the - # constraint if constrained) - # check_satisfies('multivalue_variant foo="bar"', - # 'multivalue_variant foo="bar,baz"') - - # check_satisfies('multivalue_variant foo="bar,baz"', - # 'multivalue_variant foo="bar,baz,quux"') - def test_unsatisfiable_variant_types(self): # These should fail due to incompatible types check_unsatisfiable('multivalue_variant +foo', diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index 2d02ab1253..fe08e4529e 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -546,6 +546,22 @@ class VariantMap(lang.HashableMap): return string.getvalue() +def substitute_single_valued_variants(spec): + """Uses the information in `spec.package` to turn any variant that needs + it into a SingleValuedVariant. + + Args: + spec: spec on which to operate the substitution + """ + for name, v in spec.variants.items(): + pkg_cls = type(spec.package) + pkg_variant = spec.package.variants[name] + pkg_variant.validate_or_raise(v, pkg_cls) + spec.variants.substitute( + pkg_variant.make_variant(v._original_value) + ) + + class DuplicateVariantError(error.SpecError): """Raised when the same variant occurs in a spec twice.""" diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index b697f4d2a9..e39ad13bd1 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -49,6 +49,8 @@ class A(AutotoolsPackage): multi=False ) + depends_on('b', when='foobar=bar') + def with_or_without_fee(self, activated): if not activated: return '--no-fee' diff --git a/var/spack/repos/builtin/packages/wget/package.py b/var/spack/repos/builtin/packages/wget/package.py index 10b8c33d31..ff704ca37c 100644 --- a/var/spack/repos/builtin/packages/wget/package.py +++ b/var/spack/repos/builtin/packages/wget/package.py @@ -38,7 +38,15 @@ class Wget(Package): version('1.17', 'c4c4727766f24ac716936275014a0536') version('1.16', '293a37977c41b5522f781d3a3a078426') - depends_on("openssl") + variant( + 'ssl', + default='openssl', + values=('gnutls', 'openssl'), + description='Specify SSL backend' + ) + + depends_on('gnutls', when='ssl=gnutls') + depends_on('openssl', when='ssl=openssl') depends_on("perl@5.12.0:", type='build') def install(self, spec, prefix): -- cgit v1.2.3-70-g09d2 From 9b49dfdc2afa9f42723c485dfc38aa2901e92278 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 5 May 2017 13:05:56 -0500 Subject: Fix typos in Basic Installation Tutorial (#4127) --- lib/spack/docs/tutorial_basics.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/tutorial_basics.rst b/lib/spack/docs/tutorial_basics.rst index 8d9a8fbaea..6bd5dad604 100644 --- a/lib/spack/docs/tutorial_basics.rst +++ b/lib/spack/docs/tutorial_basics.rst @@ -574,7 +574,7 @@ You may also have noticed that there are some packages shown in the dependencies that were installed implicitly. A few packages installed implicitly are not shown as dependencies in the ``spack find -d`` output. These are build dependencies. For example, ``libpciaccess`` is a -dependency of openmpi and requires m4 to build. Spack will build `m4`` as +dependency of openmpi and requires ``m4`` to build. Spack will build ``m4`` as part of the installation of ``openmpi``, but it does not become a part of the DAG because it is not linked in at run time. Spack handles build dependencies differently because of their different (less strict) @@ -951,7 +951,7 @@ You can control how the output is displayed with a number of options. The ASCII output from ``spack graph`` can be difficult to parse for complicated packages. The output can be changed to the ``graphviz`` -``.dot`` format using the `--dot` flag. +``.dot`` format using the ``--dot`` flag. .. code-block:: console @@ -1093,13 +1093,13 @@ packages at once. Advanced ``spack find`` Usage ----------------------------- -We will go over some additional uses for the `spack find` command not +We will go over some additional uses for the ``spack find`` command not already covered in the :ref:`basics-tutorial-install` and :ref:`basics-tutorial-uninstall` sections. The ``spack find`` command can accept what we call "anonymous specs." These are expressions in spec syntax that do not contain a package -name. For example, `spack find %intel` will return every package built +name. For example, ``spack find %intel`` will return every package built with the intel compiler, and ``spack find cppflags="-O3"`` will return every package which was built with ``cppflags="-O3"``. -- cgit v1.2.3-70-g09d2 From 73896e94810df41202d8b1d344218ab8adf40f1b Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 5 May 2017 18:52:28 -0500 Subject: Remind developers to update tab completion script (#4148) --- lib/spack/docs/developer_guide.rst | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib') diff --git a/lib/spack/docs/developer_guide.rst b/lib/spack/docs/developer_guide.rst index ea8d50c6ca..96b4436683 100644 --- a/lib/spack/docs/developer_guide.rst +++ b/lib/spack/docs/developer_guide.rst @@ -336,6 +336,10 @@ your command. If it isn't used very frequently, changes to the rest of Spack can cause your command to break without sufficient unit tests to prevent this from happening. +Whenever you add/remove/rename a command or flags for an existing command, +make sure to update Spack's `Bash tab completion script +`_. + ---------- Unit tests ---------- -- cgit v1.2.3-70-g09d2 From 4e44d39f1a65b3fd25929d3f9be6441888789846 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 8 May 2017 06:53:02 +0200 Subject: Spec.__init__: removed dead code (#4146) The conditionals are repeated in the statement before _add_dependencies --- lib/spack/spack/spec.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 399f58461f..ff213c5986 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -966,15 +966,12 @@ class Spec(object): # Spec(a, b) will copy a but just add b as a dep. deptypes = () for dep in dep_like: - if isinstance(dep, Spec): - spec = dep - elif isinstance(dep, (list, tuple)): + + if isinstance(dep, (list, tuple)): # Literals can be deptypes -- if there are tuples in the # list, they will be used as deptypes for the following Spec. deptypes = tuple(dep) continue - else: - spec = Spec(dep) spec = dep if isinstance(dep, Spec) else Spec(dep) self._add_dependency(spec, deptypes) -- cgit v1.2.3-70-g09d2 From cf93f49462a319be4d6b6f263725297686612299 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 8 May 2017 00:04:52 -0500 Subject: Fix PGI compiler detection on PowerPC (#4150) --- lib/spack/spack/compilers/pgi.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/compilers/pgi.py b/lib/spack/spack/compilers/pgi.py index 146c153041..ed8bad1a9b 100644 --- a/lib/spack/spack/compilers/pgi.py +++ b/lib/spack/spack/compilers/pgi.py @@ -61,12 +61,20 @@ class Pgi(Compiler): @classmethod def default_version(cls, comp): - """The '-V' option works for all the PGI compilers. + """The ``-V`` option works for all the PGI compilers. Output looks like this:: pgcc 15.10-0 64-bit target on x86-64 Linux -tp sandybridge The Portland Group - PGI Compilers and Tools Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved. + + on x86-64, and:: + + pgcc 17.4-0 linuxpower target on Linuxpower + PGI Compilers and Tools + Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. + + on PowerPC. """ return get_compiler_version( - comp, '-V', r'pg[^ ]* ([^ ]+) \d\d\d?-bit target') + comp, '-V', r'pg[^ ]* ([0-9.-]+) [^ ]+ target on ') -- cgit v1.2.3-70-g09d2 From 85b0ebe83644d4d223f6a580b51a015de4b76ac7 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 8 May 2017 07:06:39 +0200 Subject: BarrierTimeoutError must derive from Exception (#4157) Seen in https://travis-ci.org/LLNL/spack/builds/229484526, very likely due to a problem in the Travis builder. --- lib/spack/spack/util/multiproc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/util/multiproc.py b/lib/spack/spack/util/multiproc.py index 91bac57c26..f465a3dbdc 100644 --- a/lib/spack/spack/util/multiproc.py +++ b/lib/spack/spack/util/multiproc.py @@ -92,5 +92,5 @@ class Barrier: self.turnstile2.release() -class BarrierTimeoutError: +class BarrierTimeoutError(Exception): pass -- cgit v1.2.3-70-g09d2 From ff3b5d88e4229516e9655a9a75f818453613e8e4 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 8 May 2017 13:18:29 -0700 Subject: rework spack help (#3033) - Full help is now only generated lazily, when needed. - Executing specific commands doesn't require loading all of them. - All commands are only loaded if we need them for help. - There is now short and long help: - short help (spack help) shows only basic spack options - long help (spack help -a) shows all spack options - Both divide help on commands into high-level sections - Commands now specify attributes from which help is auto-generated: - description: used in help to describe the command. - section: help section - level: short or long - Clean up command descriptions - Add a `spack docs` command to open full documentation in the browser. - move `spack doc` command to `spack pydoc` for clarity - Add a `spack --spec` command to show documentation on the spec syntax. --- bin/spack | 222 ++---------------- lib/spack/spack/__init__.py | 2 +- lib/spack/spack/cmd/activate.py | 2 + lib/spack/spack/cmd/arch.py | 2 + lib/spack/spack/cmd/bootstrap.py | 2 + lib/spack/spack/cmd/build.py | 3 + lib/spack/spack/cmd/cd.py | 2 + lib/spack/spack/cmd/checksum.py | 2 + lib/spack/spack/cmd/clean.py | 2 + lib/spack/spack/cmd/compiler.py | 2 + lib/spack/spack/cmd/compilers.py | 4 +- lib/spack/spack/cmd/config.py | 2 + lib/spack/spack/cmd/configure.py | 4 +- lib/spack/spack/cmd/create.py | 3 + lib/spack/spack/cmd/deactivate.py | 2 + lib/spack/spack/cmd/debug.py | 2 + lib/spack/spack/cmd/dependents.py | 2 + lib/spack/spack/cmd/diy.py | 2 + lib/spack/spack/cmd/doc.py | 34 --- lib/spack/spack/cmd/docs.py | 33 +++ lib/spack/spack/cmd/edit.py | 2 + lib/spack/spack/cmd/env.py | 4 +- lib/spack/spack/cmd/extensions.py | 2 + lib/spack/spack/cmd/fetch.py | 2 + lib/spack/spack/cmd/find.py | 4 +- lib/spack/spack/cmd/flake8.py | 4 + lib/spack/spack/cmd/graph.py | 2 + lib/spack/spack/cmd/help.py | 90 +++++++- lib/spack/spack/cmd/info.py | 2 + lib/spack/spack/cmd/install.py | 2 + lib/spack/spack/cmd/list.py | 5 +- lib/spack/spack/cmd/load.py | 4 +- lib/spack/spack/cmd/location.py | 2 + lib/spack/spack/cmd/md5.py | 2 + lib/spack/spack/cmd/mirror.py | 2 + lib/spack/spack/cmd/module.py | 3 + lib/spack/spack/cmd/patch.py | 2 + lib/spack/spack/cmd/pkg.py | 2 + lib/spack/spack/cmd/providers.py | 2 + lib/spack/spack/cmd/purge.py | 2 + lib/spack/spack/cmd/pydoc.py | 36 +++ lib/spack/spack/cmd/python.py | 2 + lib/spack/spack/cmd/reindex.py | 3 + lib/spack/spack/cmd/repo.py | 2 + lib/spack/spack/cmd/restage.py | 2 + lib/spack/spack/cmd/setup.py | 2 + lib/spack/spack/cmd/spec.py | 4 +- lib/spack/spack/cmd/stage.py | 2 + lib/spack/spack/cmd/test.py | 4 +- lib/spack/spack/cmd/uninstall.py | 4 +- lib/spack/spack/cmd/unload.py | 4 +- lib/spack/spack/cmd/unuse.py | 2 + lib/spack/spack/cmd/url.py | 2 + lib/spack/spack/cmd/use.py | 2 + lib/spack/spack/cmd/versions.py | 2 + lib/spack/spack/cmd/view.py | 4 +- lib/spack/spack/main.py | 468 ++++++++++++++++++++++++++++++++++++++ share/spack/qa/run-unit-tests | 4 + 58 files changed, 768 insertions(+), 250 deletions(-) delete mode 100644 lib/spack/spack/cmd/doc.py create mode 100644 lib/spack/spack/cmd/docs.py create mode 100644 lib/spack/spack/cmd/pydoc.py create mode 100644 lib/spack/spack/main.py (limited to 'lib') diff --git a/bin/spack b/bin/spack index 5ab805fe54..496c705042 100755 --- a/bin/spack +++ b/bin/spack @@ -1,5 +1,4 @@ #!/usr/bin/env python -# flake8: noqa ############################################################################## # Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. @@ -26,34 +25,32 @@ ############################################################################## from __future__ import print_function +import os import sys + if sys.version_info[:2] < (2, 6): v_info = sys.version_info[:3] sys.exit("Spack requires Python 2.6 or higher." "This is Python %d.%d.%d." % v_info) -import os -import inspect - # Find spack's location and its prefix. -SPACK_FILE = os.path.realpath(os.path.expanduser(__file__)) -os.environ["SPACK_FILE"] = SPACK_FILE -SPACK_PREFIX = os.path.dirname(os.path.dirname(SPACK_FILE)) +spack_file = os.path.realpath(os.path.expanduser(__file__)) +spack_prefix = os.path.dirname(os.path.dirname(spack_file)) # Allow spack libs to be imported in our scripts -SPACK_LIB_PATH = os.path.join(SPACK_PREFIX, "lib", "spack") -sys.path.insert(0, SPACK_LIB_PATH) +spack_lib_path = os.path.join(spack_prefix, "lib", "spack") +sys.path.insert(0, spack_lib_path) # Add external libs -SPACK_EXTERNAL_LIBS = os.path.join(SPACK_LIB_PATH, "external") -sys.path.insert(0, SPACK_EXTERNAL_LIBS) +spack_external_libs = os.path.join(spack_lib_path, "external") +sys.path.insert(0, spack_external_libs) # Handle vendoring of YAML specially, as it has two versions. if sys.version_info[0] == 2: - SPACK_YAML_LIBS = os.path.join(SPACK_EXTERNAL_LIBS, "yaml/lib") + spack_yaml_libs = os.path.join(spack_external_libs, "yaml/lib") else: - SPACK_YAML_LIBS = os.path.join(SPACK_EXTERNAL_LIBS, "yaml/lib3") -sys.path.insert(0, SPACK_YAML_LIBS) + spack_yaml_libs = os.path.join(spack_external_libs, "yaml/lib3") +sys.path.insert(0, spack_yaml_libs) # Quick and dirty check to clean orphaned .pyc files left over from # previous revisions. These files were present in earlier versions of @@ -61,13 +58,13 @@ sys.path.insert(0, SPACK_YAML_LIBS) # imports. If we leave them, Spack will fail in mysterious ways. # TODO: more elegant solution for orphaned pyc files. orphaned_pyc_files = [ - os.path.join(SPACK_EXTERNAL_LIBS, 'functools.pyc'), - os.path.join(SPACK_EXTERNAL_LIBS, 'ordereddict.pyc'), - os.path.join(SPACK_LIB_PATH, 'spack', 'platforms', 'cray_xc.pyc'), - os.path.join(SPACK_LIB_PATH, 'spack', 'cmd', 'package-list.pyc'), - os.path.join(SPACK_LIB_PATH, 'spack', 'cmd', 'test-install.pyc'), - os.path.join(SPACK_LIB_PATH, 'spack', 'cmd', 'url-parse.pyc'), - os.path.join(SPACK_LIB_PATH, 'spack', 'test', 'yaml.pyc') + os.path.join(spack_external_libs, 'functools.pyc'), + os.path.join(spack_external_libs, 'ordereddict.pyc'), + os.path.join(spack_lib_path, 'spack', 'platforms', 'cray_xc.pyc'), + os.path.join(spack_lib_path, 'spack', 'cmd', 'package-list.pyc'), + os.path.join(spack_lib_path, 'spack', 'cmd', 'test-install.pyc'), + os.path.join(spack_lib_path, 'spack', 'cmd', 'url-parse.pyc'), + os.path.join(spack_lib_path, 'spack', 'test', 'yaml.pyc') ] for pyc_file in orphaned_pyc_files: @@ -79,183 +76,6 @@ for pyc_file in orphaned_pyc_files: print("WARNING: Spack may fail mysteriously. " "Couldn't remove orphaned .pyc file: %s" % pyc_file) -# If there is no working directory, use the spack prefix. -try: - working_dir = os.getcwd() -except OSError: - os.chdir(SPACK_PREFIX) - working_dir = SPACK_PREFIX - -# clean up the scope and start using spack package instead. -del SPACK_FILE, SPACK_PREFIX, SPACK_LIB_PATH -import llnl.util.tty as tty -from llnl.util.tty.color import * -import spack -from spack.error import SpackError -import argparse -import pstats - -# Get the allowed names of statistics for cProfile, and make a list of -# groups of 7 names to wrap them nicely. -stat_names = pstats.Stats.sort_arg_dict_default -stat_lines = list(zip(*(iter(stat_names),)*7)) - -# Command parsing -parser = argparse.ArgumentParser( - formatter_class=argparse.RawTextHelpFormatter, - description="Spack: the Supercomputing PACKage Manager." + colorize(""" - -spec expressions: - PACKAGE [CONSTRAINTS] - - CONSTRAINTS: - @c{@version} - @g{%compiler @compiler_version} - @B{+variant} - @r{-variant} or @r{~variant} - @m{=architecture} - [^DEPENDENCY [CONSTRAINTS] ...]""")) - -parser.add_argument('-d', '--debug', action='store_true', - help="write out debug logs during compile") -parser.add_argument('-D', '--pdb', action='store_true', - help="run spack under the pdb debugger") -parser.add_argument('-k', '--insecure', action='store_true', - help="do not check ssl certificates when downloading") -parser.add_argument('-m', '--mock', action='store_true', - help="use mock packages instead of real ones") -parser.add_argument('-p', '--profile', action='store_true', - help="profile execution using cProfile") -parser.add_argument('-P', '--sorted-profile', default=None, metavar="STAT", - help="profile and sort by one or more of:\n[%s]" % - ',\n '.join([', '.join(line) for line in stat_lines])) -parser.add_argument('--lines', default=20, action='store', - help="lines of profile output: default 20; 'all' for all") -parser.add_argument('-v', '--verbose', action='store_true', - help="print additional output during builds") -parser.add_argument('-s', '--stacktrace', action='store_true', - help="add stacktrace info to all printed statements") -parser.add_argument('-V', '--version', action='version', - version="%s" % spack.spack_version) - -# each command module implements a parser() function, to which we pass its -# subparser for setup. -subparsers = parser.add_subparsers(metavar='SUBCOMMAND', dest="command") - - -import spack.cmd -for cmd in spack.cmd.commands: - module = spack.cmd.get_module(cmd) - cmd_name = cmd.replace('_', '-') - subparser = subparsers.add_parser(cmd_name, help=module.description) - module.setup_parser(subparser) - - -def _main(args, unknown_args): - # Set up environment based on args. - tty.set_verbose(args.verbose) - tty.set_debug(args.debug) - tty.set_stacktrace(args.stacktrace) - spack.debug = args.debug - - if spack.debug: - import spack.util.debug as debug - debug.register_interrupt_handler() - - # Run any available pre-run hooks - spack.hooks.pre_run() - - spack.spack_working_dir = working_dir - if args.mock: - from spack.repository import RepoPath - spack.repo.swap(RepoPath(spack.mock_packages_path)) - - # If the user asked for it, don't check ssl certs. - if args.insecure: - tty.warn("You asked for --insecure. Will NOT check SSL certificates.") - spack.insecure = True - - # Try to load the particular command asked for and run it - command = spack.cmd.get_command(args.command.replace('-', '_')) - - # Allow commands to inject an optional argument and get unknown args - # if they want to handle them. - info = dict(inspect.getmembers(command)) - varnames = info['__code__'].co_varnames - argcount = info['__code__'].co_argcount - - # Actually execute the command - try: - if argcount == 3 and varnames[2] == 'unknown_args': - return_val = command(parser, args, unknown_args) - else: - if unknown_args: - tty.die('unrecognized arguments: %s' % ' '.join(unknown_args)) - return_val = command(parser, args) - except SpackError as e: - e.die() - except Exception as e: - tty.die(str(e)) - except KeyboardInterrupt: - sys.stderr.write('\n') - tty.die("Keyboard interrupt.") - - # Allow commands to return values if they want to exit with some other code. - if return_val is None: - sys.exit(0) - elif isinstance(return_val, int): - sys.exit(return_val) - else: - tty.die("Bad return value from command %s: %s" - % (args.command, return_val)) - - -def main(args): - # Just print help and exit if run with no arguments at all - if len(args) == 1: - parser.print_help() - sys.exit(1) - - # actually parse the args. - args, unknown = parser.parse_known_args() - - if args.profile or args.sorted_profile: - import cProfile - - try: - nlines = int(args.lines) - except ValueError: - if args.lines != 'all': - tty.die('Invalid number for --lines: %s' % args.lines) - nlines = -1 - - # allow comma-separated list of fields - sortby = ['time'] - if args.sorted_profile: - sortby = args.sorted_profile.split(',') - for stat in sortby: - if stat not in stat_names: - tty.die("Invalid sort field: %s" % stat) - - try: - # make a profiler and run the code. - pr = cProfile.Profile() - pr.enable() - _main(args, unknown) - finally: - pr.disable() - - # print out profile stats. - stats = pstats.Stats(pr) - stats.sort_stats(*sortby) - stats.print_stats(nlines) - - elif args.pdb: - import pdb - pdb.runctx('_main(args, unknown)', globals(), locals()) - else: - _main(args, unknown) - - -if __name__ == '__main__': - main(sys.argv) +# Once we've set up the system path, run the spack main method +import spack.main # noqa +sys.exit(spack.main.main()) diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 73963b848c..27283d10a9 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -217,5 +217,5 @@ __all__ += [ # Add default values for attributes that would otherwise be modified from # Spack main script -debug = True +debug = False spack_working_dir = None diff --git a/lib/spack/spack/cmd/activate.py b/lib/spack/spack/cmd/activate.py index f21799753b..f7e826efd6 100644 --- a/lib/spack/spack/cmd/activate.py +++ b/lib/spack/spack/cmd/activate.py @@ -28,6 +28,8 @@ import spack import spack.cmd description = "activate a package extension" +section = "extensions" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/arch.py b/lib/spack/spack/cmd/arch.py index 1079e7f215..d4241dcae9 100644 --- a/lib/spack/spack/cmd/arch.py +++ b/lib/spack/spack/cmd/arch.py @@ -27,6 +27,8 @@ from __future__ import print_function import spack.architecture as architecture description = "print architecture information about this machine" +section = "system" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index a804086a38..b6daf4f09b 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -33,6 +33,8 @@ from spack.util.executable import ProcessError, which _SPACK_UPSTREAM = 'https://github.com/llnl/spack' description = "create a new installation of spack in another prefix" +section = "admin" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 877f2ce0cf..cc63c6593b 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -27,6 +27,9 @@ import spack.cmd.configure as cfg from spack import * description = 'stops at build stage when installing a package, if possible' +section = "build" +level = "long" + build_system_to_phase = { AutotoolsPackage: 'build', diff --git a/lib/spack/spack/cmd/cd.py b/lib/spack/spack/cmd/cd.py index 784ad4ac83..531f3c59fd 100644 --- a/lib/spack/spack/cmd/cd.py +++ b/lib/spack/spack/cmd/cd.py @@ -26,6 +26,8 @@ import spack.cmd.location import spack.modules description = "cd to spack directories in the shell" +section = "environment" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index fda9beed27..d8a17fd383 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -36,6 +36,8 @@ from spack.util.naming import * from spack.version import * description = "checksum available versions of a package" +section = "packaging" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py index 6c70b5bd38..23507822ef 100644 --- a/lib/spack/spack/cmd/clean.py +++ b/lib/spack/spack/cmd/clean.py @@ -30,6 +30,8 @@ import spack import spack.cmd description = "remove build stage and source tarball for packages" +section = "build" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 6067d44c5e..f2eeca20ab 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -39,6 +39,8 @@ from spack.spec import CompilerSpec, ArchSpec from spack.util.environment import get_path description = "manage compilers" +section = "system" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/compilers.py b/lib/spack/spack/cmd/compilers.py index 934fc6cf06..f0e21f987e 100644 --- a/lib/spack/spack/cmd/compilers.py +++ b/lib/spack/spack/cmd/compilers.py @@ -25,7 +25,9 @@ import spack from spack.cmd.compiler import compiler_list -description = "list available compilers, same as 'spack compiler list'" +description = "list available compilers" +section = "system" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index a647e3ed6e..61c2c6f0e8 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -25,6 +25,8 @@ import spack.config description = "get and set configuration options" +section = "config" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 7f6c07c34b..7cab566052 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -30,7 +30,9 @@ import spack.cmd.install as inst from spack import * -description = 'stops at configuration stage when installing a package, if possible' # NOQA: ignore=E501 +description = 'stage and configure a package but do not install' +section = "build" +level = "long" build_system_to_phase = { diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index adaf388387..89ba050a53 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -40,6 +40,9 @@ from spack.util.naming import * from spack.url import * description = "create a new package file" +section = "packaging" +level = "short" + package_template = '''\ ############################################################################## diff --git a/lib/spack/spack/cmd/deactivate.py b/lib/spack/spack/cmd/deactivate.py index 7ea2039236..3d8020d064 100644 --- a/lib/spack/spack/cmd/deactivate.py +++ b/lib/spack/spack/cmd/deactivate.py @@ -31,6 +31,8 @@ import spack.store from spack.graph import topological_sort description = "deactivate a package extension" +section = "extensions" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/debug.py b/lib/spack/spack/cmd/debug.py index 06dea9ea70..ba5f783839 100644 --- a/lib/spack/spack/cmd/debug.py +++ b/lib/spack/spack/cmd/debug.py @@ -34,6 +34,8 @@ import spack from spack.util.executable import which description = "debugging commands for troubleshooting Spack" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index c752ffb943..6c481548d3 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -31,6 +31,8 @@ import spack.store import spack.cmd description = "show installed packages that depend on another" +section = "basic" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/diy.py b/lib/spack/spack/cmd/diy.py index c67e189f73..14d28bb3f4 100644 --- a/lib/spack/spack/cmd/diy.py +++ b/lib/spack/spack/cmd/diy.py @@ -34,6 +34,8 @@ import spack.cmd.common.arguments as arguments from spack.stage import DIYStage description = "do-it-yourself: build from an existing source directory" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/doc.py b/lib/spack/spack/cmd/doc.py deleted file mode 100644 index 12ae6b4973..0000000000 --- a/lib/spack/spack/cmd/doc.py +++ /dev/null @@ -1,34 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 -############################################################################## - -description = "run pydoc from within spack" - - -def setup_parser(subparser): - subparser.add_argument('entity', help="run pydoc help on entity") - - -def doc(parser, args): - help(args.entity) diff --git a/lib/spack/spack/cmd/docs.py b/lib/spack/spack/cmd/docs.py new file mode 100644 index 0000000000..fe026da4a7 --- /dev/null +++ b/lib/spack/spack/cmd/docs.py @@ -0,0 +1,33 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import webbrowser + +description = 'open spack documentation in a web browser' +section = 'help' +level = 'short' + + +def docs(parser, args): + webbrowser.open('https://spack.readthedocs.io') diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py index 01f2b61887..0287b8cd67 100644 --- a/lib/spack/spack/cmd/edit.py +++ b/lib/spack/spack/cmd/edit.py @@ -33,6 +33,8 @@ from spack.spec import Spec from spack.repository import Repo description = "open package files in $EDITOR" +section = "packaging" +level = "short" def edit_package(name, repo_path, namespace): diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index ed18940ac0..034b710b85 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -31,7 +31,9 @@ import llnl.util.tty as tty import spack.cmd import spack.build_environment as build_env -description = "run a command with the install environment for a spec" +description = "show install environment for a spec, and run commands" +section = "build" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py index 94a3e8288f..d073d42cc3 100644 --- a/lib/spack/spack/cmd/extensions.py +++ b/lib/spack/spack/cmd/extensions.py @@ -33,6 +33,8 @@ import spack.cmd.find import spack.store description = "list extensions for package" +section = "extensions" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py index 35cc23a963..cf39d4a40b 100644 --- a/lib/spack/spack/cmd/fetch.py +++ b/lib/spack/spack/cmd/fetch.py @@ -28,6 +28,8 @@ import spack import spack.cmd description = "fetch archives for packages" +section = "build" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index 3a6d8270fb..0142155fe1 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -29,7 +29,9 @@ import spack.cmd.common.arguments as arguments from spack.cmd import display_specs -description = "find installed spack packages" +description = "list and search installed packages" +section = "basic" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 42d36a3beb..9753b20e78 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -36,7 +36,11 @@ from llnl.util.filesystem import * import spack from spack.util.executable import * + description = "runs source code style checks on Spack. requires flake8" +section = "developer" +level = "long" + """List of directories to exclude from checks.""" exclude_directories = [spack.external_path] diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py index ee401d8fb7..3a82f39ce5 100644 --- a/lib/spack/spack/cmd/graph.py +++ b/lib/spack/spack/cmd/graph.py @@ -34,6 +34,8 @@ from spack.spec import * from spack.graph import * description = "generate graphs of package dependency relationships" +section = "basic" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/help.py b/lib/spack/spack/cmd/help.py index e867ca1295..313b082e2f 100644 --- a/lib/spack/spack/cmd/help.py +++ b/lib/spack/spack/cmd/help.py @@ -22,16 +22,100 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import sys +from llnl.util.tty import colorize + description = "get help on spack and its commands" +section = "help" +level = "short" + +# +# These are longer guides on particular aspects of Spack. Currently there +# is only one on spec syntax. +# +spec_guide = """\ +spec expression syntax: + + package [constraints] [^dependency [constraints] ...] + + package any package from 'spack list' + + constraints: + versions: + @c{@version} single version + @c{@min:max} version range (inclusive) + @c{@min:} version or higher + @c{@:max} up to version (inclusive) + + compilers: + @g{%compiler} build with + @g{%compiler@version} build with specific compiler version + @g{%compiler@min:max} specific version range (see above) + + variants: + @B{+variant} enable + @r{-variant} or @r{~variant} disable + @B{variant=value} set non-boolean to + @B{variant=value1,value2,value3} set multi-value values + + architecture variants: + @m{target=target} specific processor + @m{os=operating_system} specific + @m{platform=platform} linux, darwin, cray, bgq, etc. + @m{arch=platform-os-target} shortcut for all three above + + cross-compiling: + @m{os=backend} or @m{os=be} build for compute node (backend) + @m{os=frontend} or @m{os=fe} build for login node (frontend) + + dependencies: + ^dependency [constraints] specify constraints on dependencies + + examples: + hdf5 any hdf5 configuration + hdf5 @c{@1.10.1} hdf5 version 1.10.1 + hdf5 @c{@1.8:} hdf5 1.8 or higher + hdf5 @c{@1.8:} @g{%gcc} hdf5 1.8 or higher built with gcc + hdf5 @B{+mpi} hdf5 with mpi enabled + hdf5 @r{~mpi} hdf5 with mpi disabled + hdf5 @B{+mpi} ^mpich hdf5 with mpi, using mpich + hdf5 @B{+mpi} ^openmpi@c{@1.7} hdf5 wtih mpi, using openmpi 1.7 + boxlib @B{dim=2} boxlib built for 2 dimensions + libdwarf @g{%intel} ^libelf@g{%gcc} + libdwarf, built with intel compiler, linked to libelf built with gcc + mvapich2 @g{%pgi} @B{fabrics=psm,mrail,sock} + mvapich2, built with pgi compiler, with support for multiple fabrics +""" + + +guides = { + 'spec': spec_guide, +} def setup_parser(subparser): - subparser.add_argument('help_command', nargs='?', default=None, - help='command to get help on') + help_cmd_group = subparser.add_mutually_exclusive_group() + help_cmd_group.add_argument('help_command', nargs='?', default=None, + help='command to get help on') + + help_all_group = subparser.add_mutually_exclusive_group() + help_all_group.add_argument( + '-a', '--all', action='store_const', const='long', default='short', + help='print all available commands') + + help_spec_group = subparser.add_mutually_exclusive_group() + help_spec_group.add_argument( + '--spec', action='store_const', dest='guide', const='spec', + default=None, help='print all available commands') def help(parser, args): + if args.guide: + print(colorize(guides[args.guide])) + return 0 + if args.help_command: + parser.add_command(args.help_command) parser.parse_args([args.help_command, '-h']) else: - parser.print_help() + sys.stdout.write(parser.format_help(level=args.all)) diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 86ec839b90..62de5484af 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -31,6 +31,8 @@ import spack import spack.fetch_strategy as fs description = "get detailed information on a particular package" +section = "basic" +level = "short" def padder(str_list, extra=0): diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index fb01fc2d5e..87fad76181 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -41,6 +41,8 @@ from spack.fetch_strategy import FetchError from spack.package import PackageBase description = "build and install packages" +section = "build" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index bcfb092945..72be99d260 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -35,7 +35,10 @@ import llnl.util.tty as tty import spack from llnl.util.tty.colify import colify -description = "print available spack packages to stdout in different formats" +description = "list and search available packages" +section = "basic" +level = "short" + formatters = {} diff --git a/lib/spack/spack/cmd/load.py b/lib/spack/spack/cmd/load.py index cdc3a741ae..106a95c9c2 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -25,7 +25,9 @@ import argparse import spack.modules -description = "add package to environment using modules" +description = "add package to environment using `module load`" +section = "environment" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/location.py b/lib/spack/spack/cmd/location.py index d1a7825630..e713d028d2 100644 --- a/lib/spack/spack/cmd/location.py +++ b/lib/spack/spack/cmd/location.py @@ -31,6 +31,8 @@ import spack import spack.cmd description = "print out locations of various directories used by Spack" +section = "environment" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/md5.py b/lib/spack/spack/cmd/md5.py index fc205cc693..1d121f0120 100644 --- a/lib/spack/spack/cmd/md5.py +++ b/lib/spack/spack/cmd/md5.py @@ -32,6 +32,8 @@ import spack.util.crypto from spack.stage import Stage, FailedDownloadError description = "calculate md5 checksums for files/urls" +section = "packaging" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index 528fcbfc3f..e5b3b492b4 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -38,6 +38,8 @@ from spack.error import SpackError from spack.util.spack_yaml import syaml_dict description = "manage mirrors" +section = "config" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py index 37c79a358b..f8253aad6f 100644 --- a/lib/spack/spack/cmd/module.py +++ b/lib/spack/spack/cmd/module.py @@ -36,6 +36,9 @@ from spack.cmd.common import arguments from spack.modules import module_types description = "manipulate module files" +section = "environment" +level = "short" + # Dictionary that will be populated with the list of sub-commands # Each sub-command must be callable and accept 3 arguments : diff --git a/lib/spack/spack/cmd/patch.py b/lib/spack/spack/cmd/patch.py index 2e332554ad..dfe45b0494 100644 --- a/lib/spack/spack/cmd/patch.py +++ b/lib/spack/spack/cmd/patch.py @@ -30,6 +30,8 @@ import spack description = "patch expanded archive sources in preparation for install" +section = "build" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index 12dcb81792..aca69e9c99 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -34,6 +34,8 @@ import spack from spack.util.executable import * description = "query packages associated with particular git revisions" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/providers.py b/lib/spack/spack/cmd/providers.py index 470e3e5ed2..f30c28a951 100644 --- a/lib/spack/spack/cmd/providers.py +++ b/lib/spack/spack/cmd/providers.py @@ -30,6 +30,8 @@ import spack import spack.cmd description = "list packages that provide a particular virtual package" +section = "basic" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/purge.py b/lib/spack/spack/cmd/purge.py index 56165d5d97..b7ebb0fc69 100644 --- a/lib/spack/spack/cmd/purge.py +++ b/lib/spack/spack/cmd/purge.py @@ -26,6 +26,8 @@ import spack import spack.stage as stage description = "remove temporary build files and/or downloaded archives" +section = "admin" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/pydoc.py b/lib/spack/spack/cmd/pydoc.py new file mode 100644 index 0000000000..c9003184c4 --- /dev/null +++ b/lib/spack/spack/cmd/pydoc.py @@ -0,0 +1,36 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## + +description = "run pydoc from within spack" +section = "developer" +level = "long" + + +def setup_parser(subparser): + subparser.add_argument('entity', help="run pydoc help on entity") + + +def pydoc(parser, args): + help(args.entity) diff --git a/lib/spack/spack/cmd/python.py b/lib/spack/spack/cmd/python.py index 6df9507580..3c4fbf9e87 100644 --- a/lib/spack/spack/cmd/python.py +++ b/lib/spack/spack/cmd/python.py @@ -32,6 +32,8 @@ import spack description = "launch an interpreter as spack would launch a command" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/reindex.py b/lib/spack/spack/cmd/reindex.py index 0bbd85069f..dff127bc06 100644 --- a/lib/spack/spack/cmd/reindex.py +++ b/lib/spack/spack/cmd/reindex.py @@ -26,6 +26,9 @@ import spack import spack.store description = "rebuild Spack's package database" +section = "admin" +level = "long" + def reindex(parser, args): spack.store.db.reindex(spack.store.layout) diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py index dd75f148c2..5beb0083e2 100644 --- a/lib/spack/spack/cmd/repo.py +++ b/lib/spack/spack/cmd/repo.py @@ -33,6 +33,8 @@ import spack.config from spack.repository import * description = "manage package source repositories" +section = "config" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/restage.py b/lib/spack/spack/cmd/restage.py index 36fee9237b..4cecf4b42e 100644 --- a/lib/spack/spack/cmd/restage.py +++ b/lib/spack/spack/cmd/restage.py @@ -30,6 +30,8 @@ import spack import spack.cmd description = "revert checked out package source code" +section = "build" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/setup.py b/lib/spack/spack/cmd/setup.py index 82d00f4e11..79e7bca1ab 100644 --- a/lib/spack/spack/cmd/setup.py +++ b/lib/spack/spack/cmd/setup.py @@ -39,6 +39,8 @@ from spack import which from spack.stage import DIYStage description = "create a configuration script and module, but don't build" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index 2e917d2ee3..f4105900cb 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -29,7 +29,9 @@ import spack import spack.cmd import spack.cmd.common.arguments as arguments -description = "print out abstract and concrete versions of a spec" +description = "show what would be installed, given a spec" +section = "build" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/stage.py b/lib/spack/spack/cmd/stage.py index e0023b7254..a469cd896d 100644 --- a/lib/spack/spack/cmd/stage.py +++ b/lib/spack/spack/cmd/stage.py @@ -29,6 +29,8 @@ import spack import spack.cmd description = "expand downloaded archive in preparation for install" +section = "build" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py index 9384e3a9e6..f7ec6a10e0 100644 --- a/lib/spack/spack/cmd/test.py +++ b/lib/spack/spack/cmd/test.py @@ -36,7 +36,9 @@ from llnl.util.tty.colify import colify import spack -description = "a thin wrapper around the pytest command" +description = "run spack's unit tests" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index f3eaddf88a..6880409c56 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -33,7 +33,9 @@ import spack.repository from llnl.util import tty -description = "remove an installed package" +description = "remove installed packages" +section = "build" +level = "short" error_message = """You can either: a) use a more specific spec, or diff --git a/lib/spack/spack/cmd/unload.py b/lib/spack/spack/cmd/unload.py index 5da6f5daa5..8a0511f64c 100644 --- a/lib/spack/spack/cmd/unload.py +++ b/lib/spack/spack/cmd/unload.py @@ -25,7 +25,9 @@ import argparse import spack.modules -description = "remove package from environment using module" +description = "remove package from environment using `module unload`" +section = "environment" +level = "short" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/unuse.py b/lib/spack/spack/cmd/unuse.py index e479749457..77312d1204 100644 --- a/lib/spack/spack/cmd/unuse.py +++ b/lib/spack/spack/cmd/unuse.py @@ -26,6 +26,8 @@ import argparse import spack.modules description = "remove package from environment using dotkit" +section = "environment" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py index e5cfce0de3..28118a178a 100644 --- a/lib/spack/spack/cmd/url.py +++ b/lib/spack/spack/cmd/url.py @@ -34,6 +34,8 @@ from spack.util.web import find_versions_of_archive from spack.util.naming import simplify_name description = "debugging tool for url parsing" +section = "developer" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/use.py b/lib/spack/spack/cmd/use.py index c9714d9de0..e67de3a8b3 100644 --- a/lib/spack/spack/cmd/use.py +++ b/lib/spack/spack/cmd/use.py @@ -26,6 +26,8 @@ import argparse import spack.modules description = "add package to environment using dotkit" +section = "environment" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py index a6f6805fb0..446f0a876d 100644 --- a/lib/spack/spack/cmd/versions.py +++ b/lib/spack/spack/cmd/versions.py @@ -29,6 +29,8 @@ import llnl.util.tty as tty import spack description = "list available versions of a package" +section = "packaging" +level = "long" def setup_parser(subparser): diff --git a/lib/spack/spack/cmd/view.py b/lib/spack/spack/cmd/view.py index 72e139d123..8fb94d3f37 100644 --- a/lib/spack/spack/cmd/view.py +++ b/lib/spack/spack/cmd/view.py @@ -69,7 +69,9 @@ import spack import spack.cmd import llnl.util.tty as tty -description = "produce a single-rooted directory view of a spec" +description = "produce a single-rooted directory view of packages" +section = "environment" +level = "short" def setup_parser(sp): diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py new file mode 100644 index 0000000000..39c64b3ce0 --- /dev/null +++ b/lib/spack/spack/main.py @@ -0,0 +1,468 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## +"""This is the implementation of the Spack command line executable. + +In a normal Spack installation, this is invoked from the bin/spack script +after the system path is set up. +""" +from __future__ import print_function + +import sys +import os +import inspect +from argparse import _ArgumentGroup, ArgumentParser, RawTextHelpFormatter +import pstats + +import llnl.util.tty as tty +from llnl.util.tty.color import * + +import spack +import spack.cmd +from spack.error import SpackError + + +# names of profile statistics +stat_names = pstats.Stats.sort_arg_dict_default + +# help levels in order of detail (i.e., number of commands shown) +levels = ['short', 'long'] + +# intro text for help at different levels +intro_by_level = { + 'short': 'These are common spack commands:', + 'long': 'Complete list of spack commands:', +} + +# control top-level spack options shown in basic vs. advanced help +options_by_level = { + 'short': 'hkV', + 'long': 'all' +} + +# Longer text for each section, to show in help +section_descriptions = { + 'admin': 'administration', + 'basic': 'query packages', + 'build': 'build packages', + 'config': 'configuration', + 'developer': 'developer', + 'environment': 'environment', + 'extensions': 'extensions', + 'help': 'more help', + 'packaging': 'create packages', + 'system': 'system', +} + +# preferential command order for some sections (e.g., build pipeline is +# in execution order, not alphabetical) +section_order = { + 'basic': ['list', 'info', 'find'], + 'build': ['fetch', 'stage', 'patch', 'configure', 'build', 'restage', + 'install', 'uninstall', 'clean'] +} + +# Properties that commands are required to set. +required_command_properties = ['level', 'section', 'description'] + + +def set_working_dir(): + """Change the working directory to getcwd, or spack prefix if no cwd.""" + try: + spack.spack_working_dir = os.getcwd() + except OSError: + os.chdir(spack_prefix) + spack.spack_working_dir = spack_prefix + + +def add_all_commands(parser): + """Add all spack subcommands to the parser.""" + for cmd in spack.cmd.commands: + parser.add_command(cmd) + + +def index_commands(): + """create an index of commands by section for this help level""" + index = {} + for command in spack.cmd.commands: + cmd_module = spack.cmd.get_module(command) + + # make sure command modules have required properties + for p in required_command_properties: + prop = getattr(cmd_module, p, None) + if not prop: + tty.die("Command doesn't define a property '%s': %s" + % (p, command)) + + # add commands to lists for their level and higher levels + for level in reversed(levels): + level_sections = index.setdefault(level, {}) + commands = level_sections.setdefault(cmd_module.section, []) + commands.append(command) + if level == cmd_module.level: + break + + return index + + +class SpackArgumentParser(ArgumentParser): + def format_help_sections(self, level): + """Format help on sections for a particular verbosity level. + + Args: + level (str): 'short' or 'long' (more commands shown for long) + """ + if level not in levels: + raise ValueError("level must be one of: %s" % levels) + + # lazily add all commands to the parser when needed. + add_all_commands(self) + + """Print help on subcommands in neatly formatted sections.""" + formatter = self._get_formatter() + + # Create a list of subcommand actions. Argparse internals are nasty! + # Note: you can only call _get_subactions() once. Even nastier! + if not hasattr(self, 'actions'): + self.actions = self._subparsers._actions[-1]._get_subactions() + + # make a set of commands not yet added. + remaining = set(spack.cmd.commands) + + def add_group(group): + formatter.start_section(group.title) + formatter.add_text(group.description) + formatter.add_arguments(group._group_actions) + formatter.end_section() + + def add_subcommand_group(title, commands): + """Add informational help group for a specific subcommand set.""" + cmd_set = set(commands) + + # make a dict of commands of interest + cmds = dict((action.metavar, action) for action in self.actions + if action.metavar in cmd_set) + + # add commands to a group in order, and add the group + group = _ArgumentGroup(self, title=title) + for name in commands: + group._add_action(cmds[name]) + if name in remaining: + remaining.remove(name) + add_group(group) + + # select only the options for the particular level we're showing. + show_options = options_by_level[level] + if show_options != 'all': + opts = dict((opt.option_strings[0].strip('-'), opt) + for opt in self._optionals._group_actions) + + new_actions = [opts[letter] for letter in show_options] + self._optionals._group_actions = new_actions + + options = ''.join(opt.option_strings[0].strip('-') + for opt in self._optionals._group_actions) + + index = index_commands() + + # usage + formatter.add_text( + "usage: %s [-%s] [...]" % (self.prog, options)) + + # description + formatter.add_text(self.description) + + # start subcommands + formatter.add_text(intro_by_level[level]) + + # add argument groups based on metadata in commands + sections = index[level] + for section in sorted(sections): + if section == 'help': + continue # Cover help in the epilog. + + group_description = section_descriptions.get(section, section) + + to_display = sections[section] + commands = [] + + # add commands whose order we care about first. + if section in section_order: + commands.extend(cmd for cmd in section_order[section] + if cmd in to_display) + + # add rest in alphabetical order. + commands.extend(cmd for cmd in sorted(sections[section]) + if cmd not in commands) + + # add the group to the parser + add_subcommand_group(group_description, commands) + + # optionals + add_group(self._optionals) + + # epilog + formatter.add_text("""\ +{help}: + spack help -a list all available commands + spack help help on a specific command + spack help --spec help on the spec syntax + spack docs open http://spack.rtfd.io/ in a browser""" +.format(help=section_descriptions['help'])) + + # determine help from format above + return formatter.format_help() + + def add_command(self, name): + """Add one subcommand to this parser.""" + # lazily initialize any subparsers + if not hasattr(self, 'subparsers'): + # remove the dummy "command" argument. + self._remove_action(self._actions[-1]) + self.subparsers = self.add_subparsers(metavar='COMMAND', + dest="command") + + # each command module implements a parser() function, to which we + # pass its subparser for setup. + module = spack.cmd.get_module(name) + cmd_name = name.replace('_', '-') + subparser = self.subparsers.add_parser( + cmd_name, help=module.description, description=module.description) + module.setup_parser(subparser) + return module + + def format_help(self, level='short'): + if self.prog == 'spack': + # use format_help_sections for the main spack parser, but not + # for subparsers + return self.format_help_sections(level) + else: + # in subparsers, self.prog is, e.g., 'spack install' + return super(SpackArgumentParser, self).format_help() + + +def make_argument_parser(): + """Create an basic argument parser without any subcommands added.""" + parser = SpackArgumentParser( + formatter_class=RawTextHelpFormatter, add_help=False, + description=( + "A flexible package manager that supports multiple versions,\n" + "configurations, platforms, and compilers.")) + + # stat names in groups of 7, for nice wrapping. + stat_lines = list(zip(*(iter(stat_names),) * 7)) + + parser.add_argument('-h', '--help', action='store_true', + help="show this help message and exit") + parser.add_argument('-d', '--debug', action='store_true', + help="write out debug logs during compile") + parser.add_argument('-D', '--pdb', action='store_true', + help="run spack under the pdb debugger") + parser.add_argument('-k', '--insecure', action='store_true', + help="do not check ssl certificates when downloading") + parser.add_argument('-m', '--mock', action='store_true', + help="use mock packages instead of real ones") + parser.add_argument('-p', '--profile', action='store_true', + help="profile execution using cProfile") + parser.add_argument('-P', '--sorted-profile', default=None, metavar="STAT", + help="profile and sort by one or more of:\n[%s]" % + ',\n '.join([', '.join(line) for line in stat_lines])) + parser.add_argument('--lines', default=20, action='store', + help="lines of profile output; default 20; or 'all'") + parser.add_argument('-v', '--verbose', action='store_true', + help="print additional output during builds") + parser.add_argument('-s', '--stacktrace', action='store_true', + help="add stacktraces to all printed statements") + parser.add_argument('-V', '--version', action='store_true', + help='show version number and exit') + return parser + + +def setup_main_options(args): + """Configure spack globals based on the basic options.""" + # Set up environment based on args. + tty.set_verbose(args.verbose) + tty.set_debug(args.debug) + tty.set_stacktrace(args.stacktrace) + spack.debug = args.debug + + if spack.debug: + import spack.util.debug as debug + debug.register_interrupt_handler() + + if args.mock: + from spack.repository import RepoPath + spack.repo.swap(RepoPath(spack.mock_packages_path)) + + # If the user asked for it, don't check ssl certs. + if args.insecure: + tty.warn("You asked for --insecure. Will NOT check SSL certificates.") + spack.insecure = True + + +def allows_unknown_args(command): + """This is a basic argument injection test. + + Commands may add an optional argument called "unknown args" to + indicate they can handle unknonwn args, and we'll pass the unknown + args in. + """ + info = dict(inspect.getmembers(command)) + varnames = info['__code__'].co_varnames + argcount = info['__code__'].co_argcount + return (argcount == 3 and varnames[2] == 'unknown_args') + + +def _main(command, parser, args, unknown_args): + # many operations will fail without a working directory. + set_working_dir() + + # only setup main options in here, after the real parse (we'll get it + # wrong if we do it after the initial, partial parse) + setup_main_options(args) + spack.hooks.pre_run() + + # Now actually execute the command + try: + if allows_unknown_args(command): + return_val = command(parser, args, unknown_args) + else: + if unknown_args: + tty.die('unrecognized arguments: %s' % ' '.join(unknown_args)) + return_val = command(parser, args) + except SpackError as e: + e.die() # gracefully die on any SpackErrors + except Exception as e: + if spack.debug: + raise + tty.die(str(e)) + except KeyboardInterrupt: + sys.stderr.write('\n') + tty.die("Keyboard interrupt.") + + # Allow commands to return and error code if they want + return 0 if return_val is None else return_val + + +def _profile_wrapper(command, parser, args, unknown_args): + import cProfile + + try: + nlines = int(args.lines) + except ValueError: + if args.lines != 'all': + tty.die('Invalid number for --lines: %s' % args.lines) + nlines = -1 + + # allow comma-separated list of fields + sortby = ['time'] + if args.sorted_profile: + sortby = args.sorted_profile.split(',') + for stat in sortby: + if stat not in stat_names: + tty.die("Invalid sort field: %s" % stat) + + try: + # make a profiler and run the code. + pr = cProfile.Profile() + pr.enable() + return _main(command, parser, args, unknown_args) + + finally: + pr.disable() + + # print out profile stats. + stats = pstats.Stats(pr) + stats.sort_stats(*sortby) + stats.print_stats(nlines) + + +def main(argv=None): + """This is the entry point for the Spack command. + + Args: + argv (list of str or None): command line arguments, NOT including + the executable name. If None, parses from sys.argv. + """ + # Create a parser with a simple positional argument first. We'll + # lazily load the subcommand(s) we need later. This allows us to + # avoid loading all the modules from spack.cmd when we don't need + # them, which reduces startup latency. + parser = make_argument_parser() + parser.add_argument( + 'command', metavar='COMMAND', nargs='?', action='store') + args, unknown = parser.parse_known_args(argv) + + # Just print help and exit if run with no arguments at all + no_args = (len(sys.argv) == 1) if argv is None else (len(argv) == 0) + if no_args: + parser.print_help() + return 1 + + # -h and -V are special as they do not require a command, but all the + # other options do nothing without a command. + if not args.command: + if args.version: + print(spack.spack_version) + return 0 + else: + parser.print_help() + return 0 if args.help else 1 + + # Try to load the particular command the caller asked for. If there + # is no module for it, just die. + command_name = args.command.replace('-', '_') + try: + parser.add_command(command_name) + except ImportError: + if spack.debug: + raise + tty.die("Unknown command: %s" % args.command) + + # Re-parse with the proper sub-parser added. + args, unknown = parser.parse_known_args() + + # we now know whether options go with spack or the command + if args.version: + print(spack.spack_version) + return 0 + elif args.help: + parser.print_help() + return 0 + + # now we can actually execute the command. + command = spack.cmd.get_command(command_name) + try: + if args.profile or args.sorted_profile: + _profile_wrapper(command, parser, args, unknown) + elif args.pdb: + import pdb + pdb.runctx('_main(command, parser, args, unknown)', + globals(), locals()) + return 0 + else: + return _main(command, parser, args, unknown) + + except SystemExit as e: + return e.code diff --git a/share/spack/qa/run-unit-tests b/share/spack/qa/run-unit-tests index fe2ec6f54a..87203ba915 100755 --- a/share/spack/qa/run-unit-tests +++ b/share/spack/qa/run-unit-tests @@ -20,6 +20,10 @@ cd "$SPACK_ROOT" # Print compiler information spack config get compilers +# Run spack help to cover command import +${coverage_run} bin/spack -h +${coverage_run} bin/spack help -a + # Profile and print top 20 lines for a simple call to spack spec ${coverage_run} bin/spack -p --lines 20 spec mpileaks -- cgit v1.2.3-70-g09d2 From 3efa9bd29678c884df9f9ff8c97416741f01fde1 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 8 May 2017 22:24:37 +0200 Subject: spec_syntax: added xfailing tests for cases in #4144 (#4151) It seems that parse_anonymous_spec may fail if more than one part (variant, version range, etc.) is given to the function. Added tests to code against to fix the problem in #4144. --- lib/spack/spack/test/spec_syntax.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index dfad4a019f..2ee9ef486c 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -138,6 +138,13 @@ class TestSpecSyntax(object): self.check_parse("^zlib") self.check_parse("+foo") self.check_parse("arch=test-None-None", "platform=test") + self.check_parse('@2.7:') + + @pytest.mark.xfail() + def test_anonymous_specs_with_multiple_parts(self): + # Parse anonymous spec with multiple tokens + self.check_parse('languages=go @4.2:') + self.check_parse('@4.2: languages=go') def test_simple_dependence(self): self.check_parse("openmpi^hwloc") @@ -539,3 +546,22 @@ class TestSpecSyntax(object): "mvapich_foo debug= 4 " "^ _openmpi @1.2 : 1.4 , 1.6 % intel @ 12.1 : 12.6 + debug - qt_4 " "^ stackwalker @ 8.1_1e") + + +@pytest.mark.parametrize('spec,anon_spec,spec_name', [ + ('openmpi languages=go', 'languages=go', 'openmpi'), + ('openmpi @4.6:', '@4.6:', 'openmpi'), + pytest.mark.xfail( + ('openmpi languages=go @4.6:', 'languages=go @4.6:', 'openmpi') + ), + pytest.mark.xfail( + ('openmpi @4.6: languages=go', '@4.6: languages=go', 'openmpi') + ), +]) +def test_parse_anonymous_specs(spec, anon_spec, spec_name): + + expected = parse(spec) + spec = parse_anonymous_spec(anon_spec, spec_name) + + assert len(expected) == 1 + assert spec in expected -- cgit v1.2.3-70-g09d2 From 306f158c733801cda6eacf74e3349b510cf90867 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 5 May 2017 18:24:04 +0200 Subject: cp2k: fixed compilation issues for intel stack Added DFLAGS to the `make.inc` file being written. These macros are also added to the language specific variables like CFLAGS, CXXFLAGS and FCFLAGS. Changed `spec.satisfies('foo')` with `'foo' in spec` in `intel-mkl`, see #4135. Added a basic build interface to `intel-mpi`. --- lib/spack/spack/file_cache.py | 2 +- var/spack/repos/builtin/packages/cp2k/package.py | 71 +++++++++++++++++----- .../repos/builtin/packages/intel-mkl/package.py | 22 ++++--- .../repos/builtin/packages/intel-mpi/package.py | 12 ++++ 4 files changed, 82 insertions(+), 25 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/file_cache.py b/lib/spack/spack/file_cache.py index e37f77d68d..95a8bc7ce6 100644 --- a/lib/spack/spack/file_cache.py +++ b/lib/spack/spack/file_cache.py @@ -149,7 +149,7 @@ class FileCache(object): if value: # remove tmp on exception & raise it shutil.rmtree(cm.tmp_filename, True) - raise value + else: os.rename(cm.tmp_filename, cm.orig_filename) diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 06e4697904..00d6052121 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -50,7 +50,7 @@ class Cp2k(Package): depends_on('fftw') depends_on('libint@:1.2', when='@3.0,4.1') - depends_on('mpi', when='+mpi') + depends_on('mpi@2:', when='+mpi') depends_on('scalapack', when='+mpi') depends_on('plumed+shared+mpi', when='+plumed+mpi') depends_on('plumed+shared~mpi', when='+plumed~mpi') @@ -80,32 +80,56 @@ class Cp2k(Package): optflags = { 'gcc': ['-O2', '-ffast-math', - '-ffree-form', - '-ffree-line-length-none', '-ftree-vectorize', '-funroll-loops', '-mtune=native'], 'intel': ['-O2', '-pc64', - '-unroll', - '-heap-arrays 64'] + '-unroll'] } + + dflags = ['-DNDEBUG'] + cppflags = [ '-D__FFTW3', '-D__LIBINT', spec['fftw'].headers.cpp_flags ] + + if '^mpi@3:' in spec: + cppflags.append('-D__MPI_VERSION=3') + elif '^mpi@2:' in spec: + cppflags.append('-D__MPI_VERSION=2') + + if '^intel-mkl' in spec: + cppflags.append('-D__FFTSG') + + cflags = copy.deepcopy(optflags[self.spec.compiler.name]) + cxxflags = copy.deepcopy(optflags[self.spec.compiler.name]) fcflags = copy.deepcopy(optflags[self.spec.compiler.name]) - fcflags.append(spec['fftw'].headers.cpp_flags) + fcflags.extend([ + '-ffree-form', + '-ffree-line-length-none', + spec['fftw'].headers.cpp_flags + ]) + + if '%intel' in spec: + cflags.append('-fp-model precise') + cxxflags.append('-fp-model precise') + fcflags.extend(['-fp-model source', '-heap-arrays 64']) + fftw = find_libraries('libfftw3', root=spec['fftw'].prefix.lib) ldflags = [fftw.search_flags] + if 'superlu-dist@4.3' in spec: ldflags = ['-Wl,--allow-multiple-definition'] + ldflags + libs = [ join_path(spec['libint'].prefix.lib, 'libint.so'), join_path(spec['libint'].prefix.lib, 'libderiv.so'), join_path(spec['libint'].prefix.lib, 'libr12.so') ] + if '+plumed' in self.spec: # Include Plumed.inc in the Makefile mkf.write('include {0}\n'.format( @@ -116,6 +140,7 @@ class Cp2k(Package): 'Plumed.inc') )) # Add required macro + dflags.extend(['-D__PLUMED2']) cppflags.extend(['-D__PLUMED2']) libs.extend([ join_path(self.spec['plumed'].prefix.lib, @@ -130,18 +155,20 @@ class Cp2k(Package): # ${CPP} .F > .f90 # # and use `-fpp` instead - mkf.write('CPP = # {0.compiler.cc} -P\n'.format(self)) - mkf.write('AR = xiar -r\n') + mkf.write('CPP = # {0.compiler.cc} -P\n\n'.format(self)) + mkf.write('AR = xiar -r\n\n') else: - mkf.write('CPP = {0.compiler.cc} -E\n'.format(self)) - mkf.write('AR = ar -r\n') + mkf.write('CPP = {0.compiler.cc} -E\n\n'.format(self)) + mkf.write('AR = ar -r\n\n') fc = self.compiler.fc if '~mpi' in spec else self.spec['mpi'].mpifc mkf.write('FC = {0}\n'.format(fc)) mkf.write('LD = {0}\n'.format(fc)) # Intel if '%intel' in self.spec: cppflags.extend([ - '-D__INTEL_COMPILER', + '-D__INTEL', + '-D__HAS_ISO_C_BINDING', + '-D__USE_CP2K_TRACE', '-D__MKL' ]) fcflags.extend([ @@ -196,7 +223,7 @@ class Cp2k(Package): libs.append(wannier) libs.extend(scalapack) - libs.extend(self.spec['mpi'].mpicxx_shared_libs) + libs.extend(self.spec['mpi:cxx'].libs) libs.extend(self.compiler.stdcxx_libs) # LAPACK / BLAS lapack = spec['lapack'].libs @@ -205,11 +232,23 @@ class Cp2k(Package): ldflags.append((lapack + blas).search_flags) libs.extend([str(x) for x in (fftw, lapack, blas)]) + dflags.extend(cppflags) + cflags.extend(cppflags) + cxxflags.extend(cppflags) + fcflags.extend(cppflags) + # Write compiler flags to file - mkf.write('CPPFLAGS = {0}\n'.format(' '.join(cppflags))) - mkf.write('FCFLAGS = {0}\n'.format(' '.join(fcflags))) - mkf.write('LDFLAGS = {0}\n'.format(' '.join(ldflags))) - mkf.write('LIBS = {0}\n'.format(' '.join(libs))) + mkf.write('DFLAGS = {0}\n\n'.format(' '.join(dflags))) + mkf.write('CPPFLAGS = {0}\n\n'.format(' '.join(cppflags))) + mkf.write('CFLAGS = {0}\n\n'.format(' '.join(cflags))) + mkf.write('CXXFLAGS = {0}\n\n'.format(' '.join(cxxflags))) + mkf.write('FCFLAGS = {0}\n\n'.format(' '.join(fcflags))) + mkf.write('LDFLAGS = {0}\n\n'.format(' '.join(ldflags))) + if '%intel' in spec: + mkf.write('LDFLAGS_C = {0}\n\n'.format( + ' '.join(ldflags) + ' -nofor_main') + ) + mkf.write('LIBS = {0}\n\n'.format(' '.join(libs))) with working_dir('makefiles'): # Apparently the Makefile bases its paths on PWD diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index 7f0f8e0eb5..bbc50ca424 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -96,19 +96,25 @@ class IntelMkl(IntelInstaller): @property def scalapack_libs(self): libnames = ['libmkl_scalapack'] - if self.spec.satisfies('^openmpi'): + + # Intel MKL does not directly depend on mpi but the scalapack + # interface does and the corresponding BLACS library changes + # depending on the MPI implementation we are using. We need then to + # inspect the root package which asked for Scalapack and check which + # MPI it depends on. + root = self.spec.root + if '^openmpi' in root: libnames.append('libmkl_blacs_openmpi') - elif self.spec.satisfies('^mpich@1'): + elif '^mpich@1' in root: libnames.append('libmkl_blacs') - elif self.spec.satisfies('^mpich@2:'): + elif '^mpich@2:' in root: libnames.append('libmkl_blacs_intelmpi') - elif self.spec.satisfies('^mvapich2'): + elif '^mvapich2' in root: libnames.append('libmkl_blacs_intelmpi') - elif self.spec.satisfies('^mpt'): + elif '^mpt' in root: libnames.append('libmkl_blacs_sgimpt') - # TODO: ^intel-parallel-studio can mean intel mpi, a compiler or a lib - # elif self.spec.satisfies('^intel-parallel-studio'): - # libnames.append('libmkl_blacs_intelmpi') + elif '^intel-mpi' in root: + libnames.append('libmkl_blacs_intelmpi') else: raise InstallError("No MPI found for scalapack") diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py index c4d3df8f74..0336f426be 100644 --- a/var/spack/repos/builtin/packages/intel-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-mpi/package.py @@ -42,6 +42,18 @@ class IntelMpi(IntelInstaller): provides('mpi') + @property + def mpi_libs(self): + query_parameters = self.spec.last_query.extra_parameters + libraries = ['libmpifort', 'libmpi'] + + if 'cxx' in query_parameters: + libraries = ['libmpicxx'] + libraries + + return find_libraries( + libraries, root=self.prefix.lib64, shared=True, recurse=True + ) + def install(self, spec, prefix): self.intel_prefix = prefix IntelInstaller.install(self, spec, prefix) -- cgit v1.2.3-70-g09d2 From f8b3eff01c61adf3a49699ff41649246558a7794 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 11 May 2017 19:29:08 +0200 Subject: filesystem.py: fixed bug introduced in #3367 (scrambled order in output) (#4156) PR #3367 inadvertently changed the semantics of _find_recursive and _find_non_recursive so that the returned list are not ordered as the input search list. This commit restores the original semantic, and adds tests to verify it. --- lib/spack/llnl/util/filesystem.py | 27 ++++++-- .../spack/test/data/directory_search/README.txt | 1 + lib/spack/spack/test/data/directory_search/a/c.h | 0 .../spack/test/data/directory_search/a/libc.a | 0 .../spack/test/data/directory_search/a/libc.dylib | 0 .../spack/test/data/directory_search/a/libc.so | 0 lib/spack/spack/test/data/directory_search/b/b.h | 0 lib/spack/spack/test/data/directory_search/b/d.h | 0 .../spack/test/data/directory_search/b/liba.a | 0 .../spack/test/data/directory_search/b/liba.dylib | 0 .../spack/test/data/directory_search/b/liba.so | 0 .../spack/test/data/directory_search/b/libd.a | 0 .../spack/test/data/directory_search/b/libd.dylib | 0 .../spack/test/data/directory_search/b/libd.so | 0 lib/spack/spack/test/data/directory_search/c/a.h | 0 .../spack/test/data/directory_search/c/libb.a | 0 .../spack/test/data/directory_search/c/libb.dylib | 0 .../spack/test/data/directory_search/c/libb.so | 0 lib/spack/spack/test/file_list.py | 74 +++++++++++++++++++++- 19 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 lib/spack/spack/test/data/directory_search/README.txt create mode 100644 lib/spack/spack/test/data/directory_search/a/c.h create mode 100644 lib/spack/spack/test/data/directory_search/a/libc.a create mode 100644 lib/spack/spack/test/data/directory_search/a/libc.dylib create mode 100644 lib/spack/spack/test/data/directory_search/a/libc.so create mode 100644 lib/spack/spack/test/data/directory_search/b/b.h create mode 100644 lib/spack/spack/test/data/directory_search/b/d.h create mode 100644 lib/spack/spack/test/data/directory_search/b/liba.a create mode 100644 lib/spack/spack/test/data/directory_search/b/liba.dylib create mode 100644 lib/spack/spack/test/data/directory_search/b/liba.so create mode 100644 lib/spack/spack/test/data/directory_search/b/libd.a create mode 100644 lib/spack/spack/test/data/directory_search/b/libd.dylib create mode 100644 lib/spack/spack/test/data/directory_search/b/libd.so create mode 100644 lib/spack/spack/test/data/directory_search/c/a.h create mode 100644 lib/spack/spack/test/data/directory_search/c/libb.a create mode 100644 lib/spack/spack/test/data/directory_search/c/libb.dylib create mode 100644 lib/spack/spack/test/data/directory_search/c/libb.so (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 25dc747499..f7fae7eb44 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -551,26 +551,41 @@ def find(root, files, recurse=True): def _find_recursive(root, search_files): - found_files = [] + + # The variable here is **on purpose** a defaultdict. The idea is that + # we want to poke the filesystem as little as possible, but still maintain + # stability in the order of the answer. Thus we are recording each library + # found in a key, and reconstructing the stable order later. + found_files = collections.defaultdict(list) for path, _, list_files in os.walk(root): for search_file in search_files: for list_file in list_files: if fnmatch.fnmatch(list_file, search_file): - found_files.append(join_path(path, list_file)) + found_files[search_file].append(join_path(path, list_file)) + + answer = [] + for search_file in search_files: + answer.extend(found_files[search_file]) - return found_files + return answer def _find_non_recursive(root, search_files): - found_files = [] + # The variable here is **on purpose** a defaultdict as os.list_dir + # can return files in any order (does not preserve stability) + found_files = collections.defaultdict(list) for list_file in os.listdir(root): for search_file in search_files: if fnmatch.fnmatch(list_file, search_file): - found_files.append(join_path(root, list_file)) + found_files[search_file].append(join_path(root, list_file)) + + answer = [] + for search_file in search_files: + answer.extend(found_files[search_file]) - return found_files + return answer # Utilities for libraries and headers diff --git a/lib/spack/spack/test/data/directory_search/README.txt b/lib/spack/spack/test/data/directory_search/README.txt new file mode 100644 index 0000000000..9c43a4224d --- /dev/null +++ b/lib/spack/spack/test/data/directory_search/README.txt @@ -0,0 +1 @@ +This directory tree is made up to test that search functions wil return a stable ordered sequence. \ No newline at end of file diff --git a/lib/spack/spack/test/data/directory_search/a/c.h b/lib/spack/spack/test/data/directory_search/a/c.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/a/libc.a b/lib/spack/spack/test/data/directory_search/a/libc.a new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/a/libc.dylib b/lib/spack/spack/test/data/directory_search/a/libc.dylib new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/a/libc.so b/lib/spack/spack/test/data/directory_search/a/libc.so new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/b.h b/lib/spack/spack/test/data/directory_search/b/b.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/d.h b/lib/spack/spack/test/data/directory_search/b/d.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/liba.a b/lib/spack/spack/test/data/directory_search/b/liba.a new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/liba.dylib b/lib/spack/spack/test/data/directory_search/b/liba.dylib new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/liba.so b/lib/spack/spack/test/data/directory_search/b/liba.so new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/libd.a b/lib/spack/spack/test/data/directory_search/b/libd.a new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/libd.dylib b/lib/spack/spack/test/data/directory_search/b/libd.dylib new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/b/libd.so b/lib/spack/spack/test/data/directory_search/b/libd.so new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/c/a.h b/lib/spack/spack/test/data/directory_search/c/a.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/c/libb.a b/lib/spack/spack/test/data/directory_search/c/libb.a new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/c/libb.dylib b/lib/spack/spack/test/data/directory_search/c/libb.dylib new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/data/directory_search/c/libb.so b/lib/spack/spack/test/data/directory_search/c/libb.so new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/spack/spack/test/file_list.py b/lib/spack/spack/test/file_list.py index be4334f055..10c86d0d08 100644 --- a/lib/spack/spack/test/file_list.py +++ b/lib/spack/spack/test/file_list.py @@ -23,9 +23,14 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import pytest +import fnmatch +import os +import pytest +import six +import spack from llnl.util.filesystem import LibraryList, HeaderList +from llnl.util.filesystem import find_libraries, find_headers @pytest.fixture() @@ -201,3 +206,70 @@ class TestHeaderList(object): # Always produce an instance of HeaderList assert type(header_list + pylist) == type(header_list) assert type(pylist + header_list) == type(header_list) + + +#: Directory where the data for the test below is stored +search_dir = os.path.join(spack.test_path, 'data', 'directory_search') + + +@pytest.mark.parametrize('search_fn,search_list,root,kwargs', [ + (find_libraries, 'liba', search_dir, {'recurse': True}), + (find_libraries, ['liba'], search_dir, {'recurse': True}), + (find_libraries, 'libb', search_dir, {'recurse': True}), + (find_libraries, ['libc'], search_dir, {'recurse': True}), + (find_libraries, ['libc', 'liba'], search_dir, {'recurse': True}), + (find_libraries, ['liba', 'libc'], search_dir, {'recurse': True}), + (find_libraries, ['libc', 'libb', 'liba'], search_dir, {'recurse': True}), + (find_libraries, ['liba', 'libc'], search_dir, {'recurse': True}), + (find_libraries, + ['libc', 'libb', 'liba'], + search_dir, + {'recurse': True, 'shared': False} + ), + (find_headers, 'a', search_dir, {'recurse': True}), + (find_headers, ['a'], search_dir, {'recurse': True}), + (find_headers, 'b', search_dir, {'recurse': True}), + (find_headers, ['c'], search_dir, {'recurse': True}), + (find_headers, ['c', 'a'], search_dir, {'recurse': True}), + (find_headers, ['a', 'c'], search_dir, {'recurse': True}), + (find_headers, ['c', 'b', 'a'], search_dir, {'recurse': True}), + (find_headers, ['a', 'c'], search_dir, {'recurse': True}), + (find_libraries, + ['liba', 'libd'], + os.path.join(search_dir, 'b'), + {'recurse': False} + ), + (find_headers, + ['b', 'd'], + os.path.join(search_dir, 'b'), + {'recurse': False} + ), +]) +def test_searching_order(search_fn, search_list, root, kwargs): + + # Test search + result = search_fn(search_list, root, **kwargs) + + # The tests are set-up so that something is always found + assert len(result) != 0 + + # Now reverse the result and start discarding things + # as soon as you have matches. In the end the list should + # be emptied. + l = list(reversed(result)) + + # At this point make sure the search list is a sequence + if isinstance(search_list, six.string_types): + search_list = [search_list] + + # Discard entries in the order they appear in search list + for x in search_list: + try: + while fnmatch.fnmatch(l[-1], x) or x in l[-1]: + l.pop() + except IndexError: + # List is empty + pass + + # List should be empty here + assert len(l) == 0 -- cgit v1.2.3-70-g09d2 From e7973dd290edbd7c3fc2a96bfbc4666964646255 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 11 May 2017 19:05:02 -0500 Subject: Fix typo in PythonPackage documentation (#4221) --- lib/spack/spack/build_systems/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 3fae6671f0..c52c529b50 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -75,7 +75,7 @@ class PythonPackage(PackageBase): .. code-block:: console - $ python --no-user-cfg setup.py + $ python setup.py --no-user-cfg Each phase also has a function that can pass arguments to this call. All of these functions are empty except for the ``install_args`` -- cgit v1.2.3-70-g09d2 From 1a6b4afe7f0c382f98534f57a0a859ebc21b3eb8 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 12 May 2017 09:52:01 -0500 Subject: Add helpful error message for uncompressed downloads (#4205) --- lib/spack/spack/mirror.py | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py index c9ed617dc8..1c0618e6e0 100644 --- a/lib/spack/spack/mirror.py +++ b/lib/spack/spack/mirror.py @@ -53,13 +53,33 @@ def mirror_archive_filename(spec, fetcher, resourceId=None): if fetcher.expand_archive: # If we fetch with a URLFetchStrategy, use URL's archive type ext = url.determine_url_file_extension(fetcher.url) - ext = ext or spec.package.versions[spec.package.version].get( - 'extension', None) - ext = ext.lstrip('.') + + # If the filename does not end with a normal suffix, + # see if the package explicitly declares the extension if not ext: - raise MirrorError( - "%s version does not specify an extension" % spec.name + - " and could not parse extension from %s" % fetcher.url) + ext = spec.package.versions[spec.package.version].get( + 'extension', None) + + if ext: + # Remove any leading dots + ext = ext.lstrip('.') + + if not ext: + msg = """\ +Unable to parse extension from {0}. + +If this URL is for a tarball but does not include the file extension +in the name, you can explicitly declare it with the following syntax: + + version('1.2.3', 'hash', extension='tar.gz') + +If this URL is for a download like a .jar or .whl that does not need +to be expanded, or an uncompressed installation script, you can tell +Spack not to expand it with the following syntax: + + version('1.2.3', 'hash', expand=False) +""" + raise MirrorError(msg.format(fetcher.url)) else: # If the archive shouldn't be expanded, don't check extension. ext = None -- cgit v1.2.3-70-g09d2 From b630c06773bb4ba960f8791b756c17a39d049501 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 16 May 2017 16:24:35 -0500 Subject: Sphinx no longer ignores first argument (#4243) * Sphinx no longer ignores first argument * Duplicate first argument for maximum compatibility --- lib/spack/docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index 48f1fda47e..d124848542 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -103,7 +103,7 @@ with open('command_index.rst', 'a') as index: # Without this, the API Docs will never actually update # apidoc_args = [ - 'sphinx_apidoc', # The first arugment is ignored + '--force', # Older versions of Sphinx ignore the first argument '--force', # Overwrite existing files '--no-toc', # Don't create a table of contents file '--output-dir=.', # Directory to place all output -- cgit v1.2.3-70-g09d2 From cafc3cc3ca5c457d6dcf4fafcb0c94ddedead0e7 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 17 May 2017 11:36:02 -0500 Subject: Sphinx no longer supports Python 2.6 (#4266) * Sphinx no longer supports Python 2.6 * Update vendored sphinxcontrib.programoutput from 0.9.0 to 0.10.0 * Documentation cannot be built in parallel * Let Travis install programoutput for us * Remove vendored sphinxcontrib-programoutput Recent updates to the sphinx package prevent the vendored version from being found in sys.path. We don't vendor sphinx, so it doesn't make sense to vendor sphinxcontrib-programoutput either. --- .travis.yml | 3 +- lib/spack/docs/Makefile | 3 +- lib/spack/docs/conf.py | 1 - lib/spack/docs/contribution_guide.rst | 3 +- lib/spack/docs/exts/sphinxcontrib/LICENSE | 25 -- lib/spack/docs/exts/sphinxcontrib/__init__.py | 9 - lib/spack/docs/exts/sphinxcontrib/programoutput.py | 263 --------------------- share/spack/qa/run-doc-tests | 2 +- 8 files changed, 6 insertions(+), 303 deletions(-) delete mode 100644 lib/spack/docs/exts/sphinxcontrib/LICENSE delete mode 100644 lib/spack/docs/exts/sphinxcontrib/__init__.py delete mode 100644 lib/spack/docs/exts/sphinxcontrib/programoutput.py (limited to 'lib') diff --git a/.travis.yml b/.travis.yml index 2bf21d0e57..c4bfe17640 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,7 +86,8 @@ install: - pip install --upgrade setuptools - pip install --upgrade codecov - pip install --upgrade flake8 - - pip install --upgrade sphinx + - if [[ "$TEST_SUITE" == "doc" ]]; then pip install --upgrade sphinx; fi + - if [[ "$TEST_SUITE" == "doc" ]]; then pip install --upgrade sphinxcontrib-programoutput; fi before_script: # Need this for the git tests to succeed. diff --git a/lib/spack/docs/Makefile b/lib/spack/docs/Makefile index 1054d91a50..3503794021 100644 --- a/lib/spack/docs/Makefile +++ b/lib/spack/docs/Makefile @@ -3,8 +3,7 @@ # You can set these variables from the command line. SPHINXOPTS = -E -JOBS ?= $(shell python -c 'import multiprocessing; print multiprocessing.cpu_count()') -SPHINXBUILD = sphinx-build -j $(JOBS) +SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index d124848542..ee2b314aa3 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -49,7 +49,6 @@ from sphinx.apidoc import main as sphinx_apidoc # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath('exts')) sys.path.insert(0, os.path.abspath('../external')) if sys.version_info[0] < 3: sys.path.insert(0, os.path.abspath('../external/yaml/lib')) diff --git a/lib/spack/docs/contribution_guide.rst b/lib/spack/docs/contribution_guide.rst index a3b3197181..c0e07f7340 100644 --- a/lib/spack/docs/contribution_guide.rst +++ b/lib/spack/docs/contribution_guide.rst @@ -189,6 +189,7 @@ Building the documentation requires several dependencies, all of which can be installed with Spack: * sphinx +* sphinxcontrib-programoutput * graphviz * git * mercurial @@ -227,7 +228,7 @@ your PR is accepted. There is also a ``run-doc-tests`` script in the Quality Assurance directory. The only difference between running this script and running ``make`` by hand is that the script will exit immediately if it encounters an error or warning. - This is necessary for Travis CI. If you made a lot of documentation tests, it + This is necessary for Travis CI. If you made a lot of documentation changes, it is much quicker to run ``make`` by hand so that you can see all of the warnings at once. diff --git a/lib/spack/docs/exts/sphinxcontrib/LICENSE b/lib/spack/docs/exts/sphinxcontrib/LICENSE deleted file mode 100644 index 43b87a5992..0000000000 --- a/lib/spack/docs/exts/sphinxcontrib/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2010, 2011, 2012 Sebastian Wiesner -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/spack/docs/exts/sphinxcontrib/__init__.py b/lib/spack/docs/exts/sphinxcontrib/__init__.py deleted file mode 100644 index 591cf0e16e..0000000000 --- a/lib/spack/docs/exts/sphinxcontrib/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -""" - sphinxcontrib - ~~~~~~~~~~~~~ - - Contains 3rd party Sphinx extensions. -""" - -__import__('pkg_resources').declare_namespace(__name__) diff --git a/lib/spack/docs/exts/sphinxcontrib/programoutput.py b/lib/spack/docs/exts/sphinxcontrib/programoutput.py deleted file mode 100644 index 3f6a4f1595..0000000000 --- a/lib/spack/docs/exts/sphinxcontrib/programoutput.py +++ /dev/null @@ -1,263 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2010, 2011, 2012, Sebastian Wiesner -# All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: - -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -""" - sphinxcontrib.programoutput - =========================== - - This extension provides a directive to include the output of commands as - literal block while building the docs. - - .. moduleauthor:: Sebastian Wiesner -""" - -from __future__ import (print_function, division, unicode_literals, - absolute_import) - -import sys -import os -import shlex -from subprocess import Popen, PIPE, STDOUT -from collections import defaultdict, namedtuple - -from docutils import nodes -from docutils.parsers import rst -from docutils.parsers.rst.directives import flag, unchanged, nonnegative_int - - -__version__ = '0.9' - - -class program_output(nodes.Element): - pass - - -def _slice(value): - parts = [int(v.strip()) for v in value.split(',')] - if len(parts) > 2: - raise ValueError('too many slice parts') - return tuple((parts + [None] * 2)[:2]) - - -class ProgramOutputDirective(rst.Directive): - has_content = False - final_argument_whitespace = True - required_arguments = 1 - - option_spec = dict(shell=flag, prompt=flag, nostderr=flag, - ellipsis=_slice, extraargs=unchanged, - returncode=nonnegative_int, cwd=unchanged) - - def run(self): - env = self.state.document.settings.env - - node = program_output() - node.line = self.lineno - node['command'] = self.arguments[0] - - if self.name == 'command-output': - node['show_prompt'] = True - else: - node['show_prompt'] = 'prompt' in self.options - - node['hide_standard_error'] = 'nostderr' in self.options - node['extraargs'] = self.options.get('extraargs', '') - _, cwd = env.relfn2path(self.options.get('cwd', '/')) - node['working_directory'] = cwd - node['use_shell'] = 'shell' in self.options - node['returncode'] = self.options.get('returncode', 0) - if 'ellipsis' in self.options: - node['strip_lines'] = self.options['ellipsis'] - return [node] - - -_Command = namedtuple( - 'Command', 'command shell hide_standard_error working_directory') - - -class Command(_Command): - """ - A command to be executed. - """ - - def __new__(cls, command, shell=False, hide_standard_error=False, - working_directory='/'): - if isinstance(command, list): - command = tuple(command) - # `chdir()` resolves symlinks, so we need to resolve them too for - # caching to make sure that different symlinks to the same directory - # don't result in different cache keys. Also normalize paths to make - # sure that identical paths are also equal as strings. - working_directory = os.path.normpath(os.path.realpath( - working_directory)) - return _Command.__new__(cls, command, shell, hide_standard_error, - working_directory) - - @classmethod - def from_program_output_node(cls, node): - """ - Create a command from a :class:`program_output` node. - """ - extraargs = node.get('extraargs', '') - command = (node['command'] + ' ' + extraargs).strip() - return cls(command, node['use_shell'], - node['hide_standard_error'], node['working_directory']) - - def execute(self): - """ - Execute this command. - - Return the :class:`~subprocess.Popen` object representing the running - command. - """ - if self.shell: - if sys.version_info[0] < 3 and isinstance(self.command, unicode): - command = self.command.encode(sys.getfilesystemencoding()) - else: - command = self.command - else: - if sys.version_info[0] < 3 and isinstance(self.command, unicode): - command = shlex.split(self.command.encode( - sys.getfilesystemencoding())) - elif isinstance(self.command, str): - command = shlex.split(self.command) - else: - command = self.command - return Popen(command, shell=self.shell, stdout=PIPE, - stderr=PIPE if self.hide_standard_error else STDOUT, - cwd=self.working_directory) - - def get_output(self): - """ - Get the output of this command. - - Return a tuple ``(returncode, output)``. ``returncode`` is the - integral return code of the process, ``output`` is the output as - unicode string, with final trailing spaces and new lines stripped. - """ - process = self.execute() - output = process.communicate()[0].decode( - sys.getfilesystemencoding(), 'replace').rstrip() - return process.returncode, output - - def __str__(self): - if isinstance(self.command, tuple): - return repr(list(self.command)) - return repr(self.command) - - -class ProgramOutputCache(defaultdict): - """ - Execute command and cache their output. - - This class is a mapping. Its keys are :class:`Command` objects represeting - command invocations. Its values are tuples of the form ``(returncode, - output)``, where ``returncode`` is the integral return code of the command, - and ``output`` is the output as unicode string. - - The first time, a key is retrieved from this object, the command is - invoked, and its result is cached. Subsequent access to the same key - returns the cached value. - """ - - def __missing__(self, command): - """ - Called, if a command was not found in the cache. - - ``command`` is an instance of :class:`Command`. - """ - result = command.get_output() - self[command] = result - return result - - -def run_programs(app, doctree): - """ - Execute all programs represented by ``program_output`` nodes in - ``doctree``. Each ``program_output`` node in ``doctree`` is then - replaced with a node, that represents the output of this program. - - The program output is retrieved from the cache in - ``app.env.programoutput_cache``. - """ - if app.config.programoutput_use_ansi: - # enable ANSI support, if requested by config - from sphinxcontrib.ansi import ansi_literal_block - node_class = ansi_literal_block - else: - node_class = nodes.literal_block - - cache = app.env.programoutput_cache - - for node in doctree.traverse(program_output): - command = Command.from_program_output_node(node) - try: - returncode, output = cache[command] - except EnvironmentError as error: - error_message = 'Command {0} failed: {1}'.format(command, error) - error_node = doctree.reporter.error(error_message, base_node=node) - node.replace_self(error_node) - else: - if returncode != node['returncode']: - app.warn('Unexpected return code {0} from command {1}'.format( - returncode, command)) - - # replace lines with ..., if ellipsis is specified - if 'strip_lines' in node: - lines = output.splitlines() - start, stop = node['strip_lines'] - lines[start:stop] = ['...'] - output = '\n'.join(lines) - - if node['show_prompt']: - tmpl = app.config.programoutput_prompt_template - output = tmpl.format(command=node['command'], output=output, - returncode=returncode) - - new_node = node_class(output, output) - new_node['language'] = 'text' - node.replace_self(new_node) - - -def init_cache(app): - """ - Initialize the cache for program output at - ``app.env.programoutput_cache``, if not already present (e.g. being - loaded from a pickled environment). - - The cache is of type :class:`ProgramOutputCache`. - """ - if not hasattr(app.env, 'programoutput_cache'): - app.env.programoutput_cache = ProgramOutputCache() - - -def setup(app): - app.add_config_value('programoutput_use_ansi', False, 'env') - app.add_config_value('programoutput_prompt_template', - '$ {command}\n{output}', 'env') - app.add_directive('program-output', ProgramOutputDirective) - app.add_directive('command-output', ProgramOutputDirective) - app.connect(str('builder-inited'), init_cache) - app.connect(str('doctree-read'), run_programs) diff --git a/share/spack/qa/run-doc-tests b/share/spack/qa/run-doc-tests index b9a05aa3c8..c43779fcaf 100755 --- a/share/spack/qa/run-doc-tests +++ b/share/spack/qa/run-doc-tests @@ -17,4 +17,4 @@ cd "$SPACK_ROOT/lib/spack/docs" # Treat warnings as fatal errors make clean --silent -make SPHINXOPTS=-W JOBS=1 +make SPHINXOPTS=-W -- cgit v1.2.3-70-g09d2 From 3e8662aaa750c20d3a96f1b27dc9bc768ec8e997 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Wed, 17 May 2017 09:37:06 -0700 Subject: fix bug with executables setting their own environment. (#4237) --- lib/spack/spack/util/executable.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 44865e7bdb..c7e445971b 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -130,12 +130,13 @@ class Executable(object): ignore_errors = kwargs.pop("ignore_errors", ()) # environment - env = kwargs.get('env', None) - if env is None: + env_arg = kwargs.get('env', None) + if env_arg is None: env = os.environ.copy() env.update(self.default_env) else: - env = self.default_env.copy().update(env) + env = self.default_env.copy() + env.update(env_arg) # TODO: This is deprecated. Remove in a future version. return_output = kwargs.pop("return_output", False) -- cgit v1.2.3-70-g09d2 From 32c570913d9f1668ad566283109b175cbc8e5f86 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Wed, 17 May 2017 18:45:03 -0700 Subject: Move doc dependencies to requirements.txt for readthedocs (#4280) * Move doc dependencies to requirements.txt for readthedocs * Move sphinx to doc requirements. --- .travis.yml | 3 +-- lib/spack/docs/requirements.txt | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 lib/spack/docs/requirements.txt (limited to 'lib') diff --git a/.travis.yml b/.travis.yml index c4bfe17640..c89bcf1275 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,8 +86,7 @@ install: - pip install --upgrade setuptools - pip install --upgrade codecov - pip install --upgrade flake8 - - if [[ "$TEST_SUITE" == "doc" ]]; then pip install --upgrade sphinx; fi - - if [[ "$TEST_SUITE" == "doc" ]]; then pip install --upgrade sphinxcontrib-programoutput; fi + - if [[ "$TEST_SUITE" == "doc" ]]; then pip install --upgrade -r lib/spack/docs/requirements.txt; fi before_script: # Need this for the git tests to succeed. diff --git a/lib/spack/docs/requirements.txt b/lib/spack/docs/requirements.txt new file mode 100644 index 0000000000..d3fe0d18d7 --- /dev/null +++ b/lib/spack/docs/requirements.txt @@ -0,0 +1,5 @@ +# These dependencies should be installed using pip in order +# to build the documentation. + +sphinx +sphinxcontrib-programoutput -- cgit v1.2.3-70-g09d2 From 315bda3487ca06bdd872efec6349920289bfad64 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 24 May 2017 06:57:31 -0500 Subject: Fix PGI version detection: 17.4-0 -> 17.4 (#4251) --- lib/spack/spack/compilers/pgi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/compilers/pgi.py b/lib/spack/spack/compilers/pgi.py index ed8bad1a9b..cfc3d8ea57 100644 --- a/lib/spack/spack/compilers/pgi.py +++ b/lib/spack/spack/compilers/pgi.py @@ -77,4 +77,4 @@ class Pgi(Compiler): on PowerPC. """ return get_compiler_version( - comp, '-V', r'pg[^ ]* ([0-9.-]+) [^ ]+ target on ') + comp, '-V', r'pg[^ ]* ([0-9.]+)-[0-9]+ [^ ]+ target on ') -- cgit v1.2.3-70-g09d2 From 12ab882eba1631f85f4ebd2acfe1a9c41857ca79 Mon Sep 17 00:00:00 2001 From: becker33 Date: Wed, 24 May 2017 17:13:18 -0700 Subject: Fix issues parsing multiple anonymous specs (#4199) * fix parser * Removed xfails * cleaned up debug print statements * make use of these changes in gcc * Added comment explaining unreachable line, line left for added protection --- lib/spack/spack/spec.py | 31 +++++++++++++++++-------- lib/spack/spack/test/spec_syntax.py | 11 +++------ var/spack/repos/builtin/packages/gcc/package.py | 19 +++++++-------- 3 files changed, 32 insertions(+), 29 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index ff213c5986..9e89feb148 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2958,16 +2958,23 @@ class SpecParser(spack.parse.Parser): # We're parsing an anonymous spec beginning with a # key-value pair. if not specs: + self.push_tokens([self.previous, self.token]) + self.previous = None specs.append(self.spec(None)) - self.expect(VAL) - # Raise an error if the previous spec is already - # concrete (assigned by hash) - if specs[-1]._hash: - raise RedundantSpecError(specs[-1], - 'key-value pair') - specs[-1]._add_flag( - self.previous.value, self.token.value) - self.previous = None + else: + if specs[-1].concrete: + # Trying to add k-v pair to spec from hash + raise RedundantSpecError(specs[-1], + 'key-value pair') + # We should never end up here. + # This requires starting a new spec with ID, EQ + # After another spec that is not concrete + # If the previous spec is not concrete, this is + # handled in the spec parsing loop + # If it is concrete, see the if statement above + # If there is no previous spec, we don't land in + # this else case. + self.unexpected_token() else: # We're parsing a new spec by name self.previous = None @@ -3151,7 +3158,11 @@ class SpecParser(spack.parse.Parser): if self.accept(COLON): if self.accept(ID): - end = self.token.value + if self.next and self.next.type is EQ: + # This is a start: range followed by a key=value pair + self.push_tokens([self.token]) + else: + end = self.token.value elif start: # No colon, but there was a version. return Version(start) diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index 2ee9ef486c..906aa77bb2 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -140,10 +140,9 @@ class TestSpecSyntax(object): self.check_parse("arch=test-None-None", "platform=test") self.check_parse('@2.7:') - @pytest.mark.xfail() def test_anonymous_specs_with_multiple_parts(self): # Parse anonymous spec with multiple tokens - self.check_parse('languages=go @4.2:') + self.check_parse('@4.2: languages=go', 'languages=go @4.2:') self.check_parse('@4.2: languages=go') def test_simple_dependence(self): @@ -551,12 +550,8 @@ class TestSpecSyntax(object): @pytest.mark.parametrize('spec,anon_spec,spec_name', [ ('openmpi languages=go', 'languages=go', 'openmpi'), ('openmpi @4.6:', '@4.6:', 'openmpi'), - pytest.mark.xfail( - ('openmpi languages=go @4.6:', 'languages=go @4.6:', 'openmpi') - ), - pytest.mark.xfail( - ('openmpi @4.6: languages=go', '@4.6: languages=go', 'openmpi') - ), + ('openmpi languages=go @4.6:', 'languages=go @4.6:', 'openmpi'), + ('openmpi @4.6: languages=go', '@4.6: languages=go', 'openmpi'), ]) def test_parse_anonymous_specs(spec, anon_spec, spec_name): diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index 1bdee43e83..3d42bb98b5 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -97,17 +97,14 @@ class Gcc(AutotoolsPackage): # depends_on('guile@1.4.1:', type='test') # See https://golang.org/doc/install/gccgo#Releases - provides('golang', when='languages=go') - # 'when' does not currently support multiple parts of a spec. - # See https://github.com/LLNL/spack/pull/4151 - # provides('golang', when='languages=go @4.6:') - # provides('golang@:1', when='languages=go @4.7.1:') - # provides('golang@:1.1', when='languages=go @4.8:') - # provides('golang@:1.1.2', when='languages=go @4.8.2:') - # provides('golang@:1.2', when='languages=go @4.9:') - # provides('golang@:1.4', when='languages=go @5:') - # provides('golang@:1.6.1', when='languages=go @6:') - # provides('golang@:1.8', when='languages=go @7:') + provides('golang', when='languages=go @4.6:') + provides('golang@:1', when='languages=go @4.7.1:') + provides('golang@:1.1', when='languages=go @4.8:') + provides('golang@:1.1.2', when='languages=go @4.8.2:') + provides('golang@:1.2', when='languages=go @4.9:') + provides('golang@:1.4', when='languages=go @5:') + provides('golang@:1.6.1', when='languages=go @6:') + provides('golang@:1.8', when='languages=go @7:') # For a list of valid languages for a specific release, # run the following command in the GCC source directory: -- cgit v1.2.3-70-g09d2 From 26440accabc68d441b759f448ac0e76736fb3b3c Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Thu, 25 May 2017 11:00:58 -0700 Subject: Touch up string expansion. (#4344) * Touch up string expansion. I'm chasing this: ``` $ (module purge; spack install perl %gcc/5.4.0) ==> Error: No installed spec matches the hash: '%s' ``` There's something deeper going on, but the error message isn't helpful. After this change it tells me this: ``` $ (module purge; spack install perl %gcc/5.4.0) ==> Error: No installed spec matches the hash: '5.4.0' ``` Which is weird because `5.4.0` is not a hash... Whatever is going on here, the error message needs to be fixed. * Flake8 whitespace --- lib/spack/spack/spec.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 9e89feb148..c757e6b0d6 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -3395,7 +3395,8 @@ class InvalidHashError(SpecError): class NoSuchHashError(SpecError): def __init__(self, hash): super(NoSuchHashError, self).__init__( - "No installed spec matches the hash: '%s'") + "No installed spec matches the hash: '%s'" + % hash) class RedundantSpecError(SpecError): -- cgit v1.2.3-70-g09d2 From f38d250e508ef933a6f0bf1e0e5be89c23e20559 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 26 May 2017 13:31:04 -0400 Subject: gpg: add 'spack gpg subcommand (#3845) - Add a `spack gpg` subcommand in anticipation of signed binaries. - GPG keys are stored in var/spack/gpg, and the spack gpg command manages them. - Docs are included on the command. --- .travis.yml | 2 + lib/spack/docs/basic_usage.rst | 64 +++++++++++ lib/spack/docs/getting_started.rst | 1 + lib/spack/spack/__init__.py | 7 ++ lib/spack/spack/cmd/gpg.py | 168 +++++++++++++++++++++++++++++ lib/spack/spack/test/cmd/gpg.py | 181 ++++++++++++++++++++++++++++++++ lib/spack/spack/util/gpg.py | 120 +++++++++++++++++++++ var/spack/gpg.mock/README.md | 3 + var/spack/gpg.mock/data/content.txt | 1 + var/spack/gpg.mock/data/content.txt.asc | 17 +++ var/spack/gpg.mock/keys/external.key | 30 ++++++ var/spack/gpg/README.md | 5 + 12 files changed, 599 insertions(+) create mode 100644 lib/spack/spack/cmd/gpg.py create mode 100644 lib/spack/spack/test/cmd/gpg.py create mode 100644 lib/spack/spack/util/gpg.py create mode 100644 var/spack/gpg.mock/README.md create mode 100644 var/spack/gpg.mock/data/content.txt create mode 100644 var/spack/gpg.mock/data/content.txt.asc create mode 100644 var/spack/gpg.mock/keys/external.key create mode 100644 var/spack/gpg/README.md (limited to 'lib') diff --git a/.travis.yml b/.travis.yml index c89bcf1275..ef3ec362c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -71,12 +71,14 @@ addons: - gfortran - mercurial - graphviz + - gnupg2 # Work around Travis's lack of support for Python on OSX before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew ls --versions python > /dev/null || brew install python; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew ls --versions gcc > /dev/null || brew install gcc; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew ls --versions gnupg2 > /dev/null || brew install gnupg2; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then virtualenv venv; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then source venv/bin/activate; fi diff --git a/lib/spack/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst index f25247579b..6eba26a4b5 100644 --- a/lib/spack/docs/basic_usage.rst +++ b/lib/spack/docs/basic_usage.rst @@ -276,6 +276,70 @@ Seeing installed packages We know that ``spack list`` shows you the names of available packages, but how do you figure out which are already installed? +.. _cmd-spack-gpg: + +^^^^^^^^^^^^^ +``spack gpg`` +^^^^^^^^^^^^^ + +Spack has support for signing and verifying packages using GPG keys. A +separate keyring is used for Spack, so any keys available in the user's home +directory are not used. + +^^^^^^^^^^^^^^^^^^ +``spack gpg init`` +^^^^^^^^^^^^^^^^^^ + +When Spack is first installed, its keyring is empty. Keys stored in +:file:`var/spack/gpg` are the default keys for a Spack installation. These +keys may be imported by running ``spack gpg init``. This will import the +default keys into the keyring as trusted keys. + +------------- +Trusting keys +------------- + +Additional keys may be added to the keyring using +``spack gpg trust ``. Once a key is trusted, packages signed by the +owner of they key may be installed. + +------------- +Creating keys +------------- + +You may also create your own key so that you may sign your own packages using +``spack gpg create ``. By default, the key has no expiration, +but it may be set with the ``--expires `` flag (see the ``gnupg2`` +documentation for accepted date formats). It is also recommended to add a +comment as to the use of the key using the ``--comment `` flag. The +public half of the key can also be exported for sharing with others so that +they may use packages you have signed using the ``--export `` flag. +Secret keys may also be later exported using the +``spack gpg export [...]`` command. + +------------ +Listing keys +------------ + +In order to list the keys available in the keyring, the +``spack gpg list`` command will list trusted keys with the ``--trusted`` flag +and keys available for signing using ``--signing``. If you would like to +remove keys from your keyring, ``spack gpg untrust ``. Key IDs can be +email addresses, names, or (best) fingerprints. + +------------------------------ +Signing and Verifying Packages +------------------------------ + +In order to sign a package, ``spack gpg sign `` should be used. By +default, the signature will be written to ``.asc``, but that may be +changed by using the ``--output `` flag. If there is only one signing +key available, it will be used, but if there is more than one, the key to use +must be specified using the ``--key `` flag. The ``--clearsign`` flag +may also be used to create a signed file which contains the contents, but it +is not recommended. Signed packages may be verified by using +``spack gpg verify ``. + .. _cmd-spack-find: ^^^^^^^^^^^^^^ diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index 971d42cea0..75c2f662b5 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -14,6 +14,7 @@ before Spack is run: 1. Python 2 (2.6 or 2.7) or 3 (3.3 - 3.6) 2. A C/C++ compiler 3. The ``git`` and ``curl`` commands. +4. If using the ``gpg`` subcommand, ``gnupg2`` is required. These requirements can be easily installed on most modern Linux systems; on Macintosh, XCode is required. Spack is designed to run on HPC diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 27283d10a9..057c54d665 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -68,6 +68,13 @@ opt_path = join_path(prefix, "opt") etc_path = join_path(prefix, "etc") +# GPG paths. +gpg_keys_path = join_path(var_path, "gpg") +mock_gpg_data_path = join_path(var_path, "gpg.mock", "data") +mock_gpg_keys_path = join_path(var_path, "gpg.mock", "keys") +gpg_path = join_path(opt_path, "spack", "gpg") + + #----------------------------------------------------------------------------- # Initial imports (only for use in this file -- see __all__ below.) #----------------------------------------------------------------------------- diff --git a/lib/spack/spack/cmd/gpg.py b/lib/spack/spack/cmd/gpg.py new file mode 100644 index 0000000000..ff511b6520 --- /dev/null +++ b/lib/spack/spack/cmd/gpg.py @@ -0,0 +1,168 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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.util.gpg import Gpg +import spack +import os + +description = "handle GPG actions for spack" +section = "developer" +level = "long" + + +def setup_parser(subparser): + setup_parser.parser = subparser + subparsers = subparser.add_subparsers(help='GPG sub-commands') + + verify = subparsers.add_parser('verify') + verify.add_argument('package', type=str, + help='the package to verify') + verify.add_argument('signature', type=str, nargs='?', + help='the signature file') + verify.set_defaults(func=gpg_verify) + + trust = subparsers.add_parser('trust') + trust.add_argument('keyfile', type=str, + help='add a key to the trust store') + trust.set_defaults(func=gpg_trust) + + untrust = subparsers.add_parser('untrust') + untrust.add_argument('--signing', action='store_true', + help='allow untrusting signing keys') + untrust.add_argument('keys', nargs='+', type=str, + help='remove keys from the trust store') + untrust.set_defaults(func=gpg_untrust) + + sign = subparsers.add_parser('sign') + sign.add_argument('--output', metavar='DEST', type=str, + help='the directory to place signatures') + sign.add_argument('--key', metavar='KEY', type=str, + help='the key to use for signing') + sign.add_argument('--clearsign', action='store_true', + help='if specified, create a clearsign signature') + sign.add_argument('package', type=str, + help='the package to sign') + sign.set_defaults(func=gpg_sign) + + create = subparsers.add_parser('create') + create.add_argument('name', type=str, + help='the name to use for the new key') + create.add_argument('email', type=str, + help='the email address to use for the new key') + create.add_argument('--comment', metavar='COMMENT', type=str, + default='GPG created for Spack', + help='a description for the intended use of the key') + create.add_argument('--expires', metavar='EXPIRATION', type=str, + default='0', help='when the key should expire') + create.add_argument('--export', metavar='DEST', type=str, + help='export the public key to a file') + create.set_defaults(func=gpg_create) + + list = subparsers.add_parser('list') + list.add_argument('--trusted', action='store_true', + help='list trusted keys') + list.add_argument('--signing', action='store_true', + help='list keys which may be used for signing') + list.set_defaults(func=gpg_list) + + init = subparsers.add_parser('init') + init.set_defaults(func=gpg_init) + init.set_defaults(import_dir=spack.gpg_keys_path) + + export = subparsers.add_parser('export') + export.add_argument('location', type=str, + help='where to export keys') + export.add_argument('keys', nargs='*', + help='the keys to export; ' + 'all secret keys if unspecified') + export.set_defaults(func=gpg_export) + + +def gpg_create(args): + if args.export: + old_sec_keys = Gpg.signing_keys() + Gpg.create(name=args.name, email=args.email, + comment=args.comment, expires=args.expires) + if args.export: + new_sec_keys = set(Gpg.signing_keys()) + new_keys = new_sec_keys.difference(old_sec_keys) + Gpg.export_keys(args.export, *new_keys) + + +def gpg_export(args): + keys = args.keys + if not keys: + keys = Gpg.signing_keys() + Gpg.export_keys(args.location, *keys) + + +def gpg_list(args): + Gpg.list(args.trusted, args.signing) + + +def gpg_sign(args): + key = args.key + if key is None: + keys = Gpg.signing_keys() + if len(keys) == 1: + key = keys[0] + elif not keys: + raise RuntimeError('no signing keys are available') + else: + raise RuntimeError('multiple signing keys are available; ' + 'please choose one') + output = args.output + if not output: + output = args.package + '.asc' + # TODO: Support the package format Spack creates. + Gpg.sign(key, args.package, output, args.clearsign) + + +def gpg_trust(args): + Gpg.trust(args.keyfile) + + +def gpg_init(args): + for root, _, filenames in os.walk(args.import_dir): + for filename in filenames: + if not filename.endswith('.key'): + continue + Gpg.trust(os.path.join(root, filename)) + + +def gpg_untrust(args): + Gpg.untrust(args.signing, *args.keys) + + +def gpg_verify(args): + # TODO: Support the package format Spack creates. + signature = args.signature + if signature is None: + signature = args.package + '.asc' + Gpg.verify(signature, args.package) + + +def gpg(parser, args): + if args.func: + args.func(args) diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py new file mode 100644 index 0000000000..cc6d57d91e --- /dev/null +++ b/lib/spack/spack/test/cmd/gpg.py @@ -0,0 +1,181 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import argparse +import os.path + +import pytest +import spack +import spack.cmd.gpg as gpg +import spack.util.gpg as gpg_util +from spack.util.executable import ProcessError + + +@pytest.fixture(scope='function') +def testing_gpg_directory(tmpdir): + old_gpg_path = gpg_util.GNUPGHOME + gpg_util.GNUPGHOME = str(tmpdir.join('gpg')) + yield + gpg_util.GNUPGHOME = old_gpg_path + + +def has_gnupg2(): + try: + gpg_util.Gpg.gpg()('--version') + return True + except Exception: + return False + + +@pytest.mark.usefixtures('testing_gpg_directory') +@pytest.mark.skipif(not has_gnupg2(), + reason='These tests require gnupg2') +def test_gpg(tmpdir): + parser = argparse.ArgumentParser() + gpg.setup_parser(parser) + + # Verify a file with an empty keyring. + args = parser.parse_args(['verify', os.path.join( + spack.mock_gpg_data_path, 'content.txt')]) + with pytest.raises(ProcessError): + gpg.gpg(parser, args) + + # Import the default key. + args = parser.parse_args(['init']) + args.import_dir = spack.mock_gpg_keys_path + gpg.gpg(parser, args) + + # List the keys. + # TODO: Test the output here. + args = parser.parse_args(['list', '--trusted']) + gpg.gpg(parser, args) + args = parser.parse_args(['list', '--signing']) + gpg.gpg(parser, args) + + # Verify the file now that the key has been trusted. + args = parser.parse_args(['verify', os.path.join( + spack.mock_gpg_data_path, 'content.txt')]) + gpg.gpg(parser, args) + + # Untrust the default key. + args = parser.parse_args(['untrust', 'Spack testing']) + gpg.gpg(parser, args) + + # Now that the key is untrusted, verification should fail. + args = parser.parse_args(['verify', os.path.join( + spack.mock_gpg_data_path, 'content.txt')]) + with pytest.raises(ProcessError): + gpg.gpg(parser, args) + + # Create a file to test signing. + test_path = tmpdir.join('to-sign.txt') + with open(str(test_path), 'w+') as fout: + fout.write('Test content for signing.\n') + + # Signing without a private key should fail. + args = parser.parse_args(['sign', str(test_path)]) + with pytest.raises(RuntimeError) as exc_info: + gpg.gpg(parser, args) + assert exc_info.value.args[0] == 'no signing keys are available' + + # Create a key for use in the tests. + keypath = tmpdir.join('testing-1.key') + args = parser.parse_args(['create', + '--comment', 'Spack testing key', + '--export', str(keypath), + 'Spack testing 1', + 'spack@googlegroups.com']) + gpg.gpg(parser, args) + keyfp = gpg_util.Gpg.signing_keys()[0] + + # List the keys. + # TODO: Test the output here. + args = parser.parse_args(['list', '--trusted']) + gpg.gpg(parser, args) + args = parser.parse_args(['list', '--signing']) + gpg.gpg(parser, args) + + # Signing with the default (only) key. + args = parser.parse_args(['sign', str(test_path)]) + gpg.gpg(parser, args) + + # Verify the file we just verified. + args = parser.parse_args(['verify', str(test_path)]) + gpg.gpg(parser, args) + + # Export the key for future use. + export_path = tmpdir.join('export.testing.key') + args = parser.parse_args(['export', str(export_path)]) + gpg.gpg(parser, args) + + # Create a second key for use in the tests. + args = parser.parse_args(['create', + '--comment', 'Spack testing key', + 'Spack testing 2', + 'spack@googlegroups.com']) + gpg.gpg(parser, args) + + # List the keys. + # TODO: Test the output here. + args = parser.parse_args(['list', '--trusted']) + gpg.gpg(parser, args) + args = parser.parse_args(['list', '--signing']) + gpg.gpg(parser, args) + + test_path = tmpdir.join('to-sign-2.txt') + with open(str(test_path), 'w+') as fout: + fout.write('Test content for signing.\n') + + # Signing with multiple signing keys is ambiguous. + args = parser.parse_args(['sign', str(test_path)]) + with pytest.raises(RuntimeError) as exc_info: + gpg.gpg(parser, args) + assert exc_info.value.args[0] == \ + 'multiple signing keys are available; please choose one' + + # Signing with a specified key. + args = parser.parse_args(['sign', '--key', keyfp, str(test_path)]) + gpg.gpg(parser, args) + + # Untrusting signing keys needs a flag. + args = parser.parse_args(['untrust', 'Spack testing 1']) + with pytest.raises(ProcessError): + gpg.gpg(parser, args) + + # Untrust the key we created. + args = parser.parse_args(['untrust', '--signing', keyfp]) + gpg.gpg(parser, args) + + # Verification should now fail. + args = parser.parse_args(['verify', str(test_path)]) + with pytest.raises(ProcessError): + gpg.gpg(parser, args) + + # Trust the exported key. + args = parser.parse_args(['trust', str(export_path)]) + gpg.gpg(parser, args) + + # Verification should now succeed again. + args = parser.parse_args(['verify', str(test_path)]) + gpg.gpg(parser, args) diff --git a/lib/spack/spack/util/gpg.py b/lib/spack/spack/util/gpg.py new file mode 100644 index 0000000000..ccaf33519b --- /dev/null +++ b/lib/spack/spack/util/gpg.py @@ -0,0 +1,120 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import os + +import spack +from spack.util.executable import Executable + + +GNUPGHOME = spack.gpg_path + + +class Gpg(object): + @staticmethod + def gpg(): + # TODO: Support loading up a GPG environment from a built gpg. + gpg = Executable('gpg2') + if not os.path.exists(GNUPGHOME): + os.makedirs(GNUPGHOME) + os.chmod(GNUPGHOME, 0o700) + gpg.add_default_env('GNUPGHOME', GNUPGHOME) + return gpg + + @classmethod + def create(cls, **kwargs): + r, w = os.pipe() + r = os.fdopen(r, 'r') + w = os.fdopen(w, 'w') + w.write(''' + Key-Type: rsa + Key-Length: 4096 + Key-Usage: sign + Name-Real: %(name)s + Name-Email: %(email)s + Name-Comment: %(comment)s + Expire-Date: %(expires)s + %%no-protection + %%commit + ''' % kwargs) + w.close() + cls.gpg()('--gen-key', '--batch', input=r) + r.close() + + @classmethod + def signing_keys(cls): + keys = [] + output = cls.gpg()('--list-secret-keys', '--with-colons', + '--fingerprint', output=str) + for line in output.split('\n'): + if line.startswith('fpr'): + keys.append(line.split(':')[9]) + return keys + + @classmethod + def export_keys(cls, location, *keys): + cls.gpg()('--armor', '--export', '--output', location, *keys) + + @classmethod + def trust(cls, keyfile): + cls.gpg()('--import', keyfile) + + @classmethod + def untrust(cls, signing, *keys): + args = [ + '--yes', + '--batch', + ] + if signing: + signing_args = args + ['--delete-secret-keys'] + list(keys) + cls.gpg()(*signing_args) + args.append('--delete-keys') + args.extend(keys) + cls.gpg()(*args) + + @classmethod + def sign(cls, key, file, output, clearsign=False): + args = [ + '--armor', + '--default-key', key, + '--output', output, + file, + ] + if clearsign: + args.insert(0, '--clearsign') + else: + args.insert(0, '--detach-sign') + cls.gpg()(*args) + + @classmethod + def verify(cls, signature, file): + cls.gpg()('--verify', signature, file) + + @classmethod + def list(cls, trusted, signing): + if trusted: + cls.gpg()('--list-public-keys') + if signing: + cls.gpg()('--list-secret-keys') diff --git a/var/spack/gpg.mock/README.md b/var/spack/gpg.mock/README.md new file mode 100644 index 0000000000..95215a8634 --- /dev/null +++ b/var/spack/gpg.mock/README.md @@ -0,0 +1,3 @@ +# Mock GPG directory + +This directory contains keys and data used in the testing Spack. diff --git a/var/spack/gpg.mock/data/content.txt b/var/spack/gpg.mock/data/content.txt new file mode 100644 index 0000000000..6ab0f567cf --- /dev/null +++ b/var/spack/gpg.mock/data/content.txt @@ -0,0 +1 @@ +This file has a signature signed by an external key. diff --git a/var/spack/gpg.mock/data/content.txt.asc b/var/spack/gpg.mock/data/content.txt.asc new file mode 100644 index 0000000000..7593156113 --- /dev/null +++ b/var/spack/gpg.mock/data/content.txt.asc @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2 + +iQIcBAABCAAGBQJZELiKAAoJENygJBhApdriPvgP/0shBTmx4jg6QaI0zyie8a+R ++L/o9iIV4MqvBI5g+Ti+nktoCSxSOPOYFW4af740A7/43wIML9LK+gIhx/QbCrMb +bNqzyIry9/L6PK1cCuXvd10CT+MCF1P0hdaMtKihdBYB3J8f5y1i30z+a8YWsRsX +tPMVF/HunlpAkSWIpjmbJzFPT1R/UiBHl4VJ+mM3NNZYNIq8ZhKUiXwlQkZ8R8zg +M0IEFkwfFtp7JxnhG7jR0k63cNm3KSocAJpwENy46RKGsAvwvqTzRh4T2MlmQIjH +TC1MA8alJvtSdBHpkKffSU8jLewKHe1H48nc9NifMy04Ni8fSlGZe14Oe7Krqla0 +qWs+XHrGCmSleyiRUQes1MKQ7NhumKEoEaU+q0/c+lUDILZp1TlfvTPg2fzng4M/ +YF6+f+wqM+xY6z1/IloOMHis5oALjARSO88ldrLU4DQp/6jTKJO/+I4uWhMnPkMW ++a3GLWl1CShReHKbWZTLFtdQATZXA8M6wQ8FAsLOmRLb0AlEQ28A8fHrBCCdU2xj +tSG++U1ZUo64cMYQmIMsvIApnkTh7qCkDjaVBP1to3qc83YHncxorydz9ERpuDvP +d1IOHlJyUSM4+sLkCPvH9QyTaJn/x7D/VraznEiptGON7G6G9AgyAzIgYamm1Kwh +UDhbQDFDhLLvUSDGzO3l +=kwo9 +-----END PGP SIGNATURE----- diff --git a/var/spack/gpg.mock/keys/external.key b/var/spack/gpg.mock/keys/external.key new file mode 100644 index 0000000000..d08c90ea7f --- /dev/null +++ b/var/spack/gpg.mock/keys/external.key @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mQINBFkQuFIBEAC7DiUM7jQ01kaGX+4nguzVeYquBRYoEUiObl5UIVSavMn4I7Oy +aytG+qR26tUpunjEB6ftIQMJSyPKueclUJBaQ9lzQ3WpFC3ItpBNkMxHpiqPa9DX +ddMk2QtJt4TlCWJEdnhR/92mMF+vf7B5/OvFvKOi0P+AwzBHC8IKTxml/UosmeVI +Cs69FzRDXyqQxQAkATmuDmHXPaC6RkDmpVRe3ej+Kr+Xu4vcb/EBHg/vcZkFdSmi +hyOj21/8LQZzcwTg4TSgHzKqbjPtIEQM3NNksvcFYlq2X0ad4cBcxa1Hj5xV8oS/ +bdYOFSdsh3QRROcEeKYVQZhvCR12qS93P4b2egbamBxCQK0Sn6QPIjlR6+Ya2/6p +/hHddF+YVA6HJ22QZjaORf9lImYfYMs1ka2GtgkczOeaFEfcJ96nIa8Qb1jcrOon +/3k/l+Ae09HRCcGB2DgKXw7S+CXKt46Oadp3bIDAyceotGnrG3cVA6A9Lwqy6U/5 +ywry8ETu3wlIR3EAIwM0a/3xCPg3cC/bt9rSqsFcmXyxltGI2CBTWcTqcyjW4VAw +nVI8otBd4yNdimhpxLfx6AaMjA+D+OSltnAZUrp1fSFVhWLpTxLbcTv+HJ/g4U+x ++PAsQ79Hzmzvy/8nOvIprGzY4LCmBPbLUB47Yu761HhYQhkuJiYP1R/GzQARAQAB +tDpTcGFjayB0ZXN0aW5nIChTcGFjayB0ZXN0aW5nIGtleSkgPHNwYWNrQGdvb2ds +ZWdyb3Vwcy5jb20+iQI3BBMBCAAhBQJZELhSAhsDBQsJCAcCBhUICQoLAgQWAgMB +Ah4BAheAAAoJENygJBhApdriOnUP/iLC1ZxyBP3STSVgBBTS1L6FnRAc9ya6eXNT +EwLLoSL0I0srs0sThmhyW38ZamsXYDhggaetShxemcO0BoNAii/oNK9yQoXNF4f6 +7wg2ZxCDuDjp/3VsbiI+kNlH2kj1tQ/M53ak9nYhmwLJFfKzjQBWJiyTwYZwO3MB +QvXBvLIKj6IDS20o+7jbOq8F243vo5/uNHc/6C9eC3i4jzXWVlln2+iN/e5sVt+X +ZiggLK2Goj5CZ7ZjZQvdoH4wKbSPLBg0Lh5FYSih9p0wx0UTEoi0jPqFUDw81duz +IyxjbGASSaUxoz16C2U/olPEAAXeBe4266jRQwTrn+sEIX5FD+RGoryXQ97pV5up +I9wb2anVAMHOf20iYep3vYTjnFG/81ykODm8+I4D/Jj0EEe1E2b0D+7RQ9xKNYxC +fDgY3isXBFzmS6O4h8N27P06yfzQX+zvjPrrHRB7ka2pmDT3M421p2wN0n9aCq1J +8+M5UdpF98A38oosyE53KcItoCUFLgEP3KrWPwvpDUC2sNQAOFiHeitzc+v1iwmD +RScdefCQ8qc2JJdCqMG6M0tlFy6Tw1o0eBYOhhDGa0rq/PQ4NewR2dj+yDXXBGJy +ElR0VChqniMCyd2Q4SDPnhcVrWPTYSKL1MpsL0lXED8TGOdoAHHmQNU8MWhqmdBy +zcWArNUY +=yVqw +-----END PGP PUBLIC KEY BLOCK----- diff --git a/var/spack/gpg/README.md b/var/spack/gpg/README.md new file mode 100644 index 0000000000..122d24f841 --- /dev/null +++ b/var/spack/gpg/README.md @@ -0,0 +1,5 @@ +# GPG Keys + +This directory contains keys that should be trusted by this installation of +Spack. They are imported when running `spack gpg init`, but may also be +imported manually with `spack gpg trust path/to/key`. -- cgit v1.2.3-70-g09d2 From 6f0ac9d54cc8494cdb4a002c7a203622dfe656eb Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 26 May 2017 16:37:06 -0500 Subject: Add --configure-args/vars support to RPackage (#4289) * Add --configure-args/vars support to RPackage * Docstring formatting change --- lib/spack/spack/build_systems/r.py | 36 +++++++++++++++++++--- lib/spack/spack/cmd/create.py | 6 +++- var/spack/repos/builtin/packages/r-rmpi/package.py | 33 ++++++++++++-------- 3 files changed, 57 insertions(+), 18 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index 618ba398e1..a659f75b98 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -30,7 +30,10 @@ from spack.package import PackageBase, run_after class RPackage(PackageBase): - """Specialized class for packages that are built using R + """Specialized class for packages that are built using R. + + For more information on the R build system, see: + https://stat.ethz.ch/R-manual/R-devel/library/utils/html/INSTALL.html This class provides a single phase that can be overridden: @@ -49,12 +52,37 @@ class RPackage(PackageBase): depends_on('r', type=('build', 'run')) + def configure_args(self, spec, prefix): + """Arguments to pass to install via ``--configure-args``.""" + return [] + + def configure_vars(self, spec, prefix): + """Arguments to pass to install via ``--configure-vars``.""" + return [] + def install(self, spec, prefix): """Installs an R package.""" - inspect.getmodule(self).R( - 'CMD', 'INSTALL', + + config_args = self.configure_args(spec, prefix) + config_vars = self.configure_vars(spec, prefix) + + args = [ + 'CMD', + 'INSTALL' + ] + + if config_args: + args.append('--configure-args={0}'.format(' '.join(config_args))) + + if config_vars: + args.append('--configure-vars={0}'.format(' '.join(config_vars))) + + args.extend([ '--library={0}'.format(self.module.r_lib_dir), - self.stage.source_path) + self.stage.source_path + ]) + + inspect.getmodule(self).R(*args) # Check that self.prefix is there after installation run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 89ba050a53..648400e41e 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -265,7 +265,11 @@ class RPackageTemplate(PackageTemplate): # depends_on('r-foo', type=('build', 'run'))""" body = """\ - # FIXME: Override install() if necessary.""" + def configure_args(self, spec, prefix): + # FIXME: Add arguments to pass to install via --configure-args + # FIXME: If not needed delete this function + args = [] + return args""" def __init__(self, name, *args): # If the user provided `--name r-rcpp`, don't rename it r-r-rcpp diff --git a/var/spack/repos/builtin/packages/r-rmpi/package.py b/var/spack/repos/builtin/packages/r-rmpi/package.py index 7b955545d8..4ef46791ec 100644 --- a/var/spack/repos/builtin/packages/r-rmpi/package.py +++ b/var/spack/repos/builtin/packages/r-rmpi/package.py @@ -38,18 +38,25 @@ class RRmpi(RPackage): depends_on('mpi') depends_on('r@2.15.1:') - def install(self, spec, prefix): - if 'mpich' in spec: - Rmpi_type = 'MPICH' - elif 'mvapich' in spec: - Rmpi_type = 'MVAPICH' - else: + # The following MPI types are not supported + conflicts('^intel-mpi') + conflicts('^intel-parallel-studio') + conflicts('^mvapich2') + conflicts('^spectrum-mpi') + + def configure_args(self, spec, prefix): + mpi_name = spec['mpi'].name + + # The type of MPI. Supported values are: + # OPENMPI, LAM, MPICH, MPICH2, or CRAY + if mpi_name == 'openmpi': Rmpi_type = 'OPENMPI' + elif mpi_name == 'mpich': + Rmpi_type = 'MPICH2' + else: + raise InstallError('Unsupported MPI type') - my_mpi = spec['mpi'] - - R('CMD', 'INSTALL', - '--configure-args=--with-Rmpi-type=%s' % Rmpi_type + - ' --with-mpi=%s' % my_mpi.prefix, - '--library={0}'.format(self.module.r_lib_dir), - self.stage.source_path) + return [ + '--with-Rmpi-type={0}'.format(Rmpi_type), + '--with-mpi={0}'.format(spec['mpi'].prefix), + ] -- cgit v1.2.3-70-g09d2 From d3a82ce63215c048358650c55feeaecf5625bbf6 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 26 May 2017 22:05:54 -0500 Subject: Fix typo in mod_to_class docstring (#4371) --- lib/spack/spack/util/naming.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py index 18142bd83f..e70b0a6ce0 100644 --- a/lib/spack/spack/util/naming.py +++ b/lib/spack/spack/util/naming.py @@ -57,7 +57,7 @@ def mod_to_class(mod_name): * Class names use the CapWords convention. Regular source code follows these convetions. Spack is a bit - more liberal with its Package names nad Compiler names: + more liberal with its Package names and Compiler names: * They can contain '-' as well as '_', but cannot start with '-'. * They can start with numbers, e.g. "3proxy". -- cgit v1.2.3-70-g09d2 From f9ac965fb9ed251819c80541bb1bd8542c416952 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 27 May 2017 12:51:03 -0500 Subject: Document known issue with R concretization (#4313) --- lib/spack/docs/known_issues.rst | 40 +++++++++++++++++++++++++++ var/spack/repos/builtin/packages/r/package.py | 2 ++ 2 files changed, 42 insertions(+) (limited to 'lib') diff --git a/lib/spack/docs/known_issues.rst b/lib/spack/docs/known_issues.rst index a68033dba6..2756f59691 100644 --- a/lib/spack/docs/known_issues.rst +++ b/lib/spack/docs/known_issues.rst @@ -37,6 +37,46 @@ A workaround is to explicitly activate the variant related to the dependency: See https://github.com/LLNL/spack/issues/397 for further details. +--------------------------------------------------- +Variants are not properly forwarded to dependencies +--------------------------------------------------- + +**Status:** Expected to be fixed in the next release + +Sometimes, a variant of a package can also affect how its dependencies are +built. For example, in order to build MPI support for a package, it may +require that its dependencies are also built with MPI support. In the +``package.py``, this looks like: + +.. code-block:: python + + depends_on('hdf5~mpi', when='~mpi') + depends_on('hdf5+mpi', when='+mpi') + +Spack handles this situation properly for *immediate* dependencies, and +builds ``hdf5`` with the same variant you used for the package that +depends on it. However, for *indirect* dependencies (dependencies of +dependencies), Spack does not backtrack up the DAG far enough to handle +this. Users commonly run into this situation when trying to build R with +X11 support: + +.. code-block:: console + + $ spack install r+X + ... + ==> Error: Invalid spec: 'cairo@1.14.8%gcc@6.2.1+X arch=linux-fedora25-x86_64 ^bzip2@1.0.6%gcc@6.2.1+shared arch=linux-fedora25-x86_64 ^font-util@1.3.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^fontconfig@2.12.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^freetype@2.7.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^gettext@0.19.8.1%gcc@6.2.1+bzip2+curses+git~libunistring+libxml2+tar+xz arch=linux-fedora25-x86_64 ^glib@2.53.1%gcc@6.2.1~libmount arch=linux-fedora25-x86_64 ^inputproto@2.3.2%gcc@6.2.1 arch=linux-fedora25-x86_64 ^kbproto@1.0.7%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libffi@3.2.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libpng@1.6.29%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libpthread-stubs@0.4%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libx11@1.6.5%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxau@1.0.8%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxcb@1.12%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxdmcp@1.1.2%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxext@1.3.3%gcc@6.2.1 arch=linux-fedora25-x86_64 ^libxml2@2.9.4%gcc@6.2.1~python arch=linux-fedora25-x86_64 ^libxrender@0.9.10%gcc@6.2.1 arch=linux-fedora25-x86_64 ^ncurses@6.0%gcc@6.2.1~symlinks arch=linux-fedora25-x86_64 ^openssl@1.0.2k%gcc@6.2.1 arch=linux-fedora25-x86_64 ^pcre@8.40%gcc@6.2.1+utf arch=linux-fedora25-x86_64 ^pixman@0.34.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^pkg-config@0.29.2%gcc@6.2.1+internal_glib arch=linux-fedora25-x86_64 ^python@2.7.13%gcc@6.2.1+shared~tk~ucs4 arch=linux-fedora25-x86_64 ^readline@7.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^renderproto@0.11.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^sqlite@3.18.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^tar^util-macros@1.19.1%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xcb-proto@1.12%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xextproto@7.3.0%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xproto@7.0.31%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xtrans@1.3.5%gcc@6.2.1 arch=linux-fedora25-x86_64 ^xz@5.2.3%gcc@6.2.1 arch=linux-fedora25-x86_64 ^zlib@1.2.11%gcc@6.2.1+pic+shared arch=linux-fedora25-x86_64'. + Package cairo requires variant ~X, but spec asked for +X + +A workaround is to explicitly activate the variants of dependencies as well: + +.. code-block:: console + + $ spack install r+X ^cairo+X ^pango+X + +See https://github.com/LLNL/spack/issues/267 and +https://github.com/LLNL/spack/issues/2546 for further details. + + --------------------------------- ``spack extensions`` doesn't work --------------------------------- diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py index 4ae8caab23..5c092e30e5 100644 --- a/var/spack/repos/builtin/packages/r/package.py +++ b/var/spack/repos/builtin/packages/r/package.py @@ -74,6 +74,8 @@ class R(AutotoolsPackage): depends_on('cairo+X', when='+X') depends_on('cairo~X', when='~X') depends_on('pango') + depends_on('pango+X', when='+X') + depends_on('pango~X', when='~X') depends_on('freetype') depends_on('tcl') depends_on('tk') -- cgit v1.2.3-70-g09d2 From d9d5135ec9f1ef71fa6604406a2efe46668821ea Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 30 May 2017 13:37:56 -0500 Subject: Fix spack info bug for Python 3 (#4391) --- lib/spack/spack/cmd/info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 62de5484af..f0cddad2e2 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -25,7 +25,7 @@ from __future__ import print_function import textwrap -import itertools +from six.moves import zip_longest from llnl.util.tty.colify import * import spack import spack.fetch_strategy as fs @@ -119,7 +119,7 @@ class VariantFormatter(object): v.description, width=self.column_widths[2] ) - for t in itertools.izip_longest( + for t in zip_longest( name, allowed, description, fillvalue='' ): yield " " + self.fmt % t -- cgit v1.2.3-70-g09d2 From 8018f6cdf633306244a888266ab7bdaa7229c504 Mon Sep 17 00:00:00 2001 From: Stas Sergienko Date: Wed, 7 Jun 2017 11:50:56 -0500 Subject: Fixed duplicated spec: nag@6.1 line in getting started guide (#4445) --- lib/spack/docs/getting_started.rst | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index 75c2f662b5..9b31ea4491 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -641,6 +641,7 @@ Or it can be set permanently in your ``compilers.yaml``: fflags: -mismatch spec: nag@6.1 + --------------- System Packages --------------- -- cgit v1.2.3-70-g09d2 From 1b9af88572c902df6de43105d751eb5785449d9f Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 7 Jun 2017 11:52:28 -0500 Subject: Supress output from gpg --version during tests (#4441) --- lib/spack/spack/test/cmd/gpg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py index cc6d57d91e..e4dbb681a6 100644 --- a/lib/spack/spack/test/cmd/gpg.py +++ b/lib/spack/spack/test/cmd/gpg.py @@ -23,7 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import argparse -import os.path +import os import pytest import spack @@ -42,7 +42,7 @@ def testing_gpg_directory(tmpdir): def has_gnupg2(): try: - gpg_util.Gpg.gpg()('--version') + gpg_util.Gpg.gpg()('--version', output=os.devnull) return True except Exception: return False -- cgit v1.2.3-70-g09d2 From 85fd8f0b31b2df7ec610e13092b9e43aeca01d45 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 9 Jun 2017 01:53:40 -0500 Subject: Fix url parse offset for SourceForge downloads (#4458) --- lib/spack/spack/test/url_parse.py | 2 ++ lib/spack/spack/url.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index cf6f262fdf..5489cc8d26 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -160,6 +160,8 @@ def test_url_strip_name_suffixes(url, version, expected): ('sionlib', 30, '1.7.1', 59, 'http://apps.fz-juelich.de/jsc/sionlib/download.php?version=1.7.1'), # Regex in name ('voro++', 40, '0.4.6', 47, 'http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz'), + # SourceForge download + ('glew', 55, '2.0.0', 60, 'https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download'), ]) def test_url_parse_offset(name, noffset, ver, voffset, path): """Tests that the name, version and offsets are computed correctly. diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 8f2129b84a..54b3b74f1b 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -301,7 +301,8 @@ def split_url_extension(path): prefix, ext, suffix = path, '', '' # Strip off sourceforge download suffix. - match = re.search(r'((?:sourceforge\.net|sf\.net)/.*)(/download)$', path) + # e.g. https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download + match = re.search(r'(.*(?:sourceforge\.net|sf\.net)/.*)(/download)$', path) if match: prefix, suffix = match.groups() -- cgit v1.2.3-70-g09d2 From 218992862c436d4e1bd2ecde2d5914ce8fa5b448 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 9 Jun 2017 12:27:29 -0500 Subject: Move gpg section of docs to Getting Started (#4446) --- lib/spack/docs/basic_usage.rst | 64 ------------------------------------ lib/spack/docs/getting_started.rst | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 64 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst index 6eba26a4b5..f25247579b 100644 --- a/lib/spack/docs/basic_usage.rst +++ b/lib/spack/docs/basic_usage.rst @@ -276,70 +276,6 @@ Seeing installed packages We know that ``spack list`` shows you the names of available packages, but how do you figure out which are already installed? -.. _cmd-spack-gpg: - -^^^^^^^^^^^^^ -``spack gpg`` -^^^^^^^^^^^^^ - -Spack has support for signing and verifying packages using GPG keys. A -separate keyring is used for Spack, so any keys available in the user's home -directory are not used. - -^^^^^^^^^^^^^^^^^^ -``spack gpg init`` -^^^^^^^^^^^^^^^^^^ - -When Spack is first installed, its keyring is empty. Keys stored in -:file:`var/spack/gpg` are the default keys for a Spack installation. These -keys may be imported by running ``spack gpg init``. This will import the -default keys into the keyring as trusted keys. - -------------- -Trusting keys -------------- - -Additional keys may be added to the keyring using -``spack gpg trust ``. Once a key is trusted, packages signed by the -owner of they key may be installed. - -------------- -Creating keys -------------- - -You may also create your own key so that you may sign your own packages using -``spack gpg create ``. By default, the key has no expiration, -but it may be set with the ``--expires `` flag (see the ``gnupg2`` -documentation for accepted date formats). It is also recommended to add a -comment as to the use of the key using the ``--comment `` flag. The -public half of the key can also be exported for sharing with others so that -they may use packages you have signed using the ``--export `` flag. -Secret keys may also be later exported using the -``spack gpg export [...]`` command. - ------------- -Listing keys ------------- - -In order to list the keys available in the keyring, the -``spack gpg list`` command will list trusted keys with the ``--trusted`` flag -and keys available for signing using ``--signing``. If you would like to -remove keys from your keyring, ``spack gpg untrust ``. Key IDs can be -email addresses, names, or (best) fingerprints. - ------------------------------- -Signing and Verifying Packages ------------------------------- - -In order to sign a package, ``spack gpg sign `` should be used. By -default, the signature will be written to ``.asc``, but that may be -changed by using the ``--output `` flag. If there is only one signing -key available, it will be used, but if there is more than one, the key to use -must be specified using the ``--key `` flag. The ``--clearsign`` flag -may also be used to create a signed file which contains the contents, but it -is not recommended. Signed packages may be verified by using -``spack gpg verify ``. - .. _cmd-spack-find: ^^^^^^^^^^^^^^ diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index 9b31ea4491..eaa92db694 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -987,6 +987,73 @@ written in C/C++/Fortran would need it. A potential workaround is to load a recent ``binutils`` into your environment and use the ``--dirty`` flag. +----------- +GPG Signing +----------- + +.. _cmd-spack-gpg: + +^^^^^^^^^^^^^ +``spack gpg`` +^^^^^^^^^^^^^ + +Spack has support for signing and verifying packages using GPG keys. A +separate keyring is used for Spack, so any keys available in the user's home +directory are not used. + +^^^^^^^^^^^^^^^^^^ +``spack gpg init`` +^^^^^^^^^^^^^^^^^^ + +When Spack is first installed, its keyring is empty. Keys stored in +:file:`var/spack/gpg` are the default keys for a Spack installation. These +keys may be imported by running ``spack gpg init``. This will import the +default keys into the keyring as trusted keys. + +^^^^^^^^^^^^^ +Trusting keys +^^^^^^^^^^^^^ + +Additional keys may be added to the keyring using +``spack gpg trust ``. Once a key is trusted, packages signed by the +owner of they key may be installed. + +^^^^^^^^^^^^^ +Creating keys +^^^^^^^^^^^^^ + +You may also create your own key so that you may sign your own packages using +``spack gpg create ``. By default, the key has no expiration, +but it may be set with the ``--expires `` flag (see the ``gnupg2`` +documentation for accepted date formats). It is also recommended to add a +comment as to the use of the key using the ``--comment `` flag. The +public half of the key can also be exported for sharing with others so that +they may use packages you have signed using the ``--export `` flag. +Secret keys may also be later exported using the +``spack gpg export [...]`` command. + +^^^^^^^^^^^^ +Listing keys +^^^^^^^^^^^^ + +In order to list the keys available in the keyring, the +``spack gpg list`` command will list trusted keys with the ``--trusted`` flag +and keys available for signing using ``--signing``. If you would like to +remove keys from your keyring, ``spack gpg untrust ``. Key IDs can be +email addresses, names, or (best) fingerprints. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Signing and Verifying Packages +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In order to sign a package, ``spack gpg sign `` should be used. By +default, the signature will be written to ``.asc``, but that may be +changed by using the ``--output `` flag. If there is only one signing +key available, it will be used, but if there is more than one, the key to use +must be specified using the ``--key `` flag. The ``--clearsign`` flag +may also be used to create a signed file which contains the contents, but it +is not recommended. Signed packages may be verified by using +``spack gpg verify ``. .. _cray-support: -- cgit v1.2.3-70-g09d2 From 36b8ea2f928651a53f29c0dae158f70597207173 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 9 Jun 2017 12:28:39 -0500 Subject: Add default list_url for GitLab, BitBucket, and CRAN (#4439) * Add default list_url for GitLab, BitBucket, and CRAN * Fix flake and doc tests --- lib/spack/spack/url.py | 43 +++++++++++++++++++--- var/spack/repos/builtin/packages/eigen/package.py | 1 - .../repos/builtin/packages/hoomd-blue/package.py | 3 +- .../builtin/packages/perl-term-readkey/package.py | 1 - .../repos/builtin/packages/r-abind/package.py | 1 - .../repos/builtin/packages/r-adabag/package.py | 1 - var/spack/repos/builtin/packages/r-ade4/package.py | 1 - .../repos/builtin/packages/r-adegenet/package.py | 1 - var/spack/repos/builtin/packages/r-ape/package.py | 1 - .../repos/builtin/packages/r-assertthat/package.py | 1 - .../repos/builtin/packages/r-base64enc/package.py | 1 - var/spack/repos/builtin/packages/r-bh/package.py | 1 - .../repos/builtin/packages/r-bitops/package.py | 1 - var/spack/repos/builtin/packages/r-boot/package.py | 1 - var/spack/repos/builtin/packages/r-brew/package.py | 1 - var/spack/repos/builtin/packages/r-c50/package.py | 3 +- var/spack/repos/builtin/packages/r-car/package.py | 1 - .../repos/builtin/packages/r-caret/package.py | 1 - .../repos/builtin/packages/r-catools/package.py | 3 +- .../repos/builtin/packages/r-checkpoint/package.py | 1 - .../repos/builtin/packages/r-chron/package.py | 1 - .../repos/builtin/packages/r-class/package.py | 3 +- .../repos/builtin/packages/r-cluster/package.py | 1 - var/spack/repos/builtin/packages/r-coda/package.py | 1 - .../repos/builtin/packages/r-codetools/package.py | 1 - var/spack/repos/builtin/packages/r-coin/package.py | 1 - .../repos/builtin/packages/r-colorspace/package.py | 1 - .../repos/builtin/packages/r-corrplot/package.py | 1 - .../repos/builtin/packages/r-crayon/package.py | 1 - .../repos/builtin/packages/r-cubature/package.py | 1 - .../repos/builtin/packages/r-cubist/package.py | 1 - var/spack/repos/builtin/packages/r-curl/package.py | 1 - .../repos/builtin/packages/r-data-table/package.py | 1 - var/spack/repos/builtin/packages/r-dbi/package.py | 1 - .../repos/builtin/packages/r-deldir/package.py | 1 - .../repos/builtin/packages/r-dendextend/package.py | 1 - .../repos/builtin/packages/r-deoptim/package.py | 1 - .../repos/builtin/packages/r-devtools/package.py | 1 - .../repos/builtin/packages/r-diagrammer/package.py | 1 - .../repos/builtin/packages/r-dichromat/package.py | 1 - .../repos/builtin/packages/r-digest/package.py | 1 - .../repos/builtin/packages/r-diptest/package.py | 1 - var/spack/repos/builtin/packages/r-domc/package.py | 1 - .../repos/builtin/packages/r-doparallel/package.py | 1 - .../repos/builtin/packages/r-dplyr/package.py | 1 - var/spack/repos/builtin/packages/r-dt/package.py | 1 - .../repos/builtin/packages/r-dygraphs/package.py | 1 - .../repos/builtin/packages/r-e1071/package.py | 1 - .../repos/builtin/packages/r-ellipse/package.py | 1 - var/spack/repos/builtin/packages/r-ergm/package.py | 1 - .../repos/builtin/packages/r-evaluate/package.py | 1 - var/spack/repos/builtin/packages/r-expm/package.py | 1 - .../repos/builtin/packages/r-factoextra/package.py | 1 - .../repos/builtin/packages/r-factominer/package.py | 1 - .../repos/builtin/packages/r-filehash/package.py | 1 - .../repos/builtin/packages/r-flashclust/package.py | 1 - .../repos/builtin/packages/r-flexmix/package.py | 1 - .../repos/builtin/packages/r-foreach/package.py | 1 - .../repos/builtin/packages/r-foreign/package.py | 1 - .../repos/builtin/packages/r-formatr/package.py | 1 - .../repos/builtin/packages/r-formula/package.py | 1 - var/spack/repos/builtin/packages/r-fpc/package.py | 1 - .../repos/builtin/packages/r-gdata/package.py | 1 - .../repos/builtin/packages/r-geosphere/package.py | 1 - .../repos/builtin/packages/r-ggmap/package.py | 1 - .../repos/builtin/packages/r-ggplot2/package.py | 1 - .../repos/builtin/packages/r-ggpubr/package.py | 1 - .../repos/builtin/packages/r-ggrepel/package.py | 1 - .../repos/builtin/packages/r-ggsci/package.py | 1 - .../repos/builtin/packages/r-ggvis/package.py | 1 - .../repos/builtin/packages/r-gistr/package.py | 1 - .../repos/builtin/packages/r-git2r/package.py | 1 - .../repos/builtin/packages/r-glmnet/package.py | 1 - .../repos/builtin/packages/r-gmodels/package.py | 1 - var/spack/repos/builtin/packages/r-gmp/package.py | 1 - .../repos/builtin/packages/r-googlevis/package.py | 1 - .../repos/builtin/packages/r-gridbase/package.py | 1 - .../repos/builtin/packages/r-gridextra/package.py | 1 - .../repos/builtin/packages/r-gtable/package.py | 1 - .../repos/builtin/packages/r-gtools/package.py | 1 - .../repos/builtin/packages/r-hexbin/package.py | 1 - .../repos/builtin/packages/r-highr/package.py | 1 - .../repos/builtin/packages/r-htmltools/package.py | 1 - .../builtin/packages/r-htmlwidgets/package.py | 1 - .../repos/builtin/packages/r-httpuv/package.py | 1 - var/spack/repos/builtin/packages/r-httr/package.py | 1 - .../repos/builtin/packages/r-igraph/package.py | 1 - .../repos/builtin/packages/r-inline/package.py | 1 - .../repos/builtin/packages/r-ipred/package.py | 1 - .../repos/builtin/packages/r-irlba/package.py | 1 - .../repos/builtin/packages/r-iterators/package.py | 1 - var/spack/repos/builtin/packages/r-jpeg/package.py | 1 - .../repos/builtin/packages/r-jsonlite/package.py | 1 - .../repos/builtin/packages/r-kernlab/package.py | 1 - .../repos/builtin/packages/r-kernsmooth/package.py | 1 - var/spack/repos/builtin/packages/r-kknn/package.py | 1 - .../repos/builtin/packages/r-knitr/package.py | 1 - .../repos/builtin/packages/r-labeling/package.py | 1 - .../builtin/packages/r-laplacesdemon/package.py | 1 - .../repos/builtin/packages/r-lattice/package.py | 1 - var/spack/repos/builtin/packages/r-lava/package.py | 1 - .../repos/builtin/packages/r-lazyeval/package.py | 1 - .../repos/builtin/packages/r-leaflet/package.py | 1 - .../repos/builtin/packages/r-leaps/package.py | 1 - .../repos/builtin/packages/r-learnbayes/package.py | 1 - var/spack/repos/builtin/packages/r-lme4/package.py | 1 - .../repos/builtin/packages/r-lmtest/package.py | 1 - .../repos/builtin/packages/r-lpsolve/package.py | 1 - .../repos/builtin/packages/r-lubridate/package.py | 1 - .../repos/builtin/packages/r-magic/package.py | 1 - .../repos/builtin/packages/r-magrittr/package.py | 1 - .../repos/builtin/packages/r-mapproj/package.py | 1 - var/spack/repos/builtin/packages/r-maps/package.py | 1 - .../repos/builtin/packages/r-maptools/package.py | 1 - .../repos/builtin/packages/r-markdown/package.py | 1 - var/spack/repos/builtin/packages/r-mass/package.py | 1 - .../repos/builtin/packages/r-matrix/package.py | 1 - .../builtin/packages/r-matrixmodels/package.py | 1 - .../repos/builtin/packages/r-mclust/package.py | 1 - var/spack/repos/builtin/packages/r-mda/package.py | 1 - .../repos/builtin/packages/r-memoise/package.py | 1 - var/spack/repos/builtin/packages/r-mgcv/package.py | 1 - var/spack/repos/builtin/packages/r-mime/package.py | 1 - .../repos/builtin/packages/r-minqa/package.py | 1 - .../repos/builtin/packages/r-mlbench/package.py | 1 - .../builtin/packages/r-modelmetrics/package.py | 1 - .../repos/builtin/packages/r-modeltools/package.py | 1 - .../repos/builtin/packages/r-multcomp/package.py | 1 - .../repos/builtin/packages/r-munsell/package.py | 1 - .../repos/builtin/packages/r-mvtnorm/package.py | 1 - .../repos/builtin/packages/r-ncdf4/package.py | 1 - .../repos/builtin/packages/r-network/package.py | 1 - .../repos/builtin/packages/r-networkd3/package.py | 1 - var/spack/repos/builtin/packages/r-nlme/package.py | 1 - .../repos/builtin/packages/r-nloptr/package.py | 1 - var/spack/repos/builtin/packages/r-nmf/package.py | 1 - var/spack/repos/builtin/packages/r-nnet/package.py | 1 - var/spack/repos/builtin/packages/r-np/package.py | 1 - .../repos/builtin/packages/r-numderiv/package.py | 1 - .../repos/builtin/packages/r-openssl/package.py | 1 - .../repos/builtin/packages/r-packrat/package.py | 1 - .../repos/builtin/packages/r-pacman/package.py | 1 - .../repos/builtin/packages/r-party/package.py | 1 - .../repos/builtin/packages/r-partykit/package.py | 1 - .../repos/builtin/packages/r-pbdzmq/package.py | 1 - .../repos/builtin/packages/r-pbkrtest/package.py | 1 - .../repos/builtin/packages/r-permute/package.py | 1 - .../repos/builtin/packages/r-pkgmaker/package.py | 1 - .../repos/builtin/packages/r-plotrix/package.py | 1 - var/spack/repos/builtin/packages/r-pls/package.py | 1 - var/spack/repos/builtin/packages/r-plyr/package.py | 1 - var/spack/repos/builtin/packages/r-png/package.py | 1 - .../repos/builtin/packages/r-prabclus/package.py | 1 - .../repos/builtin/packages/r-prodlim/package.py | 1 - .../repos/builtin/packages/r-proto/package.py | 1 - var/spack/repos/builtin/packages/r-pryr/package.py | 1 - .../repos/builtin/packages/r-quadprog/package.py | 1 - .../repos/builtin/packages/r-quantmod/package.py | 1 - .../repos/builtin/packages/r-quantreg/package.py | 1 - var/spack/repos/builtin/packages/r-r6/package.py | 1 - .../builtin/packages/r-randomforest/package.py | 1 - .../repos/builtin/packages/r-raster/package.py | 1 - .../repos/builtin/packages/r-rbokeh/package.py | 1 - .../builtin/packages/r-rcolorbrewer/package.py | 1 - var/spack/repos/builtin/packages/r-rcpp/package.py | 1 - .../repos/builtin/packages/r-rcppeigen/package.py | 1 - .../repos/builtin/packages/r-registry/package.py | 1 - var/spack/repos/builtin/packages/r-repr/package.py | 1 - .../repos/builtin/packages/r-reshape2/package.py | 1 - var/spack/repos/builtin/packages/r-rgl/package.py | 2 - .../builtin/packages/r-rgooglemaps/package.py | 1 - .../repos/builtin/packages/r-rinside/package.py | 1 - .../repos/builtin/packages/r-rjava/package.py | 1 - .../repos/builtin/packages/r-rjson/package.py | 1 - .../repos/builtin/packages/r-rjsonio/package.py | 1 - .../repos/builtin/packages/r-rmarkdown/package.py | 1 - .../repos/builtin/packages/r-rminer/package.py | 1 - .../repos/builtin/packages/r-rmpfr/package.py | 1 - var/spack/repos/builtin/packages/r-rmpi/package.py | 1 - .../repos/builtin/packages/r-rmysql/package.py | 1 - .../repos/builtin/packages/r-rngtools/package.py | 1 - .../repos/builtin/packages/r-rodbc/package.py | 1 - .../repos/builtin/packages/r-roxygen2/package.py | 1 - .../repos/builtin/packages/r-rpart-plot/package.py | 1 - .../repos/builtin/packages/r-rpart/package.py | 1 - .../builtin/packages/r-rpostgresql/package.py | 1 - .../repos/builtin/packages/r-rsnns/package.py | 1 - .../repos/builtin/packages/r-rsqlite/package.py | 1 - .../repos/builtin/packages/r-rstan/package.py | 1 - .../repos/builtin/packages/r-rstudioapi/package.py | 1 - var/spack/repos/builtin/packages/r-rzmq/package.py | 1 - .../repos/builtin/packages/r-sandwich/package.py | 1 - .../repos/builtin/packages/r-scales/package.py | 1 - .../builtin/packages/r-scatterplot3d/package.py | 1 - .../repos/builtin/packages/r-segmented/package.py | 1 - .../repos/builtin/packages/r-seqinr/package.py | 1 - .../repos/builtin/packages/r-shiny/package.py | 1 - var/spack/repos/builtin/packages/r-snow/package.py | 1 - var/spack/repos/builtin/packages/r-sp/package.py | 1 - .../repos/builtin/packages/r-sparsem/package.py | 1 - .../repos/builtin/packages/r-spdep/package.py | 1 - .../builtin/packages/r-stanheaders/package.py | 1 - .../builtin/packages/r-statnet-common/package.py | 1 - .../repos/builtin/packages/r-stringi/package.py | 1 - .../repos/builtin/packages/r-stringr/package.py | 1 - .../builtin/packages/r-strucchange/package.py | 1 - .../repos/builtin/packages/r-survey/package.py | 1 - .../repos/builtin/packages/r-survival/package.py | 1 - .../repos/builtin/packages/r-tarifx/package.py | 1 - .../repos/builtin/packages/r-testit/package.py | 1 - .../repos/builtin/packages/r-testthat/package.py | 1 - .../repos/builtin/packages/r-th-data/package.py | 1 - .../repos/builtin/packages/r-threejs/package.py | 1 - .../repos/builtin/packages/r-tibble/package.py | 1 - .../repos/builtin/packages/r-tidyr/package.py | 1 - .../builtin/packages/r-trimcluster/package.py | 1 - .../repos/builtin/packages/r-trust/package.py | 1 - var/spack/repos/builtin/packages/r-ttr/package.py | 1 - var/spack/repos/builtin/packages/r-uuid/package.py | 1 - var/spack/repos/builtin/packages/r-vcd/package.py | 1 - .../repos/builtin/packages/r-vegan/package.py | 1 - .../repos/builtin/packages/r-viridis/package.py | 1 - .../builtin/packages/r-viridislite/package.py | 1 - .../repos/builtin/packages/r-visnetwork/package.py | 1 - .../repos/builtin/packages/r-whisker/package.py | 1 - .../repos/builtin/packages/r-withr/package.py | 1 - .../repos/builtin/packages/r-xgboost/package.py | 1 - .../repos/builtin/packages/r-xlconnect/package.py | 1 - .../builtin/packages/r-xlconnectjars/package.py | 1 - var/spack/repos/builtin/packages/r-xlsx/package.py | 1 - .../repos/builtin/packages/r-xlsxjars/package.py | 1 - var/spack/repos/builtin/packages/r-xml/package.py | 1 - .../repos/builtin/packages/r-xtable/package.py | 1 - var/spack/repos/builtin/packages/r-xts/package.py | 1 - var/spack/repos/builtin/packages/r-yaml/package.py | 1 - var/spack/repos/builtin/packages/r-zoo/package.py | 1 - .../repos/builtin/packages/spindle/package.py | 1 - 237 files changed, 42 insertions(+), 246 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 54b3b74f1b..f20ca1f918 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -63,16 +63,49 @@ from spack.version import Version # "path" seemed like the most generic term. # def find_list_url(url): - """Finds a good list URL for the supplied URL. This depends on - the site. By default, just assumes that a good list URL is the - dirname of an archive path. For github URLs, this returns the - URL of the project's releases page. + """Finds a good list URL for the supplied URL. + + By default, returns the dirname of the archive path. + + Provides special treatment for the following websites, which have a + unique list URL different from the dirname of the download URL: + + ========= ======================================================= + GitHub https://github.com///releases + GitLab https://gitlab.\*///tags + BitBucket https://bitbucket.org///downloads/?tab=tags + CRAN https://\*.r-project.org/src/contrib/Archive/ + ========= ======================================================= + + Parameters: + url (str): The download URL for the package + + Returns: + str: The list URL for the package """ url_types = [ + # GitHub # e.g. https://github.com/llnl/callpath/archive/v1.0.1.tar.gz (r'(.*github\.com/[^/]+/[^/]+)', - lambda m: m.group(1) + '/releases')] + lambda m: m.group(1) + '/releases'), + + # GitLab + # e.g. https://gitlab.dkrz.de/k202009/libaec/uploads/631e85bcf877c2dcaca9b2e6d6526339/libaec-1.0.0.tar.gz + (r'(.*gitlab[^/]+/[^/]+/[^/]+)', + lambda m: m.group(1) + '/tags'), + + # BitBucket + # e.g. https://bitbucket.org/eigen/eigen/get/3.3.3.tar.bz2 + (r'(.*bitbucket.org/[^/]+/[^/]+)', + lambda m: m.group(1) + '/downloads/?tab=tags'), + + # CRAN + # e.g. https://cran.r-project.org/src/contrib/Rcpp_0.12.9.tar.gz + # e.g. https://cloud.r-project.org/src/contrib/rgl_0.98.1.tar.gz + (r'(.*\.r-project\.org/src/contrib)/([^_]+)', + lambda m: m.group(1) + '/Archive/' + m.group(2)), + ] for pattern, fun in url_types: match = re.search(pattern, url) diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py index 4ed2858005..07277fc3e3 100644 --- a/var/spack/repos/builtin/packages/eigen/package.py +++ b/var/spack/repos/builtin/packages/eigen/package.py @@ -32,7 +32,6 @@ class Eigen(CMakePackage): homepage = 'http://eigen.tuxfamily.org/' url = 'https://bitbucket.org/eigen/eigen/get/3.3.3.tar.bz2' - list_url = 'https://bitbucket.org/eigen/eigen/downloads/?tab=tags' version('3.3.3', 'b2ddade41040d9cf73b39b4b51e8775b') version('3.3.1', 'edb6799ef413b0868aace20d2403864c') diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py index 0aa9574a6d..bc1ffd4d5b 100644 --- a/var/spack/repos/builtin/packages/hoomd-blue/package.py +++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py @@ -40,9 +40,8 @@ class HoomdBlue(CMakePackage): git = "https://bitbucket.org/glotzer/hoomd-blue" # TODO: There is a bug in Spack that requires a url to be defined - # even if it isn't used. These URLs can hopefully be removed someday. + # even if it isn't used. This URL can hopefully be removed someday. url = "https://bitbucket.org/glotzer/hoomd-blue/get/v2.1.6.tar.bz2" - list_url = "https://bitbucket.org/glotzer/hoomd-blue/downloads/?tab=tags" version('develop', git=git, submodules=True) diff --git a/var/spack/repos/builtin/packages/perl-term-readkey/package.py b/var/spack/repos/builtin/packages/perl-term-readkey/package.py index 2b1f93cbc0..b9ab06dce1 100644 --- a/var/spack/repos/builtin/packages/perl-term-readkey/package.py +++ b/var/spack/repos/builtin/packages/perl-term-readkey/package.py @@ -36,6 +36,5 @@ class PerlTermReadkey(PerlPackage): homepage = "http://search.cpan.org/perldoc/Term::ReadKey" url = "http://www.cpan.org/authors/id/J/JS/JSTOWE/TermReadKey-2.37.tar.gz" - list_url = "http://www.cpan.org/authors/id/J/JS/JSTOWE" version('2.37', 'e8ea15c16333ac4f8d146d702e83cc0c') diff --git a/var/spack/repos/builtin/packages/r-abind/package.py b/var/spack/repos/builtin/packages/r-abind/package.py index 81fa319a90..52815298cf 100644 --- a/var/spack/repos/builtin/packages/r-abind/package.py +++ b/var/spack/repos/builtin/packages/r-abind/package.py @@ -33,6 +33,5 @@ class RAbind(RPackage): homepage = "https://cran.r-project.org/" url = "https://cran.r-project.org/src/contrib/abind_1.4-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/abind" version('1.4-3', '10fcf80c677b991bf263d38be35a1fc5') diff --git a/var/spack/repos/builtin/packages/r-adabag/package.py b/var/spack/repos/builtin/packages/r-adabag/package.py index aa16047856..a2bc90a690 100644 --- a/var/spack/repos/builtin/packages/r-adabag/package.py +++ b/var/spack/repos/builtin/packages/r-adabag/package.py @@ -30,7 +30,6 @@ class RAdabag(RPackage): homepage = "https://cran.r-project.org/package=adabag" url = "https://cran.r-project.org/src/contrib/adabag_4.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/adabag" version('4.1', '2e019f053d49f62ebb3b1697bbb50afa') diff --git a/var/spack/repos/builtin/packages/r-ade4/package.py b/var/spack/repos/builtin/packages/r-ade4/package.py index e7bc51d3af..9583db2f24 100644 --- a/var/spack/repos/builtin/packages/r-ade4/package.py +++ b/var/spack/repos/builtin/packages/r-ade4/package.py @@ -31,7 +31,6 @@ class RAde4(RPackage): homepage = "http://pbil.univ-lyon1.fr/ADE-4" url = "https://cran.r-project.org/src/contrib/ade4_1.7-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ade4" version('1.7-6', '63401ca369677538c96c3d7b75b3f4a1') diff --git a/var/spack/repos/builtin/packages/r-adegenet/package.py b/var/spack/repos/builtin/packages/r-adegenet/package.py index 368d546e1d..47347b6897 100644 --- a/var/spack/repos/builtin/packages/r-adegenet/package.py +++ b/var/spack/repos/builtin/packages/r-adegenet/package.py @@ -38,7 +38,6 @@ class RAdegenet(RPackage): homepage = "https://github.com/thibautjombart/adegenet/wiki" url = "https://cran.r-project.org/src/contrib/adegenet_2.0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/adegenet" version('2.0.1', 'ecb1220ce7c9affaba2987bc7f38adda') diff --git a/var/spack/repos/builtin/packages/r-ape/package.py b/var/spack/repos/builtin/packages/r-ape/package.py index 0476a6da29..314f9b0c4d 100644 --- a/var/spack/repos/builtin/packages/r-ape/package.py +++ b/var/spack/repos/builtin/packages/r-ape/package.py @@ -44,7 +44,6 @@ class RApe(RPackage): homepage = "http://ape-package.ird.fr/" url = "https://cran.r-project.org/src/contrib/ape_4.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ape" version('4.1', 'a9ed416d6d172d4b9682556cf692d7c2') diff --git a/var/spack/repos/builtin/packages/r-assertthat/package.py b/var/spack/repos/builtin/packages/r-assertthat/package.py index b8ab7d7a0c..f4935eaf08 100644 --- a/var/spack/repos/builtin/packages/r-assertthat/package.py +++ b/var/spack/repos/builtin/packages/r-assertthat/package.py @@ -33,6 +33,5 @@ class RAssertthat(RPackage): homepage = "https://cran.r-project.org/package=assertthat" url = "https://cran.r-project.org/src/contrib/assertthat_0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/assertthat" version('0.1', '59f9d7f7c00077ea54d763b78eeb5798') diff --git a/var/spack/repos/builtin/packages/r-base64enc/package.py b/var/spack/repos/builtin/packages/r-base64enc/package.py index 698e27a29e..1d189fac5f 100644 --- a/var/spack/repos/builtin/packages/r-base64enc/package.py +++ b/var/spack/repos/builtin/packages/r-base64enc/package.py @@ -31,6 +31,5 @@ class RBase64enc(RPackage): homepage = "http://www.rforge.net/base64enc" url = "https://cran.r-project.org/src/contrib/base64enc_0.1-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/base64enc" version('0.1-3', '0f476dacdd11a3e0ad56d13f5bc2f190') diff --git a/var/spack/repos/builtin/packages/r-bh/package.py b/var/spack/repos/builtin/packages/r-bh/package.py index 683ba24d86..44f2442cab 100644 --- a/var/spack/repos/builtin/packages/r-bh/package.py +++ b/var/spack/repos/builtin/packages/r-bh/package.py @@ -43,6 +43,5 @@ class RBh(RPackage): homepage = "https://cran.r-project.org/web/packages/BH/index.html" url = "https://cran.r-project.org/src/contrib/BH_1.60.0-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/BH" version('1.60.0-2', 'b50fdc85285da05add4e9da664a2d551') diff --git a/var/spack/repos/builtin/packages/r-bitops/package.py b/var/spack/repos/builtin/packages/r-bitops/package.py index 67bb0fe777..2b40e8c4d8 100644 --- a/var/spack/repos/builtin/packages/r-bitops/package.py +++ b/var/spack/repos/builtin/packages/r-bitops/package.py @@ -31,6 +31,5 @@ class RBitops(RPackage): homepage = "https://cran.r-project.org/package=bitops" url = "https://cran.r-project.org/src/contrib/bitops_1.0-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/bitops" version('1.0-6', 'fba16485a51b1ccd354abde5816b6bdd') diff --git a/var/spack/repos/builtin/packages/r-boot/package.py b/var/spack/repos/builtin/packages/r-boot/package.py index 1361920673..27ae21c2b8 100644 --- a/var/spack/repos/builtin/packages/r-boot/package.py +++ b/var/spack/repos/builtin/packages/r-boot/package.py @@ -32,6 +32,5 @@ class RBoot(RPackage): homepage = "https://cran.r-project.org/package=boot" url = "https://cran.r-project.org/src/contrib/boot_1.3-18.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/boot" version('1.3-18', '711dd58af14e1027eb8377d9202e9b6f') diff --git a/var/spack/repos/builtin/packages/r-brew/package.py b/var/spack/repos/builtin/packages/r-brew/package.py index 558d830a2b..f4aea09172 100644 --- a/var/spack/repos/builtin/packages/r-brew/package.py +++ b/var/spack/repos/builtin/packages/r-brew/package.py @@ -32,6 +32,5 @@ class RBrew(RPackage): homepage = "https://cran.r-project.org/package=brew" url = "https://cran.r-project.org/src/contrib/brew_1.0-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/brew" version('1.0-6', '4aaca5e6ec145e0fc0fe6375ce1f3806') diff --git a/var/spack/repos/builtin/packages/r-c50/package.py b/var/spack/repos/builtin/packages/r-c50/package.py index 571f8f461b..323f8efbea 100644 --- a/var/spack/repos/builtin/packages/r-c50/package.py +++ b/var/spack/repos/builtin/packages/r-c50/package.py @@ -31,8 +31,7 @@ class RC50(RPackage): homepage = "https://cran.r-project.org/package=C50" url = "https://cran.r-project.org/src/contrib/C50_0.1.0-24.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/C50" version('0.1.0-24', '42631e65c5c579532cc6edf5ea175949') - depends_on('r-partykit', type=('build','run')) + depends_on('r-partykit', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-car/package.py b/var/spack/repos/builtin/packages/r-car/package.py index 56c87c27a6..2fa7380ca3 100644 --- a/var/spack/repos/builtin/packages/r-car/package.py +++ b/var/spack/repos/builtin/packages/r-car/package.py @@ -31,7 +31,6 @@ class RCar(RPackage): homepage = "https://r-forge.r-project.org/projects/car/" url = "https://cran.r-project.org/src/contrib/car_2.1-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/car" version('2.1-4', 'a66c307e8ccf0c336ed197c0f1799565') version('2.1-2', '0f78ad74ef7130126d319acec23951a0') diff --git a/var/spack/repos/builtin/packages/r-caret/package.py b/var/spack/repos/builtin/packages/r-caret/package.py index 277fdc7143..a20a5c2280 100644 --- a/var/spack/repos/builtin/packages/r-caret/package.py +++ b/var/spack/repos/builtin/packages/r-caret/package.py @@ -31,7 +31,6 @@ class RCaret(RPackage): homepage = "https://github.com/topepo/caret/" url = "https://cran.r-project.org/src/contrib/caret_6.0-73.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/caret" version('6.0-73', 'ca869e3357b5358f028fb926eb62eb70') version('6.0-70', '202d7abb6a679af716ea69fb2573f108') diff --git a/var/spack/repos/builtin/packages/r-catools/package.py b/var/spack/repos/builtin/packages/r-catools/package.py index 7b82a19c01..78165c59b4 100644 --- a/var/spack/repos/builtin/packages/r-catools/package.py +++ b/var/spack/repos/builtin/packages/r-catools/package.py @@ -34,8 +34,7 @@ class RCatools(RPackage): homepage = "https://cran.r-project.org/package=caTools" url = "https://cran.r-project.org/src/contrib/caTools_1.17.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/caTools" version('1.17.1', '5c872bbc78b177b306f36709deb44498') - depends_on('r-bitops', type=('build','run')) + depends_on('r-bitops', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-checkpoint/package.py b/var/spack/repos/builtin/packages/r-checkpoint/package.py index 5fd862fa46..299051ddbb 100644 --- a/var/spack/repos/builtin/packages/r-checkpoint/package.py +++ b/var/spack/repos/builtin/packages/r-checkpoint/package.py @@ -33,7 +33,6 @@ class RCheckpoint(RPackage): homepage = "https://cran.r-project.org/package=checkpoint" url = "https://cran.r-project.org/src/contrib/checkpoint_0.3.18.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/checkpoint" version('0.3.18', '021d7faeb72c36167951e103b2b065ea') version('0.3.15', 'a4aa8320338f1434a330d984e97981ea') diff --git a/var/spack/repos/builtin/packages/r-chron/package.py b/var/spack/repos/builtin/packages/r-chron/package.py index e1731424b3..00d08070ee 100644 --- a/var/spack/repos/builtin/packages/r-chron/package.py +++ b/var/spack/repos/builtin/packages/r-chron/package.py @@ -30,6 +30,5 @@ class RChron(RPackage): homepage = "https://cran.r-project.org/package=chron" url = "https://cran.r-project.org/src/contrib/chron_2.3-47.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/chron" version('2.3-47', 'b8890cdc5f2337f8fd775b0becdcdd1f') diff --git a/var/spack/repos/builtin/packages/r-class/package.py b/var/spack/repos/builtin/packages/r-class/package.py index de81e7588e..238e754398 100644 --- a/var/spack/repos/builtin/packages/r-class/package.py +++ b/var/spack/repos/builtin/packages/r-class/package.py @@ -31,8 +31,7 @@ class RClass(RPackage): homepage = "http://www.stats.ox.ac.uk/pub/MASS4/" url = "https://cran.r-project.org/src/contrib/class_7.3-14.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/class" version('7.3-14', '6a21dd206fe4ea29c55faeb65fb2b71e') - depends_on('r-mass', type=('build','run')) + depends_on('r-mass', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/r-cluster/package.py b/var/spack/repos/builtin/packages/r-cluster/package.py index caa96a380a..b5b8544710 100644 --- a/var/spack/repos/builtin/packages/r-cluster/package.py +++ b/var/spack/repos/builtin/packages/r-cluster/package.py @@ -32,7 +32,6 @@ class RCluster(RPackage): homepage = "https://cran.r-project.org/web/packages/cluster/index.html" url = "https://cran.r-project.org/src/contrib/cluster_2.0.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/cluster" version('2.0.5', '7330f209ebce960bdee1a6d6679cb85a') version('2.0.4', 'bb4deceaafb1c42bb1278d5d0dc11e59') diff --git a/var/spack/repos/builtin/packages/r-coda/package.py b/var/spack/repos/builtin/packages/r-coda/package.py index 08f0f10bb4..9645aab046 100644 --- a/var/spack/repos/builtin/packages/r-coda/package.py +++ b/var/spack/repos/builtin/packages/r-coda/package.py @@ -33,7 +33,6 @@ class RCoda(RPackage): homepage = "https://cran.r-project.org/web/packages/coda/index.html" url = "https://cran.r-project.org/src/contrib/coda_0.19-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/coda" version('0.19-1', '0d2aca6a5a3bdae9542708817c1ec001') diff --git a/var/spack/repos/builtin/packages/r-codetools/package.py b/var/spack/repos/builtin/packages/r-codetools/package.py index 60b8fc2cc8..07c9b442fd 100644 --- a/var/spack/repos/builtin/packages/r-codetools/package.py +++ b/var/spack/repos/builtin/packages/r-codetools/package.py @@ -30,7 +30,6 @@ class RCodetools(RPackage): homepage = "https://cran.r-project.org/web/packages/codetools/index.html" url = "https://cran.r-project.org/src/contrib/codetools_0.2-15.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/codetools" version('0.2-15', '37419cbc3de81984cf6d9b207d4f62d4') version('0.2-14', '7ec41d4f8bd6ba85facc8c5e6adc1f4d') diff --git a/var/spack/repos/builtin/packages/r-coin/package.py b/var/spack/repos/builtin/packages/r-coin/package.py index 51b61a6164..b2208f5c15 100644 --- a/var/spack/repos/builtin/packages/r-coin/package.py +++ b/var/spack/repos/builtin/packages/r-coin/package.py @@ -32,7 +32,6 @@ class RCoin(RPackage): homepage = "https://cran.r-project.org/package=coin" url = "https://cran.r-project.org/src/contrib/coin_1.1-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/coin" version('1.1-3', '97d3d21f1e4a5762e36dd718dd2d0661') diff --git a/var/spack/repos/builtin/packages/r-colorspace/package.py b/var/spack/repos/builtin/packages/r-colorspace/package.py index af2895acbf..c5c022e6ab 100644 --- a/var/spack/repos/builtin/packages/r-colorspace/package.py +++ b/var/spack/repos/builtin/packages/r-colorspace/package.py @@ -33,7 +33,6 @@ class RColorspace(RPackage): homepage = "https://cran.r-project.org/web/packages/colorspace/index.html" url = "https://cran.r-project.org/src/contrib/colorspace_1.3-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/colorspace" version('1.3-2', '63000bab81d995ff167df76fb97b2984') version('1.2-6', 'a30191e9caf66f77ff4e99c062e9dce1') diff --git a/var/spack/repos/builtin/packages/r-corrplot/package.py b/var/spack/repos/builtin/packages/r-corrplot/package.py index ccae3bf913..bc7b7f7cde 100644 --- a/var/spack/repos/builtin/packages/r-corrplot/package.py +++ b/var/spack/repos/builtin/packages/r-corrplot/package.py @@ -31,6 +31,5 @@ class RCorrplot(RPackage): homepage = "https://cran.r-project.org/package=corrplot" url = "https://cran.r-project.org/src/contrib/corrplot_0.77.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/corrplot" version('0.77', '2a5d54fd5c65618b9afba1a32f6b4542') diff --git a/var/spack/repos/builtin/packages/r-crayon/package.py b/var/spack/repos/builtin/packages/r-crayon/package.py index 2002ea5419..99c0d248ea 100644 --- a/var/spack/repos/builtin/packages/r-crayon/package.py +++ b/var/spack/repos/builtin/packages/r-crayon/package.py @@ -34,6 +34,5 @@ class RCrayon(RPackage): homepage = "https://github.com/gaborcsardi/crayon" url = "https://cran.r-project.org/src/contrib/crayon_1.3.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/crayon" version('1.3.2', 'fe29c6204d2d6ff4c2f9d107a03d0cb9') diff --git a/var/spack/repos/builtin/packages/r-cubature/package.py b/var/spack/repos/builtin/packages/r-cubature/package.py index 918f8e9e3d..747e5e9e1f 100644 --- a/var/spack/repos/builtin/packages/r-cubature/package.py +++ b/var/spack/repos/builtin/packages/r-cubature/package.py @@ -30,6 +30,5 @@ class RCubature(RPackage): homepage = "https://cran.r-project.org/package=cubature" url = "https://cran.r-project.org/src/contrib/cubature_1.1-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/cubature" version('1.1-2', '5617e1d82baa803a3814d92461da45c9') diff --git a/var/spack/repos/builtin/packages/r-cubist/package.py b/var/spack/repos/builtin/packages/r-cubist/package.py index acc0261383..6e1d8d10cc 100644 --- a/var/spack/repos/builtin/packages/r-cubist/package.py +++ b/var/spack/repos/builtin/packages/r-cubist/package.py @@ -30,7 +30,6 @@ class RCubist(RPackage): homepage = "https://cran.r-project.org/package=Cubist" url = "https://cran.r-project.org/src/contrib/Cubist_0.0.19.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/Cubist" version('0.0.19', 'bf9364f655536ec03717fd2ad6223a47') diff --git a/var/spack/repos/builtin/packages/r-curl/package.py b/var/spack/repos/builtin/packages/r-curl/package.py index ae9ccf3f5e..076872acc7 100644 --- a/var/spack/repos/builtin/packages/r-curl/package.py +++ b/var/spack/repos/builtin/packages/r-curl/package.py @@ -38,7 +38,6 @@ class RCurl(RPackage): homepage = "https://github.com/jeroenooms/curl" url = "https://cran.r-project.org/src/contrib/curl_2.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/curl" version('2.3', '7250ee8caed98ba76906ab4d32da60f8') version('1.0', '93d34926d6071e1fba7e728b482f0dd9') diff --git a/var/spack/repos/builtin/packages/r-data-table/package.py b/var/spack/repos/builtin/packages/r-data-table/package.py index 4381d1e0f8..c6f45ba5bf 100644 --- a/var/spack/repos/builtin/packages/r-data-table/package.py +++ b/var/spack/repos/builtin/packages/r-data-table/package.py @@ -33,7 +33,6 @@ class RDataTable(RPackage): homepage = "https://github.com/Rdatatable/data.table/wiki" url = "https://cran.r-project.org/src/contrib/data.table_1.10.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/data.table" version('1.10.0', 'f0e08dd5ba1b3f46c59dd1574fe497c1') version('1.9.6', 'b1c0c7cce490bdf42ab288541cc55372') diff --git a/var/spack/repos/builtin/packages/r-dbi/package.py b/var/spack/repos/builtin/packages/r-dbi/package.py index f00100bdf0..256d638812 100644 --- a/var/spack/repos/builtin/packages/r-dbi/package.py +++ b/var/spack/repos/builtin/packages/r-dbi/package.py @@ -32,6 +32,5 @@ class RDbi(RPackage): homepage = "https://github.com/rstats-db/DBI" url = "https://cran.r-project.org/src/contrib/DBI_0.4-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/DBI" version('0.4-1', 'c7ee8f1c5037c2284e99c62698d0f087') diff --git a/var/spack/repos/builtin/packages/r-deldir/package.py b/var/spack/repos/builtin/packages/r-deldir/package.py index 4a08be58bb..3e3d556a17 100644 --- a/var/spack/repos/builtin/packages/r-deldir/package.py +++ b/var/spack/repos/builtin/packages/r-deldir/package.py @@ -34,7 +34,6 @@ class RDeldir(RPackage): homepage = "https://CRAN.R-project.org/package=deldir" url = "https://cran.r-project.org/src/contrib/deldir_0.1-14.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/deldir" version('0.1-14', '6a22b13d962615cd9d51b6eae403409f') diff --git a/var/spack/repos/builtin/packages/r-dendextend/package.py b/var/spack/repos/builtin/packages/r-dendextend/package.py index 3bde46b6f0..c30491ef67 100644 --- a/var/spack/repos/builtin/packages/r-dendextend/package.py +++ b/var/spack/repos/builtin/packages/r-dendextend/package.py @@ -30,7 +30,6 @@ class RDendextend(RPackage): homepage = "https://CRAN.R-project.org/package=dendextend" url = "https://cran.r-project.org/src/contrib/dendextend_1.5.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/dendextend" version('1.5.2', '1134869d94005727c63cf3037e2f1bbf') diff --git a/var/spack/repos/builtin/packages/r-deoptim/package.py b/var/spack/repos/builtin/packages/r-deoptim/package.py index 5334953d46..521c5e7a4b 100644 --- a/var/spack/repos/builtin/packages/r-deoptim/package.py +++ b/var/spack/repos/builtin/packages/r-deoptim/package.py @@ -32,6 +32,5 @@ class RDeoptim(RPackage): homepage = "https://cran.r-project.org/package=DEoptim" url = "https://cran.r-project.org/src/contrib/DEoptim_2.2-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/DEoptim" version('2.2-3', 'ed406e6790f8f1568aa9bec159f80326') diff --git a/var/spack/repos/builtin/packages/r-devtools/package.py b/var/spack/repos/builtin/packages/r-devtools/package.py index c994f557c8..f5e395c715 100644 --- a/var/spack/repos/builtin/packages/r-devtools/package.py +++ b/var/spack/repos/builtin/packages/r-devtools/package.py @@ -30,7 +30,6 @@ class RDevtools(RPackage): homepage = "https://github.com/hadley/devtools" url = "https://cran.r-project.org/src/contrib/devtools_1.12.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/devtools" version('1.12.0', '73b46c446273566e5b21c9f5f72aeca3') version('1.11.1', '242672ee27d24dddcbdaac88c586b6c2') diff --git a/var/spack/repos/builtin/packages/r-diagrammer/package.py b/var/spack/repos/builtin/packages/r-diagrammer/package.py index 5f8e27a102..8db0ab3736 100644 --- a/var/spack/repos/builtin/packages/r-diagrammer/package.py +++ b/var/spack/repos/builtin/packages/r-diagrammer/package.py @@ -30,7 +30,6 @@ class RDiagrammer(RPackage): homepage = "https://github.com/rich-iannone/DiagrammeR" url = "https://cran.r-project.org/src/contrib/DiagrammeR_0.8.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/DiagrammeR" version('0.8.4', '9ee295c744f5d4ba9a84289ca7bdaf1a') diff --git a/var/spack/repos/builtin/packages/r-dichromat/package.py b/var/spack/repos/builtin/packages/r-dichromat/package.py index ea465e2d6c..57942674f2 100644 --- a/var/spack/repos/builtin/packages/r-dichromat/package.py +++ b/var/spack/repos/builtin/packages/r-dichromat/package.py @@ -31,6 +31,5 @@ class RDichromat(RPackage): homepage = "https://cran.r-project.org/web/packages/dichromat/index.html" url = "https://cran.r-project.org/src/contrib/dichromat_2.0-0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/dichromat" version('2.0-0', '84e194ac95a69763d740947a7ee346a6') diff --git a/var/spack/repos/builtin/packages/r-digest/package.py b/var/spack/repos/builtin/packages/r-digest/package.py index 08f5af0aca..8919af2f5a 100644 --- a/var/spack/repos/builtin/packages/r-digest/package.py +++ b/var/spack/repos/builtin/packages/r-digest/package.py @@ -45,7 +45,6 @@ class RDigest(RPackage): homepage = "http://dirk.eddelbuettel.com/code/digest.html" url = "https://cran.r-project.org/src/contrib/digest_0.6.12.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/digest" version('0.6.12', '738efd4d9a37c5a4001ae66e954ce07e') version('0.6.11', '52a864f55846b48b3cab0b5d0304a82a') diff --git a/var/spack/repos/builtin/packages/r-diptest/package.py b/var/spack/repos/builtin/packages/r-diptest/package.py index f9ce2dd794..e64a490710 100644 --- a/var/spack/repos/builtin/packages/r-diptest/package.py +++ b/var/spack/repos/builtin/packages/r-diptest/package.py @@ -30,6 +30,5 @@ class RDiptest(RPackage): homepage = "https://CRAN.R-project.org/package=diptest" url = "https://cran.r-project.org/src/contrib/diptest_0.75-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/diptest" version('0.75-7', '1a4a958fda763f7c99cb485dbe5954ab') diff --git a/var/spack/repos/builtin/packages/r-domc/package.py b/var/spack/repos/builtin/packages/r-domc/package.py index 1a44aa537d..163004f4a5 100644 --- a/var/spack/repos/builtin/packages/r-domc/package.py +++ b/var/spack/repos/builtin/packages/r-domc/package.py @@ -31,7 +31,6 @@ class RDomc(RPackage): homepage = "https://cran.r-project.org/package=doMC" url = "https://cran.r-project.org/src/contrib/doMC_1.3.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/doMC" version('1.3.4', 'f965b09add9056e84f99a831dc3af7d1') diff --git a/var/spack/repos/builtin/packages/r-doparallel/package.py b/var/spack/repos/builtin/packages/r-doparallel/package.py index fa039568c6..04d9bd06a7 100644 --- a/var/spack/repos/builtin/packages/r-doparallel/package.py +++ b/var/spack/repos/builtin/packages/r-doparallel/package.py @@ -31,7 +31,6 @@ class RDoparallel(RPackage): homepage = "https://cran.r-project.org/web/packages/doParallel/index.html" url = "https://cran.r-project.org/src/contrib/doParallel_1.0.10.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/doParallel" version('1.0.10', 'd9fbde8f315d98d055483ee3493c9b43') diff --git a/var/spack/repos/builtin/packages/r-dplyr/package.py b/var/spack/repos/builtin/packages/r-dplyr/package.py index 6ffa48adc8..682753cc63 100644 --- a/var/spack/repos/builtin/packages/r-dplyr/package.py +++ b/var/spack/repos/builtin/packages/r-dplyr/package.py @@ -31,7 +31,6 @@ class RDplyr(RPackage): homepage = "https://github.com/hadley/dplyr" url = "https://cran.r-project.org/src/contrib/dplyr_0.5.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/dplyr" version('0.5.0', '1fcafcacca70806eea2e6d465cdb94ef') diff --git a/var/spack/repos/builtin/packages/r-dt/package.py b/var/spack/repos/builtin/packages/r-dt/package.py index ae92f5fd24..85e6fee837 100644 --- a/var/spack/repos/builtin/packages/r-dt/package.py +++ b/var/spack/repos/builtin/packages/r-dt/package.py @@ -33,7 +33,6 @@ class RDt(RPackage): homepage = "http://rstudio.github.io/DT" url = "https://cran.r-project.org/src/contrib/DT_0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/DT/" version('0.1', '5c8df984921fa484784ec4b8a4fb6f3c') diff --git a/var/spack/repos/builtin/packages/r-dygraphs/package.py b/var/spack/repos/builtin/packages/r-dygraphs/package.py index 323fb6d584..d9e66d86f7 100644 --- a/var/spack/repos/builtin/packages/r-dygraphs/package.py +++ b/var/spack/repos/builtin/packages/r-dygraphs/package.py @@ -34,7 +34,6 @@ class RDygraphs(RPackage): homepage = "https://cran.r-project.org/web/packages/dygraphs/index.html" url = "https://cran.r-project.org/src/contrib/dygraphs_0.9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/dygraphs" version('0.9', '7f0ce4312bcd3f0a58b8c03b2772f833') diff --git a/var/spack/repos/builtin/packages/r-e1071/package.py b/var/spack/repos/builtin/packages/r-e1071/package.py index 4d79fcccd7..545909bf28 100644 --- a/var/spack/repos/builtin/packages/r-e1071/package.py +++ b/var/spack/repos/builtin/packages/r-e1071/package.py @@ -32,7 +32,6 @@ class RE1071(RPackage): homepage = "https://cran.r-project.org/package=e1071" url = "https://cran.r-project.org/src/contrib/e1071_1.6-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/e1071" version('1.6-7', 'd109a7e3dd0c905d420e327a9a921f5a') diff --git a/var/spack/repos/builtin/packages/r-ellipse/package.py b/var/spack/repos/builtin/packages/r-ellipse/package.py index 1f6144285e..e106a4322d 100644 --- a/var/spack/repos/builtin/packages/r-ellipse/package.py +++ b/var/spack/repos/builtin/packages/r-ellipse/package.py @@ -31,7 +31,6 @@ class REllipse(RPackage): homepage = "https://cran.r-project.org/package=ellipse" url = "https://cran.r-project.org/src/contrib/ellipse_0.3-8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ellipse" version('0.3-8', '385f5ec5e49bcda4317ca9dffd33f771') diff --git a/var/spack/repos/builtin/packages/r-ergm/package.py b/var/spack/repos/builtin/packages/r-ergm/package.py index 72663cc1f8..06e3a0379a 100644 --- a/var/spack/repos/builtin/packages/r-ergm/package.py +++ b/var/spack/repos/builtin/packages/r-ergm/package.py @@ -32,7 +32,6 @@ class RErgm(RPackage): homepage = "http://statnet.org" url = "https://cran.r-project.org/src/contrib/ergm_3.7.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ergm" version('3.7.1', '431ae430c76b2408988f469831d80126') diff --git a/var/spack/repos/builtin/packages/r-evaluate/package.py b/var/spack/repos/builtin/packages/r-evaluate/package.py index 004048e985..ba0a9d5d15 100644 --- a/var/spack/repos/builtin/packages/r-evaluate/package.py +++ b/var/spack/repos/builtin/packages/r-evaluate/package.py @@ -33,7 +33,6 @@ class REvaluate(RPackage): homepage = "https://github.com/hadley/evaluate" url = "https://cran.rstudio.com/src/contrib/evaluate_0.9.tar.gz" - list_url = "https://cran.rstudio.com/src/contrib/Archive/evaluate" version('0.10', 'c49326babf984a8b36e7e276da370ad2') version('0.9', '877d89ce8a9ef7f403b1089ca1021775') diff --git a/var/spack/repos/builtin/packages/r-expm/package.py b/var/spack/repos/builtin/packages/r-expm/package.py index ba129a3071..e2ad579441 100644 --- a/var/spack/repos/builtin/packages/r-expm/package.py +++ b/var/spack/repos/builtin/packages/r-expm/package.py @@ -31,6 +31,5 @@ class RExpm(RPackage): homepage = "http://R-Forge.R-project.org/projects/expm" url = "https://cran.r-project.org/src/contrib/expm_0.999-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/expm" version('0.999-2', 'e05fa3f995754af92bd03227625da984') diff --git a/var/spack/repos/builtin/packages/r-factoextra/package.py b/var/spack/repos/builtin/packages/r-factoextra/package.py index 44b39e7326..00052e61a5 100644 --- a/var/spack/repos/builtin/packages/r-factoextra/package.py +++ b/var/spack/repos/builtin/packages/r-factoextra/package.py @@ -31,7 +31,6 @@ class RFactoextra(RPackage): homepage = "http://www.sthda.com/english/rpkgs/factoextra" url = "https://cran.r-project.org/src/contrib/factoextra_1.0.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/factoextra" version('1.0.4', 'aa4c81ca610f17fdee0c9f3379e35429') diff --git a/var/spack/repos/builtin/packages/r-factominer/package.py b/var/spack/repos/builtin/packages/r-factominer/package.py index 909e6871bf..078caf4280 100644 --- a/var/spack/repos/builtin/packages/r-factominer/package.py +++ b/var/spack/repos/builtin/packages/r-factominer/package.py @@ -30,7 +30,6 @@ class RFactominer(RPackage): homepage = "http://factominer.free.fr" url = "https://cran.r-project.org/src/contrib/FactoMineR_1.35.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/FactoMineR" version('1.35', 'bef076181ce942016114dd7a6f5c2348') diff --git a/var/spack/repos/builtin/packages/r-filehash/package.py b/var/spack/repos/builtin/packages/r-filehash/package.py index b17335ed11..9f67ecad37 100644 --- a/var/spack/repos/builtin/packages/r-filehash/package.py +++ b/var/spack/repos/builtin/packages/r-filehash/package.py @@ -38,6 +38,5 @@ class RFilehash(RPackage): homepage = 'https://cran.r-project.org/' url = "https://cran.r-project.org/src/contrib/filehash_2.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/filehash" version('2.3', '01fffafe09b148ccadc9814c103bdc2f') diff --git a/var/spack/repos/builtin/packages/r-flashclust/package.py b/var/spack/repos/builtin/packages/r-flashclust/package.py index e8ea8c76e4..a5adeb5016 100644 --- a/var/spack/repos/builtin/packages/r-flashclust/package.py +++ b/var/spack/repos/builtin/packages/r-flashclust/package.py @@ -30,7 +30,6 @@ class RFlashclust(RPackage): homepage = "https://CRAN.R-project.org/package=flashClust" url = "https://cran.r-project.org/src/contrib/flashClust_1.01-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/flashClust" version('1.01-2', '23409aeeef98bf35d0b3d5dd755fdeff') diff --git a/var/spack/repos/builtin/packages/r-flexmix/package.py b/var/spack/repos/builtin/packages/r-flexmix/package.py index ebaed1ebd8..715a710743 100644 --- a/var/spack/repos/builtin/packages/r-flexmix/package.py +++ b/var/spack/repos/builtin/packages/r-flexmix/package.py @@ -30,7 +30,6 @@ class RFlexmix(RPackage): homepage = "https://CRAN.R-project.org/package=flexmix" url = "https://cran.r-project.org/src/contrib/flexmix_2.3-14.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/flexmix" version('2.3-14', '5be4f7764e6a697f4586e60c2bf6e960') diff --git a/var/spack/repos/builtin/packages/r-foreach/package.py b/var/spack/repos/builtin/packages/r-foreach/package.py index 78efe02188..527cd5a110 100644 --- a/var/spack/repos/builtin/packages/r-foreach/package.py +++ b/var/spack/repos/builtin/packages/r-foreach/package.py @@ -36,7 +36,6 @@ class RForeach(RPackage): homepage = "https://cran.r-project.org/web/packages/foreach/index.html" url = "https://cran.r-project.org/src/contrib/foreach_1.4.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/foreach" version('1.4.3', 'ef45768126661b259f9b8994462c49a0') diff --git a/var/spack/repos/builtin/packages/r-foreign/package.py b/var/spack/repos/builtin/packages/r-foreign/package.py index b293f091c2..a3549068dc 100644 --- a/var/spack/repos/builtin/packages/r-foreign/package.py +++ b/var/spack/repos/builtin/packages/r-foreign/package.py @@ -32,6 +32,5 @@ class RForeign(RPackage): homepage = "https://cran.r-project.org/web/packages/foreign/index.html" url = "https://cran.r-project.org/src/contrib/foreign_0.8-66.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/foreign" version('0.8-66', 'ff12190f4631dca31e30ca786c2c8f62') diff --git a/var/spack/repos/builtin/packages/r-formatr/package.py b/var/spack/repos/builtin/packages/r-formatr/package.py index 011111af07..814e83ffac 100644 --- a/var/spack/repos/builtin/packages/r-formatr/package.py +++ b/var/spack/repos/builtin/packages/r-formatr/package.py @@ -35,7 +35,6 @@ class RFormatr(RPackage): homepage = "http://yihui.name/formatR" url = "https://cran.r-project.org/src/contrib/formatR_1.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/formatR" version('1.4', '98b9b64b2785b35f9df403e1aab6c73c') diff --git a/var/spack/repos/builtin/packages/r-formula/package.py b/var/spack/repos/builtin/packages/r-formula/package.py index 5515ca91a3..2381f5a115 100644 --- a/var/spack/repos/builtin/packages/r-formula/package.py +++ b/var/spack/repos/builtin/packages/r-formula/package.py @@ -32,6 +32,5 @@ class RFormula(RPackage): homepage = "https://cran.r-project.org/package=Formula" url = "https://cran.r-project.org/src/contrib/Formula_1.2-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/Formula" version('1.2-1', '2afb31e637cecd0c1106317aca1e4849') diff --git a/var/spack/repos/builtin/packages/r-fpc/package.py b/var/spack/repos/builtin/packages/r-fpc/package.py index 8a50a984f4..675e3b7c96 100644 --- a/var/spack/repos/builtin/packages/r-fpc/package.py +++ b/var/spack/repos/builtin/packages/r-fpc/package.py @@ -30,7 +30,6 @@ class RFpc(RPackage): homepage = "http://www.homepages.ucl.ac.uk/~ucakche" url = "https://cran.r-project.org/src/contrib/fpc_2.1-10.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/fpc" version('2.1-10', '75e5340e416cd13d7751e06f1c07866b') diff --git a/var/spack/repos/builtin/packages/r-gdata/package.py b/var/spack/repos/builtin/packages/r-gdata/package.py index ef001699bb..b68a8b91c2 100644 --- a/var/spack/repos/builtin/packages/r-gdata/package.py +++ b/var/spack/repos/builtin/packages/r-gdata/package.py @@ -46,7 +46,6 @@ class RGdata(RPackage): homepage = "https://cran.r-project.org/package=gdata" url = "https://cran.r-project.org/src/contrib/gdata_2.17.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gdata" version('2.17.0', 'c716b663b9dc16ad8cafe6acc781a75f') diff --git a/var/spack/repos/builtin/packages/r-geosphere/package.py b/var/spack/repos/builtin/packages/r-geosphere/package.py index d90594a3e0..93f56a2873 100644 --- a/var/spack/repos/builtin/packages/r-geosphere/package.py +++ b/var/spack/repos/builtin/packages/r-geosphere/package.py @@ -32,7 +32,6 @@ class RGeosphere(RPackage): homepage = "https://cran.r-project.org/package=geosphere" url = "https://cran.r-project.org/src/contrib/geosphere_1.5-5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/geosphere" version('1.5-5', '28efb7a8e266c7f076cdbcf642455f3e') diff --git a/var/spack/repos/builtin/packages/r-ggmap/package.py b/var/spack/repos/builtin/packages/r-ggmap/package.py index 65a69553a1..40b81aef31 100644 --- a/var/spack/repos/builtin/packages/r-ggmap/package.py +++ b/var/spack/repos/builtin/packages/r-ggmap/package.py @@ -33,7 +33,6 @@ class RGgmap(RPackage): homepage = "https://github.com/dkahle/ggmap" url = "https://cran.r-project.org/src/contrib/ggmap_2.6.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ggmap" version('2.6.1', '25ad414a3a1c6d59a227a9f22601211a') diff --git a/var/spack/repos/builtin/packages/r-ggplot2/package.py b/var/spack/repos/builtin/packages/r-ggplot2/package.py index e5c80e4b79..da514768fc 100644 --- a/var/spack/repos/builtin/packages/r-ggplot2/package.py +++ b/var/spack/repos/builtin/packages/r-ggplot2/package.py @@ -36,7 +36,6 @@ class RGgplot2(RPackage): homepage = "http://ggplot2.org/" url = "https://cran.r-project.org/src/contrib/ggplot2_2.2.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ggplot2" version('2.2.1', '14c5a3507bc123c6e7e9ad3bef7cee5c') version('2.1.0', '771928cfb97c649c720423deb3ec7fd3') diff --git a/var/spack/repos/builtin/packages/r-ggpubr/package.py b/var/spack/repos/builtin/packages/r-ggpubr/package.py index 52184b7307..538a0f5d33 100644 --- a/var/spack/repos/builtin/packages/r-ggpubr/package.py +++ b/var/spack/repos/builtin/packages/r-ggpubr/package.py @@ -30,7 +30,6 @@ class RGgpubr(RPackage): homepage = "http://www.sthda.com/english/rpkgs/ggpubr" url = "https://cran.r-project.org/src/contrib/ggpubr_0.1.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ggpubr" version('0.1.2', '42a5749ae44121597ef511a7424429d1') diff --git a/var/spack/repos/builtin/packages/r-ggrepel/package.py b/var/spack/repos/builtin/packages/r-ggrepel/package.py index c1547655c0..8bda46f398 100644 --- a/var/spack/repos/builtin/packages/r-ggrepel/package.py +++ b/var/spack/repos/builtin/packages/r-ggrepel/package.py @@ -30,7 +30,6 @@ class RGgrepel(RPackage): homepage = "http://github.com/slowkow/ggrepel" url = "https://cran.r-project.org/src/contrib/ggrepel_0.6.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ggrepel" version('0.6.5', '7e2732cd4840efe2dc9e4bc689cf1ee5') diff --git a/var/spack/repos/builtin/packages/r-ggsci/package.py b/var/spack/repos/builtin/packages/r-ggsci/package.py index fb811ff2fe..5372677163 100644 --- a/var/spack/repos/builtin/packages/r-ggsci/package.py +++ b/var/spack/repos/builtin/packages/r-ggsci/package.py @@ -31,7 +31,6 @@ class RGgsci(RPackage): homepage = "https://github.com/road2stat/ggsci" url = "https://cran.r-project.org/src/contrib/ggsci_2.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ggsci" version('2.4', '8e5dc2fcf84352cacbb91363e26c7175') diff --git a/var/spack/repos/builtin/packages/r-ggvis/package.py b/var/spack/repos/builtin/packages/r-ggvis/package.py index 5acbff04b0..14d65a0223 100644 --- a/var/spack/repos/builtin/packages/r-ggvis/package.py +++ b/var/spack/repos/builtin/packages/r-ggvis/package.py @@ -32,7 +32,6 @@ class RGgvis(RPackage): homepage = "http://ggvis.rstudio.com/" url = "https://cran.r-project.org/src/contrib/ggvis_0.4.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ggvis" version('0.4.2', '039f45e5c7f1e0652779163d7d99f922') diff --git a/var/spack/repos/builtin/packages/r-gistr/package.py b/var/spack/repos/builtin/packages/r-gistr/package.py index 67c34cfffc..644d6f12d0 100644 --- a/var/spack/repos/builtin/packages/r-gistr/package.py +++ b/var/spack/repos/builtin/packages/r-gistr/package.py @@ -36,7 +36,6 @@ class RGistr(RPackage): homepage = "https://github.com/ropensci/gistr" url = "https://cran.r-project.org/src/contrib/gistr_0.3.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gistr" version('0.3.6', '49d548cb3eca0e66711aece37757a2c0') diff --git a/var/spack/repos/builtin/packages/r-git2r/package.py b/var/spack/repos/builtin/packages/r-git2r/package.py index a0df2d9b23..2bfb2eee79 100644 --- a/var/spack/repos/builtin/packages/r-git2r/package.py +++ b/var/spack/repos/builtin/packages/r-git2r/package.py @@ -32,7 +32,6 @@ class RGit2r(RPackage): homepage = "https://github.com/ropensci/git2r" url = "https://cran.r-project.org/src/contrib/git2r_0.18.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/git2r" version('0.18.0', 'fb5741eb490c3d6e23a751a72336f24d') version('0.15.0', '57658b3298f9b9aadc0dd77b4ef6a1e1') diff --git a/var/spack/repos/builtin/packages/r-glmnet/package.py b/var/spack/repos/builtin/packages/r-glmnet/package.py index ac44d42c12..6922fc2aaa 100644 --- a/var/spack/repos/builtin/packages/r-glmnet/package.py +++ b/var/spack/repos/builtin/packages/r-glmnet/package.py @@ -35,7 +35,6 @@ class RGlmnet(RPackage): homepage = "http://www.jstatsoft.org/v33/i01/" url = "https://cran.r-project.org/src/contrib/glmnet_2.0-5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/glmnet" version('2.0-5', '049b18caa29529614cd684db3beaec2a') diff --git a/var/spack/repos/builtin/packages/r-gmodels/package.py b/var/spack/repos/builtin/packages/r-gmodels/package.py index 2afb9273ce..44fcfe0ee9 100644 --- a/var/spack/repos/builtin/packages/r-gmodels/package.py +++ b/var/spack/repos/builtin/packages/r-gmodels/package.py @@ -30,7 +30,6 @@ class RGmodels(RPackage): homepage = "http://www.sf.net/projects/r-gregmisc" url = "https://cran.r-project.org/src/contrib/gmodels_2.16.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gmodels" version('2.16.2', 'f13e5feb2a8b9f0cd47fdf25ddc74228') diff --git a/var/spack/repos/builtin/packages/r-gmp/package.py b/var/spack/repos/builtin/packages/r-gmp/package.py index 13b890220d..8919408473 100644 --- a/var/spack/repos/builtin/packages/r-gmp/package.py +++ b/var/spack/repos/builtin/packages/r-gmp/package.py @@ -32,7 +32,6 @@ class RGmp(RPackage): homepage = "http://mulcyber.toulouse.inra.fr/projects/gmp" url = "https://cran.r-project.org/src/contrib/gmp_0.5-13.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gmp" version('0.5-13.1', '4a45d45e53bf7140720bd44f10b075ed') diff --git a/var/spack/repos/builtin/packages/r-googlevis/package.py b/var/spack/repos/builtin/packages/r-googlevis/package.py index 29916965b4..2d090025cc 100644 --- a/var/spack/repos/builtin/packages/r-googlevis/package.py +++ b/var/spack/repos/builtin/packages/r-googlevis/package.py @@ -34,7 +34,6 @@ class RGooglevis(RPackage): homepage = "https://github.com/mages/googleVis#googlevis" url = "https://cran.r-project.org/src/contrib/googleVis_0.6.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/googleVis" version('0.6.0', 'ec36fd2a6884ddc7baa894007d0d0468') diff --git a/var/spack/repos/builtin/packages/r-gridbase/package.py b/var/spack/repos/builtin/packages/r-gridbase/package.py index 73d87c7e49..829a394d33 100644 --- a/var/spack/repos/builtin/packages/r-gridbase/package.py +++ b/var/spack/repos/builtin/packages/r-gridbase/package.py @@ -30,6 +30,5 @@ class RGridbase(RPackage): homepage = "https://cran.r-project.org/web/packages/gridBase/index.html" url = "https://cran.r-project.org/src/contrib/gridBase_0.4-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gridBase" version('0.4-7', '6d5064a85f5c966a92ee468ae44c5f1f') diff --git a/var/spack/repos/builtin/packages/r-gridextra/package.py b/var/spack/repos/builtin/packages/r-gridextra/package.py index 304035dc06..790e7254ee 100644 --- a/var/spack/repos/builtin/packages/r-gridextra/package.py +++ b/var/spack/repos/builtin/packages/r-gridextra/package.py @@ -31,7 +31,6 @@ class RGridextra(RPackage): homepage = "https://github.com/baptiste/gridextra" url = "https://cran.r-project.org/src/contrib/gridExtra_2.2.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gridExtra" version('2.2.1', '7076c2122d387c7ef3add69a1c4fc1b2') diff --git a/var/spack/repos/builtin/packages/r-gtable/package.py b/var/spack/repos/builtin/packages/r-gtable/package.py index 236416755b..d47ec281a9 100644 --- a/var/spack/repos/builtin/packages/r-gtable/package.py +++ b/var/spack/repos/builtin/packages/r-gtable/package.py @@ -30,6 +30,5 @@ class RGtable(RPackage): homepage = "https://cran.r-project.org/web/packages/gtable/index.html" url = "https://cran.r-project.org/src/contrib/gtable_0.2.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gtable" version('0.2.0', '124090ae40b2dd3170ae11180e0d4cab') diff --git a/var/spack/repos/builtin/packages/r-gtools/package.py b/var/spack/repos/builtin/packages/r-gtools/package.py index 632187b49e..df047b6c94 100644 --- a/var/spack/repos/builtin/packages/r-gtools/package.py +++ b/var/spack/repos/builtin/packages/r-gtools/package.py @@ -49,6 +49,5 @@ class RGtools(RPackage): homepage = "https://cran.r-project.org/package=gtools" url = "https://cran.r-project.org/src/contrib/gtools_3.5.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/gtools" version('3.5.0', '45f8800c0336d35046641fbacc56bdbb') diff --git a/var/spack/repos/builtin/packages/r-hexbin/package.py b/var/spack/repos/builtin/packages/r-hexbin/package.py index 0a5c66c1a3..21ae867da2 100644 --- a/var/spack/repos/builtin/packages/r-hexbin/package.py +++ b/var/spack/repos/builtin/packages/r-hexbin/package.py @@ -32,7 +32,6 @@ class RHexbin(RPackage): homepage = "http://github.com/edzer/hexbin" url = "https://cran.r-project.org/src/contrib/hexbin_1.27.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/hexbin" version('1.27.1', '7f380390c6511e97df10a810a3b3bb7c') diff --git a/var/spack/repos/builtin/packages/r-highr/package.py b/var/spack/repos/builtin/packages/r-highr/package.py index 13164f9c60..616bab728b 100644 --- a/var/spack/repos/builtin/packages/r-highr/package.py +++ b/var/spack/repos/builtin/packages/r-highr/package.py @@ -33,6 +33,5 @@ class RHighr(RPackage): homepage = "https://github.com/yihui/highr" url = "https://cran.r-project.org/src/contrib/highr_0.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/highr" version('0.6', 'bf47388c5f57dc61962362fb7e1d8b16') diff --git a/var/spack/repos/builtin/packages/r-htmltools/package.py b/var/spack/repos/builtin/packages/r-htmltools/package.py index 9374e1f9cc..e6c5294c18 100644 --- a/var/spack/repos/builtin/packages/r-htmltools/package.py +++ b/var/spack/repos/builtin/packages/r-htmltools/package.py @@ -30,7 +30,6 @@ class RHtmltools(RPackage): homepage = "https://github.com/rstudio/htmltools" url = "https://cran.r-project.org/src/contrib/htmltools_0.3.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/htmltools" version('0.3.5', '5f001aff4a39e329f7342dcec5139724') diff --git a/var/spack/repos/builtin/packages/r-htmlwidgets/package.py b/var/spack/repos/builtin/packages/r-htmlwidgets/package.py index 85ab593245..ad08721f65 100644 --- a/var/spack/repos/builtin/packages/r-htmlwidgets/package.py +++ b/var/spack/repos/builtin/packages/r-htmlwidgets/package.py @@ -32,7 +32,6 @@ class RHtmlwidgets(RPackage): homepage = "https://github.com/ramnathv/htmlwidgets" url = "https://cran.r-project.org/src/contrib/htmlwidgets_0.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/htmlwidgets" version('0.6', '7fa522d2eda97593978021bda9670c0e') diff --git a/var/spack/repos/builtin/packages/r-httpuv/package.py b/var/spack/repos/builtin/packages/r-httpuv/package.py index a81e3c3fb1..aa8b774383 100644 --- a/var/spack/repos/builtin/packages/r-httpuv/package.py +++ b/var/spack/repos/builtin/packages/r-httpuv/package.py @@ -36,7 +36,6 @@ class RHttpuv(RPackage): homepage = "https://github.com/rstudio/httpuv" url = "https://cran.r-project.org/src/contrib/httpuv_1.3.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/httpuv" version('1.3.3', 'c78ae068cf59e949b9791be987bb4489') diff --git a/var/spack/repos/builtin/packages/r-httr/package.py b/var/spack/repos/builtin/packages/r-httr/package.py index b27bee4fbb..ec01bc0c66 100644 --- a/var/spack/repos/builtin/packages/r-httr/package.py +++ b/var/spack/repos/builtin/packages/r-httr/package.py @@ -32,7 +32,6 @@ class RHttr(RPackage): homepage = "https://github.com/hadley/httr" url = "https://cran.r-project.org/src/contrib/httr_1.2.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/httr" version('1.2.1', 'c469948dedac9ab3926f23cf484b33d9') version('1.1.0', '5ffbbc5c2529e49f00aaa521a2b35600') diff --git a/var/spack/repos/builtin/packages/r-igraph/package.py b/var/spack/repos/builtin/packages/r-igraph/package.py index 993a80ae1c..77bda4a3a0 100644 --- a/var/spack/repos/builtin/packages/r-igraph/package.py +++ b/var/spack/repos/builtin/packages/r-igraph/package.py @@ -32,7 +32,6 @@ class RIgraph(RPackage): homepage = "http://igraph.org/" url = "https://cran.r-project.org/src/contrib/igraph_1.0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/igraph" version('1.0.1', 'ea33495e49adf4a331e4ba60ba559065') diff --git a/var/spack/repos/builtin/packages/r-inline/package.py b/var/spack/repos/builtin/packages/r-inline/package.py index f30c87dc9b..9040d0fbcc 100644 --- a/var/spack/repos/builtin/packages/r-inline/package.py +++ b/var/spack/repos/builtin/packages/r-inline/package.py @@ -32,6 +32,5 @@ class RInline(RPackage): homepage = "https://cran.r-project.org/web/packages/inline/index.html" url = "https://cran.r-project.org/src/contrib/inline_0.3.14.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/inline" version('0.3.14', '9fe304a6ebf0e3889c4c6a7ad1c50bca') diff --git a/var/spack/repos/builtin/packages/r-ipred/package.py b/var/spack/repos/builtin/packages/r-ipred/package.py index 37accb6ee2..f504528c67 100644 --- a/var/spack/repos/builtin/packages/r-ipred/package.py +++ b/var/spack/repos/builtin/packages/r-ipred/package.py @@ -32,7 +32,6 @@ class RIpred(RPackage): homepage = "https://cran.r-project.org/package=ipred" url = "https://cran.r-project.org/src/contrib/ipred_0.9-5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ipred" version('0.9-5', 'ce8768547a7aa9554ad3650b18ea3cbd') diff --git a/var/spack/repos/builtin/packages/r-irlba/package.py b/var/spack/repos/builtin/packages/r-irlba/package.py index ad383492ff..4ed3fe5b39 100644 --- a/var/spack/repos/builtin/packages/r-irlba/package.py +++ b/var/spack/repos/builtin/packages/r-irlba/package.py @@ -32,7 +32,6 @@ class RIrlba(RPackage): homepage = "https://cran.r-project.org/web/packages/irlba/index.html" url = "https://cran.r-project.org/src/contrib/irlba_2.1.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/irlba" version('2.1.2', '290940abf6662ed10c0c5a8db1bc6e88') version('2.0.0', '557674cf8b68fea5b9f231058c324d26') diff --git a/var/spack/repos/builtin/packages/r-iterators/package.py b/var/spack/repos/builtin/packages/r-iterators/package.py index 38dff8f9ac..bc9a8c6726 100644 --- a/var/spack/repos/builtin/packages/r-iterators/package.py +++ b/var/spack/repos/builtin/packages/r-iterators/package.py @@ -31,6 +31,5 @@ class RIterators(RPackage): homepage = "https://cran.r-project.org/web/packages/iterators/index.html" url = "https://cran.r-project.org/src/contrib/iterators_1.0.8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/iterators" version('1.0.8', '2ded7f82cddd8174f1ec98607946c6ee') diff --git a/var/spack/repos/builtin/packages/r-jpeg/package.py b/var/spack/repos/builtin/packages/r-jpeg/package.py index 02c42b5ff1..643b510f05 100644 --- a/var/spack/repos/builtin/packages/r-jpeg/package.py +++ b/var/spack/repos/builtin/packages/r-jpeg/package.py @@ -32,7 +32,6 @@ class RJpeg(RPackage): homepage = "http://www.rforge.net/jpeg/" url = "https://cran.r-project.org/src/contrib/jpeg_0.1-8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/jpeg" version('0.1-8', '696007451d14395b1ed1d0e9af667a57') diff --git a/var/spack/repos/builtin/packages/r-jsonlite/package.py b/var/spack/repos/builtin/packages/r-jsonlite/package.py index 4a690d475a..34c0c88c87 100644 --- a/var/spack/repos/builtin/packages/r-jsonlite/package.py +++ b/var/spack/repos/builtin/packages/r-jsonlite/package.py @@ -39,7 +39,6 @@ class RJsonlite(RPackage): homepage = "https://github.com/jeroenooms/jsonlite" url = "https://cran.r-project.org/src/contrib/jsonlite_1.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/jsonlite" version('1.2', '80cd2678ae77254be470f5931db71c51') version('1.0', 'c8524e086de22ab39b8ac8000220cc87') diff --git a/var/spack/repos/builtin/packages/r-kernlab/package.py b/var/spack/repos/builtin/packages/r-kernlab/package.py index 67159297ab..7d3079a210 100644 --- a/var/spack/repos/builtin/packages/r-kernlab/package.py +++ b/var/spack/repos/builtin/packages/r-kernlab/package.py @@ -33,7 +33,6 @@ class RKernlab(RPackage): homepage = "https://cran.r-project.org/package=kernlab" url = "https://cran.r-project.org/src/contrib/kernlab_0.9-25.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/kernlab" version('0.9-25', '1182a2a336a79fd2cf70b4bc5a35353f') diff --git a/var/spack/repos/builtin/packages/r-kernsmooth/package.py b/var/spack/repos/builtin/packages/r-kernsmooth/package.py index 14e58072dc..59479a5ef9 100644 --- a/var/spack/repos/builtin/packages/r-kernsmooth/package.py +++ b/var/spack/repos/builtin/packages/r-kernsmooth/package.py @@ -30,7 +30,6 @@ class RKernsmooth(RPackage): homepage = "https://cran.r-project.org/package=KernSmooth" url = "https://cran.r-project.org/src/contrib/KernSmooth_2.23-15.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/KernSmooth" version('2.23-15', '746cdf26dec72004cf19978e87dcc982') diff --git a/var/spack/repos/builtin/packages/r-kknn/package.py b/var/spack/repos/builtin/packages/r-kknn/package.py index bd5d688b14..c12a359b14 100644 --- a/var/spack/repos/builtin/packages/r-kknn/package.py +++ b/var/spack/repos/builtin/packages/r-kknn/package.py @@ -31,7 +31,6 @@ class RKknn(RPackage): homepage = "https://cran.r-project.org/package=kknn" url = "https://cran.r-project.org/src/contrib/kknn_1.3.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/kknn" version('1.3.1', '372cd84f618cd5005f8c4c5721755117') diff --git a/var/spack/repos/builtin/packages/r-knitr/package.py b/var/spack/repos/builtin/packages/r-knitr/package.py index dd92474944..5d604252f8 100644 --- a/var/spack/repos/builtin/packages/r-knitr/package.py +++ b/var/spack/repos/builtin/packages/r-knitr/package.py @@ -32,7 +32,6 @@ class RKnitr(RPackage): homepage = "http://yihui.name/knitr/" url = "https://cran.rstudio.com/src/contrib/knitr_1.14.tar.gz" - list_url = "https://cran.rstudio.com/src/contrib/Archive/knitr" version('1.14', 'ef0fbeaa9372f99ffbc57212a7781511') version('0.6', 'c67d6db84cd55594a9e870c90651a3db') diff --git a/var/spack/repos/builtin/packages/r-labeling/package.py b/var/spack/repos/builtin/packages/r-labeling/package.py index 7c288c63a4..41ac015977 100644 --- a/var/spack/repos/builtin/packages/r-labeling/package.py +++ b/var/spack/repos/builtin/packages/r-labeling/package.py @@ -30,6 +30,5 @@ class RLabeling(RPackage): homepage = "https://cran.r-project.org/web/packages/labeling/index.html" url = "https://cran.r-project.org/src/contrib/labeling_0.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/labeling" version('0.3', 'ccd7082ec0b211aba8a89d85176bb534') diff --git a/var/spack/repos/builtin/packages/r-laplacesdemon/package.py b/var/spack/repos/builtin/packages/r-laplacesdemon/package.py index 1518b34bea..c2755a4920 100644 --- a/var/spack/repos/builtin/packages/r-laplacesdemon/package.py +++ b/var/spack/repos/builtin/packages/r-laplacesdemon/package.py @@ -32,6 +32,5 @@ class RLaplacesdemon(RPackage): homepage = "https://github.com/LaplacesDemonR/LaplacesDemon" url = "https://cran.r-project.org/src/contrib/LaplacesDemon_16.0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/LaplacesDemon" version('16.0.1', '1e4dab2dd0e27251734d68b0bfdbe911') diff --git a/var/spack/repos/builtin/packages/r-lattice/package.py b/var/spack/repos/builtin/packages/r-lattice/package.py index ed3c19f2e6..7837bac1b4 100644 --- a/var/spack/repos/builtin/packages/r-lattice/package.py +++ b/var/spack/repos/builtin/packages/r-lattice/package.py @@ -33,6 +33,5 @@ class RLattice(RPackage): homepage = "http://lattice.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/lattice_0.20-34.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lattice" version('0.20-34', 'c2a648b22d4206ae7526fb70b8e90fed') diff --git a/var/spack/repos/builtin/packages/r-lava/package.py b/var/spack/repos/builtin/packages/r-lava/package.py index 263e859c48..f4c85a57ad 100644 --- a/var/spack/repos/builtin/packages/r-lava/package.py +++ b/var/spack/repos/builtin/packages/r-lava/package.py @@ -30,7 +30,6 @@ class RLava(RPackage): homepage = "https://cran.r-project.org/package=lava" url = "https://cran.r-project.org/src/contrib/lava_1.4.7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lava" version('1.4.7', '28039248a7039ba9281d172e4dbf9543') diff --git a/var/spack/repos/builtin/packages/r-lazyeval/package.py b/var/spack/repos/builtin/packages/r-lazyeval/package.py index ab41a39675..72b73f9e0a 100644 --- a/var/spack/repos/builtin/packages/r-lazyeval/package.py +++ b/var/spack/repos/builtin/packages/r-lazyeval/package.py @@ -32,6 +32,5 @@ class RLazyeval(RPackage): homepage = "https://cran.r-project.org/web/packages/lazyeval/index.html" url = "https://cran.r-project.org/src/contrib/lazyeval_0.2.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lazyeval" version('0.2.0', 'df1daac908dcf02ae7e12f4335b1b13b') diff --git a/var/spack/repos/builtin/packages/r-leaflet/package.py b/var/spack/repos/builtin/packages/r-leaflet/package.py index 62c2cf3c7c..c309c92de9 100644 --- a/var/spack/repos/builtin/packages/r-leaflet/package.py +++ b/var/spack/repos/builtin/packages/r-leaflet/package.py @@ -32,7 +32,6 @@ class RLeaflet(RPackage): homepage = "http://rstudio.github.io/leaflet/" url = "https://cran.r-project.org/src/contrib/leaflet_1.0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/leaflet" version('1.0.1', '7f3d8b17092604d87d4eeb579f73d5df') diff --git a/var/spack/repos/builtin/packages/r-leaps/package.py b/var/spack/repos/builtin/packages/r-leaps/package.py index 077ea282ba..3afc27e6dd 100644 --- a/var/spack/repos/builtin/packages/r-leaps/package.py +++ b/var/spack/repos/builtin/packages/r-leaps/package.py @@ -30,6 +30,5 @@ class RLeaps(RPackage): homepage = "https://CRAN.R-project.org/package=leaps" url = "https://cran.r-project.org/src/contrib/leaps_3.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/leaps" version('3.0', '30823138890680e0493d1491c8f43edc') diff --git a/var/spack/repos/builtin/packages/r-learnbayes/package.py b/var/spack/repos/builtin/packages/r-learnbayes/package.py index 85a9e122bc..c6b276c863 100644 --- a/var/spack/repos/builtin/packages/r-learnbayes/package.py +++ b/var/spack/repos/builtin/packages/r-learnbayes/package.py @@ -36,6 +36,5 @@ class RLearnbayes(RPackage): homepage = "https://CRAN.R-project.org/package=LearnBayes" url = "https://cran.r-project.org/src/contrib/LearnBayes_2.15.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/LearnBayes" version('2.15', '213713664707bc79fd6d3a109555ef76') diff --git a/var/spack/repos/builtin/packages/r-lme4/package.py b/var/spack/repos/builtin/packages/r-lme4/package.py index 0ca545ced9..e71da3ad81 100644 --- a/var/spack/repos/builtin/packages/r-lme4/package.py +++ b/var/spack/repos/builtin/packages/r-lme4/package.py @@ -33,7 +33,6 @@ class RLme4(RPackage): homepage = "https://github.com/lme4/lme4/" url = "https://cran.r-project.org/src/contrib/lme4_1.1-12.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lme4" version('1.1-12', 'da8aaebb67477ecb5631851c46207804') diff --git a/var/spack/repos/builtin/packages/r-lmtest/package.py b/var/spack/repos/builtin/packages/r-lmtest/package.py index 3d17dd2a7e..7967f38615 100644 --- a/var/spack/repos/builtin/packages/r-lmtest/package.py +++ b/var/spack/repos/builtin/packages/r-lmtest/package.py @@ -32,7 +32,6 @@ class RLmtest(RPackage): homepage = "https://cran.r-project.org/package=lmtest" url = "https://cran.r-project.org/src/contrib/lmtest_0.9-34.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lmtest" version('0.9-34', 'fcdf7286bb5ccc2ca46be00bf25ac2fe') diff --git a/var/spack/repos/builtin/packages/r-lpsolve/package.py b/var/spack/repos/builtin/packages/r-lpsolve/package.py index 1ef84eb672..65570e2873 100644 --- a/var/spack/repos/builtin/packages/r-lpsolve/package.py +++ b/var/spack/repos/builtin/packages/r-lpsolve/package.py @@ -35,6 +35,5 @@ class RLpsolve(RPackage): homepage = "https://cran.r-project.org/web/packages/lpSolve/index.html" url = "https://cran.r-project.org/src/contrib/lpSolve_5.6.13.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lpSolve" version('5.6.13', '8471654d9ae76e0f85ff3449433d4bc1') diff --git a/var/spack/repos/builtin/packages/r-lubridate/package.py b/var/spack/repos/builtin/packages/r-lubridate/package.py index 159e84e292..ad64ce0c39 100644 --- a/var/spack/repos/builtin/packages/r-lubridate/package.py +++ b/var/spack/repos/builtin/packages/r-lubridate/package.py @@ -35,7 +35,6 @@ class RLubridate(RPackage): homepage = "https://cran.r-project.org/web/packages/lubridate/index.html" url = "https://cran.r-project.org/src/contrib/lubridate_1.5.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/lubridate" version('1.5.6', 'a5dc44817548ee219d26a10bae92e611') diff --git a/var/spack/repos/builtin/packages/r-magic/package.py b/var/spack/repos/builtin/packages/r-magic/package.py index b0987adcd7..4e2c3bb193 100644 --- a/var/spack/repos/builtin/packages/r-magic/package.py +++ b/var/spack/repos/builtin/packages/r-magic/package.py @@ -33,7 +33,6 @@ class RMagic(RPackage): homepage = "https://cran.r-project.org/" url = "https://cran.r-project.org/src/contrib/magic_1.5-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/magic" version('1.5-6', 'a68e5ced253b2196af842e1fc84fd029') diff --git a/var/spack/repos/builtin/packages/r-magrittr/package.py b/var/spack/repos/builtin/packages/r-magrittr/package.py index 915797e11d..a01b601a3c 100644 --- a/var/spack/repos/builtin/packages/r-magrittr/package.py +++ b/var/spack/repos/builtin/packages/r-magrittr/package.py @@ -34,6 +34,5 @@ class RMagrittr(RPackage): homepage = "https://cran.r-project.org/web/packages/magrittr/index.html" url = "https://cran.r-project.org/src/contrib/magrittr_1.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/magrittr" version('1.5', 'e74ab7329f2b9833f0c3c1216f86d65a') diff --git a/var/spack/repos/builtin/packages/r-mapproj/package.py b/var/spack/repos/builtin/packages/r-mapproj/package.py index 3475868abd..711c3dfb07 100644 --- a/var/spack/repos/builtin/packages/r-mapproj/package.py +++ b/var/spack/repos/builtin/packages/r-mapproj/package.py @@ -30,7 +30,6 @@ class RMapproj(RPackage): homepage = "https://cran.r-project.org/package=mapproj" url = "https://cran.r-project.org/src/contrib/mapproj_1.2-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mapproj" version('1.2-4', '10e22bde1c790e1540672f15ddcaee71') diff --git a/var/spack/repos/builtin/packages/r-maps/package.py b/var/spack/repos/builtin/packages/r-maps/package.py index c399bc52f3..0f327db31e 100644 --- a/var/spack/repos/builtin/packages/r-maps/package.py +++ b/var/spack/repos/builtin/packages/r-maps/package.py @@ -31,6 +31,5 @@ class RMaps(RPackage): homepage = "https://cran.r-project.org/" url = "https://cran.r-project.org/src/contrib/maps_3.1.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/maps" version('3.1.1', 'ff045eccb6d5a658db5a539116ddf764') diff --git a/var/spack/repos/builtin/packages/r-maptools/package.py b/var/spack/repos/builtin/packages/r-maptools/package.py index 74d0673aea..f2894568d0 100644 --- a/var/spack/repos/builtin/packages/r-maptools/package.py +++ b/var/spack/repos/builtin/packages/r-maptools/package.py @@ -34,7 +34,6 @@ class RMaptools(RPackage): homepage = "http://r-forge.r-project.org/projects/maptools/" url = "https://cran.r-project.org/src/contrib/maptools_0.8-39.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/maptools" version('0.8-39', '3690d96afba8ef22c8e27ae540ffb836') diff --git a/var/spack/repos/builtin/packages/r-markdown/package.py b/var/spack/repos/builtin/packages/r-markdown/package.py index c0e03fef0a..f843e64bc7 100644 --- a/var/spack/repos/builtin/packages/r-markdown/package.py +++ b/var/spack/repos/builtin/packages/r-markdown/package.py @@ -34,7 +34,6 @@ class RMarkdown(RPackage): homepage = "https://github.com/rstudio/markdown" url = "https://cran.r-project.org/src/contrib/markdown_0.7.7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/markdown" version('0.7.7', '72deca9c675c7cc9343048edbc29f7ff') diff --git a/var/spack/repos/builtin/packages/r-mass/package.py b/var/spack/repos/builtin/packages/r-mass/package.py index 25d3b5869b..56a000968d 100644 --- a/var/spack/repos/builtin/packages/r-mass/package.py +++ b/var/spack/repos/builtin/packages/r-mass/package.py @@ -31,6 +31,5 @@ class RMass(RPackage): homepage = "http://www.stats.ox.ac.uk/pub/MASS4/" url = "https://cran.r-project.org/src/contrib/MASS_7.3-45.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/MASS" version('7.3-45', 'aba3d12fab30f1793bee168a1efea88b') diff --git a/var/spack/repos/builtin/packages/r-matrix/package.py b/var/spack/repos/builtin/packages/r-matrix/package.py index ba1323a737..d2f14df063 100644 --- a/var/spack/repos/builtin/packages/r-matrix/package.py +++ b/var/spack/repos/builtin/packages/r-matrix/package.py @@ -31,7 +31,6 @@ class RMatrix(RPackage): homepage = "http://matrix.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/Matrix_1.2-8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/Matrix" version('1.2-8', '4a6406666bf97d3ec6b698eea5d9c0f5') version('1.2-6', 'f545307fb1284861e9266c4e9712c55e') diff --git a/var/spack/repos/builtin/packages/r-matrixmodels/package.py b/var/spack/repos/builtin/packages/r-matrixmodels/package.py index 0958de49a3..2391da8ad7 100644 --- a/var/spack/repos/builtin/packages/r-matrixmodels/package.py +++ b/var/spack/repos/builtin/packages/r-matrixmodels/package.py @@ -31,7 +31,6 @@ class RMatrixmodels(RPackage): homepage = "http://matrix.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/MatrixModels_0.4-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/MatrixModels" version('0.4-1', '65b3ab56650c62bf1046a3eb1f1e19a0') diff --git a/var/spack/repos/builtin/packages/r-mclust/package.py b/var/spack/repos/builtin/packages/r-mclust/package.py index 5bf58c02cd..308afd5952 100644 --- a/var/spack/repos/builtin/packages/r-mclust/package.py +++ b/var/spack/repos/builtin/packages/r-mclust/package.py @@ -31,7 +31,6 @@ class RMclust(RPackage): homepage = "http://www.stat.washington.edu/mclust" url = "https://cran.r-project.org/src/contrib/mclust_5.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mclust" version('5.3', '74aac9fccdfc78373ce733c1a09176ef') diff --git a/var/spack/repos/builtin/packages/r-mda/package.py b/var/spack/repos/builtin/packages/r-mda/package.py index 4a3325abec..5c39cc7858 100644 --- a/var/spack/repos/builtin/packages/r-mda/package.py +++ b/var/spack/repos/builtin/packages/r-mda/package.py @@ -31,7 +31,6 @@ class RMda(RPackage): homepage = "https://cran.r-project.org/package=mda" url = "https://cran.r-project.org/src/contrib/mda_0.4-9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mda" version('0.4-9', '2ce1446c4a013e0ebcc1099a00269ad9') diff --git a/var/spack/repos/builtin/packages/r-memoise/package.py b/var/spack/repos/builtin/packages/r-memoise/package.py index 76c207dc04..9cabadb282 100644 --- a/var/spack/repos/builtin/packages/r-memoise/package.py +++ b/var/spack/repos/builtin/packages/r-memoise/package.py @@ -31,7 +31,6 @@ class RMemoise(RPackage): homepage = "https://github.com/hadley/memoise" url = "https://cran.r-project.org/src/contrib/memoise_1.0.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/memoise" version('1.0.0', 'd31145292e2a88ae9a504cab1602e4ac') diff --git a/var/spack/repos/builtin/packages/r-mgcv/package.py b/var/spack/repos/builtin/packages/r-mgcv/package.py index 611abfd47c..bdf6fe3a89 100644 --- a/var/spack/repos/builtin/packages/r-mgcv/package.py +++ b/var/spack/repos/builtin/packages/r-mgcv/package.py @@ -33,7 +33,6 @@ class RMgcv(RPackage): homepage = "https://cran.r-project.org/package=mgcv" url = "https://cran.r-project.org/src/contrib/mgcv_1.8-16.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mgcv" version('1.8-16', '4c1d85e0f80b017bccb4b63395842911') version('1.8-13', '30607be3aaf44b13bd8c81fc32e8c984') diff --git a/var/spack/repos/builtin/packages/r-mime/package.py b/var/spack/repos/builtin/packages/r-mime/package.py index c4d2eb2b3e..aa6e51c18b 100644 --- a/var/spack/repos/builtin/packages/r-mime/package.py +++ b/var/spack/repos/builtin/packages/r-mime/package.py @@ -31,7 +31,6 @@ class RMime(RPackage): homepage = "https://github.com/yihui/mime" url = "https://cran.r-project.org/src/contrib/mime_0.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mime" version('0.5', '87e00b6d57b581465c19ae869a723c4d') version('0.4', '789cb33e41db2206c6fc7c3e9fbc2c02') diff --git a/var/spack/repos/builtin/packages/r-minqa/package.py b/var/spack/repos/builtin/packages/r-minqa/package.py index 7a9032a546..afd5c37132 100644 --- a/var/spack/repos/builtin/packages/r-minqa/package.py +++ b/var/spack/repos/builtin/packages/r-minqa/package.py @@ -31,7 +31,6 @@ class RMinqa(RPackage): homepage = "http://optimizer.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/minqa_1.2.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/minqa" version('1.2.4', 'bcaae4fdba60a33528f2116e2fd51105') diff --git a/var/spack/repos/builtin/packages/r-mlbench/package.py b/var/spack/repos/builtin/packages/r-mlbench/package.py index ec7957d5f7..8ab4c89058 100644 --- a/var/spack/repos/builtin/packages/r-mlbench/package.py +++ b/var/spack/repos/builtin/packages/r-mlbench/package.py @@ -31,7 +31,6 @@ class RMlbench(RPackage): homepage = "https://cran.r-project.org/web/packages/mlbench/index.html" url = "https://cran.r-project.org/src/contrib/mlbench_2.1-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mlbench" version('2.1-1', '9f06848b8e137b8a37417c92d8e57f3b') diff --git a/var/spack/repos/builtin/packages/r-modelmetrics/package.py b/var/spack/repos/builtin/packages/r-modelmetrics/package.py index 99644ef190..03ae0ca6f7 100644 --- a/var/spack/repos/builtin/packages/r-modelmetrics/package.py +++ b/var/spack/repos/builtin/packages/r-modelmetrics/package.py @@ -31,7 +31,6 @@ class RModelmetrics(RPackage): homepage = "https://cran.r-project.org/package=ModelMetrics" url = "https://cran.r-project.org/src/contrib/ModelMetrics_1.1.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ModelMetrics" version('1.1.0', 'd43175001f0531b8810d2802d76b7b44') diff --git a/var/spack/repos/builtin/packages/r-modeltools/package.py b/var/spack/repos/builtin/packages/r-modeltools/package.py index 97c3cf0682..2d80652f8c 100644 --- a/var/spack/repos/builtin/packages/r-modeltools/package.py +++ b/var/spack/repos/builtin/packages/r-modeltools/package.py @@ -30,6 +30,5 @@ class RModeltools(RPackage): homepage = "https://cran.r-project.org/package=modeltools" url = "https://cran.r-project.org/src/contrib/modeltools_0.2-21.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/modeltools" version('0.2-21', '3bf56b2e7bf78981444385d87eeccdd7') diff --git a/var/spack/repos/builtin/packages/r-multcomp/package.py b/var/spack/repos/builtin/packages/r-multcomp/package.py index 0dbfb14ea0..ab77b6024d 100644 --- a/var/spack/repos/builtin/packages/r-multcomp/package.py +++ b/var/spack/repos/builtin/packages/r-multcomp/package.py @@ -34,7 +34,6 @@ class RMultcomp(RPackage): homepage = "http://multcomp.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/multcomp_1.4-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/multcomp" version('1.4-6', 'f1353ede2ed78b23859a7f1f1f9ebe88') diff --git a/var/spack/repos/builtin/packages/r-munsell/package.py b/var/spack/repos/builtin/packages/r-munsell/package.py index 670fed41e2..fe43d4c746 100644 --- a/var/spack/repos/builtin/packages/r-munsell/package.py +++ b/var/spack/repos/builtin/packages/r-munsell/package.py @@ -34,7 +34,6 @@ class RMunsell(RPackage): homepage = "https://cran.r-project.org/web/packages/munsell/index.html" url = "https://cran.r-project.org/src/contrib/munsell_0.4.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/munsell" version('0.4.3', 'ebd205323dc37c948f499ee08be9c476') diff --git a/var/spack/repos/builtin/packages/r-mvtnorm/package.py b/var/spack/repos/builtin/packages/r-mvtnorm/package.py index 01e3aea91d..3c79b05691 100644 --- a/var/spack/repos/builtin/packages/r-mvtnorm/package.py +++ b/var/spack/repos/builtin/packages/r-mvtnorm/package.py @@ -31,6 +31,5 @@ class RMvtnorm(RPackage): homepage = "http://mvtnorm.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/mvtnorm_1.0-5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/mvtnorm" version('1.0-5', '5894dd3969bbfa26f4862c45f9a48a52') diff --git a/var/spack/repos/builtin/packages/r-ncdf4/package.py b/var/spack/repos/builtin/packages/r-ncdf4/package.py index 597f4d903f..299bf0b108 100644 --- a/var/spack/repos/builtin/packages/r-ncdf4/package.py +++ b/var/spack/repos/builtin/packages/r-ncdf4/package.py @@ -43,7 +43,6 @@ class RNcdf4(RPackage): homepage = "http://cirrus.ucsd.edu/~pierce/ncdf" url = "https://cran.r-project.org/src/contrib/ncdf4_1.15.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/ncdf4" version('1.15', 'cd60dadbae3be31371e1ed40ddeb420a') diff --git a/var/spack/repos/builtin/packages/r-network/package.py b/var/spack/repos/builtin/packages/r-network/package.py index 9fdc59c02b..acf0e9a0e9 100644 --- a/var/spack/repos/builtin/packages/r-network/package.py +++ b/var/spack/repos/builtin/packages/r-network/package.py @@ -32,6 +32,5 @@ class RNetwork(RPackage): homepage = "https://statnet.org" url = "https://cran.r-project.org/src/contrib/network_1.13.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/network" version('1.13.0', 'd0b967d6f1aad43b6479d72f29b705de') diff --git a/var/spack/repos/builtin/packages/r-networkd3/package.py b/var/spack/repos/builtin/packages/r-networkd3/package.py index e881394538..2c70b45438 100644 --- a/var/spack/repos/builtin/packages/r-networkd3/package.py +++ b/var/spack/repos/builtin/packages/r-networkd3/package.py @@ -31,7 +31,6 @@ class RNetworkd3(RPackage): homepage = "http://cran.r-project.org/package=networkD3" url = "https://cran.r-project.org/src/contrib/networkD3_0.2.12.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/networkD3" version('0.2.12', '356fe4be59698e6fb052644bd9659d84') diff --git a/var/spack/repos/builtin/packages/r-nlme/package.py b/var/spack/repos/builtin/packages/r-nlme/package.py index 32fa484f60..0c619e5f9d 100644 --- a/var/spack/repos/builtin/packages/r-nlme/package.py +++ b/var/spack/repos/builtin/packages/r-nlme/package.py @@ -30,7 +30,6 @@ class RNlme(RPackage): homepage = "https://cran.r-project.org/package=nlme" url = "https://cran.r-project.org/src/contrib/nlme_3.1-130.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/nlme" version('3.1-130', '1935d6e308a8018ed8e45d25c8731288') version('3.1-128', '3d75ae7380bf123761b95a073eb55008') diff --git a/var/spack/repos/builtin/packages/r-nloptr/package.py b/var/spack/repos/builtin/packages/r-nloptr/package.py index 8da84c5814..2512cca695 100644 --- a/var/spack/repos/builtin/packages/r-nloptr/package.py +++ b/var/spack/repos/builtin/packages/r-nloptr/package.py @@ -36,6 +36,5 @@ class RNloptr(RPackage): homepage = "https://cran.r-project.org/package=nloptr" url = "https://cran.r-project.org/src/contrib/nloptr_1.0.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/nloptr" version('1.0.4', '9af69a613349b236fd377d0a107f484c') diff --git a/var/spack/repos/builtin/packages/r-nmf/package.py b/var/spack/repos/builtin/packages/r-nmf/package.py index 78347ea615..a0385d4ce2 100644 --- a/var/spack/repos/builtin/packages/r-nmf/package.py +++ b/var/spack/repos/builtin/packages/r-nmf/package.py @@ -35,7 +35,6 @@ class RNmf(RPackage): homepage = "http://renozao.github.io/NMF" url = "https://cran.r-project.org/src/contrib/NMF_0.20.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/NMF" version('0.20.6', '81df07b3bf710a611db5af24730ff3d0') diff --git a/var/spack/repos/builtin/packages/r-nnet/package.py b/var/spack/repos/builtin/packages/r-nnet/package.py index eeb6f91034..6a7651a51e 100644 --- a/var/spack/repos/builtin/packages/r-nnet/package.py +++ b/var/spack/repos/builtin/packages/r-nnet/package.py @@ -31,6 +31,5 @@ class RNnet(RPackage): homepage = "http://www.stats.ox.ac.uk/pub/MASS4/" url = "https://cran.r-project.org/src/contrib/nnet_7.3-12.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/nnet" version('7.3-12', 'dc7c6f0d0de53d8fc72b44554400a74e') diff --git a/var/spack/repos/builtin/packages/r-np/package.py b/var/spack/repos/builtin/packages/r-np/package.py index e15cb7efcb..a010d37af9 100644 --- a/var/spack/repos/builtin/packages/r-np/package.py +++ b/var/spack/repos/builtin/packages/r-np/package.py @@ -36,7 +36,6 @@ class RNp(RPackage): homepage = "https://github.com/JeffreyRacine/R-Package-np/" url = "https://cran.r-project.org/src/contrib/np_0.60-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/np" version('0.60-2', 'e094d52ddff7280272b41e6cb2c74389') diff --git a/var/spack/repos/builtin/packages/r-numderiv/package.py b/var/spack/repos/builtin/packages/r-numderiv/package.py index 135c4f4141..1323e537ae 100644 --- a/var/spack/repos/builtin/packages/r-numderiv/package.py +++ b/var/spack/repos/builtin/packages/r-numderiv/package.py @@ -31,7 +31,6 @@ class RNumderiv(RPackage): homepage = "https://cran.r-project.org/package=numDeriv" url = "https://cran.r-project.org/src/contrib/numDeriv_2016.8-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/numDeriv" version('2016.8-1', '30e486298d5126d86560095be8e8aac1') diff --git a/var/spack/repos/builtin/packages/r-openssl/package.py b/var/spack/repos/builtin/packages/r-openssl/package.py index 8b20482c32..8989fcf14c 100644 --- a/var/spack/repos/builtin/packages/r-openssl/package.py +++ b/var/spack/repos/builtin/packages/r-openssl/package.py @@ -39,7 +39,6 @@ class ROpenssl(RPackage): homepage = "https://github.com/jeroenooms/openssl#readme" url = "https://cran.r-project.org/src/contrib/openssl_0.9.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/openssl" version('0.9.6', '7ef137929d9dd07db690d35db242ba4b') version('0.9.4', '82a890e71ed0e74499878bedacfb8ccb') diff --git a/var/spack/repos/builtin/packages/r-packrat/package.py b/var/spack/repos/builtin/packages/r-packrat/package.py index ff66ddaf39..e0f8c0ec4e 100644 --- a/var/spack/repos/builtin/packages/r-packrat/package.py +++ b/var/spack/repos/builtin/packages/r-packrat/package.py @@ -31,7 +31,6 @@ class RPackrat(RPackage): homepage = "https://github.com/rstudio/packrat/" url = "https://cran.r-project.org/src/contrib/packrat_0.4.7-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/packrat" version('0.4.8-1', '14e82feba55fcda923396282fc490038') version('0.4.7-1', '80c2413269b292ade163a70ba5053e84') diff --git a/var/spack/repos/builtin/packages/r-pacman/package.py b/var/spack/repos/builtin/packages/r-pacman/package.py index a51633fbb4..3112e9ef19 100644 --- a/var/spack/repos/builtin/packages/r-pacman/package.py +++ b/var/spack/repos/builtin/packages/r-pacman/package.py @@ -33,7 +33,6 @@ class RPacman(RPackage): homepage = "https://cran.r-project.org/package=pacman" url = "https://cran.r-project.org/src/contrib/pacman_0.4.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/pacman" version('0.4.1', 'bf18fe6d1407d31e00b337d9b07fb648') diff --git a/var/spack/repos/builtin/packages/r-party/package.py b/var/spack/repos/builtin/packages/r-party/package.py index 23f66ca4a4..ee006ec710 100644 --- a/var/spack/repos/builtin/packages/r-party/package.py +++ b/var/spack/repos/builtin/packages/r-party/package.py @@ -30,7 +30,6 @@ class RParty(RPackage): homepage = "https://cran.r-project.org/web/packages/party/index.html" url = "https://cran.r-project.org/src/contrib/party_1.1-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/party" version('1.1-2', '40a00336cf8418042d2ab616675c8ddf') diff --git a/var/spack/repos/builtin/packages/r-partykit/package.py b/var/spack/repos/builtin/packages/r-partykit/package.py index 8773dace22..5c056e7b71 100644 --- a/var/spack/repos/builtin/packages/r-partykit/package.py +++ b/var/spack/repos/builtin/packages/r-partykit/package.py @@ -38,7 +38,6 @@ class RPartykit(RPackage): homepage = "http://partykit.r-forge.r-project.org/partykit" url = "https://cran.r-project.org/src/contrib/partykit_1.1-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/partykit" version('1.1-1', '8fcb31d73ec1b8cd3bcd9789639a9277') diff --git a/var/spack/repos/builtin/packages/r-pbdzmq/package.py b/var/spack/repos/builtin/packages/r-pbdzmq/package.py index f602e50723..ee85dfe3a4 100644 --- a/var/spack/repos/builtin/packages/r-pbdzmq/package.py +++ b/var/spack/repos/builtin/packages/r-pbdzmq/package.py @@ -37,7 +37,6 @@ class RPbdzmq(RPackage): homepage = "http://r-pbd.org/" url = "https://cran.r-project.org/src/contrib/pbdZMQ_0.2-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/pbdZMQ" version('0.2-4', 'e5afb70199aa54d737ee7a0e26bde060') diff --git a/var/spack/repos/builtin/packages/r-pbkrtest/package.py b/var/spack/repos/builtin/packages/r-pbkrtest/package.py index 2a2edc50ce..8278f67218 100644 --- a/var/spack/repos/builtin/packages/r-pbkrtest/package.py +++ b/var/spack/repos/builtin/packages/r-pbkrtest/package.py @@ -34,7 +34,6 @@ class RPbkrtest(RPackage): homepage = "http://people.math.aau.dk/~sorenh/software/pbkrtest/" url = "https://cran.r-project.org/src/contrib/pbkrtest_0.4-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/pbkrtest" version('0.4-6', '0a7d9ff83b8d131af9b2335f35781ef9') version('0.4-4', '5e54b1b1b35413dd1d24ef15735ec645') diff --git a/var/spack/repos/builtin/packages/r-permute/package.py b/var/spack/repos/builtin/packages/r-permute/package.py index 739e001b3b..8dbc5a82be 100644 --- a/var/spack/repos/builtin/packages/r-permute/package.py +++ b/var/spack/repos/builtin/packages/r-permute/package.py @@ -36,7 +36,6 @@ class RPermute(RPackage): homepage = "https://github.com/gavinsimpson/permute" url = "https://cran.r-project.org/src/contrib/permute_0.9-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/permute" version('0.9-4', '569fc2442d72a1e3b7e2d456019674c9') diff --git a/var/spack/repos/builtin/packages/r-pkgmaker/package.py b/var/spack/repos/builtin/packages/r-pkgmaker/package.py index 099cabd954..2692d491b4 100644 --- a/var/spack/repos/builtin/packages/r-pkgmaker/package.py +++ b/var/spack/repos/builtin/packages/r-pkgmaker/package.py @@ -36,7 +36,6 @@ class RPkgmaker(RPackage): homepage = "https://renozao.github.io/pkgmaker" url = "https://cran.r-project.org/src/contrib/pkgmaker_0.22.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/pkgmaker" version('0.22', '73a0c6d3e84c6dadf3de7582ef7e88a4') diff --git a/var/spack/repos/builtin/packages/r-plotrix/package.py b/var/spack/repos/builtin/packages/r-plotrix/package.py index 0cd3423f73..9740c70594 100644 --- a/var/spack/repos/builtin/packages/r-plotrix/package.py +++ b/var/spack/repos/builtin/packages/r-plotrix/package.py @@ -30,7 +30,6 @@ class RPlotrix(RPackage): homepage = "https://cran.r-project.org/package=plotrix" url = "https://cran.r-project.org/src/contrib/plotrix_3.6-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/plotrix" version('3.6-4', 'efe9b9b093d8903228a9b56c46d943fa') version('3.6-3', '23e3e022a13a596e9b77b40afcb4a2ef') diff --git a/var/spack/repos/builtin/packages/r-pls/package.py b/var/spack/repos/builtin/packages/r-pls/package.py index ddb18ff42e..c75048962e 100644 --- a/var/spack/repos/builtin/packages/r-pls/package.py +++ b/var/spack/repos/builtin/packages/r-pls/package.py @@ -32,7 +32,6 @@ class RPls(RPackage): homepage = "https://cran.r-project.org/package=pls" url = "https://cran.r-project.org/src/contrib/pls_2.6-0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/pls" version('2.6-0', '04e02e8e46d983c5ed53c1f952b329df') diff --git a/var/spack/repos/builtin/packages/r-plyr/package.py b/var/spack/repos/builtin/packages/r-plyr/package.py index 6f48f5c38e..f9f8176c64 100644 --- a/var/spack/repos/builtin/packages/r-plyr/package.py +++ b/var/spack/repos/builtin/packages/r-plyr/package.py @@ -36,7 +36,6 @@ class RPlyr(RPackage): homepage = "http://had.co.nz/plyr" url = "https://cran.r-project.org/src/contrib/plyr_1.8.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/plyr" version('1.8.4', 'ef455cf7fc06e34837692156b7b2587b') diff --git a/var/spack/repos/builtin/packages/r-png/package.py b/var/spack/repos/builtin/packages/r-png/package.py index 38b7ae5138..9808e3e3a5 100644 --- a/var/spack/repos/builtin/packages/r-png/package.py +++ b/var/spack/repos/builtin/packages/r-png/package.py @@ -32,7 +32,6 @@ class RPng(RPackage): homepage = "http://www.rforge.net/png/" url = "https://cran.r-project.org/src/contrib/png_0.1-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/png" version('0.1-7', '1ebc8b8aa5979b12c5ec2384b30d649f') diff --git a/var/spack/repos/builtin/packages/r-prabclus/package.py b/var/spack/repos/builtin/packages/r-prabclus/package.py index 424d75274d..1dd42ffae4 100644 --- a/var/spack/repos/builtin/packages/r-prabclus/package.py +++ b/var/spack/repos/builtin/packages/r-prabclus/package.py @@ -31,7 +31,6 @@ class RPrabclus(RPackage): homepage = "http://www.homepages.ucl.ac.uk/~ucakche" url = "https://cran.r-project.org/src/contrib/prabclus_2.2-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/prabclus" version('2.2-6', '7f835dcc113243e1db74aad28ce93d11') diff --git a/var/spack/repos/builtin/packages/r-prodlim/package.py b/var/spack/repos/builtin/packages/r-prodlim/package.py index 5219578d94..44f03e789a 100644 --- a/var/spack/repos/builtin/packages/r-prodlim/package.py +++ b/var/spack/repos/builtin/packages/r-prodlim/package.py @@ -32,7 +32,6 @@ class RProdlim(RPackage): homepage = "https://cran.r-project.org/package=prodlim" url = "https://cran.r-project.org/src/contrib/prodlim_1.5.9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/prodlim" version('1.5.9', 'e0843053c9270e41b657a733d6675dc9') diff --git a/var/spack/repos/builtin/packages/r-proto/package.py b/var/spack/repos/builtin/packages/r-proto/package.py index 2553e325f3..f4b6c2f809 100644 --- a/var/spack/repos/builtin/packages/r-proto/package.py +++ b/var/spack/repos/builtin/packages/r-proto/package.py @@ -31,6 +31,5 @@ class RProto(RPackage): homepage = "http://r-proto.googlecode.com/" url = "https://cran.r-project.org/src/contrib/proto_0.3-10.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/proto" version('0.3-10', 'd5523943a5be6ca2f0ab557c900f8212') diff --git a/var/spack/repos/builtin/packages/r-pryr/package.py b/var/spack/repos/builtin/packages/r-pryr/package.py index 3a103e9855..673060c779 100644 --- a/var/spack/repos/builtin/packages/r-pryr/package.py +++ b/var/spack/repos/builtin/packages/r-pryr/package.py @@ -32,7 +32,6 @@ class RPryr(RPackage): homepage = "https://github.com/hadley/pryr" url = "https://cran.r-project.org/src/contrib/pryr_0.1.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/pryr" version('0.1.2', '66b597a762aa15a3b7037779522983b6') diff --git a/var/spack/repos/builtin/packages/r-quadprog/package.py b/var/spack/repos/builtin/packages/r-quadprog/package.py index 84e4624e16..b72a7f9260 100644 --- a/var/spack/repos/builtin/packages/r-quadprog/package.py +++ b/var/spack/repos/builtin/packages/r-quadprog/package.py @@ -31,6 +31,5 @@ class RQuadprog(RPackage): homepage = "https://cran.r-project.org/web/packages/quadprog/index.html" url = "https://cran.r-project.org/src/contrib/quadprog_1.5-5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/quadprog" version('1.5-5', '8442f37afd8d0b19b12e77d63e6515ad') diff --git a/var/spack/repos/builtin/packages/r-quantmod/package.py b/var/spack/repos/builtin/packages/r-quantmod/package.py index 4cc53fcf69..8a9755cc4e 100644 --- a/var/spack/repos/builtin/packages/r-quantmod/package.py +++ b/var/spack/repos/builtin/packages/r-quantmod/package.py @@ -31,7 +31,6 @@ class RQuantmod(RPackage): homepage = "http://www.quantmod.com/" url = "https://cran.r-project.org/src/contrib/quantmod_0.4-5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/quantmod" version('0.4-5', 'cab3c409e4de3df98a20f1ded60f3631') diff --git a/var/spack/repos/builtin/packages/r-quantreg/package.py b/var/spack/repos/builtin/packages/r-quantreg/package.py index c9bdaefa44..011c4a1c4e 100644 --- a/var/spack/repos/builtin/packages/r-quantreg/package.py +++ b/var/spack/repos/builtin/packages/r-quantreg/package.py @@ -35,7 +35,6 @@ class RQuantreg(RPackage): homepage = "https://cran.r-project.org/package=quantreg" url = "https://cran.r-project.org/src/contrib/quantreg_5.29.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/quantreg" version('5.29', '643ca728200d13f8c2e62365204e9907') version('5.26', '1d89ed932fb4d67ae2d5da0eb8c2989f') diff --git a/var/spack/repos/builtin/packages/r-r6/package.py b/var/spack/repos/builtin/packages/r-r6/package.py index 700771f40f..9930b751b2 100644 --- a/var/spack/repos/builtin/packages/r-r6/package.py +++ b/var/spack/repos/builtin/packages/r-r6/package.py @@ -35,7 +35,6 @@ class RR6(RPackage): homepage = "https://github.com/wch/R6/" url = "https://cran.r-project.org/src/contrib/R6_2.2.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/R6" version('2.2.0', '659d83b2d3f7a308a48332b4cfbdab49') version('2.1.2', 'b6afb9430e48707be87638675390e457') diff --git a/var/spack/repos/builtin/packages/r-randomforest/package.py b/var/spack/repos/builtin/packages/r-randomforest/package.py index bc7798695d..6df372e6f3 100644 --- a/var/spack/repos/builtin/packages/r-randomforest/package.py +++ b/var/spack/repos/builtin/packages/r-randomforest/package.py @@ -31,6 +31,5 @@ class RRandomforest(RPackage): homepage = "https://www.stat.berkeley.edu/~breiman/RandomForests/" url = "https://cran.r-project.org/src/contrib/randomForest_4.6-12.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/randomForest" version('4.6-12', '071c03af974198e861f1475c5bab9e7a') diff --git a/var/spack/repos/builtin/packages/r-raster/package.py b/var/spack/repos/builtin/packages/r-raster/package.py index daa42793ee..2bcdfe33ec 100644 --- a/var/spack/repos/builtin/packages/r-raster/package.py +++ b/var/spack/repos/builtin/packages/r-raster/package.py @@ -32,7 +32,6 @@ class RRaster(RPackage): homepage = "http://cran.r-project.org/package=raster" url = "https://cran.r-project.org/src/contrib/raster_2.5-8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/raster" version('2.5-8', '2a7db931c74d50516e82d04687c0a577') diff --git a/var/spack/repos/builtin/packages/r-rbokeh/package.py b/var/spack/repos/builtin/packages/r-rbokeh/package.py index 00f15891b2..f90ea20fbf 100644 --- a/var/spack/repos/builtin/packages/r-rbokeh/package.py +++ b/var/spack/repos/builtin/packages/r-rbokeh/package.py @@ -32,7 +32,6 @@ class RRbokeh(RPackage): homepage = "https://hafen.github.io/rbokeh" url = "https://cran.r-project.org/src/contrib/rbokeh_0.5.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rbokeh" version('0.5.0', '4e14778c3fbd9286460ca28c68f57d10') diff --git a/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py b/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py index 59f134caad..d123f536de 100644 --- a/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py +++ b/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py @@ -31,6 +31,5 @@ class RRcolorbrewer(RPackage): homepage = "http://colorbrewer2.org" url = "https://cran.r-project.org/src/contrib/RColorBrewer_1.1-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RColorBrewer" version('1.1-2', '66054d83eade4dff8a43ad4732691182') diff --git a/var/spack/repos/builtin/packages/r-rcpp/package.py b/var/spack/repos/builtin/packages/r-rcpp/package.py index 5b89324970..1f85226975 100644 --- a/var/spack/repos/builtin/packages/r-rcpp/package.py +++ b/var/spack/repos/builtin/packages/r-rcpp/package.py @@ -38,7 +38,6 @@ class RRcpp(RPackage): homepage = "http://dirk.eddelbuettel.com/code/rcpp.html" url = "https://cran.r-project.org/src/contrib/Rcpp_0.12.9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/Rcpp" version('0.12.9', '691c49b12794507288b728ede03668a5') version('0.12.6', 'db4280fb0a79cd19be73a662c33b0a8b') diff --git a/var/spack/repos/builtin/packages/r-rcppeigen/package.py b/var/spack/repos/builtin/packages/r-rcppeigen/package.py index b33e938d5b..e5db4ac0f6 100644 --- a/var/spack/repos/builtin/packages/r-rcppeigen/package.py +++ b/var/spack/repos/builtin/packages/r-rcppeigen/package.py @@ -42,7 +42,6 @@ class RRcppeigen(RPackage): homepage = "http://eigen.tuxfamily.org/" url = "https://cran.r-project.org/src/contrib/RcppEigen_0.3.2.9.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RcppEigen" version('0.3.2.9.0', '14a7786882a5d9862d53c4b2217df318') version('0.3.2.8.1', '4146e06e4fdf7f4d08db7839069d479f') diff --git a/var/spack/repos/builtin/packages/r-registry/package.py b/var/spack/repos/builtin/packages/r-registry/package.py index 479250cac6..618ab00385 100644 --- a/var/spack/repos/builtin/packages/r-registry/package.py +++ b/var/spack/repos/builtin/packages/r-registry/package.py @@ -30,6 +30,5 @@ class RRegistry(RPackage): homepage = "https://cran.r-project.org/web/packages/registry/index.html" url = "https://cran.r-project.org/src/contrib/registry_0.3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/registry" version('0.3', '85345b334ec81eb3da6edcbb27c5f421') diff --git a/var/spack/repos/builtin/packages/r-repr/package.py b/var/spack/repos/builtin/packages/r-repr/package.py index 47720327de..67804a7b4f 100644 --- a/var/spack/repos/builtin/packages/r-repr/package.py +++ b/var/spack/repos/builtin/packages/r-repr/package.py @@ -32,6 +32,5 @@ class RRepr(RPackage): homepage = "https://github.com/IRkernel/repr" url = "https://cran.r-project.org/src/contrib/repr_0.9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/repr" version('0.9', 'db5ff74893063b492f684e42283070bd') diff --git a/var/spack/repos/builtin/packages/r-reshape2/package.py b/var/spack/repos/builtin/packages/r-reshape2/package.py index ca65e006dc..208cc4d576 100644 --- a/var/spack/repos/builtin/packages/r-reshape2/package.py +++ b/var/spack/repos/builtin/packages/r-reshape2/package.py @@ -31,7 +31,6 @@ class RReshape2(RPackage): homepage = "https://github.com/hadley/reshape" url = "https://cran.r-project.org/src/contrib/reshape2_1.4.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/reshape2" version('1.4.2', 'c851a0312191b8c5bab956445df7cf5f') version('1.4.1', '41e9dffdf5c6fa830321ac9c8ebffe00') diff --git a/var/spack/repos/builtin/packages/r-rgl/package.py b/var/spack/repos/builtin/packages/r-rgl/package.py index a4b912a6d5..d3b65adbaf 100644 --- a/var/spack/repos/builtin/packages/r-rgl/package.py +++ b/var/spack/repos/builtin/packages/r-rgl/package.py @@ -36,8 +36,6 @@ class RRgl(RPackage): homepage = "https://r-forge.r-project.org/projects/rgl" url = "https://cloud.r-project.org/src/contrib/rgl_0.98.1.tar.gz" - list_url = 'https://cloud.r-project.org/src/contrib/Archive/rgl' - version('0.98.1', 'bd69e1d33f1590feb4b6dc080b133e5b') depends_on('r@3.2:3.9') diff --git a/var/spack/repos/builtin/packages/r-rgooglemaps/package.py b/var/spack/repos/builtin/packages/r-rgooglemaps/package.py index 87672a35e2..b505249f59 100644 --- a/var/spack/repos/builtin/packages/r-rgooglemaps/package.py +++ b/var/spack/repos/builtin/packages/r-rgooglemaps/package.py @@ -33,7 +33,6 @@ class RRgooglemaps(RPackage): homepage = "https://cran.r-project.org/package=RgoogleMaps" url = "https://cran.r-project.org/src/contrib/RgoogleMaps_1.2.0.7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RgoogleMaps" version('1.2.0.7', '2e1df804f0331b4122d841105f0c7ea5') diff --git a/var/spack/repos/builtin/packages/r-rinside/package.py b/var/spack/repos/builtin/packages/r-rinside/package.py index d8e7c28e23..11a254a162 100644 --- a/var/spack/repos/builtin/packages/r-rinside/package.py +++ b/var/spack/repos/builtin/packages/r-rinside/package.py @@ -44,7 +44,6 @@ class RRinside(RPackage): homepage = "http://dirk.eddelbuettel.com/code/rinside.html" url = "https://cran.r-project.org/src/contrib/RInside_0.2.13.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RInside" version('0.2.13', '2e3c35a7bd648e9bef98d0afcc02cf88') diff --git a/var/spack/repos/builtin/packages/r-rjava/package.py b/var/spack/repos/builtin/packages/r-rjava/package.py index 440b93ff1f..26502134c1 100644 --- a/var/spack/repos/builtin/packages/r-rjava/package.py +++ b/var/spack/repos/builtin/packages/r-rjava/package.py @@ -31,7 +31,6 @@ class RRjava(RPackage): homepage = "http://www.rforge.net/rJava/" url = "https://cran.r-project.org/src/contrib/rJava_0.9-8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rJava" version('0.9-8', '51ae0d690ceed056ebe7c4be71fc6c7a') diff --git a/var/spack/repos/builtin/packages/r-rjson/package.py b/var/spack/repos/builtin/packages/r-rjson/package.py index f37b574323..5db82ed44a 100644 --- a/var/spack/repos/builtin/packages/r-rjson/package.py +++ b/var/spack/repos/builtin/packages/r-rjson/package.py @@ -30,6 +30,5 @@ class RRjson(RPackage): homepage = "https://cran.r-project.org/package=rjson" url = "https://cran.r-project.org/src/contrib/rjson_0.2.15.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rjson" version('0.2.15', '87d0e29bc179c6aeaf312b138089f8e9') diff --git a/var/spack/repos/builtin/packages/r-rjsonio/package.py b/var/spack/repos/builtin/packages/r-rjsonio/package.py index 4d5ffa6ddf..5cf23bc973 100644 --- a/var/spack/repos/builtin/packages/r-rjsonio/package.py +++ b/var/spack/repos/builtin/packages/r-rjsonio/package.py @@ -44,6 +44,5 @@ class RRjsonio(RPackage): homepage = "https://cran.r-project.org/package=RJSONIO" url = "https://cran.r-project.org/src/contrib/RJSONIO_1.3-0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RJSONIO" version('1.3-0', '72c395622ba8d1435ec43849fd32c830') diff --git a/var/spack/repos/builtin/packages/r-rmarkdown/package.py b/var/spack/repos/builtin/packages/r-rmarkdown/package.py index 31a7695923..09328f7684 100644 --- a/var/spack/repos/builtin/packages/r-rmarkdown/package.py +++ b/var/spack/repos/builtin/packages/r-rmarkdown/package.py @@ -31,7 +31,6 @@ class RRmarkdown(RPackage): homepage = "http://rmarkdown.rstudio.com/" url = "https://cran.r-project.org/src/contrib/rmarkdown_1.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rmarkdown" version('1.0', '264aa6a59e9680109e38df8270e14c58') diff --git a/var/spack/repos/builtin/packages/r-rminer/package.py b/var/spack/repos/builtin/packages/r-rminer/package.py index b22612a238..4a50994db5 100644 --- a/var/spack/repos/builtin/packages/r-rminer/package.py +++ b/var/spack/repos/builtin/packages/r-rminer/package.py @@ -32,7 +32,6 @@ class RRminer(RPackage): homepage = "http://www3.dsi.uminho.pt/pcortez/rminer.html" url = "https://cran.r-project.org/src/contrib/rminer_1.4.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rminer" version('1.4.2', '7d5d90f4ae030cf647d67aa962412c05') diff --git a/var/spack/repos/builtin/packages/r-rmpfr/package.py b/var/spack/repos/builtin/packages/r-rmpfr/package.py index c9a957ae0d..cda1bdd135 100644 --- a/var/spack/repos/builtin/packages/r-rmpfr/package.py +++ b/var/spack/repos/builtin/packages/r-rmpfr/package.py @@ -34,7 +34,6 @@ class RRmpfr(RPackage): homepage = "http://rmpfr.r-forge.r-project.org" url = "https://cran.r-project.org/src/contrib/Rmpfr_0.6-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/Rmpfr" version('0.6-1', '55d4ec257bd2a9233bafee9e444d0265') diff --git a/var/spack/repos/builtin/packages/r-rmpi/package.py b/var/spack/repos/builtin/packages/r-rmpi/package.py index 4ef46791ec..d1844776e0 100644 --- a/var/spack/repos/builtin/packages/r-rmpi/package.py +++ b/var/spack/repos/builtin/packages/r-rmpi/package.py @@ -31,7 +31,6 @@ class RRmpi(RPackage): homepage = "http://www.stats.uwo.ca/faculty/yu/Rmpi" url = "https://cran.r-project.org/src/contrib/Rmpi_0.6-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/Rmpi" version('0.6-6', '59ae8ce62ff0ff99342d53942c745779') diff --git a/var/spack/repos/builtin/packages/r-rmysql/package.py b/var/spack/repos/builtin/packages/r-rmysql/package.py index 4946b071fa..c0248e7349 100644 --- a/var/spack/repos/builtin/packages/r-rmysql/package.py +++ b/var/spack/repos/builtin/packages/r-rmysql/package.py @@ -30,7 +30,6 @@ class RRmysql(RPackage): homepage = "https://github.com/rstats-db/rmysql" url = "https://cran.r-project.org/src/contrib/RMySQL_0.10.9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RMySQL" version('0.10.9', '3628200a1864ac3005cfd55cc7cde17a') diff --git a/var/spack/repos/builtin/packages/r-rngtools/package.py b/var/spack/repos/builtin/packages/r-rngtools/package.py index f9edc93a2c..4d26350cc4 100644 --- a/var/spack/repos/builtin/packages/r-rngtools/package.py +++ b/var/spack/repos/builtin/packages/r-rngtools/package.py @@ -34,7 +34,6 @@ class RRngtools(RPackage): homepage = "https://renozao.github.io/rngtools" url = "https://cran.r-project.org/src/contrib/rngtools_1.2.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rngtools" version('1.2.4', '715967f8b3af2848a76593a7c718c1cd') diff --git a/var/spack/repos/builtin/packages/r-rodbc/package.py b/var/spack/repos/builtin/packages/r-rodbc/package.py index 70e477bcb1..c48455b91c 100644 --- a/var/spack/repos/builtin/packages/r-rodbc/package.py +++ b/var/spack/repos/builtin/packages/r-rodbc/package.py @@ -30,7 +30,6 @@ class RRodbc(RPackage): homepage = "https://cran.rstudio.com/web/packages/RODBC/" url = "https://cran.rstudio.com/src/contrib/RODBC_1.3-13.tar.gz" - list_url = "https://cran.rstudio.com/src/contrib/Archive/RODBC" version('1.3-13', 'c52ef9139c2ed85adc53ad6effa7d68e') diff --git a/var/spack/repos/builtin/packages/r-roxygen2/package.py b/var/spack/repos/builtin/packages/r-roxygen2/package.py index 1bbfeb2e87..10b876d686 100644 --- a/var/spack/repos/builtin/packages/r-roxygen2/package.py +++ b/var/spack/repos/builtin/packages/r-roxygen2/package.py @@ -31,7 +31,6 @@ class RRoxygen2(RPackage): homepage = "https://github.com/klutometis/roxygen" url = "https://cran.r-project.org/src/contrib/roxygen2_5.0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/roxygen2" version('5.0.1', 'df5bdbc12fda372e427710ef1cd92ed7') diff --git a/var/spack/repos/builtin/packages/r-rpart-plot/package.py b/var/spack/repos/builtin/packages/r-rpart-plot/package.py index d7d40f2154..64559f9303 100644 --- a/var/spack/repos/builtin/packages/r-rpart-plot/package.py +++ b/var/spack/repos/builtin/packages/r-rpart-plot/package.py @@ -31,7 +31,6 @@ class RRpartPlot(RPackage): homepage = "https://cran.r-project.org/package=rpart.plot" url = "https://cran.r-project.org/src/contrib/rpart.plot_2.1.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rpart.plot" version('2.1.0', 'fb0f8edfe22c464683ee82aa429136f9') diff --git a/var/spack/repos/builtin/packages/r-rpart/package.py b/var/spack/repos/builtin/packages/r-rpart/package.py index a81c9d7d91..df8e33414a 100644 --- a/var/spack/repos/builtin/packages/r-rpart/package.py +++ b/var/spack/repos/builtin/packages/r-rpart/package.py @@ -31,7 +31,6 @@ class RRpart(RPackage): homepage = "https://cran.r-project.org/package=rpart" url = "https://cran.r-project.org/src/contrib/rpart_4.1-10.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rpart" version('4.1-10', '15873cded4feb3ef44d63580ba3ca46e') diff --git a/var/spack/repos/builtin/packages/r-rpostgresql/package.py b/var/spack/repos/builtin/packages/r-rpostgresql/package.py index b204c53828..80331755ac 100644 --- a/var/spack/repos/builtin/packages/r-rpostgresql/package.py +++ b/var/spack/repos/builtin/packages/r-rpostgresql/package.py @@ -38,7 +38,6 @@ class RRpostgresql(RPackage): homepage = "https://code.google.com/p/rpostgresql/" url = "https://cran.r-project.org/src/contrib/RPostgreSQL_0.4-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RPostgreSQL" version('0.4-1', 'e7b22e212afbb2cbb88bab937f93e55a') diff --git a/var/spack/repos/builtin/packages/r-rsnns/package.py b/var/spack/repos/builtin/packages/r-rsnns/package.py index 1a0978363a..0359102983 100644 --- a/var/spack/repos/builtin/packages/r-rsnns/package.py +++ b/var/spack/repos/builtin/packages/r-rsnns/package.py @@ -37,7 +37,6 @@ class RRsnns(RPackage): homepage = "http://sci2s.ugr.es/dicits/software/RSNNS" url = "https://cran.r-project.org/src/contrib/RSNNS_0.4-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RSNNS" version('0.4-7', 'ade7736611c456effb5f72e0ce0a1e6f') diff --git a/var/spack/repos/builtin/packages/r-rsqlite/package.py b/var/spack/repos/builtin/packages/r-rsqlite/package.py index c08fcac20c..218d7e589f 100644 --- a/var/spack/repos/builtin/packages/r-rsqlite/package.py +++ b/var/spack/repos/builtin/packages/r-rsqlite/package.py @@ -32,7 +32,6 @@ class RRsqlite(RPackage): homepage = "https://github.com/rstats-db/RSQLite" url = "https://cran.r-project.org/src/contrib/RSQLite_1.0.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/RSQLite" version('1.0.0', 'e6cbe2709612b687c13a10d30c7bad45') diff --git a/var/spack/repos/builtin/packages/r-rstan/package.py b/var/spack/repos/builtin/packages/r-rstan/package.py index e616f0a7dd..0283c34d32 100644 --- a/var/spack/repos/builtin/packages/r-rstan/package.py +++ b/var/spack/repos/builtin/packages/r-rstan/package.py @@ -38,7 +38,6 @@ class RRstan(RPackage): homepage = "http://mc-stan.org/" url = "https://cran.r-project.org/src/contrib/rstan_2.10.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rstan" version('2.10.1', 'f5d212f6f8551bdb91fe713d05d4052a') diff --git a/var/spack/repos/builtin/packages/r-rstudioapi/package.py b/var/spack/repos/builtin/packages/r-rstudioapi/package.py index 2558a5c3f6..acf391d136 100644 --- a/var/spack/repos/builtin/packages/r-rstudioapi/package.py +++ b/var/spack/repos/builtin/packages/r-rstudioapi/package.py @@ -31,7 +31,6 @@ class RRstudioapi(RPackage): homepage = "https://cran.r-project.org/web/packages/rstudioapi/index.html" url = "https://cran.r-project.org/src/contrib/rstudioapi_0.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rstudioapi" version('0.6', 'fdb13bf46aab02421557e713fceab66b') version('0.5', '6ce1191da74e7bcbf06b61339486b3ba') diff --git a/var/spack/repos/builtin/packages/r-rzmq/package.py b/var/spack/repos/builtin/packages/r-rzmq/package.py index f385a13901..9142c66055 100644 --- a/var/spack/repos/builtin/packages/r-rzmq/package.py +++ b/var/spack/repos/builtin/packages/r-rzmq/package.py @@ -31,7 +31,6 @@ class RRzmq(RPackage): homepage = "http://github.com/armstrtw/rzmq" url = "https://cran.r-project.org/src/contrib/rzmq_0.7.7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/rzmq" version('0.7.7', '8ba18fd1c222d1eb25bb622ccd2897e0') diff --git a/var/spack/repos/builtin/packages/r-sandwich/package.py b/var/spack/repos/builtin/packages/r-sandwich/package.py index bae8e82d68..2b04a2f675 100644 --- a/var/spack/repos/builtin/packages/r-sandwich/package.py +++ b/var/spack/repos/builtin/packages/r-sandwich/package.py @@ -31,7 +31,6 @@ class RSandwich(RPackage): homepage = "https://cran.r-project.org/package=sandwich" url = "https://cran.r-project.org/src/contrib/sandwich_2.3-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/sandwich" version('2.3-4', 'a621dbd8a57b6e1e036496642aadc2e5') diff --git a/var/spack/repos/builtin/packages/r-scales/package.py b/var/spack/repos/builtin/packages/r-scales/package.py index e88ef144cf..ec7f82af37 100644 --- a/var/spack/repos/builtin/packages/r-scales/package.py +++ b/var/spack/repos/builtin/packages/r-scales/package.py @@ -31,7 +31,6 @@ class RScales(RPackage): homepage = "https://github.com/hadley/scales" url = "https://cran.r-project.org/src/contrib/scales_0.4.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/scales" version('0.4.1', '3fb2218866a7fe4c1f6e66790876f85a') version('0.4.0', '7b5602d9c55595901192248bca25c099') diff --git a/var/spack/repos/builtin/packages/r-scatterplot3d/package.py b/var/spack/repos/builtin/packages/r-scatterplot3d/package.py index edb92a0820..51c3b44e1c 100644 --- a/var/spack/repos/builtin/packages/r-scatterplot3d/package.py +++ b/var/spack/repos/builtin/packages/r-scatterplot3d/package.py @@ -30,7 +30,6 @@ class RScatterplot3d(RPackage): homepage = "https://CRAN.R-project.org/package=scatterplot3d" url = "https://cran.r-project.org/src/contrib/scatterplot3d_0.3-40.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/scatterplot3d" version('0.3-40', '67b9ab6131d244d7fc1db39dcc911dfe') diff --git a/var/spack/repos/builtin/packages/r-segmented/package.py b/var/spack/repos/builtin/packages/r-segmented/package.py index 53bac60ca9..415e5a4f72 100644 --- a/var/spack/repos/builtin/packages/r-segmented/package.py +++ b/var/spack/repos/builtin/packages/r-segmented/package.py @@ -32,6 +32,5 @@ class RSegmented(RPackage): homepage = "https://CRAN.R-project.org/package=segmented" url = "https://cran.r-project.org/src/contrib/segmented_0.5-1.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/segmented" version('0.5-1.4', 'f9d76ea9e22ef5f40aa126b697351cae') diff --git a/var/spack/repos/builtin/packages/r-seqinr/package.py b/var/spack/repos/builtin/packages/r-seqinr/package.py index e77914b726..d9157a77fc 100644 --- a/var/spack/repos/builtin/packages/r-seqinr/package.py +++ b/var/spack/repos/builtin/packages/r-seqinr/package.py @@ -32,7 +32,6 @@ class RSeqinr(RPackage): homepage = "http://seqinr.r-forge.r-project.org" url = "https://cran.r-project.org/src/contrib/seqinr_3.3-6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/seqinr" version('3.3-6', '73023d627e72021b723245665e1ad055') diff --git a/var/spack/repos/builtin/packages/r-shiny/package.py b/var/spack/repos/builtin/packages/r-shiny/package.py index b1d21c7e7c..dd0ce0192d 100644 --- a/var/spack/repos/builtin/packages/r-shiny/package.py +++ b/var/spack/repos/builtin/packages/r-shiny/package.py @@ -33,7 +33,6 @@ class RShiny(RPackage): homepage = "http://shiny.rstudio.com/" url = "https://cran.r-project.org/src/contrib/shiny_0.13.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/shiny" version('0.13.2', 'cb5bff7a28ad59ec2883cd0912ca9611') diff --git a/var/spack/repos/builtin/packages/r-snow/package.py b/var/spack/repos/builtin/packages/r-snow/package.py index 662cdd80a7..6070e4a882 100644 --- a/var/spack/repos/builtin/packages/r-snow/package.py +++ b/var/spack/repos/builtin/packages/r-snow/package.py @@ -30,7 +30,6 @@ class RSnow(RPackage): homepage = "https://cran.r-project.org/web/packages/snow/index.html" url = "https://cran.r-project.org/src/contrib/snow_0.4-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/snow" version('0.4-2', 'afc7b0dfd4518aedb6fc81712fd2ac70') diff --git a/var/spack/repos/builtin/packages/r-sp/package.py b/var/spack/repos/builtin/packages/r-sp/package.py index 2917f0b6b6..66a213133c 100644 --- a/var/spack/repos/builtin/packages/r-sp/package.py +++ b/var/spack/repos/builtin/packages/r-sp/package.py @@ -33,7 +33,6 @@ class RSp(RPackage): homepage = "https://github.com/edzer/sp/" url = "https://cran.r-project.org/src/contrib/sp_1.2-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/sp" version('1.2-3', 'f0e24d993dec128642ee66b6b47b10c1') diff --git a/var/spack/repos/builtin/packages/r-sparsem/package.py b/var/spack/repos/builtin/packages/r-sparsem/package.py index bcd11a5c1f..49f4f03f04 100644 --- a/var/spack/repos/builtin/packages/r-sparsem/package.py +++ b/var/spack/repos/builtin/packages/r-sparsem/package.py @@ -32,7 +32,6 @@ class RSparsem(RPackage): homepage = "http://www.econ.uiuc.edu/~roger/research/sparse/sparse.html" url = "https://cran.r-project.org/src/contrib/SparseM_1.74.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/SparseM" version('1.74', 'a16c9b7db172dfd2b7b6508c48e81a5d') version('1.7', '7b5b0ab166a0929ef6dcfe1d97643601') diff --git a/var/spack/repos/builtin/packages/r-spdep/package.py b/var/spack/repos/builtin/packages/r-spdep/package.py index d229876ff3..eb31f64d5d 100644 --- a/var/spack/repos/builtin/packages/r-spdep/package.py +++ b/var/spack/repos/builtin/packages/r-spdep/package.py @@ -43,7 +43,6 @@ class RSpdep(RPackage): homepage = "https://r-forge.r-project.org/projects/spdep" url = "https://cran.r-project.org/src/contrib/spdep_0.6-13.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/spdep" version('0.6-13', 'bfc68b3016b4894b152ecec4b86f85d1') diff --git a/var/spack/repos/builtin/packages/r-stanheaders/package.py b/var/spack/repos/builtin/packages/r-stanheaders/package.py index 322356e347..1f7e59064d 100644 --- a/var/spack/repos/builtin/packages/r-stanheaders/package.py +++ b/var/spack/repos/builtin/packages/r-stanheaders/package.py @@ -44,6 +44,5 @@ class RStanheaders(RPackage): homepage = "http://mc-stan.org/" url = "https://cran.r-project.org/src/contrib/StanHeaders_2.10.0-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/StanHeaders" version('2.10.0-2', '9d09b1e9278f08768f7a988ad9082d57') diff --git a/var/spack/repos/builtin/packages/r-statnet-common/package.py b/var/spack/repos/builtin/packages/r-statnet-common/package.py index 68bf2c4222..25c014790a 100644 --- a/var/spack/repos/builtin/packages/r-statnet-common/package.py +++ b/var/spack/repos/builtin/packages/r-statnet-common/package.py @@ -31,6 +31,5 @@ class RStatnetCommon(RPackage): homepage = "http://www.statnet.org" url = "https://cran.r-project.org/src/contrib/statnet.common_3.3.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/statnet.common" version('3.3.0', '36bc11098dcd3652a4beb05c156ad6c8') diff --git a/var/spack/repos/builtin/packages/r-stringi/package.py b/var/spack/repos/builtin/packages/r-stringi/package.py index b116c328f5..15b89fe64e 100644 --- a/var/spack/repos/builtin/packages/r-stringi/package.py +++ b/var/spack/repos/builtin/packages/r-stringi/package.py @@ -38,7 +38,6 @@ class RStringi(RPackage): homepage = "http://www.gagolewski.com/software/stringi/" url = "https://cran.r-project.org/src/contrib/stringi_1.1.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/stringi" version('1.1.2', '0ec2faa62643e1900734c0eaf5096648') version('1.1.1', '32b919ee3fa8474530c4942962a6d8d9') diff --git a/var/spack/repos/builtin/packages/r-stringr/package.py b/var/spack/repos/builtin/packages/r-stringr/package.py index 4accd04e51..e14616cc20 100644 --- a/var/spack/repos/builtin/packages/r-stringr/package.py +++ b/var/spack/repos/builtin/packages/r-stringr/package.py @@ -34,7 +34,6 @@ class RStringr(RPackage): homepage = "https://cran.r-project.org/web/packages/stringr/index.html" url = "https://cran.r-project.org/src/contrib/stringr_1.1.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/stringr" version('1.1.0', '47973a33944c6d5db9524b1e835b8a5d') version('1.0.0', '5ca977c90351f78b1b888b379114a7b4') diff --git a/var/spack/repos/builtin/packages/r-strucchange/package.py b/var/spack/repos/builtin/packages/r-strucchange/package.py index 6d00d31402..651e8aee4e 100644 --- a/var/spack/repos/builtin/packages/r-strucchange/package.py +++ b/var/spack/repos/builtin/packages/r-strucchange/package.py @@ -31,7 +31,6 @@ class RStrucchange(RPackage): homepage = "https://cran.r-project.org/package=strucchange" url = "https://cran.r-project.org/src/contrib/strucchange_1.5-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/strucchange" version('1.5-1', 'fc751fc011df9c8df82d577298cb8395') diff --git a/var/spack/repos/builtin/packages/r-survey/package.py b/var/spack/repos/builtin/packages/r-survey/package.py index 249cad8178..b13dbe3f7e 100644 --- a/var/spack/repos/builtin/packages/r-survey/package.py +++ b/var/spack/repos/builtin/packages/r-survey/package.py @@ -36,6 +36,5 @@ class RSurvey(RPackage): homepage = "http://r-survey.r-forge.r-project.org/survey/" url = "https://cran.r-project.org/src/contrib/survey_3.30-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/survey" version('3.30-3', 'c70cdae9cb43d35abddd11173d64cad0') diff --git a/var/spack/repos/builtin/packages/r-survival/package.py b/var/spack/repos/builtin/packages/r-survival/package.py index 067cdcfd6b..62477d5314 100644 --- a/var/spack/repos/builtin/packages/r-survival/package.py +++ b/var/spack/repos/builtin/packages/r-survival/package.py @@ -32,7 +32,6 @@ class RSurvival(RPackage): homepage = "https://cran.r-project.org/package=survival" url = "https://cran.r-project.org/src/contrib/survival_2.40-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/survival" version('2.40-1', 'a2474b656cd723791268e3114481b8a7') version('2.39-5', 'a3cc6b5762e8c5c0bb9e64a276710be2') diff --git a/var/spack/repos/builtin/packages/r-tarifx/package.py b/var/spack/repos/builtin/packages/r-tarifx/package.py index 1fb2d35b1d..f935989a38 100644 --- a/var/spack/repos/builtin/packages/r-tarifx/package.py +++ b/var/spack/repos/builtin/packages/r-tarifx/package.py @@ -30,7 +30,6 @@ class RTarifx(RPackage): homepage = "https://cran.r-project.org/package=taRifx" url = "https://cran.r-project.org/src/contrib/taRifx_1.0.6.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/taRifx" version('1.0.6', '7e782e04bd69d929b29f91553382e6a2') diff --git a/var/spack/repos/builtin/packages/r-testit/package.py b/var/spack/repos/builtin/packages/r-testit/package.py index 4d99c388e6..39bd69ca38 100644 --- a/var/spack/repos/builtin/packages/r-testit/package.py +++ b/var/spack/repos/builtin/packages/r-testit/package.py @@ -32,6 +32,5 @@ class RTestit(RPackage): homepage = "https://github.com/yihui/testit" url = "https://cran.r-project.org/src/contrib/testit_0.5.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/testit" version('0.5', 'f206d3cbdc5174e353d2d05ba6a12e59') diff --git a/var/spack/repos/builtin/packages/r-testthat/package.py b/var/spack/repos/builtin/packages/r-testthat/package.py index 62409912f7..87cdb93ed4 100644 --- a/var/spack/repos/builtin/packages/r-testthat/package.py +++ b/var/spack/repos/builtin/packages/r-testthat/package.py @@ -31,7 +31,6 @@ class RTestthat(RPackage): homepage = "https://github.com/hadley/testthat" url = "https://cran.r-project.org/src/contrib/testthat_1.0.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/testthat" version('1.0.2', '6c6a90c8db860292df5784a70e07b8dc') diff --git a/var/spack/repos/builtin/packages/r-th-data/package.py b/var/spack/repos/builtin/packages/r-th-data/package.py index b9c5fab0d0..39eed23fc7 100644 --- a/var/spack/repos/builtin/packages/r-th-data/package.py +++ b/var/spack/repos/builtin/packages/r-th-data/package.py @@ -30,7 +30,6 @@ class RThData(RPackage): homepage = "https://cran.r-project.org/package=TH.data" url = "https://cran.r-project.org/src/contrib/TH.data_1.0-8.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/TH.data" version('1.0-8', '2cc20acc8b470dff1202749b4bea55c4') version('1.0-7', '3e8b6b1a4699544f175215aed7039a94') diff --git a/var/spack/repos/builtin/packages/r-threejs/package.py b/var/spack/repos/builtin/packages/r-threejs/package.py index 50b484dc25..c318b0c435 100644 --- a/var/spack/repos/builtin/packages/r-threejs/package.py +++ b/var/spack/repos/builtin/packages/r-threejs/package.py @@ -31,7 +31,6 @@ class RThreejs(RPackage): homepage = "http://bwlewis.github.io/rthreejs" url = "https://cran.r-project.org/src/contrib/threejs_0.2.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/threejs" version('0.2.2', '35c179b10813c5e4bd3e7827fae6627b') diff --git a/var/spack/repos/builtin/packages/r-tibble/package.py b/var/spack/repos/builtin/packages/r-tibble/package.py index a06b33e7f2..50d75bae96 100644 --- a/var/spack/repos/builtin/packages/r-tibble/package.py +++ b/var/spack/repos/builtin/packages/r-tibble/package.py @@ -31,7 +31,6 @@ class RTibble(RPackage): homepage = "https://github.com/hadley/tibble" url = "https://cran.r-project.org/src/contrib/tibble_1.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/tibble" version('1.2', 'bdbc3d67aa16860741add6d6ec20ea13') version('1.1', '2fe9f806109d0b7fadafb1ffafea4cb8') diff --git a/var/spack/repos/builtin/packages/r-tidyr/package.py b/var/spack/repos/builtin/packages/r-tidyr/package.py index 1285e5e9ae..e4334bac11 100644 --- a/var/spack/repos/builtin/packages/r-tidyr/package.py +++ b/var/spack/repos/builtin/packages/r-tidyr/package.py @@ -32,7 +32,6 @@ class RTidyr(RPackage): homepage = "https://github.com/hadley/tidyr" url = "https://cran.r-project.org/src/contrib/tidyr_0.5.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/tidyr" version('0.5.1', '3cadc869510c054ed93d374ab44120bd') diff --git a/var/spack/repos/builtin/packages/r-trimcluster/package.py b/var/spack/repos/builtin/packages/r-trimcluster/package.py index 770718ae00..bb64a9c5df 100644 --- a/var/spack/repos/builtin/packages/r-trimcluster/package.py +++ b/var/spack/repos/builtin/packages/r-trimcluster/package.py @@ -30,7 +30,6 @@ class RTrimcluster(RPackage): homepage = "http://www.homepages.ucl.ac.uk/~ucakche" url = "https://cran.r-project.org/src/contrib/trimcluster_0.1-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/trimcluster" version('0.1-2', '7617920e224bd18f5b87db38a3116ec2') diff --git a/var/spack/repos/builtin/packages/r-trust/package.py b/var/spack/repos/builtin/packages/r-trust/package.py index 622a0325a7..1fe6676b8f 100644 --- a/var/spack/repos/builtin/packages/r-trust/package.py +++ b/var/spack/repos/builtin/packages/r-trust/package.py @@ -31,6 +31,5 @@ class RTrust(RPackage): homepage = "http://www.stat.umn.edu/geyer/trust" url = "https://cran.r-project.org/src/contrib/trust_0.1-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/trust" version('0.1-7', '7e218b3a6b33bd77bd7e86dc6360418d') diff --git a/var/spack/repos/builtin/packages/r-ttr/package.py b/var/spack/repos/builtin/packages/r-ttr/package.py index 79429f5286..1db3f3c10c 100644 --- a/var/spack/repos/builtin/packages/r-ttr/package.py +++ b/var/spack/repos/builtin/packages/r-ttr/package.py @@ -30,7 +30,6 @@ class RTtr(RPackage): homepage = "https://github.com/joshuaulrich/TTR" url = "https://cran.r-project.org/src/contrib/TTR_0.23-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/TTR" version('0.23-1', '35f693ac0d97e8ec742ebea2da222986') diff --git a/var/spack/repos/builtin/packages/r-uuid/package.py b/var/spack/repos/builtin/packages/r-uuid/package.py index b9dcc12629..638f493ace 100644 --- a/var/spack/repos/builtin/packages/r-uuid/package.py +++ b/var/spack/repos/builtin/packages/r-uuid/package.py @@ -32,6 +32,5 @@ class RUuid(RPackage): homepage = "http://www.rforge.net/uuid" url = "https://cran.rstudio.com/src/contrib/uuid_0.1-2.tar.gz" - list_url = "https://cran.rstudio.com/src/contrib/Archive/uuid" version('0.1-2', 'f97d000c0b16bca455fb5bf2cd668ddf') diff --git a/var/spack/repos/builtin/packages/r-vcd/package.py b/var/spack/repos/builtin/packages/r-vcd/package.py index 56a2ebdfa7..7f785f8158 100644 --- a/var/spack/repos/builtin/packages/r-vcd/package.py +++ b/var/spack/repos/builtin/packages/r-vcd/package.py @@ -35,7 +35,6 @@ class RVcd(RPackage): homepage = "https://cran.r-project.org/package=vcd" url = "https://cran.r-project.org/src/contrib/vcd_1.4-1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/vcd" version('1.4-1', '7db150a77f173f85b69a1f86f73f8f02') diff --git a/var/spack/repos/builtin/packages/r-vegan/package.py b/var/spack/repos/builtin/packages/r-vegan/package.py index 4892193e59..bd1134e8be 100644 --- a/var/spack/repos/builtin/packages/r-vegan/package.py +++ b/var/spack/repos/builtin/packages/r-vegan/package.py @@ -31,7 +31,6 @@ class RVegan(RPackage): homepage = "https://github.com/vegandevs/vegan" url = "https://cran.r-project.org/src/contrib/vegan_2.4-3.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/vegan" version('2.4-3', 'db17d4c4b9a4d421246abd5b36b00fec') diff --git a/var/spack/repos/builtin/packages/r-viridis/package.py b/var/spack/repos/builtin/packages/r-viridis/package.py index 55f879e90e..bb0ac670a6 100644 --- a/var/spack/repos/builtin/packages/r-viridis/package.py +++ b/var/spack/repos/builtin/packages/r-viridis/package.py @@ -30,7 +30,6 @@ class RViridis(RPackage): homepage = "https://github.com/sjmgarnier/viridis" url = "https://cran.r-project.org/src/contrib/viridis_0.4.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/viridis" version('0.4.0', 'f874384cbedf459f6c309ddb40b354ea') diff --git a/var/spack/repos/builtin/packages/r-viridislite/package.py b/var/spack/repos/builtin/packages/r-viridislite/package.py index fc65b7f393..e1e4f50d1c 100644 --- a/var/spack/repos/builtin/packages/r-viridislite/package.py +++ b/var/spack/repos/builtin/packages/r-viridislite/package.py @@ -30,7 +30,6 @@ class RViridislite(RPackage): homepage = "https://github.com/sjmgarnier/viridisLite" url = "https://cran.r-project.org/src/contrib/viridisLite_0.2.0.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/viridisLite" version('0.2.0', '04a04415cf651a2b5f964b261896c0fb') diff --git a/var/spack/repos/builtin/packages/r-visnetwork/package.py b/var/spack/repos/builtin/packages/r-visnetwork/package.py index ea0b972bf1..6618bf8b07 100644 --- a/var/spack/repos/builtin/packages/r-visnetwork/package.py +++ b/var/spack/repos/builtin/packages/r-visnetwork/package.py @@ -31,7 +31,6 @@ class RVisnetwork(RPackage): homepage = "https://github.com/datastorm-open/visNetwork" url = "https://cran.r-project.org/src/contrib/visNetwork_1.0.1.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/visNetwork" version('1.0.1', 'dfc9664a5165134d8dbdcd949ad73cf7') diff --git a/var/spack/repos/builtin/packages/r-whisker/package.py b/var/spack/repos/builtin/packages/r-whisker/package.py index 17f904f5c3..44b8c6fc08 100644 --- a/var/spack/repos/builtin/packages/r-whisker/package.py +++ b/var/spack/repos/builtin/packages/r-whisker/package.py @@ -31,6 +31,5 @@ class RWhisker(RPackage): homepage = "http://github.com/edwindj/whisker" url = "https://cran.r-project.org/src/contrib/whisker_0.3-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/whisker" version('0.3-2', 'c4b9bf9a22e69ce003fe68663ab5e8e6') diff --git a/var/spack/repos/builtin/packages/r-withr/package.py b/var/spack/repos/builtin/packages/r-withr/package.py index 082b94e2a6..f9de7d42cd 100644 --- a/var/spack/repos/builtin/packages/r-withr/package.py +++ b/var/spack/repos/builtin/packages/r-withr/package.py @@ -33,7 +33,6 @@ class RWithr(RPackage): homepage = "http://github.com/jimhester/withr" url = "https://cran.r-project.org/src/contrib/withr_1.0.2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/withr" version('1.0.2', 'ca52b729af9bbaa14fc8b7bafe38663c') version('1.0.1', 'ac38af2c6f74027c9592dd8f0acb7598') diff --git a/var/spack/repos/builtin/packages/r-xgboost/package.py b/var/spack/repos/builtin/packages/r-xgboost/package.py index 4246d73e49..eb6dacab34 100644 --- a/var/spack/repos/builtin/packages/r-xgboost/package.py +++ b/var/spack/repos/builtin/packages/r-xgboost/package.py @@ -38,7 +38,6 @@ class RXgboost(RPackage): homepage = "https://github.com/dmlc/xgboost" url = "https://cran.r-project.org/src/contrib/xgboost_0.6-4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/xgboost" version('0.6-4', '86e517e3ce39f8a01de796920f6b425e') version('0.4-4', 'c24d3076058101a71de4b8af8806697c') diff --git a/var/spack/repos/builtin/packages/r-xlconnect/package.py b/var/spack/repos/builtin/packages/r-xlconnect/package.py index 1863997ad7..5f23a9e275 100644 --- a/var/spack/repos/builtin/packages/r-xlconnect/package.py +++ b/var/spack/repos/builtin/packages/r-xlconnect/package.py @@ -31,7 +31,6 @@ class RXlconnect(RPackage): homepage = "http://miraisolutions.wordpress.com/" url = "https://cran.r-project.org/src/contrib/XLConnect_0.2-11.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/XLConnect" version('0.2-12', '3340d05d259f0a41262eab4ed32617ad') version('0.2-11', '9d1769a103cda05665df399cc335017d') diff --git a/var/spack/repos/builtin/packages/r-xlconnectjars/package.py b/var/spack/repos/builtin/packages/r-xlconnectjars/package.py index 0200b00a0f..1e8b0b4f69 100644 --- a/var/spack/repos/builtin/packages/r-xlconnectjars/package.py +++ b/var/spack/repos/builtin/packages/r-xlconnectjars/package.py @@ -30,7 +30,6 @@ class RXlconnectjars(RPackage): homepage = "http://miraisolutions.wordpress.com/" url = "https://cran.r-project.org/src/contrib/XLConnectJars_0.2-9.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/XLConnectJars" version('0.2-12', '6984e5140cd1c887c017ef6f88cbba81') version('0.2-9', 'e6d6b1acfede26acaa616ee421bd30fb') diff --git a/var/spack/repos/builtin/packages/r-xlsx/package.py b/var/spack/repos/builtin/packages/r-xlsx/package.py index e16a582306..35c8d35d95 100644 --- a/var/spack/repos/builtin/packages/r-xlsx/package.py +++ b/var/spack/repos/builtin/packages/r-xlsx/package.py @@ -31,7 +31,6 @@ class RXlsx(RPackage): homepage = "http://code.google.com/p/rexcel/" url = "https://cran.rstudio.com/src/contrib/xlsx_0.5.7.tar.gz" - list_url = "https://cran.rstudio.com/src/contrib/Archive/xlsx" version('0.5.7', '36b1b16f29c54b6089b1dae923180dd5') diff --git a/var/spack/repos/builtin/packages/r-xlsxjars/package.py b/var/spack/repos/builtin/packages/r-xlsxjars/package.py index 1c16c75a9d..8d351d69b6 100644 --- a/var/spack/repos/builtin/packages/r-xlsxjars/package.py +++ b/var/spack/repos/builtin/packages/r-xlsxjars/package.py @@ -31,7 +31,6 @@ class RXlsxjars(RPackage): homepage = "https://cran.rstudio.com/web/packages/xlsxjars/index.html" url = "https://cran.rstudio.com/src/contrib/xlsxjars_0.6.1.tar.gz" - list_url = "https://cran.rstudio.com/src/contrib/Archive/xlsxjars" version('0.6.1', '5a1721d5733cb42f3a29e3f353e39166') diff --git a/var/spack/repos/builtin/packages/r-xml/package.py b/var/spack/repos/builtin/packages/r-xml/package.py index 2fe2a8a05b..9ec3d8cf1e 100644 --- a/var/spack/repos/builtin/packages/r-xml/package.py +++ b/var/spack/repos/builtin/packages/r-xml/package.py @@ -32,7 +32,6 @@ class RXml(RPackage): homepage = "http://www.omegahat.net/RSXML" url = "https://cran.r-project.org/src/contrib/XML_3.98-1.4.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/XML" version('3.98-1.5', 'd1cfcd56f7aec96a84ffca91aea507ee') version('3.98-1.4', '1a7f3ce6f264eeb109bfa57bedb26c14') diff --git a/var/spack/repos/builtin/packages/r-xtable/package.py b/var/spack/repos/builtin/packages/r-xtable/package.py index 66d8687b6d..462a97b451 100644 --- a/var/spack/repos/builtin/packages/r-xtable/package.py +++ b/var/spack/repos/builtin/packages/r-xtable/package.py @@ -30,6 +30,5 @@ class RXtable(RPackage): homepage = "http://xtable.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/xtable_1.8-2.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/xtable" version('1.8-2', '239e4825cd046156a67efae3aac01d86') diff --git a/var/spack/repos/builtin/packages/r-xts/package.py b/var/spack/repos/builtin/packages/r-xts/package.py index 1cedec1d42..a3a4ce7f58 100644 --- a/var/spack/repos/builtin/packages/r-xts/package.py +++ b/var/spack/repos/builtin/packages/r-xts/package.py @@ -33,7 +33,6 @@ class RXts(RPackage): homepage = "http://r-forge.r-project.org/projects/xts/" url = "https://cran.r-project.org/src/contrib/xts_0.9-7.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/xts" version('0.9-7', 'a232e94aebfa654653a7d88a0503537b') diff --git a/var/spack/repos/builtin/packages/r-yaml/package.py b/var/spack/repos/builtin/packages/r-yaml/package.py index c812ea8ca2..79cc0b392f 100644 --- a/var/spack/repos/builtin/packages/r-yaml/package.py +++ b/var/spack/repos/builtin/packages/r-yaml/package.py @@ -31,6 +31,5 @@ class RYaml(RPackage): homepage = "https://cran.r-project.org/web/packages/yaml/index.html" url = "https://cran.r-project.org/src/contrib/yaml_2.1.13.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/yaml" version('2.1.13', 'f2203ea395adaff6bd09134666191d9a') diff --git a/var/spack/repos/builtin/packages/r-zoo/package.py b/var/spack/repos/builtin/packages/r-zoo/package.py index 7418d36a64..0012a2d29a 100644 --- a/var/spack/repos/builtin/packages/r-zoo/package.py +++ b/var/spack/repos/builtin/packages/r-zoo/package.py @@ -34,7 +34,6 @@ class RZoo(RPackage): homepage = "http://zoo.r-forge.r-project.org/" url = "https://cran.r-project.org/src/contrib/zoo_1.7-14.tar.gz" - list_url = "https://cran.r-project.org/src/contrib/Archive/zoo" version('1.7-14', '8c577a7c1e535c899ab14177b1039c32') version('1.7-13', '99521dfa4c668e692720cefcc5a1bf30') diff --git a/var/spack/repos/builtin/packages/spindle/package.py b/var/spack/repos/builtin/packages/spindle/package.py index c23fb56f03..ec996140b1 100644 --- a/var/spack/repos/builtin/packages/spindle/package.py +++ b/var/spack/repos/builtin/packages/spindle/package.py @@ -33,7 +33,6 @@ class Spindle(AutotoolsPackage): """ homepage = "https://computation.llnl.gov/project/spindle/" url = "https://github.com/hpc/Spindle/archive/v0.8.1.tar.gz" - list_url = "https://github.com/hpc/Spindle/releases" version('0.8.1', 'f11793a6b9d8df2cd231fccb2857d912') -- cgit v1.2.3-70-g09d2 From c67f6477854091de09ac650352db5ce97b3c76f5 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 9 Jun 2017 21:02:16 -0700 Subject: Move description to top of `spack info` (#4475) --- lib/spack/spack/cmd/info.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index f0cddad2e2..43d086d4b3 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -131,6 +131,14 @@ def print_text_info(pkg): header = "{0}: ".format(pkg.build_system_class) print(header, pkg.name) + + print() + print("Description:") + if pkg.__doc__: + print(pkg.format_doc(indent=4)) + else: + print(" None") + whitespaces = ''.join([' '] * (len(header) - len("Homepage: "))) print("Homepage:", whitespaces, pkg.homepage) @@ -183,13 +191,6 @@ def print_text_info(pkg): else: print(" None") - print() - print("Description:") - if pkg.__doc__: - print(pkg.format_doc(indent=4)) - else: - print(" None") - def info(parser, args): pkg = spack.repo.get(args.name) -- cgit v1.2.3-70-g09d2 From 0de653ff016003c62b5e491646f62b3d644b835f Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 12 Jun 2017 09:47:46 -0500 Subject: Add an installcheck phase to MakefilePackage (#4476) * Add an installcheck phase to MakefilePackage * Minor changes to ESMF --- lib/spack/spack/build_systems/makefile.py | 12 +++++++++++ var/spack/repos/builtin/packages/esmf/package.py | 26 ++++++++---------------- 2 files changed, 21 insertions(+), 17 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index a014ed7c15..2311158bfe 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -75,6 +75,9 @@ class MakefilePackage(PackageBase): #: Callback names for build-time test build_time_test_callbacks = ['check'] + #: Callback names for install-time test + install_time_test_callbacks = ['installcheck'] + @property def build_directory(self): """Returns the directory containing the main Makefile @@ -113,5 +116,14 @@ class MakefilePackage(PackageBase): self._if_make_target_execute('test') self._if_make_target_execute('check') + run_after('install')(PackageBase._run_default_install_time_test_callbacks) + + def installcheck(self): + """Searches the Makefile for an ``installcheck`` target + and runs it if found. + """ + with working_dir(self.build_directory): + self._if_make_target_execute('installcheck') + # Check that self.prefix is there after installation run_after('install')(PackageBase.sanity_check_prefix) diff --git a/var/spack/repos/builtin/packages/esmf/package.py b/var/spack/repos/builtin/packages/esmf/package.py index 9d68d17846..9c8b9d2c2e 100644 --- a/var/spack/repos/builtin/packages/esmf/package.py +++ b/var/spack/repos/builtin/packages/esmf/package.py @@ -26,7 +26,7 @@ from spack import * import os -class Esmf(Package): +class Esmf(MakefilePackage): """The Earth System Modeling Framework (ESMF) is high-performance, flexible software infrastructure for building and coupling weather, climate, and related Earth science applications. The ESMF defines an architecture for @@ -47,25 +47,28 @@ class Esmf(Package): variant('debug', default=False, description='Make a debuggable version of the library') # Required dependencies - depends_on('mpi', when='+mpi') depends_on('zlib') depends_on('libxml2') - # depends_on('perl', type='test') # TODO: Add a test deptype # Optional dependencies + depends_on('mpi', when='+mpi') depends_on('lapack@3:', when='+lapack') depends_on('netcdf@3.6:', when='+netcdf') depends_on('netcdf-fortran@3.6:', when='+netcdf') depends_on('parallel-netcdf@1.2.0:', when='+pnetcdf') depends_on('xerces-c@3.1.0:', when='+xerces') + # Testing dependencies + # depends_on('perl', type='test') # TODO: Add a test deptype + # NOTE: ESMF cannot be installed with GCC 6. It uses constructs that # are no longer valid in GCC 6. GCC 4 is recommended for installation. + conflicts('%gcc@6:') def url_for_version(self, version): return "http://www.earthsystemmodeling.org/esmf_releases/non_public/ESMF_{0}/esmf_{0}_src.tar.gz".format(version.underscored) - def install(self, spec, prefix): + def edit(self, spec, prefix): # Installation instructions can be found at: # http://www.earthsystemmodeling.org/esmf_releases/last_built/ESMF_usrdoc/node9.html @@ -238,16 +241,5 @@ class Esmf(Package): # ESMF_XERCES_INCLUDE # ESMF_XERCES_LIBPATH - ################ - # Installation # - ################ - - make() - - if self.run_tests: - make('check', parallel=False) - - make('install') - - if self.run_tests: - make('installcheck') + def check(self): + make('check', parallel=False) -- cgit v1.2.3-70-g09d2 From 1e69d9d1a94c1f3f5b165e7b5eeebcf65e1789fc Mon Sep 17 00:00:00 2001 From: scheibelp Date: Tue, 13 Jun 2017 09:15:51 -0700 Subject: Override partial installs by default - part three (#4331) * During install, remove prior unfinished installs If a user performs an installation which fails, in some cases the install prefix is still present, and the stage path may also be present. With this commit, unless the user specifies '--keep-prefix', installs are guaranteed to begin with a clean slate. The database is used to decide whether an install finished, since a database record is not added until the end of the install process. * test updates * repair_partial uses keep_prefix and keep_stage * use of mock stage object to ensure that stage is destroyed when it should be destroyed (and otherwise not) * add --restage option to 'install' command; when this option is not set, the default is to reuse a stage if it is found. --- lib/spack/spack/cmd/install.py | 4 + lib/spack/spack/database.py | 2 + lib/spack/spack/package.py | 44 +++++++- lib/spack/spack/test/install.py | 125 +++++++++++++++++++++ .../repos/builtin.mock/packages/canfail/package.py | 43 +++++++ 5 files changed, 215 insertions(+), 3 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/canfail/package.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 87fad76181..f030e5b2df 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -65,6 +65,9 @@ the dependencies""" subparser.add_argument( '--keep-stage', action='store_true', dest='keep_stage', help="don't remove the build stage if installation succeeds") + subparser.add_argument( + '--restage', action='store_true', dest='restage', + help="if a partial install is detected, delete prior state") subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', help="do not check packages against checksum") @@ -307,6 +310,7 @@ def install(parser, args, **kwargs): kwargs.update({ 'keep_prefix': args.keep_prefix, 'keep_stage': args.keep_stage, + 'restage': args.restage, 'install_deps': 'dependencies' in args.things_to_install, 'make_jobs': args.jobs, 'run_tests': args.run_tests, diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 38ea8d584c..123c3a8998 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -577,6 +577,8 @@ class Database(object): else: # The file doesn't exist, try to traverse the directory. # reindex() takes its own write lock, so no lock here. + with WriteTransaction(self.lock, timeout=_db_lock_timeout): + self._write(None, None, None) self.reindex(spack.store.layout) def _add(self, spec, directory_layout=None, explicit=False): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 12b91bcdb0..90e55e2ce0 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1188,11 +1188,13 @@ class PackageBase(with_metaclass(PackageMeta, object)): if self.spec.external: return self._process_external_package(explicit) + restage = kwargs.get('restage', False) + partial = self.check_for_unfinished_installation(keep_prefix, restage) + # Ensure package is not already installed layout = spack.store.layout with spack.store.db.prefix_read_lock(self.spec): - if (keep_prefix and os.path.isdir(self.prefix) and - (not self.installed)): + if partial: tty.msg( "Continuing from partial install of %s" % self.name) elif layout.check_installed(self.spec): @@ -1319,7 +1321,8 @@ class PackageBase(with_metaclass(PackageMeta, object)): try: # Create the install prefix and fork the build process. - spack.store.layout.create_install_directory(self.spec) + if not os.path.exists(self.prefix): + spack.store.layout.create_install_directory(self.spec) # Fork a child to do the actual installation spack.build_environment.fork(self, build_process, dirty=dirty) # If we installed then we should keep the prefix @@ -1346,6 +1349,41 @@ class PackageBase(with_metaclass(PackageMeta, object)): if not keep_prefix: self.remove_prefix() + def check_for_unfinished_installation( + self, keep_prefix=False, restage=False): + """Check for leftover files from partially-completed prior install to + prepare for a new install attempt. Options control whether these + files are reused (vs. destroyed). This function considers a package + fully-installed if there is a DB entry for it (in that way, it is + more strict than Package.installed). The return value is used to + indicate when the prefix exists but the install is not complete. + """ + if self.spec.external: + raise ExternalPackageError("Attempted to repair external spec %s" % + self.spec.name) + + with spack.store.db.prefix_write_lock(self.spec): + try: + record = spack.store.db.get_record(self.spec) + installed_in_db = record.installed if record else False + except KeyError: + installed_in_db = False + + partial = False + if not installed_in_db and os.path.isdir(self.prefix): + if not keep_prefix: + self.remove_prefix() + else: + partial = True + + stage_is_managed_in_spack = self.stage.path.startswith( + spack.stage_path) + if restage and stage_is_managed_in_spack: + self.stage.destroy() + self.stage.create() + + return partial + def _do_install_pop_kwargs(self, kwargs): """Pops kwargs from do_install before starting the installation diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index f10c3a37e9..13d3e2ee94 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -30,6 +30,8 @@ from spack.directory_layout import YamlDirectoryLayout from spack.fetch_strategy import URLFetchStrategy, FetchStrategyComposite from spack.spec import Spec +import os + @pytest.fixture() def install_mockery(tmpdir, config, builtin_mock): @@ -77,6 +79,125 @@ def test_install_and_uninstall(mock_archive): raise +def mock_remove_prefix(*args): + raise MockInstallError( + "Intentional error", + "Mock remove_prefix method intentionally fails") + + +class RemovePrefixChecker(object): + def __init__(self, wrapped_rm_prefix): + self.removed = False + self.wrapped_rm_prefix = wrapped_rm_prefix + + def remove_prefix(self): + self.removed = True + self.wrapped_rm_prefix() + + +class MockStage(object): + def __init__(self, wrapped_stage): + self.wrapped_stage = wrapped_stage + self.test_destroyed = False + + def __enter__(self): + return self + + def __exit__(self, *exc): + return True + + def destroy(self): + self.test_destroyed = True + self.wrapped_stage.destroy() + + def __getattr__(self, attr): + return getattr(self.wrapped_stage, attr) + + +@pytest.mark.usefixtures('install_mockery') +def test_partial_install_delete_prefix_and_stage(mock_archive): + spec = Spec('canfail') + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + instance_rm_prefix = pkg.remove_prefix + + try: + spack.package.Package.remove_prefix = mock_remove_prefix + with pytest.raises(MockInstallError): + pkg.do_install() + assert os.path.isdir(pkg.prefix) + rm_prefix_checker = RemovePrefixChecker(instance_rm_prefix) + spack.package.Package.remove_prefix = rm_prefix_checker.remove_prefix + setattr(pkg, 'succeed', True) + pkg.stage = MockStage(pkg.stage) + pkg.do_install(restage=True) + assert rm_prefix_checker.removed + assert pkg.stage.test_destroyed + assert pkg.installed + finally: + spack.package.Package.remove_prefix = remove_prefix + pkg._stage = None + try: + delattr(pkg, 'succeed') + except AttributeError: + pass + + +@pytest.mark.usefixtures('install_mockery') +def test_partial_install_keep_prefix(mock_archive): + spec = Spec('canfail') + spec.concretize() + pkg = spack.repo.get(spec) + # Normally the stage should start unset, but other tests set it + pkg._stage = None + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + try: + # If remove_prefix is called at any point in this test, that is an + # error + spack.package.Package.remove_prefix = mock_remove_prefix + with pytest.raises(spack.build_environment.ChildError): + pkg.do_install(keep_prefix=True) + assert os.path.exists(pkg.prefix) + setattr(pkg, 'succeed', True) + pkg.stage = MockStage(pkg.stage) + pkg.do_install(keep_prefix=True) + assert pkg.installed + assert not pkg.stage.test_destroyed + finally: + spack.package.Package.remove_prefix = remove_prefix + pkg._stage = None + try: + delattr(pkg, 'succeed') + except AttributeError: + pass + + +@pytest.mark.usefixtures('install_mockery') +def test_second_install_no_overwrite_first(mock_archive): + spec = Spec('canfail') + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + remove_prefix = spack.package.Package.remove_prefix + try: + spack.package.Package.remove_prefix = mock_remove_prefix + setattr(pkg, 'succeed', True) + pkg.do_install() + assert pkg.installed + # If Package.install is called after this point, it will fail + delattr(pkg, 'succeed') + pkg.do_install() + finally: + spack.package.Package.remove_prefix = remove_prefix + try: + delattr(pkg, 'succeed') + except AttributeError: + pass + + @pytest.mark.usefixtures('install_mockery') def test_store(mock_archive): spec = Spec('cmake-client').concretized() @@ -102,3 +223,7 @@ def test_failing_build(mock_archive): pkg = spec.package with pytest.raises(spack.build_environment.ChildError): pkg.do_install() + + +class MockInstallError(spack.error.SpackError): + pass diff --git a/var/spack/repos/builtin.mock/packages/canfail/package.py b/var/spack/repos/builtin.mock/packages/canfail/package.py new file mode 100644 index 0000000000..18def38562 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/canfail/package.py @@ -0,0 +1,43 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Canfail(Package): + """Package which fails install unless a special attribute is set""" + + homepage = "http://www.example.com" + url = "http://www.example.com/a-1.0.tar.gz" + + version('1.0', '0123456789abcdef0123456789abcdef') + + def install(self, spec, prefix): + try: + succeed = getattr(self, 'succeed') + if not succeed: + raise InstallError("'succeed' was false") + touch(join_path(prefix, 'an_installation_file')) + except AttributeError: + raise InstallError("'succeed' attribute was not set") -- cgit v1.2.3-70-g09d2 From f06c23ef42835fd5bac96f35608132bee0dcd6f9 Mon Sep 17 00:00:00 2001 From: Nicolas Richart Date: Wed, 14 Jun 2017 20:11:30 +0200 Subject: Adding package namd (#4321) * Initial version of the namd package * Modified charm to consider compile against intel/intel-mpi * Correction of namd to compile with intel-mkl and intel compiler * Adding inclue64 in the prefix * adding property for the build directory * removing useless function build --- lib/spack/spack/util/prefix.py | 23 ++-- var/spack/repos/builtin/packages/charm/package.py | 36 +++-- .../repos/builtin/packages/intel-mpi/package.py | 7 + var/spack/repos/builtin/packages/namd/package.py | 151 +++++++++++++++++++++ 4 files changed, 195 insertions(+), 22 deletions(-) create mode 100644 var/spack/repos/builtin/packages/namd/package.py (limited to 'lib') diff --git a/lib/spack/spack/util/prefix.py b/lib/spack/spack/util/prefix.py index e39b81a4c6..ca880c53b7 100644 --- a/lib/spack/spack/util/prefix.py +++ b/lib/spack/spack/util/prefix.py @@ -60,17 +60,18 @@ class Prefix(str): def __new__(cls, path): s = super(Prefix, cls).__new__(cls, path) - s.bin = join_path(s, 'bin') - s.bin64 = join_path(s, 'bin64') - s.sbin = join_path(s, 'sbin') - s.etc = join_path(s, 'etc') - s.include = join_path(s, 'include') - s.lib = join_path(s, 'lib') - s.lib64 = join_path(s, 'lib64') - s.libexec = join_path(s, 'libexec') - s.share = join_path(s, 'share') - s.doc = join_path(s.share, 'doc') - s.info = join_path(s.share, 'info') + s.bin = join_path(s, 'bin') + s.bin64 = join_path(s, 'bin64') + s.sbin = join_path(s, 'sbin') + s.etc = join_path(s, 'etc') + s.include = join_path(s, 'include') + s.include64 = join_path(s, 'include64') + s.lib = join_path(s, 'lib') + s.lib64 = join_path(s, 'lib64') + s.libexec = join_path(s, 'libexec') + s.share = join_path(s, 'share') + s.doc = join_path(s.share, 'doc') + s.info = join_path(s.share, 'info') s.man = join_path(s, 'man') s.man1 = join_path(s.man, 'man1') diff --git a/var/spack/repos/builtin/packages/charm/package.py b/var/spack/repos/builtin/packages/charm/package.py index 3e84394da8..9f08d820d2 100644 --- a/var/spack/repos/builtin/packages/charm/package.py +++ b/var/spack/repos/builtin/packages/charm/package.py @@ -115,29 +115,43 @@ class Charm(Package): # We assume that Spack's compiler wrappers make this work. If # not, then we need to query the compiler vendor from Spack # here. - compiler = "gcc" - - options = [compiler, - "--with-production", # Note: turn this into a variant - "-j%d" % make_jobs, - "--destination=%s" % prefix] - if "+mpi" in spec: - options.append("--basedir=%s" % spec["mpi"].prefix) + compiler = os.path.basename(self.compiler.cc) + + options = [compiler] + if compiler == 'icc': + options.append('ifort') + + options.extend([ + "--with-production", # Note: turn this into a variant + "-j%d" % make_jobs, + "--destination=%s" % prefix]) + + if 'backend=mpi' in spec: + # in intelmpi /include and /lib fails so --basedir + # cannot be used + options.extend([ + '--incdir={0}'.format(incdir) + for incdir in spec["mpi"].headers.directories + ]) + options.extend([ + '--libdir={0}'.format(libdir) + for libdir in spec["mpi"].libs.directories + ]) if "+papi" in spec: options.extend(["papi", "--basedir=%s" % spec["papi"].prefix]) if "+smp" in spec: - if "+multicore" in spec: + if 'backend=multicore' in spec: # This is a Charm++ limitation; it would lead to a # build error raise InstallError("Cannot combine +smp with +multicore") options.append("smp") if "+tcp" in spec: - if "+net" not in spec: + if 'backend=net' not in spec: # This is a Charm++ limitation; it would lead to a # build error raise InstallError( "The +tcp variant requires " - "the +net communication mechanism") + "the backend=net communication mechanism") options.append("tcp") if "+shared" in spec: options.append("--build-shared") diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py index 0336f426be..68610d7afe 100644 --- a/var/spack/repos/builtin/packages/intel-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-mpi/package.py @@ -54,6 +54,13 @@ class IntelMpi(IntelInstaller): libraries, root=self.prefix.lib64, shared=True, recurse=True ) + @property + def mpi_headers(self): + # recurse from self.prefix will find too many things for all the + # supported sub-architectures like 'mic' + return find_headers( + 'mpi', root=self.prefix.include64, recurse=False) + def install(self, spec, prefix): self.intel_prefix = prefix IntelInstaller.install(self, spec, prefix) diff --git a/var/spack/repos/builtin/packages/namd/package.py b/var/spack/repos/builtin/packages/namd/package.py new file mode 100644 index 0000000000..160d508004 --- /dev/null +++ b/var/spack/repos/builtin/packages/namd/package.py @@ -0,0 +1,151 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import platform +import shutil +import sys +import os +from spack import * + + +class Namd(MakefilePackage): + """NAMDis a parallel molecular dynamics code designed for + high-performance simulation of large biomolecular systems.""" + + homepage = "http://www.ks.uiuc.edu/Research/namd/" + url = "file://{0}/NAMD_2.12_Source.tar.gz".format(os.getcwd()) + + version('2.12', '2a1191909b1ab03bf0205971ad4d8ee9') + + variant('fftw', default='3', values=('none', '2', '3', 'mkl'), + description='Enable the use of FFTW/FFTW3/MKL FFT') + + variant('interface', default='none', values=('none', 'tcl', 'python'), + description='Enables TCL and/or python interface') + + depends_on('charm') + + depends_on('fftw@:2.99', when="fftw=2") + depends_on('fftw@3:', when="fftw=3") + + depends_on('intel-mkl', when="fftw=mkl") + + depends_on('tcl', when='interface=tcl') + + depends_on('tcl', when='interface=python') + depends_on('python', when='interface=python') + + def _copy_arch_file(self, lib): + config_filename = 'arch/{0}.{1}'.format(self.arch, lib) + shutil.copy('arch/Linux-x86_64.{0}'.format(lib), + config_filename) + if lib == 'tcl': + filter_file(r'-ltcl8\.5', + '-ltcl{0}'.format(self.spec['tcl'].version.up_to(2)), + config_filename) + + def _append_option(self, opts, lib): + if lib != 'python': + self._copy_arch_file(lib) + spec = self.spec + opts.extend([ + '--with-{0}'.format(lib), + '--{0}-prefix'.format(lib), spec[lib].prefix + ]) + + @property + def arch(self): + plat = sys.platform + if plat.startswith("linux"): + plat = "linux" + march = platform.machine() + return '{0}-{1}'.format(plat, march) + + @property + def build_directory(self): + return '{0}-spack'.format(self.arch) + + def edit(self, spec, prefix): + with working_dir('arch'): + with open('{0}.arch'.format(self.build_directory), 'w') as fh: + # this options are take from the default provided + # configuration files + optims_opts = { + 'gcc': '-m64 -O3 -fexpensive-optimizations -ffast-math', + 'intel': '-O2 -ip' + } + + optim_opts = optims_opts[self.compiler.name] \ + if self.compiler.name in optims_opts else '' + + fh.write('\n'.join([ + 'NAMD_ARCH = {0}'.format(self.arch), + 'CHARMARCH = ', + 'CXX = {0.cxx} {0.cxx11_flag}'.format( + self.compiler), + 'CXXOPTS = {0}'.format(optim_opts), + 'CC = {0}'.format(self.compiler.cc), + 'COPTS = {0}'.format(optim_opts), + '' + ])) + + self._copy_arch_file('base') + + opts = ['--charm-base', spec['charm'].prefix] + fftw_version = spec.variants['fftw'].value + if fftw_version == 'none': + opts.append('--without-fftw') + elif fftw_version == 'mkl': + self._append_option(opts, 'mkl') + else: + _fftw = 'fftw{0}'.format('' if fftw_version == '2' else '3') + + self._copy_arch_file(_fftw) + opts.extend(['--with-{0}'.format(_fftw), + '--fftw-prefix', spec['fftw'].prefix]) + + interface_type = spec.variants['interface'].value + if interface_type != 'none': + self._append_option(opts, 'tcl') + + if interface_type == 'python': + self._append_option(opts, 'python') + else: + opts.extend([ + '--without-tcl', + '--without-python' + ]) + + config = Executable('./config') + + config(self.build_directory, *opts) + + def install(self, spec, prefix): + with working_dir(self.build_directory): + mkdirp(prefix.bin) + install('namd2', prefix.bin) + + # I'm not sure this is a good idea or if an autoload of the charm + # module would not be better. + install('charmrun', prefix.bin) -- cgit v1.2.3-70-g09d2 From e62744741785075c535c739b2b0613ebbe4aa0b6 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 15 Jun 2017 04:27:18 -0500 Subject: Prefer vim to vi for default editor (#4230) * vim > vi * Allow which to accept multiple args * Update __init__ to use which with multiple args * Fix doc tests --- lib/spack/spack/__init__.py | 17 ++- lib/spack/spack/abi.py | 3 +- lib/spack/spack/package_test.py | 2 +- lib/spack/spack/util/executable.py | 154 ++++++++++----------- .../repos/builtin/packages/hdf5-blosc/package.py | 2 +- var/spack/repos/builtin/packages/hdf5/package.py | 2 +- var/spack/repos/builtin/packages/spark/package.py | 2 +- 7 files changed, 97 insertions(+), 85 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 057c54d665..214bb09878 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -213,7 +213,22 @@ from spack.util.executable import * __all__ += spack.util.executable.__all__ # User's editor from the environment -editor = Executable(os.environ.get("EDITOR", "vi")) + +# Default editors to use: +_default_editors = ['vim', 'vi', 'emacs', 'nano'] + +# The EDITOR environment variable has the highest precedence +if os.environ.get('EDITOR'): + _default_editors.insert(0, os.environ.get('EDITOR')) + +editor = which(*_default_editors) + +if not editor: + default = default_editors[0] + msg = 'Default text editor, {0}, not found.\n'.format(default) + msg += 'Please set the EDITOR environment variable to your preferred ' + msg += 'text editor, or install {0}.'.format(default) + raise EnvironmentError(msg) from spack.package import \ install_dependency_symlinks, flatten_dependencies, \ diff --git a/lib/spack/spack/abi.py b/lib/spack/spack/abi.py index ad3cae6ee2..401b99cf71 100644 --- a/lib/spack/spack/abi.py +++ b/lib/spack/spack/abi.py @@ -69,8 +69,7 @@ class ABI(object): if Clang.default_version(rungcc.exe[0]) != 'unknown': return None - output = rungcc("--print-file-name=%s" % libname, - return_output=True) + output = rungcc("--print-file-name=%s" % libname, output=str) except ProcessError: return None if not output: diff --git a/lib/spack/spack/package_test.py b/lib/spack/spack/package_test.py index 54f424d45e..fa424287f3 100644 --- a/lib/spack/spack/package_test.py +++ b/lib/spack/spack/package_test.py @@ -39,7 +39,7 @@ def compile_c_and_execute(source_file, include_flags, link_flags): *link_flags) check = Executable('./check') - return check(return_output=True) + return check(output=str) def compare_output(current_output, blessed_output): diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index c7e445971b..0aec84b1d0 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -46,9 +46,16 @@ class Executable(object): raise ProcessError("Cannot construct executable for '%s'" % name) def add_default_arg(self, arg): + """Add a default argument to the command.""" self.exe.append(arg) def add_default_env(self, key, value): + """Set an environment variable when the command is run. + + Parameters: + key: The environment variable to set + value: The value to set it to + """ self.default_env[key] = value @property @@ -81,55 +88,34 @@ class Executable(object): def __call__(self, *args, **kwargs): """Run this executable in a subprocess. - Arguments - args - command line arguments to the executable to run. - - Optional arguments - - fail_on_error - - Raise an exception if the subprocess returns an - error. Default is True. When not set, the return code is - available as `exe.returncode`. - - ignore_errors - - An optional list/tuple of error codes that can be - *ignored*. i.e., if these codes are returned, this will - not raise an exception when `fail_on_error` is `True`. - - output, error - - These arguments allow you to specify new stdout and stderr - values. They default to `None`, which means the - subprocess will inherit the parent's file descriptors. - - You can set these to: - - python streams, e.g. open Python file objects, or os.devnull; - - filenames, which will be automatically opened for writing; or - - `str`, as in the Python string type. If you set these to `str`, - output and error will be written to pipes and returned as - a string. If both `output` and `error` are set to `str`, - then one string is returned containing output concatenated - with error. - - input - - Same as output, error, but `str` is not an allowed value. - - Deprecated arguments - - return_output[=False] - - Setting this to True is the same as setting output=str. - This argument may be removed in future Spack versions. - + Parameters: + *args (str): Command-line arguments to the executable to run + + Keyword Arguments: + env (dict): The environment to run the executable with + fail_on_error (bool): Raise an exception if the subprocess returns + an error. Default is True. The return code is available as + ``exe.returncode`` + ignore_errors (int or list): A list of error codes to ignore. + If these codes are returned, this process will not raise + an exception even if ``fail_on_error`` is set to ``True`` + input: Where to read stdin from + output: Where to send stdout + error: Where to send stderr + + Accepted values for input, output, and error: + + * python streams, e.g. open Python file objects, or ``os.devnull`` + * filenames, which will be automatically opened for writing + * ``str``, as in the Python string type. If you set these to ``str``, + output and error will be written to pipes and returned as a string. + If both ``output`` and ``error`` are set to ``str``, then one string + is returned containing output concatenated with error. Not valid + for ``input`` + + By default, the subprocess inherits the parent's file descriptors. """ - fail_on_error = kwargs.pop("fail_on_error", True) - ignore_errors = kwargs.pop("ignore_errors", ()) - - # environment + # Environment env_arg = kwargs.get('env', None) if env_arg is None: env = os.environ.copy() @@ -138,19 +124,19 @@ class Executable(object): env = self.default_env.copy() env.update(env_arg) - # TODO: This is deprecated. Remove in a future version. - return_output = kwargs.pop("return_output", False) + fail_on_error = kwargs.pop('fail_on_error', True) + ignore_errors = kwargs.pop('ignore_errors', ()) - # Default values of None says to keep parent's file descriptors. - if return_output: - output = str - else: - output = kwargs.pop("output", None) + # If they just want to ignore one error code, make it a tuple. + if isinstance(ignore_errors, int): + ignore_errors = (ignore_errors, ) + + input = kwargs.pop('input', None) + output = kwargs.pop('output', None) + error = kwargs.pop('error', None) - error = kwargs.pop("error", None) - input = kwargs.pop("input", None) if input is str: - raise ValueError("Cannot use `str` as input stream.") + raise ValueError('Cannot use `str` as input stream.') def streamify(arg, mode): if isinstance(arg, string_types): @@ -161,12 +147,8 @@ class Executable(object): return arg, False ostream, close_ostream = streamify(output, 'w') - estream, close_estream = streamify(error, 'w') - istream, close_istream = streamify(input, 'r') - - # if they just want to ignore one error code, make it a tuple. - if isinstance(ignore_errors, int): - ignore_errors = (ignore_errors, ) + estream, close_estream = streamify(error, 'w') + istream, close_istream = streamify(input, 'r') quoted_args = [arg for arg in args if re.search(r'^"|^\'|"$|\'$', arg)] if quoted_args: @@ -196,7 +178,7 @@ class Executable(object): rc = self.returncode = proc.returncode if fail_on_error and rc != 0 and (rc not in ignore_errors): - raise ProcessError("Command exited with status %d:" % + raise ProcessError('Command exited with status %d:' % proc.returncode, cmd_line) if output is str or error is str: @@ -209,12 +191,12 @@ class Executable(object): except OSError as e: raise ProcessError( - "%s: %s" % (self.exe[0], e.strerror), "Command: " + cmd_line) + '%s: %s' % (self.exe[0], e.strerror), 'Command: ' + cmd_line) except subprocess.CalledProcessError as e: if fail_on_error: raise ProcessError( - str(e), "\nExit status %d when invoking command: %s" % + str(e), '\nExit status %d when invoking command: %s' % (proc.returncode, cmd_line)) finally: @@ -235,27 +217,43 @@ class Executable(object): return hash((type(self), ) + tuple(self.exe)) def __repr__(self): - return "" % self.exe + return '' % self.exe def __str__(self): return ' '.join(self.exe) -def which(name, **kwargs): - """Finds an executable in the path like command-line which.""" - path = kwargs.get('path', os.environ.get('PATH', '').split(os.pathsep)) +def which(*args, **kwargs): + """Finds an executable in the path like command-line which. + + If given multiple executables, returns the first one that is found. + If no executables are found, returns None. + + Parameters: + *args (str): One or more executables to search for + + Keyword Arguments: + path (:func:`list` or str): The path to search. Defaults to ``PATH`` + required (bool): If set to True, raise an error if executable not found + + Returns: + Executable: The first executable that is found in the path + """ + path = kwargs.get('path', os.environ.get('PATH')) required = kwargs.get('required', False) - if not path: - path = [] + if isinstance(path, string_types): + path = path.split(os.pathsep) - for dir in path: - exe = os.path.join(dir, name) - if os.path.isfile(exe) and os.access(exe, os.X_OK): - return Executable(exe) + for name in args: + for directory in path: + exe = os.path.join(directory, name) + if os.path.isfile(exe) and os.access(exe, os.X_OK): + return Executable(exe) if required: - tty.die("spack requires %s. Make sure it is in your path." % name) + tty.die("spack requires '%s'. Make sure it is in your path." % args[0]) + return None diff --git a/var/spack/repos/builtin/packages/hdf5-blosc/package.py b/var/spack/repos/builtin/packages/hdf5-blosc/package.py index 053a4d4852..288f958134 100644 --- a/var/spack/repos/builtin/packages/hdf5-blosc/package.py +++ b/var/spack/repos/builtin/packages/hdf5-blosc/package.py @@ -184,7 +184,7 @@ Done. "-L%s" % spec["hdf5"].prefix.lib, "-lhdf5") try: check = Executable("./check") - output = check(return_output=True) + output = check(output=str) except: output = "" success = output == expected diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 50ad30222f..2f2f016177 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -263,7 +263,7 @@ HDF5 version {version} {version} spec['hdf5'].libs.ld_flags.split())) try: check = Executable('./check') - output = check(return_output=True) + output = check(output=str) except: output = "" success = output == expected diff --git a/var/spack/repos/builtin/packages/spark/package.py b/var/spack/repos/builtin/packages/spark/package.py index 3030fb1310..52eb5d7289 100644 --- a/var/spack/repos/builtin/packages/spark/package.py +++ b/var/spack/repos/builtin/packages/spark/package.py @@ -72,7 +72,7 @@ class Spark(Package): # spack_env.set('JAVA_HOME', self.spec['jdk'].prefix) hadoop = self.spec['hadoop'].command - hadoop_classpath = hadoop('classpath', return_output=True) + hadoop_classpath = hadoop('classpath', output=str) # Remove whitespaces, as they can compromise syntax in # module files -- cgit v1.2.3-70-g09d2 From 8c2447272eae511aa3dfc4bb9d47fad1a16468a3 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Thu, 15 Jun 2017 11:32:55 +0200 Subject: Fix dashes in variant parsing (#4498) - Skip spack flake8 test when flake8 is not installed. - Fix parsing of dashes in specs broken by new help parser. - use argparse.REMAINDER instead of narg='?' - don't interpret parts of specs like -mpi as arguments. --- lib/spack/spack/main.py | 15 +++++++-------- lib/spack/spack/test/cmd/flake8.py | 1 + 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index 39c64b3ce0..543d871f42 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -32,8 +32,8 @@ from __future__ import print_function import sys import os import inspect -from argparse import _ArgumentGroup, ArgumentParser, RawTextHelpFormatter import pstats +import argparse import llnl.util.tty as tty from llnl.util.tty.color import * @@ -126,7 +126,7 @@ def index_commands(): return index -class SpackArgumentParser(ArgumentParser): +class SpackArgumentParser(argparse.ArgumentParser): def format_help_sections(self, level): """Format help on sections for a particular verbosity level. @@ -165,7 +165,7 @@ class SpackArgumentParser(ArgumentParser): if action.metavar in cmd_set) # add commands to a group in order, and add the group - group = _ArgumentGroup(self, title=title) + group = argparse._ArgumentGroup(self, title=title) for name in commands: group._add_action(cmds[name]) if name in remaining: @@ -265,7 +265,7 @@ class SpackArgumentParser(ArgumentParser): def make_argument_parser(): """Create an basic argument parser without any subcommands added.""" parser = SpackArgumentParser( - formatter_class=RawTextHelpFormatter, add_help=False, + formatter_class=argparse.RawTextHelpFormatter, add_help=False, description=( "A flexible package manager that supports multiple versions,\n" "configurations, platforms, and compilers.")) @@ -410,8 +410,7 @@ def main(argv=None): # avoid loading all the modules from spack.cmd when we don't need # them, which reduces startup latency. parser = make_argument_parser() - parser.add_argument( - 'command', metavar='COMMAND', nargs='?', action='store') + parser.add_argument('command', nargs=argparse.REMAINDER) args, unknown = parser.parse_known_args(argv) # Just print help and exit if run with no arguments at all @@ -432,13 +431,13 @@ def main(argv=None): # Try to load the particular command the caller asked for. If there # is no module for it, just die. - command_name = args.command.replace('-', '_') + command_name = args.command[0].replace('-', '_') try: parser.add_command(command_name) except ImportError: if spack.debug: raise - tty.die("Unknown command: %s" % args.command) + tty.die("Unknown command: %s" % args.command[0]) # Re-parse with the proper sub-parser added. args, unknown = parser.parse_known_args() diff --git a/lib/spack/spack/test/cmd/flake8.py b/lib/spack/spack/test/cmd/flake8.py index 438791c988..3fad486333 100644 --- a/lib/spack/spack/test/cmd/flake8.py +++ b/lib/spack/spack/test/cmd/flake8.py @@ -81,6 +81,7 @@ def test_changed_files(parser, flake8_package): sys.version_info[:2] <= (2, 6) or (3, 0) <= sys.version_info[:2] <= (3, 3), reason='flake8 no longer supports Python 2.6 or 3.3 and older') +@pytest.mark.skipif(not which('flake8'), reason='flake8 is not installed.') def test_flake8(parser, flake8_package): # Only test the flake8_package that we modified # Otherwise, the unit tests would fail every time -- cgit v1.2.3-70-g09d2 From 41e4a034ffd89b6e31411a00ad765e7f936dc3ab Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 15 Jun 2017 05:40:55 -0500 Subject: Add latest version of JDK (#4317) * Add latest version of JDK * Use a more specific URL to get curl to work * Remove failing unit test --- lib/spack/spack/test/package_sanity.py | 10 ---------- var/spack/repos/builtin/packages/jdk/package.py | 25 +++++++++++++++---------- 2 files changed, 15 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py index ac318f94dc..c1902413ea 100644 --- a/lib/spack/spack/test/package_sanity.py +++ b/lib/spack/spack/test/package_sanity.py @@ -49,16 +49,6 @@ def test_get_all_mock_packages(): spack.repo.swap(db) -def test_url_versions(): - """Check URLs for regular packages, if they are explicitly defined.""" - for pkg in spack.repo.all_packages(): - for v, vattrs in pkg.versions.items(): - if 'url' in vattrs: - # If there is a url for the version check it. - v_url = pkg.url_for_version(v) - assert vattrs['url'] == v_url - - def test_all_versions_are_lowercase(): """Spack package names must be lowercase, and use `-` instead of `_`.""" errors = [] diff --git a/var/spack/repos/builtin/packages/jdk/package.py b/var/spack/repos/builtin/packages/jdk/package.py index 02c44e9337..9939772f47 100644 --- a/var/spack/repos/builtin/packages/jdk/package.py +++ b/var/spack/repos/builtin/packages/jdk/package.py @@ -45,19 +45,24 @@ class Jdk(Package): '-H', # specify required License Agreement cookie 'Cookie: oraclelicense=accept-securebackup-cookie'] - version('8u92', '65a1cc17ea362453a6e0eb4f13be76e4', - url="http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-linux-x64.tar.gz", - curl_options=curl_options) - version('8u73', '1b0120970aa8bc182606a16bf848a686', - url="http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.tar.gz", - curl_options=curl_options) - version('8u66', '88f31f3d642c3287134297b8c10e61bf', - url="http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.tar.gz", - curl_options=curl_options) + # For instructions on how to find the magic URL, see: + # https://gist.github.com/P7h/9741922 + # https://linuxconfig.org/how-to-install-java-se-development-kit-on-debian-linux + version('8u131-b11', '75b2cb2249710d822a60f83e28860053', curl_options=curl_options, + url='http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz') + version('8u92-b14', '65a1cc17ea362453a6e0eb4f13be76e4', curl_options=curl_options) + version('8u73-b02', '1b0120970aa8bc182606a16bf848a686', curl_options=curl_options) + version('8u66-b17', '88f31f3d642c3287134297b8c10e61bf', curl_options=curl_options) # The 7u80 tarball is not readily available from Oracle. If you have # the tarball, add it to your mirror as mirror/jdk/jdk-7u80.tar.gz and # away you go. - version('7u80', '6152f8a7561acf795ca4701daa10a965') + version('7u80-b0', '6152f8a7561acf795ca4701daa10a965') + + def url_for_version(self, version): + url = "http://download.oracle.com/otn-pub/java/jdk/{0}/jdk-{1}-linux-x64.tar.gz" + version = str(version) + minor_version = version[:version.index('-')] + return url.format(version, minor_version) def install(self, spec, prefix): distutils.dir_util.copy_tree(".", prefix) -- cgit v1.2.3-70-g09d2 From da67ee9790598fa91aa97af173660560202b3e82 Mon Sep 17 00:00:00 2001 From: Mario Melara Date: Thu, 15 Jun 2017 15:16:14 -0700 Subject: Fix tests on cray (#4298) * Check for CRAYPE_VERSION instead of path Architecture tests would fail on Cray since it would not find the expected path. To make the test correctly work on Cray search for the CRAYPE version instead. * Catch SystemExit error in case flake8 not in path On shared systems having flake8 can involve starting own virtual env. Skip the test if no flake8 is found to avoid failure reporting. * Add compatibility to 1.5 svnadmin create The flag added is needed to correctly create svn repos on NERSC systems. This could be unnecessary for other sites. I'd like to see others test before this change gets merged. --- lib/spack/spack/test/architecture.py | 2 +- lib/spack/spack/test/cmd/flake8.py | 3 --- lib/spack/spack/test/conftest.py | 4 +++- 3 files changed, 4 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py index 8f257cf0dc..f658b1951f 100644 --- a/lib/spack/spack/test/architecture.py +++ b/lib/spack/spack/test/architecture.py @@ -58,7 +58,7 @@ def test_dict_functions_for_architecture(): def test_platform(): output_platform_class = spack.architecture.real_platform() - if os.path.exists('/opt/cray/craype'): + if os.environ.get('CRAYPE_VERSION') is not None: my_platform_class = Cray() elif os.path.exists('/bgsys'): my_platform_class = Bgq() diff --git a/lib/spack/spack/test/cmd/flake8.py b/lib/spack/spack/test/cmd/flake8.py index 3fad486333..f0fc339f8b 100644 --- a/lib/spack/spack/test/cmd/flake8.py +++ b/lib/spack/spack/test/cmd/flake8.py @@ -87,10 +87,7 @@ def test_flake8(parser, flake8_package): # Otherwise, the unit tests would fail every time # the flake8 tests fail args = parser.parse_args([flake8_package]) - flake8(parser, args) - # Get even more coverage args = parser.parse_args(['--output', '--root-relative', flake8_package]) - flake8(parser, args) diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 3c725e229b..c8720ddbc8 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -474,7 +474,9 @@ def mock_svn_repository(): url = 'file://' + str(repodir) # Initialize the repository current = repodir.chdir() - svnadmin('create', str(repodir)) + # NOTE: Adding --pre-1.5-compatible works for NERSC + # Unknown if this is also an issue at other sites. + svnadmin('create', '--pre-1.5-compatible', str(repodir)) # Import a structure (first commit) r0_file = 'r0_file' -- cgit v1.2.3-70-g09d2 From 8b5e94976d9850d352225e60e1d9428fc7c87735 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 16 Jun 2017 12:41:15 +0200 Subject: issue 4492: DependencyMap.concrete checks for unconditional dependencies (#4499) * issue 4492: added xfailing test, added owner to DependencyMap * DependencyMap.concrete checks if we have unconditional dependencies This fixes #4492 and #4107 using some heuristics to avoid an infinite recursion among Spec.satisfies, Spec.concrete and DependencyMap.concrete The idea, as suggested by @becker33, is to check just for unconditional dependencies. This is not covering the whole space and a package with just conditional dependencies can still fail in the same way. It should cover though all the **real** packages we have in our repo so far. --- lib/spack/spack/spec.py | 85 ++++++++++++++++++++++++++++++++++---- lib/spack/spack/test/concretize.py | 21 +++++++++- 2 files changed, 96 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index c757e6b0d6..eed93eccb7 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -678,10 +678,72 @@ class DependencyMap(HashableMap): """Each spec has a DependencyMap containing specs for its dependencies. The DependencyMap is keyed by name. """ + def __init__(self, owner): + super(DependencyMap, self).__init__() + + # Owner Spec for the current map + self.owner = owner + @property def concrete(self): - return all((d.spec.concrete and d.deptypes) - for d in self.values()) + + # Check if the dependencies are concrete and of the correct type + dependencies_are_concrete = all( + (d.spec.concrete and d.deptypes) for d in self.values() + ) + + if not dependencies_are_concrete: + return False + + # If we are dealing with an external spec, it clearly has no + # dependencies managed by spack + if self.owner.external: + return True + + # Now check we have every dependency we need + pkg = self.owner.package + for dependency in pkg.dependencies.values(): + # Check that for every condition we satisfy we satisfy also + # the associated constraint + for condition, constraint in dependency.items(): + # WARNING: This part relies on the fact that dependencies are + # the last item to be checked when computing if a spec is + # concrete. This means that we are ensured that all variants, + # versions, compilers, etc. are there with their final value + # when we call 'Spec.satisfies(..., strict=True)' + + # FIXME: at the moment check only for non conditional + # FIXME: dependencies, to avoid infinite recursion + + # satisfy_condition = self.owner.satisfies( + # condition, strict=True + # ) + + satisfy_condition = str(condition) == self.owner.name + + if not satisfy_condition: + continue + + dependency_name = constraint.name + + # We don't want to check build dependencies + if pkg.dependency_types[dependency_name] == set(['build']): + continue + + try: + dependency = self.owner[dependency_name] + satisfy_constraint = dependency.satisfies( + constraint, strict=True + ) + except KeyError: + # If the dependency is not there we don't + # satisfy the constraint + satisfy_constraint = False + + if satisfy_condition and not satisfy_constraint: + return False + + return True def __str__(self): return "{deps: %s}" % ', '.join(str(d) for d in sorted(self.values())) @@ -1144,9 +1206,13 @@ class Spec(object): If any of the name, version, architecture, compiler, variants, or depdenencies are ambiguous,then it is not concrete. """ + # If we have cached that the spec is concrete, then it's concrete if self._concrete: return True + # Otherwise check if the various parts of the spec are concrete. + # It's crucial to have the check on dependencies last, as it relies + # on all the other parts to be already checked for concreteness. self._concrete = bool(not self.virtual and self.namespace is not None and self.versions.concrete and @@ -1647,8 +1713,8 @@ class Spec(object): if replacement.external: if (spec._dependencies): changed = True - spec._dependencies = DependencyMap() - replacement._dependencies = DependencyMap() + spec._dependencies = DependencyMap(spec) + replacement._dependencies = DependencyMap(replacement) replacement.architecture = self.architecture # TODO: could this and the stuff in _dup be cleaned up? @@ -1676,6 +1742,7 @@ class Spec(object): if spec._dup(replacement, deps=False, cleardeps=False): changed = True + spec._dependencies.owner = spec self_index.update(spec) done = False break @@ -1807,7 +1874,7 @@ class Spec(object): def index(self, deptype=None): """Return DependencyMap that points to all the dependencies in this spec.""" - dm = DependencyMap() + dm = DependencyMap(None) for spec in self.traverse(deptype=deptype): dm[spec.name] = spec return dm @@ -2416,8 +2483,8 @@ class Spec(object): else None self.compiler = other.compiler.copy() if other.compiler else None if cleardeps: - self._dependents = DependencyMap() - self._dependencies = DependencyMap() + self._dependents = DependencyMap(self) + self._dependencies = DependencyMap(self) self.compiler_flags = other.compiler_flags.copy() self.variants = other.variants.copy() self.variants.spec = self @@ -3078,8 +3145,8 @@ class SpecParser(spack.parse.Parser): spec.external_path = None spec.external_module = None spec.compiler_flags = FlagMap(spec) - spec._dependents = DependencyMap() - spec._dependencies = DependencyMap() + spec._dependents = DependencyMap(spec) + spec._dependencies = DependencyMap(spec) spec.namespace = spec_namespace spec._hash = None spec._cmp_key_cache = None diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 779d4f8816..1b659cb091 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -26,7 +26,8 @@ import pytest import spack import spack.architecture from spack.concretize import find_spec -from spack.spec import Spec, CompilerSpec, ConflictsInSpecError, SpecError +from spack.spec import Spec, CompilerSpec +from spack.spec import ConflictsInSpecError, SpecError from spack.version import ver @@ -397,3 +398,21 @@ class TestConcretize(object): s = Spec(conflict_spec) with pytest.raises(exc_type): s.concretize() + + def test_regression_issue_4492(self): + # Constructing a spec which has no dependencies, but is otherwise + # concrete is kind of difficult. What we will do is to concretize + # a spec, and then modify it to have no dependency and reset the + # cache values. + + s = Spec('mpileaks') + s.concretize() + + # Check that now the Spec is concrete, store the hash + assert s.concrete + + # Remove the dependencies and reset caches + s._dependencies.clear() + s._concrete = False + + assert not s.concrete -- cgit v1.2.3-70-g09d2 From 790b06e0c363ce1598deb3bde217c4685701b61d Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 16 Jun 2017 14:03:21 +0200 Subject: bugfix: support EDITOR values with spaces (#4523) - previous code called `which` on $EDITOR, but that doesn't work for EDITORs like `emacs -nw` or `emacsclient -t -nw`. - This patch just trusts EDITOR if it is set (same as previous behavior), and only uses the defaults if it's not. --- lib/spack/spack/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 214bb09878..3f99c5581c 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -212,16 +212,16 @@ import spack.util.executable from spack.util.executable import * __all__ += spack.util.executable.__all__ -# User's editor from the environment -# Default editors to use: -_default_editors = ['vim', 'vi', 'emacs', 'nano'] +# Set up the user's editor +# $EDITOR environment variable has the highest precedence +editor = os.environ.get('EDITOR') -# The EDITOR environment variable has the highest precedence -if os.environ.get('EDITOR'): - _default_editors.insert(0, os.environ.get('EDITOR')) - -editor = which(*_default_editors) +# if editor is not set, use some sensible defaults +if editor is not None: + editor = Executable(editor) +else: + editor = which('vim', 'vi', 'emacs', 'nano') if not editor: default = default_editors[0] -- cgit v1.2.3-70-g09d2 From 541496dfe150f50a11531156a108f7741c5d1177 Mon Sep 17 00:00:00 2001 From: becker33 Date: Fri, 16 Jun 2017 12:31:56 -0700 Subject: System config (#4518) * Code changes to enable system config scope in /etc Files will go in either /etc/spack or /etc/spack/ Required minor changes to conftest. * Updated documentation to match new config scope --- lib/spack/docs/configuration.rst | 40 ++++++++++++++++++++++------------- lib/spack/spack/__init__.py | 6 +++--- lib/spack/spack/compilers/__init__.py | 3 ++- lib/spack/spack/config.py | 10 ++++++++- lib/spack/spack/test/conftest.py | 1 + 5 files changed, 40 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/configuration.rst b/lib/spack/docs/configuration.rst index 32e1a8c170..5f76a76c81 100644 --- a/lib/spack/docs/configuration.rst +++ b/lib/spack/docs/configuration.rst @@ -45,20 +45,27 @@ Configuration Scopes ------------------------- Spack pulls configuration data from files in several directories. There -are three configuration scopes. From lowest to highest: +are four configuration scopes. From lowest to highest: -1. **defaults**: Stored in ``$(prefix)/etc/spack/defaults/``. These are +#. **defaults**: Stored in ``$(prefix)/etc/spack/defaults/``. These are the "factory" settings. Users should generally not modify the settings here, but should override them in other configuration scopes. The defaults here will change from version to version of Spack. -2. **site**: Stored in ``$(prefix)/etc/spack/``. Settings here affect +#. **system**: Stored in ``/etc/spack``. These are settings for this + machine, or for all machines on which this file system is + mounted. The site scope can be used for settings idiosyncratic to a + particular machine, such as the locations of compilers or external + packages. These settings are presumably controlled by someone with + root access on the machine. + +#. **site**: Stored in ``$(prefix)/etc/spack/``. Settings here affect only *this instance* of Spack, and they override defaults. The site scope can can be used for per-project settings (one spack instance per project) or for site-wide settings on a multi-user machine (e.g., for a common spack instance). -3. **user**: Stored in the home directory: ``~/.spack/``. These settings +#. **user**: Stored in the home directory: ``~/.spack/``. These settings affect all instances of Spack and take the highest precedence. Each configuration directory may contain several configuration files, @@ -78,22 +85,25 @@ Platform-specific scopes ------------------------- For each scope above, there can *also* be platform-specific settings. -For example, on Blue Gene/Q machines, Spack needs to know the location of -cross-compilers for the compute nodes. This configuration is in -``etc/spack/defaults/bgq/compilers.yaml``. It will take precedence over -settings in the ``defaults`` scope, but can still be overridden by -settings in ``site``, ``site/bgq``, ``user``, or ``user/bgq``. So, the -full scope precedence is: +For example, on Blue Gene/Q machines, Spack needs to know the location +of cross-compilers for the compute nodes. This configuration is in +``etc/spack/defaults/bgq/compilers.yaml``. It will take precedence +over settings in the ``defaults`` scope, but can still be overridden +by settings in ``system``, ``system/bgq``, ``site``, ``site/bgq``, +``user``, or ``user/bgq``. So, the full scope precedence is: 1. ``defaults`` 2. ``defaults/`` -3. ``site`` -4. ``site/`` -5. ``user`` -6. ``user/`` +3. ``system`` +4. ``system/`` +5. ``site`` +6. ``site/`` +7. ``user`` +8. ``user/`` You can get the name to use for ```` by running ``spack arch ---platform``. +--platform``. The system config scope has a ```` section for +sites at which ``/etc`` is mounted on multiple heterogeneous machines. ------------------------- Scope precedence diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 3f99c5581c..b67fcaf2f6 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -64,9 +64,9 @@ mock_packages_path = join_path(repos_path, "builtin.mock") user_config_path = os.path.expanduser('~/.spack') prefix = spack_root -opt_path = join_path(prefix, "opt") -etc_path = join_path(prefix, "etc") - +opt_path = join_path(prefix, "opt") +etc_path = join_path(prefix, "etc") +system_etc_path = '/etc' # GPG paths. gpg_keys_path = join_path(var_path, "gpg") diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 585df23320..826e74bbbb 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -100,7 +100,8 @@ def get_compiler_config(scope=None, init_config=True): # Check the site config and update the user config if # nothing is configured at the site level. site_config = spack.config.get_config('compilers', scope='site') - if not site_config: + sys_config = spack.config.get_config('compilers', scope='system') + if not site_config and not sys_config: init_compiler_config() config = spack.config.get_config('compilers', scope=scope) return config diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index 7c3d614aee..d0d6b6be2d 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -30,6 +30,7 @@ documentation on :ref:`configuration-scopes` for details on how Spack's configuration system behaves. The scopes are: #. ``default`` + #. ``system`` #. ``site`` #. ``user`` @@ -211,11 +212,17 @@ class ConfigScope(object): _platform = spack.architecture.platform().name """Default configuration scope is the lowest-level scope. These are - versioned with Spack and can be overridden by sites or users.""" + versioned with Spack and can be overridden by systems, sites or users.""" _defaults_path = os.path.join(spack.etc_path, 'spack', 'defaults') ConfigScope('defaults', _defaults_path) ConfigScope('defaults/%s' % _platform, os.path.join(_defaults_path, _platform)) +"""System configuration is per machine. + No system-level configs should be checked into spack by default""" +_system_path = os.path.join(spack.system_etc_path, 'spack') +ConfigScope('system', _system_path) +ConfigScope('system/%s' % _platform, os.path.join(_system_path, _platform)) + """Site configuration is per spack instance, for sites or projects. No site-level configs should be checked into spack by default.""" _site_path = os.path.join(spack.etc_path, 'spack') @@ -398,6 +405,7 @@ def get_config(section, scope=None): for scope in scopes: # read potentially cached data from the scope. + data = scope.get_section(section) # Skip empty configs diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index c8720ddbc8..19e7844090 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -173,6 +173,7 @@ def config(configuration_dir): real_scope = spack.config.config_scopes spack.config.config_scopes = ordereddict_backport.OrderedDict() spack.config.ConfigScope('site', str(configuration_dir.join('site'))) + spack.config.ConfigScope('system', str(configuration_dir.join('system'))) spack.config.ConfigScope('user', str(configuration_dir.join('user'))) Config = collections.namedtuple('Config', ['real', 'mock']) -- cgit v1.2.3-70-g09d2 From a1131011263c086042ec24748e518d6e2b16b5f8 Mon Sep 17 00:00:00 2001 From: becker33 Date: Wed, 21 Jun 2017 09:58:41 -0700 Subject: Module cmd fix (#3250) * Parse modules in a way that works for both lmod and tcl * added test and made method more robust * refactoring for pythonic clarity * Improved detection of 'module' shell function + refactored module utilities into spack.util.module_cmd * Improved regex to reject nested parentheses we are not prepared to handle * make tests backwards compatible with python 2.6 * Improved regex to account for sh being aliased to bash and used in bash module definition on some systems * Improve test compatibility with lmod * Added error for None module_cmd * Add test for get_module_cmd_from_which() Add test for get_module_cmd_from_which(). Add -c argument to Popen call to typeset -f module in get_module_cmd_from_bash(). * Increased detection options Included BASH_FUNC_module() variable outside of typeset as a detection option This should work on bash even in restricted_shell mode Kept the typeset detection as an option in case the module function is not exported in bash Also added try statements to tests, with environment recreation in finally blocks. * More tests added; some hackiness * increased test coverage for util/module_cmd --- lib/spack/spack/build_environment.py | 65 +---------- lib/spack/spack/operating_systems/cnl.py | 5 +- lib/spack/spack/package_prefs.py | 2 +- lib/spack/spack/platforms/cray.py | 4 +- lib/spack/spack/spec.py | 2 +- lib/spack/spack/test/module_parsing.py | 143 +++++++++++++++++++++++ lib/spack/spack/util/module_cmd.py | 195 +++++++++++++++++++++++++++++++ 7 files changed, 346 insertions(+), 70 deletions(-) create mode 100644 lib/spack/spack/test/module_parsing.py create mode 100644 lib/spack/spack/util/module_cmd.py (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index e216d4aa7c..ac44e57c09 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -67,8 +67,8 @@ import spack import spack.store from spack.environment import EnvironmentModifications, validate from spack.util.environment import * -from spack.util.executable import Executable, which - +from spack.util.executable import Executable +from spack.util.module_cmd import load_module, get_path_from_module # # This can be set by the user to globally disable parallel builds. # @@ -120,67 +120,6 @@ class MakeExecutable(Executable): return super(MakeExecutable, self).__call__(*args, **kwargs) -def load_module(mod): - """Takes a module name and removes modules until it is possible to - load that module. It then loads the provided module. Depends on the - modulecmd implementation of modules used in cray and lmod. - """ - # Create an executable of the module command that will output python code - modulecmd = which('modulecmd') - modulecmd.add_default_arg('python') - - # Read the module and remove any conflicting modules - # We do this without checking that they are already installed - # for ease of programming because unloading a module that is not - # loaded does nothing. - text = modulecmd('show', mod, output=str, error=str).split() - for i, word in enumerate(text): - if word == 'conflict': - exec(compile(modulecmd('unload', text[i + 1], output=str, - error=str), '', 'exec')) - # Load the module now that there are no conflicts - load = modulecmd('load', mod, output=str, error=str) - exec(compile(load, '', 'exec')) - - -def get_path_from_module(mod): - """Inspects a TCL module for entries that indicate the absolute path - at which the library supported by said module can be found. - """ - # Create a modulecmd executable - modulecmd = which('modulecmd') - modulecmd.add_default_arg('python') - - # Read the module - text = modulecmd('show', mod, output=str, error=str).split('\n') - # If it lists its package directory, return that - for line in text: - if line.find(mod.upper() + '_DIR') >= 0: - words = line.split() - return words[2] - - # If it lists a -rpath instruction, use that - for line in text: - rpath = line.find('-rpath/') - if rpath >= 0: - return line[rpath + 6:line.find('/lib')] - - # If it lists a -L instruction, use that - for line in text: - L = line.find('-L/') - if L >= 0: - return line[L + 2:line.find('/lib')] - - # If it sets the LD_LIBRARY_PATH or CRAY_LD_LIBRARY_PATH, use that - for line in text: - if line.find('LD_LIBRARY_PATH') >= 0: - words = line.split() - path = words[2] - return path[:path.find('/lib')] - # Unable to find module path - return None - - def set_compiler_environment_variables(pkg, env): assert(pkg.spec.concrete) compiler = pkg.compiler diff --git a/lib/spack/spack/operating_systems/cnl.py b/lib/spack/spack/operating_systems/cnl.py index b5c759bbcb..95f23a076e 100644 --- a/lib/spack/spack/operating_systems/cnl.py +++ b/lib/spack/spack/operating_systems/cnl.py @@ -25,10 +25,10 @@ import re from spack.architecture import OperatingSystem -from spack.util.executable import * import spack.spec from spack.util.multiproc import parmap import spack.compilers +from spack.util.module_cmd import get_module_cmd class Cnl(OperatingSystem): @@ -63,8 +63,7 @@ class Cnl(OperatingSystem): if not cmp_cls.PrgEnv_compiler: tty.die('Must supply PrgEnv_compiler with PrgEnv') - modulecmd = which('modulecmd') - modulecmd.add_default_arg('python') + modulecmd = get_module_cmd() output = modulecmd( 'avail', cmp_cls.PrgEnv_compiler, output=str, error=str) diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 8b1fe08154..f9c4ced97e 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -200,7 +200,7 @@ def spec_externals(spec): """Return a list of external specs (w/external directory path filled in), one for each known external installation.""" # break circular import. - from spack.build_environment import get_path_from_module # noqa: F401 + from spack.util.module_cmd import get_path_from_module # NOQA: ignore=F401 allpkgs = get_packages_config() name = spec.name diff --git a/lib/spack/spack/platforms/cray.py b/lib/spack/spack/platforms/cray.py index 1cd08e5565..76f7e59674 100644 --- a/lib/spack/spack/platforms/cray.py +++ b/lib/spack/spack/platforms/cray.py @@ -31,6 +31,7 @@ from spack.architecture import Platform, Target, NoPlatformError from spack.operating_systems.linux_distro import LinuxDistro from spack.operating_systems.cnl import Cnl from llnl.util.filesystem import join_path +from spack.util.module_cmd import get_module_cmd def _get_modules_in_modulecmd_output(output): @@ -142,8 +143,7 @@ class Cray(Platform): def _avail_targets(self): '''Return a list of available CrayPE CPU targets.''' if getattr(self, '_craype_targets', None) is None: - module = which('modulecmd', required=True) - module.add_default_arg('python') + module = get_module_cmd() output = module('avail', '-t', 'craype-', output=str, error=str) craype_modules = _get_modules_in_modulecmd_output(output) self._craype_targets = targets = [] diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index eed93eccb7..602f2fd878 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -120,7 +120,7 @@ import spack.util.spack_yaml as syaml from llnl.util.filesystem import find_headers, find_libraries, is_exe from llnl.util.lang import * from llnl.util.tty.color import * -from spack.build_environment import get_path_from_module, load_module +from spack.util.module_cmd import get_path_from_module, load_module from spack.error import SpecError, UnsatisfiableSpecError from spack.provider_index import ProviderIndex from spack.util.crypto import prefix_bits diff --git a/lib/spack/spack/test/module_parsing.py b/lib/spack/spack/test/module_parsing.py new file mode 100644 index 0000000000..6ddb9d2dbf --- /dev/null +++ b/lib/spack/spack/test/module_parsing.py @@ -0,0 +1,143 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import pytest +import subprocess +import os +from spack.util.module_cmd import * + +typeset_func = subprocess.Popen('module avail', + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True) +typeset_func.wait() +typeset = typeset_func.stderr.read() +MODULE_NOT_DEFINED = b'not found' in typeset + + +@pytest.fixture +def save_env(): + old_PATH = os.environ.get('PATH', None) + old_bash_func = os.environ.get('BASH_FUNC_module()', None) + + yield + + if old_PATH: + os.environ['PATH'] = old_PATH + if old_bash_func: + os.environ['BASH_FUNC_module()'] = old_bash_func + + +def test_get_path_from_module(save_env): + lines = ['prepend-path LD_LIBRARY_PATH /path/to/lib', + 'setenv MOD_DIR /path/to', + 'setenv LDFLAGS -Wl,-rpath/path/to/lib', + 'setenv LDFLAGS -L/path/to/lib'] + + for line in lines: + module_func = '() { eval `echo ' + line + ' bash filler`\n}' + os.environ['BASH_FUNC_module()'] = module_func + path = get_path_from_module('mod') + + assert path == '/path/to' + + os.environ['BASH_FUNC_module()'] = '() { eval $(echo fill bash $*)\n}' + path = get_path_from_module('mod') + + assert path is None + + +def test_get_argument_from_module_line(): + lines = ['prepend-path LD_LIBRARY_PATH /lib/path', + 'prepend-path LD_LIBRARY_PATH /lib/path', + "prepend_path('PATH' , '/lib/path')", + 'prepend_path( "PATH" , "/lib/path" )', + 'prepend_path("PATH",' + "'/lib/path')"] + + bad_lines = ['prepend_path(PATH,/lib/path)', + 'prepend-path (LD_LIBRARY_PATH) /lib/path'] + + assert all(get_argument_from_module_line(l) == '/lib/path' for l in lines) + for bl in bad_lines: + with pytest.raises(ValueError): + get_argument_from_module_line(bl) + + +@pytest.mark.skipif(MODULE_NOT_DEFINED, reason='Depends on defined module fn') +def test_get_module_cmd_from_bash_using_modules(): + module_list_proc = subprocess.Popen(['module list'], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + executable='/bin/bash', + shell=True) + module_list_proc.wait() + module_list = module_list_proc.stdout.read() + + module_cmd = get_module_cmd_from_bash() + module_cmd_list = module_cmd('list', output=str, error=str) + + # Lmod command reprints some env variables on every invocation. + # Test containment to avoid false failures on lmod systems. + assert module_list in module_cmd_list + + +def test_get_module_cmd_from_bash_ticks(save_env): + os.environ['BASH_FUNC_module()'] = '() { eval `echo bash $*`\n}' + + module_cmd = get_module_cmd() + module_cmd_list = module_cmd('list', output=str, error=str) + + assert module_cmd_list == 'python list\n' + + +def test_get_module_cmd_from_bash_parens(save_env): + os.environ['BASH_FUNC_module()'] = '() { eval $(echo fill bash $*)\n}' + + module_cmd = get_module_cmd() + module_cmd_list = module_cmd('list', output=str, error=str) + + assert module_cmd_list == 'fill python list\n' + + +def test_get_module_cmd_fails(save_env): + os.environ.pop('BASH_FUNC_module()') + os.environ.pop('PATH') + with pytest.raises(ModuleError): + module_cmd = get_module_cmd(b'--norc') + module_cmd() # Here to avoid Flake F841 on previous line + + +def test_get_module_cmd_from_which(tmpdir, save_env): + f = tmpdir.mkdir('bin').join('modulecmd') + f.write('#!/bin/bash\n' + 'echo $*') + f.chmod(0o770) + + os.environ['PATH'] = str(tmpdir.join('bin')) + ':' + os.environ['PATH'] + os.environ.pop('BASH_FUNC_module()') + + module_cmd = get_module_cmd(b'--norc') + module_cmd_list = module_cmd('list', output=str, error=str) + + assert module_cmd_list == 'python list\n' diff --git a/lib/spack/spack/util/module_cmd.py b/lib/spack/spack/util/module_cmd.py new file mode 100644 index 0000000000..bdd8463757 --- /dev/null +++ b/lib/spack/spack/util/module_cmd.py @@ -0,0 +1,195 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## +""" +This module contains routines related to the module command for accessing and +parsing environment modules. +""" +import subprocess +import re +import os +import llnl.util.tty as tty +from spack.util.executable import which + + +def get_module_cmd(bashopts=''): + try: + return get_module_cmd_from_bash(bashopts) + except ModuleError: + # Don't catch the exception this time; we have no other way to do it. + tty.warn("Could not detect module function from bash." + " Trying to detect modulecmd from `which`") + try: + return get_module_cmd_from_which() + except ModuleError: + raise ModuleError('Spack requires modulecmd or a defined module' + ' fucntion. Make sure modulecmd is in your path' + ' or the function "module" is defined in your' + ' bash environment.') + + +def get_module_cmd_from_which(): + module_cmd = which('modulecmd') + if not module_cmd: + raise ModuleError('`which` did not find any modulecmd executable') + module_cmd.add_default_arg('python') + + # Check that the executable works + module_cmd('list', output=str, error=str, fail_on_error=False) + if module_cmd.returncode != 0: + raise ModuleError('get_module_cmd cannot determine the module command') + + return module_cmd + + +def get_module_cmd_from_bash(bashopts=''): + # Find how the module function is defined in the environment + module_func = os.environ.get('BASH_FUNC_module()', None) + if module_func: + module_func = os.path.expandvars(module_func) + else: + module_func_proc = subprocess.Popen(['{0} typeset -f module | ' + 'envsubst'.format(bashopts)], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + executable='/bin/bash', + shell=True) + module_func_proc.wait() + module_func = module_func_proc.stdout.read() + + # Find the portion of the module function that is evaluated + try: + find_exec = re.search(r'.*`(.*(:? bash | sh ).*)`.*', module_func) + exec_line = find_exec.group(1) + except: + try: + # This will fail with nested parentheses. TODO: expand regex. + find_exec = re.search(r'.*\(([^()]*(:? bash | sh )[^()]*)\).*', + module_func) + exec_line = find_exec.group(1) + except: + raise ModuleError('get_module_cmd cannot ' + 'determine the module command from bash') + + # Create an executable + args = exec_line.split() + module_cmd = which(args[0]) + if module_cmd: + for arg in args[1:]: + if arg == 'bash': + module_cmd.add_default_arg('python') + break + else: + module_cmd.add_default_arg(arg) + else: + raise ModuleError('Could not create executable based on module' + ' function.') + + # Check that the executable works + module_cmd('list', output=str, error=str, fail_on_error=False) + if module_cmd.returncode != 0: + raise ModuleError('get_module_cmd cannot determine the module command' + 'from bash.') + + return module_cmd + + +def load_module(mod): + """Takes a module name and removes modules until it is possible to + load that module. It then loads the provided module. Depends on the + modulecmd implementation of modules used in cray and lmod. + """ + # Create an executable of the module command that will output python code + modulecmd = get_module_cmd() + + # Read the module and remove any conflicting modules + # We do this without checking that they are already installed + # for ease of programming because unloading a module that is not + # loaded does nothing. + text = modulecmd('show', mod, output=str, error=str).split() + for i, word in enumerate(text): + if word == 'conflict': + exec(compile(modulecmd('unload', text[i + 1], output=str, + error=str), '', 'exec')) + # Load the module now that there are no conflicts + load = modulecmd('load', mod, output=str, error=str) + exec(compile(load, '', 'exec')) + + +def get_argument_from_module_line(line): + if '(' in line and ')' in line: + # Determine which lua quote symbol is being used for the argument + comma_index = line.index(',') + cline = line[comma_index:] + try: + quote_index = min(cline.find(q) for q in ['"', "'"] if q in cline) + lua_quote = cline[quote_index] + except ValueError: + # Change error text to describe what is going on. + raise ValueError("No lua quote symbol found in lmod module line.") + words_and_symbols = line.split(lua_quote) + return words_and_symbols[-2] + else: + return line.split()[2] + + +def get_path_from_module(mod): + """Inspects a TCL module for entries that indicate the absolute path + at which the library supported by said module can be found. + """ + # Create a modulecmd executable + modulecmd = get_module_cmd() + + # Read the module + text = modulecmd('show', mod, output=str, error=str).split('\n') + + # If it sets the LD_LIBRARY_PATH or CRAY_LD_LIBRARY_PATH, use that + for line in text: + if line.find('LD_LIBRARY_PATH') >= 0: + path = get_argument_from_module_line(line) + return path[:path.find('/lib')] + + # If it lists its package directory, return that + for line in text: + if line.find(mod.upper() + '_DIR') >= 0: + return get_argument_from_module_line(line) + + # If it lists a -rpath instruction, use that + for line in text: + rpath = line.find('-rpath/') + if rpath >= 0: + return line[rpath + 6:line.find('/lib')] + + # If it lists a -L instruction, use that + for line in text: + L = line.find('-L/') + if L >= 0: + return line[L + 2:line.find('/lib')] + + # Unable to find module path + return None + + +class ModuleError(Exception): + """Raised the the module_cmd utility to indicate errors.""" -- cgit v1.2.3-70-g09d2 From 689c1d2f0c432de7090dea593c90d7ffd6741a7d Mon Sep 17 00:00:00 2001 From: becker33 Date: Wed, 21 Jun 2017 16:33:11 -0700 Subject: fix issue #4577 (#4579) --- lib/spack/spack/util/executable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 0aec84b1d0..4222a48b82 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -239,7 +239,7 @@ def which(*args, **kwargs): Returns: Executable: The first executable that is found in the path """ - path = kwargs.get('path', os.environ.get('PATH')) + path = kwargs.get('path', os.environ.get('PATH', '')) required = kwargs.get('required', False) if isinstance(path, string_types): -- cgit v1.2.3-70-g09d2 From b7ca7274b8ac8969d2862e43babc9a7582c2d046 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 23 Jun 2017 22:36:29 +0200 Subject: mv variants: packages are now needed only during normalization (#4129) * mv variants: packages are now needed only during normalization The relationship among different types of variants have been weakened, in the sense that now it is permitted to compare MV, SV and BV among each other. The mechanism that permits this is an implicit conversion of the variant passed as argument to the type of the variant asking to execute a constrain, satisfies, etc. operation. * asbtract variant: added a new type of variant An abstract variant is like a multi valued variant, but behaves differently on "satisfies" requests, because it will reply "True" to requests that **it could** satisfy eventually. Tests have been modified to reflect the fact that abstract variants are now what get parsed from expressions like `foo=bar` given by users. * Removed 'concrete=' and 'normal=' kwargs from Spec.__init__ These two keyword arguments where only used in one test module to force a Spec to 'appear' concrete. I suspect they are just a leftover from another refactoring, as now there's the private method '_mark_concrete' that does essentially the same job. Removed them to reduce a bit the clutter in Spec. * Moved yaml related functions from MultiValuedVariant to AbstractVariant. This is to fix the erros that are occurring in epfl-scitas#73, and that I can't reproduce locally. --- lib/spack/spack/spec.py | 46 ++--------- lib/spack/spack/test/spec_semantics.py | 90 ++++++++++++++------- lib/spack/spack/test/variant.py | 120 ++++++++++++++++++++-------- lib/spack/spack/variant.py | 142 ++++++++++++++++++++------------- 4 files changed, 240 insertions(+), 158 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 602f2fd878..b4b80dab6f 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1012,12 +1012,9 @@ class Spec(object): self._hash = other._hash self._cmp_key_cache = other._cmp_key_cache - # Specs are by default not assumed to be normal, but in some - # cases we've read them from a file want to assume normal. - # This allows us to manipulate specs that Spack doesn't have - # package.py files for. - self._normal = kwargs.get('normal', False) - self._concrete = kwargs.get('concrete', False) + # Specs are by default not assumed to be normal or concrete. + self._normal = False + self._concrete = False # Allow a spec to be constructed with an external path. self.external_path = kwargs.get('external_path', None) @@ -1099,13 +1096,14 @@ class Spec(object): assert(self.compiler_flags is not None) self.compiler_flags[name] = value.split() else: + # FIXME: # All other flags represent variants. 'foo=true' and 'foo=false' # map to '+foo' and '~foo' respectively. As such they need a # BoolValuedVariant instance. if str(value).upper() == 'TRUE' or str(value).upper() == 'FALSE': self.variants[name] = BoolValuedVariant(name, value) else: - self.variants[name] = MultiValuedVariant(name, value) + self.variants[name] = AbstractVariant(name, value) def _set_architecture(self, **kwargs): """Called by the parser to set the architecture.""" @@ -1892,18 +1890,6 @@ class Spec(object): # evaluate when specs to figure out constraints on the dependency. dep = None for when_spec, dep_spec in conditions.items(): - # If self was concrete it would have changed the variants in - # when_spec automatically. As here we are for sure during the - # concretization process, self is not concrete and we must change - # the variants in when_spec on our own to avoid using a - # MultiValuedVariant whe it is instead a SingleValuedVariant - try: - substitute_single_valued_variants(when_spec) - except SpecError as e: - msg = 'evaluating a `when=` statement gives ' + e.message - e.message = msg - raise - sat = self.satisfies(when_spec, strict=True) if sat: if dep is None: @@ -2131,7 +2117,6 @@ class Spec(object): if not compilers.supported(spec.compiler): raise UnsupportedCompilerError(spec.compiler.name) - # FIXME: Move the logic below into the variant.py module # Ensure correctness of variants (if the spec is not virtual) if not spec.virtual: pkg_cls = spec.package_class @@ -2140,7 +2125,7 @@ class Spec(object): if not_existing: raise UnknownVariantError(spec.name, not_existing) - substitute_single_valued_variants(spec) + substitute_abstract_variants(spec) def constrain(self, other, deps=True): """Merge the constraints of other with self. @@ -2351,24 +2336,6 @@ class Spec(object): elif strict and (other.compiler and not self.compiler): return False - # If self is a concrete spec, and other is not virtual, then we need - # to substitute every multi-valued variant that needs it with a - # single-valued variant. - if self.concrete: - try: - # When parsing a spec every variant of the form - # 'foo=value' will be interpreted by default as a - # multi-valued variant. During validation of the - # variants we use the information in the package - # to turn any variant that needs it to a single-valued - # variant. - substitute_single_valued_variants(other) - except (SpecError, KeyError): - # Catch the two things that could go wrong above: - # 1. name is not a valid variant (KeyError) - # 2. the variant is not validated (SpecError) - return False - var_strict = strict if (not self.name) or (not other.name): var_strict = True @@ -3209,7 +3176,6 @@ class SpecParser(spack.parse.Parser): return spec def variant(self, name=None): - # TODO: Make generalized variants possible if name: return name else: diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 80a2f63bde..4b21e8d0e1 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -29,31 +29,46 @@ from spack.spec import * from spack.variant import * -def check_satisfies(spec, anon_spec, concrete=False): - left = Spec(spec, concrete=concrete) +def target_factory(spec_string, target_concrete): + spec = Spec(spec_string) + + if target_concrete: + spec._mark_concrete() + substitute_abstract_variants(spec) + + return spec + + +def argument_factory(argument_spec, left): try: - right = Spec(anon_spec) # if it's not anonymous, allow it. + # If it's not anonymous, allow it + right = target_factory(argument_spec, False) except Exception: - right = parse_anonymous_spec(anon_spec, left.name) + right = parse_anonymous_spec(argument_spec, left.name) + return right + + +def check_satisfies(target_spec, argument_spec, target_concrete=False): + + left = target_factory(target_spec, target_concrete) + right = argument_factory(argument_spec, left) # Satisfies is one-directional. assert left.satisfies(right) - assert left.satisfies(anon_spec) + assert left.satisfies(argument_spec) - # if left satisfies right, then we should be able to consrain + # If left satisfies right, then we should be able to constrain # right by left. Reverse is not always true. right.copy().constrain(left) -def check_unsatisfiable(spec, anon_spec, concrete=False): - left = Spec(spec, concrete=concrete) - try: - right = Spec(anon_spec) # if it's not anonymous, allow it. - except Exception: - right = parse_anonymous_spec(anon_spec, left.name) +def check_unsatisfiable(target_spec, argument_spec, target_concrete=False): + + left = target_factory(target_spec, target_concrete) + right = argument_factory(argument_spec, left) assert not left.satisfies(right) - assert not left.satisfies(anon_spec) + assert not left.satisfies(argument_spec) with pytest.raises(UnsatisfiableSpecError): right.copy().constrain(left) @@ -297,7 +312,9 @@ class TestSpecSematics(object): # Semantics for a multi-valued variant is different # Depending on whether the spec is concrete or not - a = Spec('multivalue_variant foo="bar"', concrete=True) + a = target_factory( + 'multivalue_variant foo="bar"', target_concrete=True + ) spec_str = 'multivalue_variant foo="bar,baz"' b = Spec(spec_str) assert not a.satisfies(b) @@ -309,12 +326,15 @@ class TestSpecSematics(object): a = Spec('multivalue_variant foo="bar"') spec_str = 'multivalue_variant foo="bar,baz"' b = Spec(spec_str) - assert not a.satisfies(b) - assert not a.satisfies(spec_str) + # The specs are abstract and they **could** be constrained + assert a.satisfies(b) + assert a.satisfies(spec_str) # An abstract spec can instead be constrained assert a.constrain(b) - a = Spec('multivalue_variant foo="bar,baz"', concrete=True) + a = target_factory( + 'multivalue_variant foo="bar,baz"', target_concrete=True + ) spec_str = 'multivalue_variant foo="bar,baz,quux"' b = Spec(spec_str) assert not a.satisfies(b) @@ -326,8 +346,9 @@ class TestSpecSematics(object): a = Spec('multivalue_variant foo="bar,baz"') spec_str = 'multivalue_variant foo="bar,baz,quux"' b = Spec(spec_str) - assert not a.satisfies(b) - assert not a.satisfies(spec_str) + # The specs are abstract and they **could** be constrained + assert a.satisfies(b) + assert a.satisfies(spec_str) # An abstract spec can instead be constrained assert a.constrain(b) # ...but will fail during concretization if there are @@ -339,8 +360,11 @@ class TestSpecSematics(object): a = Spec('multivalue_variant fee="bar"') spec_str = 'multivalue_variant fee="baz"' b = Spec(spec_str) - assert not a.satisfies(b) - assert not a.satisfies(spec_str) + # The specs are abstract and they **could** be constrained, + # as before concretization I don't know which type of variant + # I have (if it is not a BV) + assert a.satisfies(b) + assert a.satisfies(spec_str) # A variant cannot be parsed as single-valued until we try to # concretize. This means that we can constrain the variant above assert a.constrain(b) @@ -351,17 +375,25 @@ class TestSpecSematics(object): def test_unsatisfiable_variant_types(self): # These should fail due to incompatible types - check_unsatisfiable('multivalue_variant +foo', - 'multivalue_variant foo="bar"') - check_unsatisfiable('multivalue_variant ~foo', - 'multivalue_variant foo="bar"') + # FIXME: these needs to be checked as the new relaxed + # FIXME: semantic makes them fail (constrain does not raise) + # check_unsatisfiable('multivalue_variant +foo', + # 'multivalue_variant foo="bar"') + # check_unsatisfiable('multivalue_variant ~foo', + # 'multivalue_variant foo="bar"') - check_unsatisfiable('multivalue_variant foo="bar"', - 'multivalue_variant +foo') + check_unsatisfiable( + target_spec='multivalue_variant foo="bar"', + argument_spec='multivalue_variant +foo', + target_concrete=True + ) - check_unsatisfiable('multivalue_variant foo="bar"', - 'multivalue_variant ~foo') + check_unsatisfiable( + target_spec='multivalue_variant foo="bar"', + argument_spec='multivalue_variant ~foo', + target_concrete=True + ) def test_satisfies_unconstrained_variant(self): # only asked for mpich, no constraints. Either will do. diff --git a/lib/spack/spack/test/variant.py b/lib/spack/spack/test/variant.py index 0c546a5dac..565b6dac86 100644 --- a/lib/spack/spack/test/variant.py +++ b/lib/spack/spack/test/variant.py @@ -93,13 +93,22 @@ class TestMultiValuedVariant(object): assert not a.satisfies(c) assert not c.satisfies(a) - # Cannot satisfy the constraint with an object of - # another type + # Implicit type conversion for variants of other types + b_sv = SingleValuedVariant('foo', 'bar') - assert not b.satisfies(b_sv) + assert b.satisfies(b_sv) + d_sv = SingleValuedVariant('foo', 'True') + assert d.satisfies(d_sv) + almost_d_bv = SingleValuedVariant('foo', 'true') + assert not d.satisfies(almost_d_bv) d_bv = BoolValuedVariant('foo', 'True') - assert not d.satisfies(d_bv) + assert d.satisfies(d_bv) + # This case is 'peculiar': the two BV instances are + # equivalent, but if converted to MV they are not + # as MV is case sensitive with respect to 'True' and 'False' + almost_d_bv = BoolValuedVariant('foo', 'true') + assert not d.satisfies(almost_d_bv) def test_compatible(self): @@ -126,12 +135,15 @@ class TestMultiValuedVariant(object): assert d.compatible(b) assert not d.compatible(c) - # Can't be compatible with other types - b_bv = BoolValuedVariant('foo', 'True') - assert not b.compatible(b_bv) + # Implicit type conversion for other types b_sv = SingleValuedVariant('foo', 'True') - assert not b.compatible(b_sv) + assert b.compatible(b_sv) + assert not c.compatible(b_sv) + + b_bv = BoolValuedVariant('foo', 'True') + assert b.compatible(b_bv) + assert not c.compatible(b_bv) def test_constrain(self): @@ -169,13 +181,19 @@ class TestMultiValuedVariant(object): with pytest.raises(ValueError): a.constrain(b) - # Try to constrain on other types + # Implicit type conversion for variants of other types + a = MultiValuedVariant('foo', 'bar,baz') - sv = SingleValuedVariant('foo', 'bar') - bv = BoolValuedVariant('foo', 'True') - for v in (sv, bv): - with pytest.raises(TypeError): - a.constrain(v) + b_sv = SingleValuedVariant('foo', 'bar') + c_sv = SingleValuedVariant('foo', 'barbaz') + + assert not a.constrain(b_sv) + assert a.constrain(c_sv) + + d_bv = BoolValuedVariant('foo', 'True') + + assert a.constrain(d_bv) + assert not a.constrain(d_bv) def test_yaml_entry(self): @@ -239,13 +257,17 @@ class TestSingleValuedVariant(object): assert not c.satisfies(b) assert not c.satisfies(d) - # Cannot satisfy the constraint with an object of - # another type + # Implicit type conversion for variants of other types + a_mv = MultiValuedVariant('foo', 'bar') - assert not a.satisfies(a_mv) + assert a.satisfies(a_mv) + multiple_values = MultiValuedVariant('foo', 'bar,baz') + assert not a.satisfies(multiple_values) e_bv = BoolValuedVariant('foo', 'True') - assert not e.satisfies(e_bv) + assert e.satisfies(e_bv) + almost_e_bv = BoolValuedVariant('foo', 'true') + assert not e.satisfies(almost_e_bv) def test_compatible(self): @@ -272,13 +294,35 @@ class TestSingleValuedVariant(object): assert not d.compatible(b) assert not d.compatible(c) - # Can't be compatible with other types + # Implicit type conversion for variants of other types + a_mv = MultiValuedVariant('foo', 'bar') - assert not a.compatible(a_mv) + b_mv = MultiValuedVariant('fee', 'bar') + c_mv = MultiValuedVariant('foo', 'baz') + d_mv = MultiValuedVariant('foo', 'bar') + + assert not a.compatible(b_mv) + assert not a.compatible(c_mv) + assert a.compatible(d_mv) + + assert not b.compatible(a_mv) + assert not b.compatible(c_mv) + assert not b.compatible(d_mv) + + assert not c.compatible(a_mv) + assert not c.compatible(b_mv) + assert not c.compatible(d_mv) + + assert d.compatible(a_mv) + assert not d.compatible(b_mv) + assert not d.compatible(c_mv) e = SingleValuedVariant('foo', 'True') e_bv = BoolValuedVariant('foo', 'True') - assert not e.compatible(e_bv) + almost_e_bv = BoolValuedVariant('foo', 'true') + + assert e.compatible(e_bv) + assert not e.compatible(almost_e_bv) def test_constrain(self): @@ -314,13 +358,12 @@ class TestSingleValuedVariant(object): t = SingleValuedVariant('foo', 'bar') assert a == t - # Try to constrain on other values + # Implicit type conversion for variants of other types a = SingleValuedVariant('foo', 'True') mv = MultiValuedVariant('foo', 'True') bv = BoolValuedVariant('foo', 'True') for v in (mv, bv): - with pytest.raises(TypeError): - a.constrain(v) + assert not a.constrain(v) def test_yaml_entry(self): a = SingleValuedVariant('foo', 'bar') @@ -398,13 +441,21 @@ class TestBoolValuedVariant(object): assert not d.satisfies(b) assert not d.satisfies(c) - # Cannot satisfy the constraint with an object of - # another type + # BV variants are case insensitive to 'True' or 'False' d_mv = MultiValuedVariant('foo', 'True') + assert d.satisfies(d_mv) + assert not b.satisfies(d_mv) + + d_mv = MultiValuedVariant('foo', 'FaLsE') + assert not d.satisfies(d_mv) + assert b.satisfies(d_mv) + + d_mv = MultiValuedVariant('foo', 'bar') assert not d.satisfies(d_mv) + assert not b.satisfies(d_mv) d_sv = SingleValuedVariant('foo', 'True') - assert not d.satisfies(d_sv) + assert d.satisfies(d_sv) def test_compatible(self): @@ -431,12 +482,14 @@ class TestBoolValuedVariant(object): assert not d.compatible(b) assert not d.compatible(c) - # Can't be compatible with other types - d_mv = MultiValuedVariant('foo', 'True') - assert not d.compatible(d_mv) + for value in ('True', 'TrUe', 'TRUE'): + d_mv = MultiValuedVariant('foo', value) + assert d.compatible(d_mv) + assert not c.compatible(d_mv) - d_sv = SingleValuedVariant('foo', 'True') - assert not d.compatible(d_sv) + d_sv = SingleValuedVariant('foo', value) + assert d.compatible(d_sv) + assert not c.compatible(d_sv) def test_constrain(self): # Try to constrain on a value equal to self @@ -476,8 +529,7 @@ class TestBoolValuedVariant(object): sv = SingleValuedVariant('foo', 'True') mv = MultiValuedVariant('foo', 'True') for v in (sv, mv): - with pytest.raises(TypeError): - a.constrain(v) + assert not a.constrain(v) def test_yaml_entry(self): diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index fe08e4529e..2acea30ddd 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -26,6 +26,7 @@ variants both in packages and in specs. """ +import functools import inspect import re @@ -172,9 +173,48 @@ class Variant(object): return SingleValuedVariant +def implicit_variant_conversion(method): + """Converts other to type(self) and calls method(self, other) + + Args: + method: any predicate method that takes another variant as an argument + + Returns: decorated method + """ + @functools.wraps(method) + def convert(self, other): + # We don't care if types are different as long as I can convert + # other to type(self) + try: + other = type(self)(other.name, other._original_value) + except (error.SpecError, ValueError): + return False + return method(self, other) + return convert + + @lang.key_ordering -class MultiValuedVariant(object): - """A variant that can hold multiple values at once.""" +class AbstractVariant(object): + """A variant that has not yet decided who it wants to be. It behaves like + a multi valued variant which **could** do things. + + This kind of variant is generated during parsing of expressions like + ``foo=bar`` and differs from multi valued variants because it will + satisfy any other variant with the same name. This is because it **could** + do it if it grows up to be a multi valued variant with the right set of + values. + """ + + def __init__(self, name, value): + self.name = name + + # Stores 'value' after a bit of massaging + # done by the property setter + self._value = None + self._original_value = None + + # Invokes property setter + self.value = value @staticmethod def from_node_dict(name, value): @@ -186,16 +226,13 @@ class MultiValuedVariant(object): return BoolValuedVariant(name, value) return SingleValuedVariant(name, value) - def __init__(self, name, value): - self.name = name - - # Stores 'value' after a bit of massaging - # done by the property setter - self._value = None - self._original_value = None + def yaml_entry(self): + """Returns a key, value tuple suitable to be an entry in a yaml dict. - # Invokes property setter - self.value = value + Returns: + tuple: (name, value_representation) + """ + return self.name, list(self.value) @property def value(self): @@ -241,9 +278,10 @@ class MultiValuedVariant(object): """ return type(self)(self.name, self._original_value) + @implicit_variant_conversion def satisfies(self, other): - """Returns true if ``other.name == self.name`` and ``other.value`` is - a strict subset of self. Does not try to validate. + """Returns true if ``other.name == self.name``, because any value that + other holds and is not in self yet **could** be added. Args: other: constraint to be met for the method to return True @@ -251,18 +289,11 @@ class MultiValuedVariant(object): Returns: bool: True or False """ - # If types are different the constraint is not satisfied - if type(other) != type(self): - return False - # If names are different then `self` does not satisfy `other` - # (`foo=bar` does not satisfy `baz=bar`) - if other.name != self.name: - return False - - # Otherwise we want all the values in `other` to be also in `self` - return all(v in self.value for v in other.value) + # (`foo=bar` will never satisfy `baz=bar`) + return other.name == self.name + @implicit_variant_conversion def compatible(self, other): """Returns True if self and other are compatible, False otherwise. @@ -275,13 +306,10 @@ class MultiValuedVariant(object): Returns: bool: True or False """ - # If types are different they are not compatible - if type(other) != type(self): - return False - # If names are different then they are not compatible return other.name == self.name + @implicit_variant_conversion def constrain(self, other): """Modify self to match all the constraints for other if both instances are multi-valued. Returns True if self changed, @@ -293,25 +321,13 @@ class MultiValuedVariant(object): Returns: bool: True or False """ - # If types are different they are not compatible - if type(other) != type(self): - msg = 'other must be of type \'{0.__name__}\'' - raise TypeError(msg.format(type(self))) - if self.name != other.name: raise ValueError('variants must have the same name') + old_value = self.value self.value = ','.join(sorted(set(self.value + other.value))) return old_value != self.value - def yaml_entry(self): - """Returns a key, value tuple suitable to be an entry in a yaml dict. - - Returns: - tuple: (name, value_representation) - """ - return self.name, list(self.value) - def __contains__(self, item): return item in self._value @@ -327,6 +343,28 @@ class MultiValuedVariant(object): ) +class MultiValuedVariant(AbstractVariant): + """A variant that can hold multiple values at once.""" + @implicit_variant_conversion + def satisfies(self, other): + """Returns true if ``other.name == self.name`` and ``other.value`` is + a strict subset of self. Does not try to validate. + + Args: + other: constraint to be met for the method to return True + + Returns: + bool: True or False + """ + # If names are different then `self` does not satisfy `other` + # (`foo=bar` does not satisfy `baz=bar`) + if other.name != self.name: + return False + + # Otherwise we want all the values in `other` to be also in `self` + return all(v in self.value for v in other.value) + + class SingleValuedVariant(MultiValuedVariant): """A variant that can hold multiple values, but one at a time.""" @@ -342,11 +380,8 @@ class SingleValuedVariant(MultiValuedVariant): def __str__(self): return '{0}={1}'.format(self.name, self.value) + @implicit_variant_conversion def satisfies(self, other): - # If types are different the constraint is not satisfied - if type(other) != type(self): - return False - # If names are different then `self` does not satisfy `other` # (`foo=bar` does not satisfy `baz=bar`) if other.name != self.name: @@ -357,11 +392,8 @@ class SingleValuedVariant(MultiValuedVariant): def compatible(self, other): return self.satisfies(other) + @implicit_variant_conversion def constrain(self, other): - if type(other) != type(self): - msg = 'other must be of type \'{0.__name__}\'' - raise TypeError(msg.format(type(self))) - if self.name != other.name: raise ValueError('variants must have the same name') @@ -411,8 +443,9 @@ class VariantMap(lang.HashableMap): def __setitem__(self, name, vspec): # Raise a TypeError if vspec is not of the right type - if not isinstance(vspec, MultiValuedVariant): - msg = 'VariantMap accepts only values of type VariantSpec' + if not isinstance(vspec, AbstractVariant): + msg = 'VariantMap accepts only values of variant types' + msg += ' [got {0} instead]'.format(type(vspec).__name__) raise TypeError(msg) # Raise an error if the variant was already in this map @@ -546,7 +579,7 @@ class VariantMap(lang.HashableMap): return string.getvalue() -def substitute_single_valued_variants(spec): +def substitute_abstract_variants(spec): """Uses the information in `spec.package` to turn any variant that needs it into a SingleValuedVariant. @@ -556,10 +589,9 @@ def substitute_single_valued_variants(spec): for name, v in spec.variants.items(): pkg_cls = type(spec.package) pkg_variant = spec.package.variants[name] - pkg_variant.validate_or_raise(v, pkg_cls) - spec.variants.substitute( - pkg_variant.make_variant(v._original_value) - ) + new_variant = pkg_variant.make_variant(v._original_value) + pkg_variant.validate_or_raise(new_variant, pkg_cls) + spec.variants.substitute(new_variant) class DuplicateVariantError(error.SpecError): -- cgit v1.2.3-70-g09d2 From cac4362f6491bf48dd287f31f3de9169464713ea Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 24 Jun 2017 22:22:55 -0700 Subject: Make LICENSE recognizable by GitHub. (#4598) --- LICENSE | 640 ++++++++++++--------- NOTICE | 32 ++ README.md | 2 +- bin/sbang | 2 +- bin/spack | 2 +- bin/spack-python | 2 +- lib/spack/docs/conf.py | 2 +- lib/spack/docs/tutorial/examples/0.package.py | 2 +- lib/spack/docs/tutorial/examples/1.package.py | 2 +- lib/spack/docs/tutorial/examples/2.package.py | 2 +- lib/spack/docs/tutorial/examples/3.package.py | 2 +- lib/spack/docs/tutorial/examples/4.package.py | 2 +- lib/spack/env/cc | 2 +- lib/spack/external/__init__.py | 2 +- lib/spack/llnl/__init__.py | 2 +- lib/spack/llnl/util/__init__.py | 2 +- lib/spack/llnl/util/filesystem.py | 2 +- lib/spack/llnl/util/lang.py | 2 +- lib/spack/llnl/util/link_tree.py | 2 +- lib/spack/llnl/util/lock.py | 2 +- lib/spack/llnl/util/tty/__init__.py | 2 +- lib/spack/llnl/util/tty/colify.py | 2 +- lib/spack/llnl/util/tty/color.py | 2 +- lib/spack/llnl/util/tty/log.py | 2 +- lib/spack/spack/__init__.py | 2 +- lib/spack/spack/abi.py | 2 +- lib/spack/spack/architecture.py | 2 +- lib/spack/spack/build_environment.py | 2 +- lib/spack/spack/build_systems/__init__.py | 2 +- lib/spack/spack/build_systems/autotools.py | 2 +- lib/spack/spack/build_systems/cmake.py | 2 +- lib/spack/spack/build_systems/makefile.py | 2 +- lib/spack/spack/build_systems/perl.py | 2 +- lib/spack/spack/build_systems/python.py | 2 +- lib/spack/spack/build_systems/r.py | 2 +- lib/spack/spack/build_systems/waf.py | 2 +- lib/spack/spack/cmd/__init__.py | 2 +- lib/spack/spack/cmd/activate.py | 2 +- lib/spack/spack/cmd/arch.py | 2 +- lib/spack/spack/cmd/bootstrap.py | 2 +- lib/spack/spack/cmd/build.py | 2 +- lib/spack/spack/cmd/cd.py | 2 +- lib/spack/spack/cmd/checksum.py | 2 +- lib/spack/spack/cmd/clean.py | 2 +- lib/spack/spack/cmd/common/__init__.py | 2 +- lib/spack/spack/cmd/common/arguments.py | 2 +- lib/spack/spack/cmd/compiler.py | 2 +- lib/spack/spack/cmd/compilers.py | 2 +- lib/spack/spack/cmd/config.py | 2 +- lib/spack/spack/cmd/configure.py | 2 +- lib/spack/spack/cmd/create.py | 4 +- lib/spack/spack/cmd/deactivate.py | 2 +- lib/spack/spack/cmd/debug.py | 2 +- lib/spack/spack/cmd/dependents.py | 2 +- lib/spack/spack/cmd/diy.py | 2 +- lib/spack/spack/cmd/docs.py | 2 +- lib/spack/spack/cmd/edit.py | 2 +- lib/spack/spack/cmd/env.py | 2 +- lib/spack/spack/cmd/extensions.py | 2 +- lib/spack/spack/cmd/fetch.py | 2 +- lib/spack/spack/cmd/find.py | 2 +- lib/spack/spack/cmd/flake8.py | 2 +- lib/spack/spack/cmd/gpg.py | 2 +- lib/spack/spack/cmd/graph.py | 2 +- lib/spack/spack/cmd/help.py | 2 +- lib/spack/spack/cmd/info.py | 2 +- lib/spack/spack/cmd/install.py | 2 +- lib/spack/spack/cmd/list.py | 2 +- lib/spack/spack/cmd/load.py | 2 +- lib/spack/spack/cmd/location.py | 2 +- lib/spack/spack/cmd/md5.py | 2 +- lib/spack/spack/cmd/mirror.py | 2 +- lib/spack/spack/cmd/module.py | 2 +- lib/spack/spack/cmd/patch.py | 2 +- lib/spack/spack/cmd/pkg.py | 2 +- lib/spack/spack/cmd/providers.py | 2 +- lib/spack/spack/cmd/purge.py | 2 +- lib/spack/spack/cmd/pydoc.py | 2 +- lib/spack/spack/cmd/python.py | 2 +- lib/spack/spack/cmd/reindex.py | 2 +- lib/spack/spack/cmd/repo.py | 2 +- lib/spack/spack/cmd/restage.py | 2 +- lib/spack/spack/cmd/setup.py | 2 +- lib/spack/spack/cmd/spec.py | 2 +- lib/spack/spack/cmd/stage.py | 2 +- lib/spack/spack/cmd/test.py | 2 +- lib/spack/spack/cmd/uninstall.py | 2 +- lib/spack/spack/cmd/unload.py | 2 +- lib/spack/spack/cmd/unuse.py | 2 +- lib/spack/spack/cmd/url.py | 2 +- lib/spack/spack/cmd/use.py | 2 +- lib/spack/spack/cmd/versions.py | 2 +- lib/spack/spack/cmd/view.py | 2 +- lib/spack/spack/compiler.py | 2 +- lib/spack/spack/compilers/__init__.py | 2 +- lib/spack/spack/compilers/cce.py | 2 +- lib/spack/spack/compilers/clang.py | 2 +- lib/spack/spack/compilers/gcc.py | 2 +- lib/spack/spack/compilers/intel.py | 2 +- lib/spack/spack/compilers/nag.py | 2 +- lib/spack/spack/compilers/pgi.py | 2 +- lib/spack/spack/compilers/xl.py | 2 +- lib/spack/spack/compilers/xl_r.py | 2 +- lib/spack/spack/concretize.py | 2 +- lib/spack/spack/config.py | 2 +- lib/spack/spack/database.py | 2 +- lib/spack/spack/directives.py | 2 +- lib/spack/spack/directory_layout.py | 2 +- lib/spack/spack/environment.py | 2 +- lib/spack/spack/error.py | 2 +- lib/spack/spack/fetch_strategy.py | 2 +- lib/spack/spack/file_cache.py | 2 +- lib/spack/spack/graph.py | 2 +- lib/spack/spack/hooks/__init__.py | 2 +- lib/spack/spack/hooks/case_consistency.py | 2 +- lib/spack/spack/hooks/extensions.py | 2 +- lib/spack/spack/hooks/licensing.py | 2 +- lib/spack/spack/hooks/module_file_generation.py | 2 +- lib/spack/spack/hooks/sbang.py | 2 +- lib/spack/spack/hooks/yaml_version_check.py | 2 +- lib/spack/spack/main.py | 2 +- lib/spack/spack/mirror.py | 2 +- lib/spack/spack/modules.py | 2 +- lib/spack/spack/multimethod.py | 2 +- lib/spack/spack/operating_systems/__init__.py | 2 +- lib/spack/spack/operating_systems/cnk.py | 2 +- lib/spack/spack/operating_systems/cnl.py | 2 +- lib/spack/spack/operating_systems/linux_distro.py | 2 +- lib/spack/spack/operating_systems/mac_os.py | 2 +- lib/spack/spack/package.py | 2 +- lib/spack/spack/package_prefs.py | 2 +- lib/spack/spack/package_test.py | 2 +- lib/spack/spack/parse.py | 2 +- lib/spack/spack/patch.py | 2 +- lib/spack/spack/platforms/__init__.py | 2 +- lib/spack/spack/platforms/bgq.py | 2 +- lib/spack/spack/platforms/cray.py | 2 +- lib/spack/spack/platforms/darwin.py | 2 +- lib/spack/spack/platforms/linux.py | 2 +- lib/spack/spack/platforms/test.py | 2 +- lib/spack/spack/provider_index.py | 2 +- lib/spack/spack/repository.py | 2 +- lib/spack/spack/resource.py | 2 +- lib/spack/spack/schema/__init__.py | 2 +- lib/spack/spack/schema/compilers.py | 2 +- lib/spack/spack/schema/config.py | 2 +- lib/spack/spack/schema/mirrors.py | 2 +- lib/spack/spack/schema/modules.py | 2 +- lib/spack/spack/schema/packages.py | 2 +- lib/spack/spack/schema/repos.py | 2 +- lib/spack/spack/spec.py | 2 +- lib/spack/spack/stage.py | 2 +- lib/spack/spack/store.py | 2 +- lib/spack/spack/test/__init__.py | 2 +- lib/spack/spack/test/architecture.py | 2 +- lib/spack/spack/test/build_system_guess.py | 2 +- lib/spack/spack/test/build_systems.py | 2 +- lib/spack/spack/test/cc.py | 2 +- lib/spack/spack/test/cmd/__init__.py | 2 +- lib/spack/spack/test/cmd/find.py | 2 +- lib/spack/spack/test/cmd/flake8.py | 2 +- lib/spack/spack/test/cmd/gpg.py | 2 +- lib/spack/spack/test/cmd/install.py | 2 +- lib/spack/spack/test/cmd/module.py | 2 +- lib/spack/spack/test/cmd/python.py | 2 +- lib/spack/spack/test/cmd/test_compiler_cmd.py | 2 +- lib/spack/spack/test/cmd/uninstall.py | 2 +- lib/spack/spack/test/cmd/url.py | 2 +- lib/spack/spack/test/compilers.py | 2 +- lib/spack/spack/test/concretize.py | 2 +- lib/spack/spack/test/concretize_preferences.py | 2 +- lib/spack/spack/test/config.py | 2 +- lib/spack/spack/test/conftest.py | 2 +- lib/spack/spack/test/data/sourceme_first.sh | 2 +- lib/spack/spack/test/data/sourceme_parameters.sh | 2 +- lib/spack/spack/test/data/sourceme_second.sh | 2 +- lib/spack/spack/test/data/sourceme_unicode.sh | 2 +- lib/spack/spack/test/database.py | 2 +- lib/spack/spack/test/directory_layout.py | 2 +- lib/spack/spack/test/environment.py | 2 +- lib/spack/spack/test/file_cache.py | 2 +- lib/spack/spack/test/file_list.py | 2 +- lib/spack/spack/test/git_fetch.py | 2 +- lib/spack/spack/test/graph.py | 2 +- lib/spack/spack/test/hg_fetch.py | 2 +- lib/spack/spack/test/install.py | 2 +- lib/spack/spack/test/link_tree.py | 2 +- lib/spack/spack/test/lock.py | 2 +- lib/spack/spack/test/make_executable.py | 2 +- lib/spack/spack/test/mirror.py | 2 +- lib/spack/spack/test/module_parsing.py | 2 +- lib/spack/spack/test/modules.py | 2 +- lib/spack/spack/test/multimethod.py | 2 +- lib/spack/spack/test/namespace_trie.py | 2 +- lib/spack/spack/test/optional_deps.py | 2 +- lib/spack/spack/test/package_sanity.py | 2 +- lib/spack/spack/test/packages.py | 2 +- lib/spack/spack/test/pattern.py | 2 +- lib/spack/spack/test/provider_index.py | 2 +- lib/spack/spack/test/python_version.py | 2 +- lib/spack/spack/test/sbang.py | 2 +- lib/spack/spack/test/spack_yaml.py | 2 +- lib/spack/spack/test/spec_dag.py | 2 +- lib/spack/spack/test/spec_semantics.py | 2 +- lib/spack/spack/test/spec_syntax.py | 2 +- lib/spack/spack/test/spec_yaml.py | 2 +- lib/spack/spack/test/stage.py | 2 +- lib/spack/spack/test/svn_fetch.py | 2 +- lib/spack/spack/test/url_fetch.py | 2 +- lib/spack/spack/test/url_parse.py | 2 +- lib/spack/spack/test/url_substitution.py | 2 +- lib/spack/spack/test/variant.py | 2 +- lib/spack/spack/test/versions.py | 2 +- lib/spack/spack/test/web.py | 2 +- lib/spack/spack/url.py | 2 +- lib/spack/spack/util/__init__.py | 2 +- lib/spack/spack/util/compression.py | 2 +- lib/spack/spack/util/crypto.py | 2 +- lib/spack/spack/util/debug.py | 2 +- lib/spack/spack/util/environment.py | 2 +- lib/spack/spack/util/executable.py | 2 +- lib/spack/spack/util/gpg.py | 2 +- lib/spack/spack/util/module_cmd.py | 2 +- lib/spack/spack/util/multiproc.py | 2 +- lib/spack/spack/util/naming.py | 2 +- lib/spack/spack/util/path.py | 2 +- lib/spack/spack/util/pattern.py | 2 +- lib/spack/spack/util/prefix.py | 2 +- lib/spack/spack/util/spack_json.py | 2 +- lib/spack/spack/util/spack_yaml.py | 2 +- lib/spack/spack/util/string.py | 2 +- lib/spack/spack/util/web.py | 2 +- lib/spack/spack/variant.py | 2 +- lib/spack/spack/version.py | 2 +- share/spack/setup-env.csh | 2 +- share/spack/setup-env.sh | 2 +- share/spack/spack-completion.bash | 2 +- var/spack/repos/builtin.mock/packages/a/package.py | 2 +- var/spack/repos/builtin.mock/packages/b/package.py | 2 +- .../repos/builtin.mock/packages/boost/package.py | 2 +- var/spack/repos/builtin.mock/packages/c/package.py | 2 +- .../builtin.mock/packages/callpath/package.py | 2 +- .../repos/builtin.mock/packages/canfail/package.py | 2 +- .../builtin.mock/packages/cmake-client/package.py | 2 +- .../repos/builtin.mock/packages/cmake/package.py | 2 +- .../packages/conflict-parent/package.py | 2 +- .../builtin.mock/packages/conflict/package.py | 2 +- .../builtin.mock/packages/develop-test/package.py | 2 +- .../builtin.mock/packages/direct-mpich/package.py | 2 +- .../packages/dt-diamond-bottom/package.py | 2 +- .../packages/dt-diamond-left/package.py | 2 +- .../packages/dt-diamond-right/package.py | 2 +- .../builtin.mock/packages/dt-diamond/package.py | 2 +- .../builtin.mock/packages/dtbuild1/package.py | 2 +- .../builtin.mock/packages/dtbuild2/package.py | 2 +- .../builtin.mock/packages/dtbuild3/package.py | 2 +- .../repos/builtin.mock/packages/dtlink1/package.py | 2 +- .../repos/builtin.mock/packages/dtlink2/package.py | 2 +- .../repos/builtin.mock/packages/dtlink3/package.py | 2 +- .../repos/builtin.mock/packages/dtlink4/package.py | 2 +- .../repos/builtin.mock/packages/dtlink5/package.py | 2 +- .../repos/builtin.mock/packages/dtrun1/package.py | 2 +- .../repos/builtin.mock/packages/dtrun2/package.py | 2 +- .../repos/builtin.mock/packages/dtrun3/package.py | 2 +- .../repos/builtin.mock/packages/dttop/package.py | 2 +- .../repos/builtin.mock/packages/dtuse/package.py | 2 +- .../repos/builtin.mock/packages/dyninst/package.py | 2 +- var/spack/repos/builtin.mock/packages/e/package.py | 2 +- .../builtin.mock/packages/extendee/package.py | 2 +- .../builtin.mock/packages/extension1/package.py | 2 +- .../builtin.mock/packages/extension2/package.py | 2 +- .../packages/externalmodule/package.py | 2 +- .../packages/externalprereq/package.py | 2 +- .../builtin.mock/packages/externaltest/package.py | 2 +- .../builtin.mock/packages/externaltool/package.py | 2 +- .../packages/externalvirtual/package.py | 2 +- .../builtin.mock/packages/failing-build/package.py | 2 +- .../repos/builtin.mock/packages/fake/package.py | 2 +- .../repos/builtin.mock/packages/flake8/package.py | 2 +- .../builtin.mock/packages/git-test/package.py | 2 +- .../repos/builtin.mock/packages/hg-test/package.py | 2 +- .../repos/builtin.mock/packages/hypre/package.py | 2 +- .../packages/indirect-mpich/package.py | 2 +- .../builtin.mock/packages/libdwarf/package.py | 2 +- .../repos/builtin.mock/packages/libelf/package.py | 2 +- .../repos/builtin.mock/packages/mpich/package.py | 2 +- .../repos/builtin.mock/packages/mpich2/package.py | 2 +- .../builtin.mock/packages/mpileaks/package.py | 2 +- .../packages/multi-provider-mpi/package.py | 2 +- .../packages/multimethod-base/package.py | 2 +- .../builtin.mock/packages/multimethod/package.py | 2 +- .../packages/multivalue_variant/package.py | 2 +- .../builtin.mock/packages/netlib-blas/package.py | 2 +- .../builtin.mock/packages/netlib-lapack/package.py | 2 +- .../packages/openblas-with-lapack/package.py | 2 +- .../builtin.mock/packages/openblas/package.py | 2 +- .../packages/optional-dep-test-2/package.py | 2 +- .../packages/optional-dep-test-3/package.py | 2 +- .../packages/optional-dep-test/package.py | 2 +- .../builtin.mock/packages/othervirtual/package.py | 2 +- .../repos/builtin.mock/packages/python/package.py | 2 +- .../builtin.mock/packages/svn-test/package.py | 2 +- .../trivial-install-test-package/package.py | 2 +- .../builtin.mock/packages/url-test/package.py | 2 +- .../repos/builtin.mock/packages/zmpi/package.py | 2 +- var/spack/repos/builtin/packages/abinit/package.py | 2 +- var/spack/repos/builtin/packages/abyss/package.py | 2 +- var/spack/repos/builtin/packages/ack/package.py | 2 +- .../builtin/packages/activeharmony/package.py | 2 +- .../repos/builtin/packages/adept-utils/package.py | 2 +- var/spack/repos/builtin/packages/adios/package.py | 2 +- var/spack/repos/builtin/packages/adlbx/package.py | 2 +- var/spack/repos/builtin/packages/adol-c/package.py | 2 +- .../builtin/packages/allinea-forge/package.py | 2 +- .../builtin/packages/allinea-reports/package.py | 2 +- .../repos/builtin/packages/alquimia/package.py | 2 +- var/spack/repos/builtin/packages/amrex/package.py | 2 +- var/spack/repos/builtin/packages/andi/package.py | 2 +- var/spack/repos/builtin/packages/ant/package.py | 2 +- var/spack/repos/builtin/packages/antlr/package.py | 2 +- var/spack/repos/builtin/packages/ape/package.py | 2 +- var/spack/repos/builtin/packages/apex/package.py | 2 +- .../repos/builtin/packages/applewmproto/package.py | 2 +- var/spack/repos/builtin/packages/appres/package.py | 2 +- .../repos/builtin/packages/apr-util/package.py | 2 +- var/spack/repos/builtin/packages/apr/package.py | 2 +- var/spack/repos/builtin/packages/archer/package.py | 2 +- .../repos/builtin/packages/argtable/package.py | 2 +- .../repos/builtin/packages/armadillo/package.py | 2 +- .../repos/builtin/packages/arpack-ng/package.py | 2 +- var/spack/repos/builtin/packages/arpack/package.py | 2 +- .../repos/builtin/packages/asciidoc/package.py | 2 +- var/spack/repos/builtin/packages/astra/package.py | 2 +- var/spack/repos/builtin/packages/astyle/package.py | 2 +- var/spack/repos/builtin/packages/atk/package.py | 2 +- var/spack/repos/builtin/packages/atlas/package.py | 2 +- .../repos/builtin/packages/atompaw/package.py | 2 +- var/spack/repos/builtin/packages/atop/package.py | 2 +- .../repos/builtin/packages/autoconf/package.py | 2 +- .../repos/builtin/packages/autogen/package.py | 2 +- .../repos/builtin/packages/automaded/package.py | 2 +- .../repos/builtin/packages/automake/package.py | 2 +- .../repos/builtin/packages/bamtools/package.py | 2 +- .../repos/builtin/packages/bamutil/package.py | 2 +- .../builtin/packages/bash-completion/package.py | 2 +- var/spack/repos/builtin/packages/bash/package.py | 2 +- var/spack/repos/builtin/packages/bats/package.py | 2 +- var/spack/repos/builtin/packages/bazel/package.py | 2 +- var/spack/repos/builtin/packages/bbcp/package.py | 2 +- .../repos/builtin/packages/bcftools/package.py | 2 +- .../repos/builtin/packages/bcl2fastq2/package.py | 2 +- .../repos/builtin/packages/bdftopcf/package.py | 2 +- var/spack/repos/builtin/packages/bdw-gc/package.py | 2 +- var/spack/repos/builtin/packages/bear/package.py | 2 +- .../repos/builtin/packages/bedtools2/package.py | 2 +- .../repos/builtin/packages/beforelight/package.py | 2 +- .../repos/builtin/packages/benchmark/package.py | 2 +- .../repos/builtin/packages/bertini/package.py | 2 +- .../repos/builtin/packages/bib2xhtml/package.py | 2 +- .../repos/builtin/packages/bigreqsproto/package.py | 2 +- .../repos/builtin/packages/binutils/package.py | 2 +- var/spack/repos/builtin/packages/bison/package.py | 2 +- var/spack/repos/builtin/packages/bitmap/package.py | 2 +- .../repos/builtin/packages/blast-plus/package.py | 2 +- var/spack/repos/builtin/packages/blat/package.py | 4 +- var/spack/repos/builtin/packages/blaze/package.py | 4 +- var/spack/repos/builtin/packages/bliss/package.py | 2 +- var/spack/repos/builtin/packages/blitz/package.py | 2 +- var/spack/repos/builtin/packages/bml/package.py | 2 +- var/spack/repos/builtin/packages/boost/package.py | 2 +- .../packages/boostmplcartesianproduct/package.py | 2 +- var/spack/repos/builtin/packages/bowtie/package.py | 2 +- .../repos/builtin/packages/bowtie2/package.py | 2 +- var/spack/repos/builtin/packages/boxlib/package.py | 2 +- .../repos/builtin/packages/bpp-core/package.py | 2 +- .../repos/builtin/packages/bpp-phyl/package.py | 2 +- .../repos/builtin/packages/bpp-seq/package.py | 2 +- .../repos/builtin/packages/bpp-suite/package.py | 2 +- .../repos/builtin/packages/brigand/package.py | 2 +- var/spack/repos/builtin/packages/bwa/package.py | 2 +- var/spack/repos/builtin/packages/bzip2/package.py | 2 +- .../repos/builtin/packages/c-blosc/package.py | 2 +- var/spack/repos/builtin/packages/caffe/package.py | 2 +- var/spack/repos/builtin/packages/cairo/package.py | 2 +- .../repos/builtin/packages/caliper/package.py | 2 +- .../repos/builtin/packages/callpath/package.py | 2 +- .../repos/builtin/packages/cantera/package.py | 2 +- var/spack/repos/builtin/packages/cask/package.py | 2 +- var/spack/repos/builtin/packages/catch/package.py | 2 +- var/spack/repos/builtin/packages/cbench/package.py | 2 +- var/spack/repos/builtin/packages/cblas/package.py | 2 +- .../builtin/packages/cbtf-argonavis/package.py | 2 +- .../repos/builtin/packages/cbtf-krell/package.py | 2 +- .../repos/builtin/packages/cbtf-lanl/package.py | 2 +- var/spack/repos/builtin/packages/cbtf/package.py | 2 +- var/spack/repos/builtin/packages/ccache/package.py | 2 +- .../repos/builtin/packages/cctools/package.py | 2 +- var/spack/repos/builtin/packages/cdd/package.py | 2 +- var/spack/repos/builtin/packages/cddlib/package.py | 2 +- var/spack/repos/builtin/packages/cdo/package.py | 2 +- var/spack/repos/builtin/packages/cereal/package.py | 2 +- .../repos/builtin/packages/cfitsio/package.py | 2 +- var/spack/repos/builtin/packages/cgal/package.py | 2 +- var/spack/repos/builtin/packages/cgm/package.py | 2 +- var/spack/repos/builtin/packages/cgns/package.py | 2 +- var/spack/repos/builtin/packages/charm/package.py | 2 +- var/spack/repos/builtin/packages/chombo/package.py | 2 +- .../repos/builtin/packages/cityhash/package.py | 2 +- .../repos/builtin/packages/cleverleaf/package.py | 2 +- var/spack/repos/builtin/packages/clhep/package.py | 2 +- var/spack/repos/builtin/packages/cloog/package.py | 2 +- .../repos/builtin/packages/clustalo/package.py | 2 +- .../repos/builtin/packages/clustalw/package.py | 2 +- var/spack/repos/builtin/packages/cmake/package.py | 2 +- var/spack/repos/builtin/packages/cmocka/package.py | 2 +- var/spack/repos/builtin/packages/cmor/package.py | 2 +- var/spack/repos/builtin/packages/cnmem/package.py | 2 +- var/spack/repos/builtin/packages/cntk/package.py | 2 +- .../repos/builtin/packages/cntk1bitsgd/package.py | 2 +- .../repos/builtin/packages/coinhsl/package.py | 2 +- var/spack/repos/builtin/packages/compiz/package.py | 2 +- .../builtin/packages/compositeproto/package.py | 2 +- .../repos/builtin/packages/conduit/package.py | 2 +- .../repos/builtin/packages/constype/package.py | 2 +- .../repos/builtin/packages/converge/package.py | 2 +- .../repos/builtin/packages/coreutils/package.py | 2 +- .../repos/builtin/packages/cosmomc/package.py | 2 +- var/spack/repos/builtin/packages/cp2k/package.py | 2 +- var/spack/repos/builtin/packages/cppad/package.py | 2 +- .../repos/builtin/packages/cppcheck/package.py | 2 +- .../repos/builtin/packages/cpprestsdk/package.py | 2 +- .../repos/builtin/packages/cppunit/package.py | 2 +- var/spack/repos/builtin/packages/cram/package.py | 2 +- .../repos/builtin/packages/cryptopp/package.py | 2 +- var/spack/repos/builtin/packages/cscope/package.py | 2 +- var/spack/repos/builtin/packages/cub/package.py | 2 +- var/spack/repos/builtin/packages/cube/package.py | 2 +- .../repos/builtin/packages/cuda-memtest/package.py | 2 +- var/spack/repos/builtin/packages/cuda/package.py | 2 +- var/spack/repos/builtin/packages/cudnn/package.py | 2 +- var/spack/repos/builtin/packages/curl/package.py | 2 +- var/spack/repos/builtin/packages/cvs/package.py | 2 +- var/spack/repos/builtin/packages/czmq/package.py | 2 +- var/spack/repos/builtin/packages/dakota/package.py | 2 +- .../repos/builtin/packages/damageproto/package.py | 2 +- .../repos/builtin/packages/damselfly/package.py | 2 +- .../builtin/packages/darshan-runtime/package.py | 2 +- .../repos/builtin/packages/darshan-util/package.py | 2 +- var/spack/repos/builtin/packages/dash/package.py | 2 +- .../repos/builtin/packages/datamash/package.py | 2 +- var/spack/repos/builtin/packages/dbus/package.py | 2 +- var/spack/repos/builtin/packages/dealii/package.py | 2 +- .../repos/builtin/packages/dejagnu/package.py | 2 +- var/spack/repos/builtin/packages/dia/package.py | 2 +- var/spack/repos/builtin/packages/direnv/package.py | 2 +- .../repos/builtin/packages/dmxproto/package.py | 2 +- .../repos/builtin/packages/docbook-xml/package.py | 2 +- .../repos/builtin/packages/docbook-xsl/package.py | 2 +- .../repos/builtin/packages/dos2unix/package.py | 2 +- .../builtin/packages/double-conversion/package.py | 2 +- .../repos/builtin/packages/doxygen/package.py | 2 +- .../repos/builtin/packages/dri2proto/package.py | 2 +- .../repos/builtin/packages/dri3proto/package.py | 2 +- var/spack/repos/builtin/packages/dtcmp/package.py | 2 +- .../repos/builtin/packages/dyninst/package.py | 2 +- .../repos/builtin/packages/easybuild/package.py | 2 +- .../repos/builtin/packages/eccodes/package.py | 2 +- .../repos/builtin/packages/editres/package.py | 2 +- var/spack/repos/builtin/packages/eigen/package.py | 2 +- .../repos/builtin/packages/elemental/package.py | 2 +- .../repos/builtin/packages/elfutils/package.py | 2 +- var/spack/repos/builtin/packages/elk/package.py | 2 +- var/spack/repos/builtin/packages/elpa/package.py | 2 +- var/spack/repos/builtin/packages/emacs/package.py | 2 +- .../repos/builtin/packages/encodings/package.py | 2 +- .../packages/environment-modules/package.py | 2 +- var/spack/repos/builtin/packages/es/package.py | 2 +- var/spack/repos/builtin/packages/esmf/package.py | 2 +- .../repos/builtin/packages/espresso/package.py | 2 +- .../repos/builtin/packages/espressopp/package.py | 2 +- .../repos/builtin/packages/etsf-io/package.py | 2 +- .../builtin/packages/everytrace-example/package.py | 2 +- .../repos/builtin/packages/everytrace/package.py | 2 +- .../repos/builtin/packages/evieext/package.py | 2 +- .../repos/builtin/packages/exmcutils/package.py | 2 +- .../repos/builtin/packages/exodusii/package.py | 2 +- .../repos/builtin/packages/exonerate/package.py | 2 +- var/spack/repos/builtin/packages/expat/package.py | 2 +- var/spack/repos/builtin/packages/expect/package.py | 2 +- var/spack/repos/builtin/packages/extrae/package.py | 2 +- .../builtin/packages/exuberant-ctags/package.py | 2 +- .../repos/builtin/packages/f90cache/package.py | 2 +- .../repos/builtin/packages/farmhash/package.py | 2 +- .../repos/builtin/packages/fastmath/package.py | 2 +- var/spack/repos/builtin/packages/fastqc/package.py | 2 +- .../builtin/packages/fastx-toolkit/package.py | 2 +- var/spack/repos/builtin/packages/fenics/package.py | 2 +- var/spack/repos/builtin/packages/ferret/package.py | 2 +- var/spack/repos/builtin/packages/ffmpeg/package.py | 8 +- var/spack/repos/builtin/packages/fftw/package.py | 2 +- .../repos/builtin/packages/findutils/package.py | 2 +- var/spack/repos/builtin/packages/fio/package.py | 2 +- var/spack/repos/builtin/packages/fish/package.py | 2 +- .../repos/builtin/packages/fixesproto/package.py | 2 +- var/spack/repos/builtin/packages/flac/package.py | 2 +- var/spack/repos/builtin/packages/flann/package.py | 2 +- var/spack/repos/builtin/packages/flash/package.py | 2 +- .../repos/builtin/packages/flecsale/package.py | 2 +- var/spack/repos/builtin/packages/flecsi/package.py | 2 +- var/spack/repos/builtin/packages/flex/package.py | 2 +- var/spack/repos/builtin/packages/flint/package.py | 2 +- var/spack/repos/builtin/packages/fltk/package.py | 2 +- var/spack/repos/builtin/packages/flux/package.py | 2 +- .../repos/builtin/packages/foam-extend/package.py | 2 +- var/spack/repos/builtin/packages/folly/package.py | 2 +- .../builtin/packages/font-adobe-100dpi/package.py | 2 +- .../builtin/packages/font-adobe-75dpi/package.py | 2 +- .../packages/font-adobe-utopia-100dpi/package.py | 2 +- .../packages/font-adobe-utopia-75dpi/package.py | 2 +- .../packages/font-adobe-utopia-type1/package.py | 2 +- .../repos/builtin/packages/font-alias/package.py | 2 +- .../builtin/packages/font-arabic-misc/package.py | 2 +- .../builtin/packages/font-bh-100dpi/package.py | 2 +- .../builtin/packages/font-bh-75dpi/package.py | 2 +- .../font-bh-lucidatypewriter-100dpi/package.py | 2 +- .../font-bh-lucidatypewriter-75dpi/package.py | 2 +- .../repos/builtin/packages/font-bh-ttf/package.py | 2 +- .../builtin/packages/font-bh-type1/package.py | 2 +- .../packages/font-bitstream-100dpi/package.py | 2 +- .../packages/font-bitstream-75dpi/package.py | 2 +- .../packages/font-bitstream-speedo/package.py | 2 +- .../packages/font-bitstream-type1/package.py | 2 +- .../packages/font-cronyx-cyrillic/package.py | 2 +- .../builtin/packages/font-cursor-misc/package.py | 2 +- .../builtin/packages/font-daewoo-misc/package.py | 2 +- .../builtin/packages/font-dec-misc/package.py | 2 +- .../builtin/packages/font-ibm-type1/package.py | 2 +- .../builtin/packages/font-isas-misc/package.py | 2 +- .../builtin/packages/font-jis-misc/package.py | 2 +- .../builtin/packages/font-micro-misc/package.py | 2 +- .../builtin/packages/font-misc-cyrillic/package.py | 2 +- .../builtin/packages/font-misc-ethiopic/package.py | 2 +- .../builtin/packages/font-misc-meltho/package.py | 2 +- .../builtin/packages/font-misc-misc/package.py | 2 +- .../builtin/packages/font-mutt-misc/package.py | 2 +- .../packages/font-schumacher-misc/package.py | 2 +- .../packages/font-screen-cyrillic/package.py | 2 +- .../builtin/packages/font-sony-misc/package.py | 2 +- .../builtin/packages/font-sun-misc/package.py | 2 +- .../repos/builtin/packages/font-util/package.py | 2 +- .../packages/font-winitzki-cyrillic/package.py | 2 +- .../builtin/packages/font-xfree86-type1/package.py | 2 +- .../builtin/packages/fontcacheproto/package.py | 2 +- .../repos/builtin/packages/fontconfig/package.py | 2 +- .../repos/builtin/packages/fontsproto/package.py | 2 +- .../repos/builtin/packages/fonttosfnt/package.py | 2 +- .../repos/builtin/packages/freetype/package.py | 2 +- .../repos/builtin/packages/fslsfonts/package.py | 2 +- .../repos/builtin/packages/fstobdf/package.py | 2 +- var/spack/repos/builtin/packages/funhpc/package.py | 2 +- var/spack/repos/builtin/packages/gasnet/package.py | 2 +- var/spack/repos/builtin/packages/gawk/package.py | 2 +- .../repos/builtin/packages/gbenchmark/package.py | 2 +- var/spack/repos/builtin/packages/gcc/package.py | 2 +- .../repos/builtin/packages/gccmakedep/package.py | 2 +- var/spack/repos/builtin/packages/gccxml/package.py | 2 +- var/spack/repos/builtin/packages/gconf/package.py | 2 +- var/spack/repos/builtin/packages/gdal/package.py | 2 +- var/spack/repos/builtin/packages/gdb/package.py | 2 +- var/spack/repos/builtin/packages/gdbm/package.py | 2 +- .../repos/builtin/packages/gdk-pixbuf/package.py | 2 +- var/spack/repos/builtin/packages/geant4/package.py | 2 +- .../repos/builtin/packages/gemmlowp/package.py | 2 +- var/spack/repos/builtin/packages/geos/package.py | 2 +- .../repos/builtin/packages/gettext/package.py | 2 +- var/spack/repos/builtin/packages/gflags/package.py | 2 +- .../builtin/packages/ghostscript-fonts/package.py | 2 +- .../repos/builtin/packages/ghostscript/package.py | 2 +- var/spack/repos/builtin/packages/giflib/package.py | 2 +- .../repos/builtin/packages/git-lfs/package.py | 2 +- var/spack/repos/builtin/packages/git/package.py | 2 +- var/spack/repos/builtin/packages/gl2ps/package.py | 2 +- var/spack/repos/builtin/packages/glew/package.py | 2 +- var/spack/repos/builtin/packages/glib/package.py | 2 +- var/spack/repos/builtin/packages/glm/package.py | 2 +- var/spack/repos/builtin/packages/global/package.py | 2 +- .../repos/builtin/packages/globalarrays/package.py | 4 +- .../builtin/packages/globus-toolkit/package.py | 2 +- var/spack/repos/builtin/packages/glog/package.py | 2 +- var/spack/repos/builtin/packages/glpk/package.py | 2 +- .../repos/builtin/packages/glproto/package.py | 2 +- var/spack/repos/builtin/packages/gmake/package.py | 2 +- var/spack/repos/builtin/packages/gmime/package.py | 2 +- var/spack/repos/builtin/packages/gmp/package.py | 2 +- var/spack/repos/builtin/packages/gmsh/package.py | 2 +- var/spack/repos/builtin/packages/gnat/package.py | 2 +- .../repos/builtin/packages/gnu-prolog/package.py | 2 +- var/spack/repos/builtin/packages/gnupg/package.py | 2 +- .../repos/builtin/packages/gnuplot/package.py | 2 +- var/spack/repos/builtin/packages/gnutls/package.py | 2 +- .../repos/builtin/packages/go-bootstrap/package.py | 2 +- var/spack/repos/builtin/packages/go/package.py | 2 +- .../packages/gobject-introspection/package.py | 2 +- .../repos/builtin/packages/googletest/package.py | 2 +- var/spack/repos/builtin/packages/gource/package.py | 2 +- var/spack/repos/builtin/packages/gperf/package.py | 2 +- .../repos/builtin/packages/gperftools/package.py | 2 +- .../repos/builtin/packages/grackle/package.py | 2 +- var/spack/repos/builtin/packages/gradle/package.py | 10 +- var/spack/repos/builtin/packages/grandr/package.py | 2 +- .../repos/builtin/packages/graphlib/package.py | 2 +- .../repos/builtin/packages/graphviz/package.py | 2 +- .../repos/builtin/packages/grib-api/package.py | 2 +- .../repos/builtin/packages/gromacs/package.py | 2 +- var/spack/repos/builtin/packages/gsl/package.py | 2 +- .../repos/builtin/packages/gtkplus/package.py | 2 +- var/spack/repos/builtin/packages/gts/package.py | 2 +- var/spack/repos/builtin/packages/guile/package.py | 2 +- var/spack/repos/builtin/packages/h5hut/package.py | 2 +- var/spack/repos/builtin/packages/h5part/package.py | 2 +- .../repos/builtin/packages/h5utils/package.py | 2 +- .../repos/builtin/packages/h5z-zfp/package.py | 2 +- var/spack/repos/builtin/packages/hadoop/package.py | 2 +- .../repos/builtin/packages/harfbuzz/package.py | 2 +- .../repos/builtin/packages/harminv/package.py | 2 +- var/spack/repos/builtin/packages/hdf/package.py | 2 +- .../repos/builtin/packages/hdf5-blosc/package.py | 2 +- var/spack/repos/builtin/packages/hdf5/package.py | 2 +- .../repos/builtin/packages/help2man/package.py | 2 +- var/spack/repos/builtin/packages/hepmc/package.py | 2 +- var/spack/repos/builtin/packages/heppdt/package.py | 2 +- .../repos/builtin/packages/highfive/package.py | 2 +- .../repos/builtin/packages/highwayhash/package.py | 2 +- var/spack/repos/builtin/packages/hmmer/package.py | 2 +- .../repos/builtin/packages/hoomd-blue/package.py | 2 +- .../packages/hpctoolkit-externals/package.py | 2 +- .../repos/builtin/packages/hpctoolkit/package.py | 2 +- var/spack/repos/builtin/packages/hpl/package.py | 2 +- var/spack/repos/builtin/packages/hpx5/package.py | 2 +- var/spack/repos/builtin/packages/hsakmt/package.py | 2 +- var/spack/repos/builtin/packages/hstr/package.py | 2 +- var/spack/repos/builtin/packages/htop/package.py | 2 +- var/spack/repos/builtin/packages/htslib/package.py | 2 +- var/spack/repos/builtin/packages/httpie/package.py | 4 +- var/spack/repos/builtin/packages/hub/package.py | 2 +- .../repos/builtin/packages/hunspell/package.py | 2 +- var/spack/repos/builtin/packages/hwloc/package.py | 2 +- var/spack/repos/builtin/packages/hydra/package.py | 2 +- var/spack/repos/builtin/packages/hypre/package.py | 2 +- var/spack/repos/builtin/packages/ibmisc/package.py | 2 +- .../repos/builtin/packages/iceauth/package.py | 2 +- var/spack/repos/builtin/packages/icet/package.py | 2 +- var/spack/repos/builtin/packages/ico/package.py | 2 +- var/spack/repos/builtin/packages/icu4c/package.py | 2 +- var/spack/repos/builtin/packages/id3lib/package.py | 2 +- .../repos/builtin/packages/ilmbase/package.py | 2 +- .../repos/builtin/packages/image-magick/package.py | 2 +- var/spack/repos/builtin/packages/imake/package.py | 2 +- .../repos/builtin/packages/inputproto/package.py | 2 +- .../repos/builtin/packages/intel-daal/package.py | 2 +- .../builtin/packages/intel-gpu-tools/package.py | 2 +- .../repos/builtin/packages/intel-ipp/package.py | 2 +- .../repos/builtin/packages/intel-mkl/package.py | 2 +- .../repos/builtin/packages/intel-mpi/package.py | 2 +- .../packages/intel-parallel-studio/package.py | 2 +- var/spack/repos/builtin/packages/intel/package.py | 2 +- .../repos/builtin/packages/intltool/package.py | 2 +- var/spack/repos/builtin/packages/ior/package.py | 2 +- var/spack/repos/builtin/packages/iozone/package.py | 2 +- var/spack/repos/builtin/packages/ipopt/package.py | 2 +- .../repos/builtin/packages/isaac-server/package.py | 2 +- var/spack/repos/builtin/packages/isaac/package.py | 2 +- var/spack/repos/builtin/packages/isl/package.py | 2 +- .../repos/builtin/packages/itstool/package.py | 2 +- .../repos/builtin/packages/jansson/package.py | 2 +- var/spack/repos/builtin/packages/jasper/package.py | 2 +- var/spack/repos/builtin/packages/jdk/package.py | 2 +- .../repos/builtin/packages/jemalloc/package.py | 2 +- var/spack/repos/builtin/packages/jmol/package.py | 2 +- var/spack/repos/builtin/packages/jpeg/package.py | 2 +- var/spack/repos/builtin/packages/jq/package.py | 2 +- var/spack/repos/builtin/packages/json-c/package.py | 2 +- .../repos/builtin/packages/jsoncpp/package.py | 2 +- var/spack/repos/builtin/packages/judy/package.py | 2 +- var/spack/repos/builtin/packages/julia/package.py | 2 +- var/spack/repos/builtin/packages/kaldi/package.py | 2 +- .../repos/builtin/packages/kbproto/package.py | 2 +- var/spack/repos/builtin/packages/kdiff3/package.py | 2 +- var/spack/repos/builtin/packages/kealib/package.py | 2 +- var/spack/repos/builtin/packages/kokkos/package.py | 2 +- var/spack/repos/builtin/packages/kripke/package.py | 2 +- var/spack/repos/builtin/packages/lammps/package.py | 2 +- .../repos/builtin/packages/launchmon/package.py | 2 +- var/spack/repos/builtin/packages/lbann/package.py | 2 +- .../repos/builtin/packages/lbxproxy/package.py | 2 +- var/spack/repos/builtin/packages/lcms/package.py | 2 +- var/spack/repos/builtin/packages/legion/package.py | 2 +- .../repos/builtin/packages/leveldb/package.py | 2 +- var/spack/repos/builtin/packages/libaio/package.py | 2 +- .../repos/builtin/packages/libapplewm/package.py | 2 +- .../repos/builtin/packages/libarchive/package.py | 2 +- .../repos/builtin/packages/libassuan/package.py | 2 +- .../builtin/packages/libatomic-ops/package.py | 2 +- .../repos/builtin/packages/libbson/package.py | 2 +- .../repos/builtin/packages/libcanberra/package.py | 2 +- var/spack/repos/builtin/packages/libcap/package.py | 2 +- .../repos/builtin/packages/libcerf/package.py | 2 +- .../repos/builtin/packages/libcircle/package.py | 2 +- .../repos/builtin/packages/libconfig/package.py | 2 +- var/spack/repos/builtin/packages/libctl/package.py | 2 +- .../builtin/packages/libdivsufsort/package.py | 2 +- var/spack/repos/builtin/packages/libdmx/package.py | 2 +- var/spack/repos/builtin/packages/libdrm/package.py | 2 +- .../repos/builtin/packages/libdwarf/package.py | 4 +- .../repos/builtin/packages/libedit/package.py | 2 +- var/spack/repos/builtin/packages/libelf/package.py | 2 +- .../repos/builtin/packages/libemos/package.py | 2 +- .../repos/builtin/packages/libepoxy/package.py | 2 +- .../repos/builtin/packages/libevent/package.py | 2 +- var/spack/repos/builtin/packages/libffi/package.py | 2 +- .../repos/builtin/packages/libfontenc/package.py | 2 +- var/spack/repos/builtin/packages/libfs/package.py | 2 +- .../repos/builtin/packages/libgcrypt/package.py | 2 +- var/spack/repos/builtin/packages/libgd/package.py | 2 +- .../repos/builtin/packages/libgit2/package.py | 2 +- .../repos/builtin/packages/libgpg-error/package.py | 2 +- .../repos/builtin/packages/libgpuarray/package.py | 2 +- .../builtin/packages/libgtextutils/package.py | 2 +- .../repos/builtin/packages/libharu/package.py | 2 +- var/spack/repos/builtin/packages/libhio/package.py | 2 +- var/spack/repos/builtin/packages/libice/package.py | 2 +- .../repos/builtin/packages/libiconv/package.py | 2 +- var/spack/repos/builtin/packages/libint/package.py | 2 +- .../builtin/packages/libjpeg-turbo/package.py | 2 +- .../repos/builtin/packages/libksba/package.py | 2 +- .../repos/builtin/packages/liblbxutil/package.py | 2 +- .../repos/builtin/packages/libmatheval/package.py | 2 +- .../repos/builtin/packages/libmesh/package.py | 2 +- var/spack/repos/builtin/packages/libmng/package.py | 2 +- .../repos/builtin/packages/libmongoc/package.py | 2 +- .../repos/builtin/packages/libmonitor/package.py | 2 +- var/spack/repos/builtin/packages/libnbc/package.py | 2 +- var/spack/repos/builtin/packages/libogg/package.py | 2 +- .../repos/builtin/packages/liboldx/package.py | 2 +- .../repos/builtin/packages/libpciaccess/package.py | 2 +- .../repos/builtin/packages/libpfm4/package.py | 2 +- var/spack/repos/builtin/packages/libpng/package.py | 2 +- var/spack/repos/builtin/packages/libpsl/package.py | 2 +- .../builtin/packages/libpthread-stubs/package.py | 2 +- var/spack/repos/builtin/packages/libquo/package.py | 2 +- .../repos/builtin/packages/libsigsegv/package.py | 2 +- var/spack/repos/builtin/packages/libsm/package.py | 2 +- .../repos/builtin/packages/libsodium/package.py | 2 +- .../builtin/packages/libspatialindex/package.py | 2 +- .../repos/builtin/packages/libsplash/package.py | 2 +- .../repos/builtin/packages/libssh2/package.py | 4 +- .../repos/builtin/packages/libtermkey/package.py | 2 +- .../repos/builtin/packages/libtiff/package.py | 2 +- .../repos/builtin/packages/libtool/package.py | 2 +- .../repos/builtin/packages/libunistring/package.py | 2 +- .../repos/builtin/packages/libunwind/package.py | 2 +- .../repos/builtin/packages/libuuid/package.py | 2 +- var/spack/repos/builtin/packages/libuv/package.py | 2 +- .../repos/builtin/packages/libvorbis/package.py | 2 +- .../repos/builtin/packages/libvterm/package.py | 2 +- .../builtin/packages/libwebsockets/package.py | 2 +- .../repos/builtin/packages/libwindowswm/package.py | 2 +- var/spack/repos/builtin/packages/libx11/package.py | 2 +- var/spack/repos/builtin/packages/libxau/package.py | 2 +- var/spack/repos/builtin/packages/libxaw/package.py | 2 +- .../repos/builtin/packages/libxaw3d/package.py | 2 +- var/spack/repos/builtin/packages/libxc/package.py | 2 +- var/spack/repos/builtin/packages/libxcb/package.py | 2 +- .../builtin/packages/libxcomposite/package.py | 2 +- .../repos/builtin/packages/libxcursor/package.py | 2 +- .../repos/builtin/packages/libxdamage/package.py | 2 +- .../repos/builtin/packages/libxdmcp/package.py | 2 +- .../repos/builtin/packages/libxevie/package.py | 2 +- .../repos/builtin/packages/libxext/package.py | 2 +- .../repos/builtin/packages/libxfixes/package.py | 2 +- .../repos/builtin/packages/libxfont/package.py | 2 +- .../repos/builtin/packages/libxfont2/package.py | 2 +- .../builtin/packages/libxfontcache/package.py | 2 +- var/spack/repos/builtin/packages/libxft/package.py | 2 +- var/spack/repos/builtin/packages/libxi/package.py | 2 +- .../repos/builtin/packages/libxinerama/package.py | 2 +- .../repos/builtin/packages/libxkbfile/package.py | 2 +- .../repos/builtin/packages/libxkbui/package.py | 2 +- .../repos/builtin/packages/libxml2/package.py | 2 +- var/spack/repos/builtin/packages/libxmu/package.py | 2 +- var/spack/repos/builtin/packages/libxp/package.py | 2 +- var/spack/repos/builtin/packages/libxpm/package.py | 2 +- .../repos/builtin/packages/libxpresent/package.py | 2 +- .../builtin/packages/libxprintapputil/package.py | 2 +- .../builtin/packages/libxprintutil/package.py | 2 +- .../repos/builtin/packages/libxrandr/package.py | 2 +- .../repos/builtin/packages/libxrender/package.py | 2 +- .../repos/builtin/packages/libxres/package.py | 2 +- .../builtin/packages/libxscrnsaver/package.py | 2 +- .../repos/builtin/packages/libxshmfence/package.py | 2 +- .../repos/builtin/packages/libxslt/package.py | 2 +- .../repos/builtin/packages/libxsmm/package.py | 2 +- .../repos/builtin/packages/libxstream/package.py | 2 +- var/spack/repos/builtin/packages/libxt/package.py | 2 +- .../repos/builtin/packages/libxtrap/package.py | 2 +- .../repos/builtin/packages/libxtst/package.py | 2 +- var/spack/repos/builtin/packages/libxv/package.py | 2 +- .../repos/builtin/packages/libxvmc/package.py | 2 +- .../repos/builtin/packages/libxxf86dga/package.py | 2 +- .../repos/builtin/packages/libxxf86misc/package.py | 2 +- .../repos/builtin/packages/libxxf86vm/package.py | 2 +- var/spack/repos/builtin/packages/libzip/package.py | 2 +- var/spack/repos/builtin/packages/likwid/package.py | 2 +- .../builtin/packages/linux-headers/package.py | 2 +- .../repos/builtin/packages/listres/package.py | 2 +- .../repos/builtin/packages/llvm-lld/package.py | 2 +- .../builtin/packages/llvm-openmp-ompt/package.py | 4 +- var/spack/repos/builtin/packages/llvm/package.py | 2 +- var/spack/repos/builtin/packages/lmdb/package.py | 2 +- var/spack/repos/builtin/packages/lmod/package.py | 2 +- var/spack/repos/builtin/packages/lndir/package.py | 2 +- .../repos/builtin/packages/log4cxx/package.py | 2 +- var/spack/repos/builtin/packages/lrslib/package.py | 2 +- var/spack/repos/builtin/packages/lrzip/package.py | 2 +- .../repos/builtin/packages/lua-jit/package.py | 2 +- .../builtin/packages/lua-luafilesystem/package.py | 2 +- .../repos/builtin/packages/lua-luaposix/package.py | 2 +- var/spack/repos/builtin/packages/lua/package.py | 2 +- var/spack/repos/builtin/packages/luit/package.py | 2 +- var/spack/repos/builtin/packages/lulesh/package.py | 2 +- var/spack/repos/builtin/packages/lwgrp/package.py | 2 +- var/spack/repos/builtin/packages/lwm2/package.py | 2 +- var/spack/repos/builtin/packages/lz4/package.py | 2 +- var/spack/repos/builtin/packages/lzma/package.py | 2 +- var/spack/repos/builtin/packages/lzo/package.py | 2 +- var/spack/repos/builtin/packages/m4/package.py | 2 +- .../repos/builtin/packages/mad-numdiff/package.py | 2 +- var/spack/repos/builtin/packages/mafft/package.py | 2 +- var/spack/repos/builtin/packages/magics/package.py | 2 +- var/spack/repos/builtin/packages/magma/package.py | 2 +- .../repos/builtin/packages/makedepend/package.py | 2 +- .../repos/builtin/packages/mallocmc/package.py | 2 +- .../repos/builtin/packages/mariadb/package.py | 2 +- var/spack/repos/builtin/packages/matio/package.py | 3 +- var/spack/repos/builtin/packages/matlab/package.py | 2 +- var/spack/repos/builtin/packages/maven/package.py | 2 +- var/spack/repos/builtin/packages/mawk/package.py | 2 +- .../repos/builtin/packages/mbedtls/package.py | 2 +- var/spack/repos/builtin/packages/mdtest/package.py | 6 +- var/spack/repos/builtin/packages/meep/package.py | 2 +- .../repos/builtin/packages/memaxes/package.py | 2 +- var/spack/repos/builtin/packages/meme/package.py | 2 +- .../repos/builtin/packages/mercurial/package.py | 2 +- .../repos/builtin/packages/mesa-glu/package.py | 2 +- var/spack/repos/builtin/packages/mesa/package.py | 2 +- .../repos/builtin/packages/mesquite/package.py | 2 +- var/spack/repos/builtin/packages/metis/package.py | 2 +- var/spack/repos/builtin/packages/mfem/package.py | 2 +- .../repos/builtin/packages/miniconda2/package.py | 2 +- .../repos/builtin/packages/miniconda3/package.py | 2 +- var/spack/repos/builtin/packages/mitos/package.py | 2 +- .../repos/builtin/packages/mkfontdir/package.py | 2 +- .../repos/builtin/packages/mkfontscale/package.py | 2 +- var/spack/repos/builtin/packages/moab/package.py | 2 +- var/spack/repos/builtin/packages/mono/package.py | 2 +- var/spack/repos/builtin/packages/mosh/package.py | 2 +- var/spack/repos/builtin/packages/mozjs/package.py | 2 +- var/spack/repos/builtin/packages/mpc/package.py | 2 +- var/spack/repos/builtin/packages/mpe2/package.py | 2 +- var/spack/repos/builtin/packages/mpfr/package.py | 2 +- .../repos/builtin/packages/mpibash/package.py | 2 +- var/spack/repos/builtin/packages/mpich/package.py | 2 +- .../repos/builtin/packages/mpifileutils/package.py | 2 +- .../repos/builtin/packages/mpileaks/package.py | 2 +- var/spack/repos/builtin/packages/mpip/package.py | 2 +- var/spack/repos/builtin/packages/mpir/package.py | 2 +- var/spack/repos/builtin/packages/mrnet/package.py | 2 +- .../repos/builtin/packages/msgpack-c/package.py | 2 +- .../repos/builtin/packages/multiverso/package.py | 2 +- var/spack/repos/builtin/packages/mummer/package.py | 2 +- var/spack/repos/builtin/packages/mumps/package.py | 2 +- var/spack/repos/builtin/packages/munge/package.py | 2 +- .../repos/builtin/packages/muparser/package.py | 2 +- var/spack/repos/builtin/packages/muster/package.py | 2 +- .../repos/builtin/packages/mvapich2/package.py | 2 +- var/spack/repos/builtin/packages/mxml/package.py | 2 +- var/spack/repos/builtin/packages/nag/package.py | 2 +- var/spack/repos/builtin/packages/nalu/package.py | 2 +- var/spack/repos/builtin/packages/namd/package.py | 2 +- var/spack/repos/builtin/packages/nano/package.py | 2 +- var/spack/repos/builtin/packages/nasm/package.py | 2 +- var/spack/repos/builtin/packages/nauty/package.py | 2 +- var/spack/repos/builtin/packages/nccl/package.py | 2 +- var/spack/repos/builtin/packages/nccmp/package.py | 2 +- var/spack/repos/builtin/packages/ncdu/package.py | 2 +- var/spack/repos/builtin/packages/ncftp/package.py | 4 +- var/spack/repos/builtin/packages/ncl/package.py | 2 +- var/spack/repos/builtin/packages/nco/package.py | 2 +- .../repos/builtin/packages/ncurses/package.py | 2 +- var/spack/repos/builtin/packages/ncview/package.py | 2 +- var/spack/repos/builtin/packages/ndiff/package.py | 2 +- .../repos/builtin/packages/netcdf-cxx/package.py | 2 +- .../repos/builtin/packages/netcdf-cxx4/package.py | 2 +- .../builtin/packages/netcdf-fortran/package.py | 2 +- var/spack/repos/builtin/packages/netcdf/package.py | 2 +- .../repos/builtin/packages/netgauge/package.py | 2 +- .../builtin/packages/netlib-lapack/package.py | 2 +- .../builtin/packages/netlib-scalapack/package.py | 2 +- var/spack/repos/builtin/packages/nettle/package.py | 2 +- .../repos/builtin/packages/nextflow/package.py | 2 +- var/spack/repos/builtin/packages/nfft/package.py | 2 +- var/spack/repos/builtin/packages/nginx/package.py | 2 +- var/spack/repos/builtin/packages/ninja/package.py | 2 +- var/spack/repos/builtin/packages/nmap/package.py | 6 +- .../repos/builtin/packages/node-js/package.py | 2 +- .../repos/builtin/packages/notmuch/package.py | 6 +- var/spack/repos/builtin/packages/npb/package.py | 2 +- var/spack/repos/builtin/packages/npm/package.py | 2 +- var/spack/repos/builtin/packages/npth/package.py | 2 +- var/spack/repos/builtin/packages/nspr/package.py | 2 +- .../repos/builtin/packages/numdiff/package.py | 2 +- var/spack/repos/builtin/packages/nwchem/package.py | 2 +- var/spack/repos/builtin/packages/ocaml/package.py | 4 +- var/spack/repos/builtin/packages/oce/package.py | 2 +- var/spack/repos/builtin/packages/oclock/package.py | 2 +- .../builtin/packages/octave-splines/package.py | 2 +- var/spack/repos/builtin/packages/octave/package.py | 2 +- .../repos/builtin/packages/octopus/package.py | 2 +- var/spack/repos/builtin/packages/ompss/package.py | 2 +- .../repos/builtin/packages/ompt-openmp/package.py | 2 +- .../repos/builtin/packages/oniguruma/package.py | 2 +- .../repos/builtin/packages/ont-albacore/package.py | 2 +- var/spack/repos/builtin/packages/opari2/package.py | 2 +- .../repos/builtin/packages/openbabel/package.py | 2 +- .../repos/builtin/packages/openblas/package.py | 2 +- .../repos/builtin/packages/opencoarrays/package.py | 2 +- var/spack/repos/builtin/packages/opencv/package.py | 2 +- .../repos/builtin/packages/openexr/package.py | 2 +- .../repos/builtin/packages/openfoam-com/package.py | 2 +- .../repos/builtin/packages/openfoam-org/package.py | 2 +- .../repos/builtin/packages/openfst/package.py | 2 +- .../repos/builtin/packages/openjpeg/package.py | 2 +- .../repos/builtin/packages/openmpi/package.py | 2 +- .../builtin/packages/openscenegraph/package.py | 2 +- .../builtin/packages/openspeedshop/package.py | 2 +- .../repos/builtin/packages/openssh/package.py | 2 +- .../repos/builtin/packages/openssl/package.py | 2 +- var/spack/repos/builtin/packages/opium/package.py | 2 +- var/spack/repos/builtin/packages/opus/package.py | 2 +- .../packages/osu-micro-benchmarks/package.py | 2 +- var/spack/repos/builtin/packages/otf/package.py | 2 +- var/spack/repos/builtin/packages/otf2/package.py | 2 +- var/spack/repos/builtin/packages/p4est/package.py | 2 +- var/spack/repos/builtin/packages/pagmo/package.py | 2 +- var/spack/repos/builtin/packages/panda/package.py | 2 +- var/spack/repos/builtin/packages/pango/package.py | 2 +- var/spack/repos/builtin/packages/papi/package.py | 2 +- .../repos/builtin/packages/paradiseo/package.py | 2 +- .../builtin/packages/parallel-netcdf/package.py | 2 +- .../repos/builtin/packages/parallel/package.py | 2 +- .../repos/builtin/packages/paraver/package.py | 2 +- .../repos/builtin/packages/paraview/package.py | 2 +- .../repos/builtin/packages/parmetis/package.py | 2 +- .../repos/builtin/packages/parmgridgen/package.py | 2 +- .../repos/builtin/packages/parpack/package.py | 2 +- var/spack/repos/builtin/packages/patch/package.py | 2 +- .../repos/builtin/packages/patchelf/package.py | 2 +- .../repos/builtin/packages/pax-utils/package.py | 2 +- var/spack/repos/builtin/packages/pcre/package.py | 2 +- var/spack/repos/builtin/packages/pcre2/package.py | 2 +- var/spack/repos/builtin/packages/pdsh/package.py | 2 +- var/spack/repos/builtin/packages/pdt/package.py | 2 +- var/spack/repos/builtin/packages/pegtl/package.py | 2 +- .../repos/builtin/packages/perl-dbi/package.py | 2 +- .../packages/perl-extutils-makemaker/package.py | 2 +- .../builtin/packages/perl-module-build/package.py | 2 +- .../builtin/packages/perl-term-readkey/package.py | 2 +- .../builtin/packages/perl-xml-parser/package.py | 2 +- var/spack/repos/builtin/packages/perl/package.py | 2 +- var/spack/repos/builtin/packages/petsc/package.py | 2 +- var/spack/repos/builtin/packages/pexsi/package.py | 2 +- var/spack/repos/builtin/packages/pfft/package.py | 2 +- .../repos/builtin/packages/pflotran/package.py | 2 +- var/spack/repos/builtin/packages/pgi/package.py | 2 +- var/spack/repos/builtin/packages/phasta/package.py | 2 +- var/spack/repos/builtin/packages/picard/package.py | 2 +- var/spack/repos/builtin/packages/pidx/package.py | 2 +- var/spack/repos/builtin/packages/pigz/package.py | 4 +- .../repos/builtin/packages/piranha/package.py | 2 +- var/spack/repos/builtin/packages/pixman/package.py | 2 +- .../repos/builtin/packages/pkg-config/package.py | 2 +- .../builtin/packages/planck-likelihood/package.py | 2 +- var/spack/repos/builtin/packages/plumed/package.py | 2 +- .../builtin/packages/pmgr-collective/package.py | 2 +- var/spack/repos/builtin/packages/pnfft/package.py | 2 +- .../repos/builtin/packages/pngwriter/package.py | 2 +- var/spack/repos/builtin/packages/pocl/package.py | 2 +- .../repos/builtin/packages/polymake/package.py | 2 +- var/spack/repos/builtin/packages/porta/package.py | 2 +- .../repos/builtin/packages/portage/package.py | 2 +- .../repos/builtin/packages/postgresql/package.py | 2 +- var/spack/repos/builtin/packages/ppl/package.py | 2 +- var/spack/repos/builtin/packages/prank/package.py | 2 +- .../repos/builtin/packages/presentproto/package.py | 2 +- .../repos/builtin/packages/printproto/package.py | 2 +- var/spack/repos/builtin/packages/proj/package.py | 2 +- .../repos/builtin/packages/protobuf/package.py | 2 +- .../repos/builtin/packages/proxymngr/package.py | 2 +- .../builtin/packages/pruners-ninja/package.py | 2 +- var/spack/repos/builtin/packages/psi4/package.py | 2 +- .../repos/builtin/packages/pstreams/package.py | 2 +- .../repos/builtin/packages/pugixml/package.py | 2 +- var/spack/repos/builtin/packages/pumi/package.py | 2 +- var/spack/repos/builtin/packages/pvm/package.py | 2 +- .../repos/builtin/packages/py-3to2/package.py | 2 +- .../builtin/packages/py-4suite-xml/package.py | 2 +- .../repos/builtin/packages/py-abipy/package.py | 2 +- .../repos/builtin/packages/py-alabaster/package.py | 2 +- .../builtin/packages/py-apache-libcloud/package.py | 2 +- .../repos/builtin/packages/py-appdirs/package.py | 2 +- .../repos/builtin/packages/py-appnope/package.py | 2 +- .../builtin/packages/py-apscheduler/package.py | 2 +- .../builtin/packages/py-argcomplete/package.py | 2 +- .../repos/builtin/packages/py-argparse/package.py | 2 +- var/spack/repos/builtin/packages/py-ase/package.py | 2 +- .../builtin/packages/py-asn1crypto/package.py | 2 +- .../repos/builtin/packages/py-astroid/package.py | 2 +- .../repos/builtin/packages/py-astropy/package.py | 2 +- .../repos/builtin/packages/py-attrs/package.py | 2 +- .../repos/builtin/packages/py-autopep8/package.py | 2 +- .../repos/builtin/packages/py-babel/package.py | 2 +- .../builtin/packages/py-backports-abc/package.py | 2 +- .../package.py | 2 +- .../py-backports-ssl-match-hostname/package.py | 2 +- .../repos/builtin/packages/py-basemap/package.py | 2 +- .../builtin/packages/py-beautifulsoup4/package.py | 2 +- .../repos/builtin/packages/py-binwalk/package.py | 2 +- .../repos/builtin/packages/py-biopython/package.py | 2 +- .../repos/builtin/packages/py-bleach/package.py | 2 +- .../repos/builtin/packages/py-blessings/package.py | 2 +- .../repos/builtin/packages/py-bokeh/package.py | 2 +- .../repos/builtin/packages/py-boltons/package.py | 2 +- .../builtin/packages/py-bottleneck/package.py | 2 +- .../repos/builtin/packages/py-brian/package.py | 2 +- .../repos/builtin/packages/py-brian2/package.py | 2 +- .../repos/builtin/packages/py-cclib/package.py | 2 +- .../repos/builtin/packages/py-cdat-lite/package.py | 2 +- var/spack/repos/builtin/packages/py-cdo/package.py | 2 +- .../repos/builtin/packages/py-certifi/package.py | 2 +- .../repos/builtin/packages/py-cffi/package.py | 2 +- .../repos/builtin/packages/py-chardet/package.py | 2 +- .../repos/builtin/packages/py-click/package.py | 2 +- .../repos/builtin/packages/py-colorama/package.py | 2 +- .../builtin/packages/py-configparser/package.py | 2 +- .../repos/builtin/packages/py-counter/package.py | 2 +- .../repos/builtin/packages/py-coverage/package.py | 2 +- .../repos/builtin/packages/py-cpuinfo/package.py | 2 +- .../builtin/packages/py-cryptography/package.py | 2 +- .../repos/builtin/packages/py-csvkit/package.py | 2 +- .../repos/builtin/packages/py-current/package.py | 2 +- .../repos/builtin/packages/py-cutadapt/package.py | 2 +- .../repos/builtin/packages/py-cycler/package.py | 2 +- .../repos/builtin/packages/py-cython/package.py | 2 +- .../repos/builtin/packages/py-dask/package.py | 2 +- .../repos/builtin/packages/py-dateutil/package.py | 2 +- var/spack/repos/builtin/packages/py-dbf/package.py | 2 +- .../repos/builtin/packages/py-decorator/package.py | 2 +- var/spack/repos/builtin/packages/py-dev/package.py | 2 +- .../repos/builtin/packages/py-dill/package.py | 2 +- .../repos/builtin/packages/py-docutils/package.py | 2 +- .../repos/builtin/packages/py-doxypy/package.py | 2 +- .../repos/builtin/packages/py-doxypypy/package.py | 2 +- .../repos/builtin/packages/py-dryscrape/package.py | 2 +- .../repos/builtin/packages/py-dxchange/package.py | 2 +- .../repos/builtin/packages/py-dxfile/package.py | 2 +- .../packages/py-easybuild-easyblocks/package.py | 2 +- .../packages/py-easybuild-easyconfigs/package.py | 2 +- .../packages/py-easybuild-framework/package.py | 2 +- .../repos/builtin/packages/py-edffile/package.py | 2 +- .../builtin/packages/py-elasticsearch/package.py | 2 +- .../repos/builtin/packages/py-elephant/package.py | 2 +- .../repos/builtin/packages/py-emcee/package.py | 2 +- .../builtin/packages/py-entrypoints/package.py | 2 +- .../repos/builtin/packages/py-enum34/package.py | 2 +- .../repos/builtin/packages/py-epydoc/package.py | 2 +- .../builtin/packages/py-et-xmlfile/package.py | 2 +- .../repos/builtin/packages/py-fasteners/package.py | 2 +- .../builtin/packages/py-fiscalyear/package.py | 2 +- .../repos/builtin/packages/py-flake8/package.py | 2 +- .../repos/builtin/packages/py-flask/package.py | 2 +- .../repos/builtin/packages/py-flexx/package.py | 2 +- .../repos/builtin/packages/py-funcsigs/package.py | 2 +- .../builtin/packages/py-functools32/package.py | 2 +- .../repos/builtin/packages/py-future/package.py | 2 +- .../repos/builtin/packages/py-futures/package.py | 2 +- .../repos/builtin/packages/py-genders/package.py | 2 +- .../repos/builtin/packages/py-genshi/package.py | 2 +- .../builtin/packages/py-git-review/package.py | 2 +- .../repos/builtin/packages/py-git2/package.py | 2 +- .../repos/builtin/packages/py-gnuplot/package.py | 2 +- .../builtin/packages/py-griddataformats/package.py | 2 +- .../repos/builtin/packages/py-guidata/package.py | 2 +- .../repos/builtin/packages/py-guiqwt/package.py | 2 +- .../repos/builtin/packages/py-h5py/package.py | 2 +- .../repos/builtin/packages/py-html2text/package.py | 2 +- .../repos/builtin/packages/py-html5lib/package.py | 2 +- .../repos/builtin/packages/py-httpbin/package.py | 2 +- .../builtin/packages/py-hypothesis/package.py | 2 +- .../repos/builtin/packages/py-idna/package.py | 2 +- .../repos/builtin/packages/py-imagesize/package.py | 2 +- .../repos/builtin/packages/py-iminuit/package.py | 2 +- .../repos/builtin/packages/py-importlib/package.py | 2 +- .../repos/builtin/packages/py-ipaddress/package.py | 2 +- .../repos/builtin/packages/py-ipdb/package.py | 2 +- .../repos/builtin/packages/py-ipykernel/package.py | 2 +- .../packages/py-ipython-genutils/package.py | 2 +- .../repos/builtin/packages/py-ipython/package.py | 2 +- .../builtin/packages/py-ipywidgets/package.py | 2 +- .../builtin/packages/py-itsdangerous/package.py | 2 +- .../repos/builtin/packages/py-jdcal/package.py | 2 +- .../repos/builtin/packages/py-jedi/package.py | 2 +- .../repos/builtin/packages/py-jinja2/package.py | 2 +- .../repos/builtin/packages/py-joblib/package.py | 2 +- .../repos/builtin/packages/py-jpype/package.py | 2 +- .../builtin/packages/py-jsonschema/package.py | 2 +- .../repos/builtin/packages/py-junit-xml/package.py | 2 +- .../builtin/packages/py-jupyter-client/package.py | 2 +- .../builtin/packages/py-jupyter-console/package.py | 2 +- .../builtin/packages/py-jupyter-core/package.py | 2 +- .../packages/py-jupyter-notebook/package.py | 2 +- .../repos/builtin/packages/py-keras/package.py | 2 +- .../builtin/packages/py-latexcodec/package.py | 2 +- .../repos/builtin/packages/py-lazy/package.py | 2 +- .../repos/builtin/packages/py-lazyarray/package.py | 2 +- .../repos/builtin/packages/py-libconf/package.py | 2 +- var/spack/repos/builtin/packages/py-lit/package.py | 2 +- .../repos/builtin/packages/py-lmfit/package.py | 2 +- .../repos/builtin/packages/py-lockfile/package.py | 2 +- .../builtin/packages/py-logilab-common/package.py | 2 +- .../repos/builtin/packages/py-lxml/package.py | 2 +- .../repos/builtin/packages/py-macs2/package.py | 2 +- .../repos/builtin/packages/py-mako/package.py | 2 +- .../repos/builtin/packages/py-markdown/package.py | 2 +- .../builtin/packages/py-markupsafe/package.py | 2 +- .../builtin/packages/py-matplotlib/package.py | 2 +- .../repos/builtin/packages/py-mccabe/package.py | 2 +- .../builtin/packages/py-mdanalysis/package.py | 2 +- .../repos/builtin/packages/py-meep/package.py | 2 +- .../repos/builtin/packages/py-mistune/package.py | 2 +- .../repos/builtin/packages/py-mock/package.py | 2 +- .../repos/builtin/packages/py-mongo/package.py | 2 +- .../repos/builtin/packages/py-monotonic/package.py | 2 +- .../repos/builtin/packages/py-monty/package.py | 2 +- .../repos/builtin/packages/py-mpi4py/package.py | 2 +- .../repos/builtin/packages/py-mpmath/package.py | 2 +- .../builtin/packages/py-multiprocess/package.py | 2 +- var/spack/repos/builtin/packages/py-mx/package.py | 2 +- .../repos/builtin/packages/py-myhdl/package.py | 2 +- .../repos/builtin/packages/py-mysqldb1/package.py | 2 +- .../repos/builtin/packages/py-nbconvert/package.py | 2 +- .../repos/builtin/packages/py-nbformat/package.py | 2 +- var/spack/repos/builtin/packages/py-neo/package.py | 6 +- .../repos/builtin/packages/py-nestle/package.py | 2 +- .../repos/builtin/packages/py-netcdf4/package.py | 2 +- .../repos/builtin/packages/py-netifaces/package.py | 2 +- .../repos/builtin/packages/py-networkx/package.py | 2 +- .../repos/builtin/packages/py-nose/package.py | 2 +- .../builtin/packages/py-nosexcover/package.py | 2 +- .../repos/builtin/packages/py-numexpr/package.py | 2 +- .../repos/builtin/packages/py-numpy/package.py | 2 +- .../repos/builtin/packages/py-numpydoc/package.py | 2 +- .../builtin/packages/py-ont-fast5-api/package.py | 2 +- .../repos/builtin/packages/py-openpyxl/package.py | 2 +- .../builtin/packages/py-ordereddict/package.py | 2 +- .../repos/builtin/packages/py-oset/package.py | 2 +- .../repos/builtin/packages/py-packaging/package.py | 2 +- .../builtin/packages/py-palettable/package.py | 2 +- .../repos/builtin/packages/py-pandas/package.py | 2 +- .../repos/builtin/packages/py-paramiko/package.py | 2 +- .../repos/builtin/packages/py-pathlib2/package.py | 2 +- .../repos/builtin/packages/py-pathos/package.py | 2 +- .../repos/builtin/packages/py-pathspec/package.py | 2 +- .../repos/builtin/packages/py-patsy/package.py | 2 +- var/spack/repos/builtin/packages/py-pbr/package.py | 2 +- .../builtin/packages/py-periodictable/package.py | 2 +- .../repos/builtin/packages/py-petsc4py/package.py | 2 +- .../repos/builtin/packages/py-pexpect/package.py | 2 +- .../repos/builtin/packages/py-phonopy/package.py | 2 +- .../builtin/packages/py-pickleshare/package.py | 2 +- var/spack/repos/builtin/packages/py-pil/package.py | 2 +- .../repos/builtin/packages/py-pillow/package.py | 2 +- var/spack/repos/builtin/packages/py-pip/package.py | 2 +- .../repos/builtin/packages/py-pkgconfig/package.py | 2 +- var/spack/repos/builtin/packages/py-ply/package.py | 2 +- var/spack/repos/builtin/packages/py-pmw/package.py | 2 +- var/spack/repos/builtin/packages/py-pox/package.py | 2 +- .../repos/builtin/packages/py-ppft/package.py | 2 +- .../builtin/packages/py-prettytable/package.py | 2 +- .../repos/builtin/packages/py-proj/package.py | 2 +- .../builtin/packages/py-prompt-toolkit/package.py | 2 +- .../repos/builtin/packages/py-protobuf/package.py | 2 +- .../repos/builtin/packages/py-psutil/package.py | 2 +- .../builtin/packages/py-ptyprocess/package.py | 2 +- .../repos/builtin/packages/py-pudb/package.py | 2 +- var/spack/repos/builtin/packages/py-py/package.py | 2 +- .../repos/builtin/packages/py-py2cairo/package.py | 2 +- .../repos/builtin/packages/py-py2neo/package.py | 2 +- .../repos/builtin/packages/py-py4j/package.py | 2 +- .../repos/builtin/packages/py-pyasn1/package.py | 2 +- .../builtin/packages/py-pybtex-docutils/package.py | 2 +- .../repos/builtin/packages/py-pybtex/package.py | 2 +- .../repos/builtin/packages/py-pychecker/package.py | 2 +- .../builtin/packages/py-pycodestyle/package.py | 2 +- .../repos/builtin/packages/py-pycparser/package.py | 2 +- .../repos/builtin/packages/py-pycrypto/package.py | 2 +- .../repos/builtin/packages/py-pycurl/package.py | 2 +- .../repos/builtin/packages/py-pydatalog/package.py | 2 +- .../builtin/packages/py-pydispatcher/package.py | 2 +- .../repos/builtin/packages/py-pydot/package.py | 2 +- .../builtin/packages/py-pyelftools/package.py | 2 +- .../repos/builtin/packages/py-pyfftw/package.py | 2 +- .../repos/builtin/packages/py-pyflakes/package.py | 2 +- .../repos/builtin/packages/py-pygments/package.py | 2 +- .../repos/builtin/packages/py-pygobject/package.py | 2 +- .../repos/builtin/packages/py-pygtk/package.py | 2 +- .../repos/builtin/packages/py-pylint/package.py | 2 +- .../repos/builtin/packages/py-pymatgen/package.py | 2 +- .../builtin/packages/py-pyminifier/package.py | 2 +- .../repos/builtin/packages/py-pympler/package.py | 2 +- .../repos/builtin/packages/py-pynn/package.py | 2 +- .../repos/builtin/packages/py-pypar/package.py | 2 +- .../repos/builtin/packages/py-pyparsing/package.py | 2 +- .../builtin/packages/py-pyprof2html/package.py | 2 +- .../repos/builtin/packages/py-pyqt/package.py | 2 +- .../repos/builtin/packages/py-pyserial/package.py | 2 +- .../repos/builtin/packages/py-pyside/package.py | 2 +- .../repos/builtin/packages/py-pysocks/package.py | 2 +- .../repos/builtin/packages/py-pytables/package.py | 2 +- .../builtin/packages/py-pytest-cov/package.py | 4 +- .../builtin/packages/py-pytest-flake8/package.py | 2 +- .../builtin/packages/py-pytest-httpbin/package.py | 2 +- .../builtin/packages/py-pytest-mock/package.py | 2 +- .../builtin/packages/py-pytest-runner/package.py | 2 +- .../repos/builtin/packages/py-pytest/package.py | 2 +- .../builtin/packages/py-python-daemon/package.py | 2 +- .../builtin/packages/py-python-gitlab/package.py | 2 +- .../repos/builtin/packages/py-pythonqwt/package.py | 2 +- .../repos/builtin/packages/py-pytz/package.py | 2 +- .../builtin/packages/py-pywavelets/package.py | 2 +- .../repos/builtin/packages/py-pyyaml/package.py | 2 +- .../repos/builtin/packages/py-qtawesome/package.py | 2 +- .../repos/builtin/packages/py-qtconsole/package.py | 2 +- .../repos/builtin/packages/py-qtpy/package.py | 2 +- .../builtin/packages/py-quantities/package.py | 2 +- .../builtin/packages/py-radical-utils/package.py | 2 +- .../repos/builtin/packages/py-ranger/package.py | 2 +- .../builtin/packages/py-readme-renderer/package.py | 2 +- .../repos/builtin/packages/py-requests/package.py | 2 +- .../repos/builtin/packages/py-restview/package.py | 2 +- .../repos/builtin/packages/py-rope/package.py | 2 +- .../repos/builtin/packages/py-rpy2/package.py | 2 +- var/spack/repos/builtin/packages/py-rsa/package.py | 2 +- .../repos/builtin/packages/py-rtree/package.py | 2 +- .../builtin/packages/py-saga-python/package.py | 2 +- .../packages/py-scientificpython/package.py | 2 +- .../builtin/packages/py-scikit-image/package.py | 2 +- .../builtin/packages/py-scikit-learn/package.py | 2 +- .../repos/builtin/packages/py-scipy/package.py | 2 +- .../repos/builtin/packages/py-seaborn/package.py | 2 +- .../builtin/packages/py-setuptools/package.py | 2 +- var/spack/repos/builtin/packages/py-sh/package.py | 2 +- .../repos/builtin/packages/py-shiboken/package.py | 2 +- .../builtin/packages/py-simplegeneric/package.py | 2 +- .../builtin/packages/py-simplejson/package.py | 2 +- .../builtin/packages/py-singledispatch/package.py | 2 +- var/spack/repos/builtin/packages/py-sip/package.py | 2 +- var/spack/repos/builtin/packages/py-six/package.py | 2 +- .../repos/builtin/packages/py-slepc4py/package.py | 4 +- .../repos/builtin/packages/py-sncosmo/package.py | 2 +- .../builtin/packages/py-snowballstemmer/package.py | 2 +- .../repos/builtin/packages/py-spefile/package.py | 2 +- .../repos/builtin/packages/py-spglib/package.py | 2 +- .../packages/py-sphinx-bootstrap-theme/package.py | 2 +- .../packages/py-sphinx-rtd-theme/package.py | 2 +- .../repos/builtin/packages/py-sphinx/package.py | 2 +- .../packages/py-sphinxcontrib-bibtex/package.py | 2 +- .../py-sphinxcontrib-programoutput/package.py | 2 +- .../py-sphinxcontrib-websupport/package.py | 2 +- .../repos/builtin/packages/py-spyder/package.py | 2 +- .../builtin/packages/py-spykeutils/package.py | 2 +- .../builtin/packages/py-sqlalchemy/package.py | 2 +- .../builtin/packages/py-statsmodels/package.py | 2 +- .../repos/builtin/packages/py-storm/package.py | 2 +- .../builtin/packages/py-subprocess32/package.py | 2 +- .../repos/builtin/packages/py-symengine/package.py | 2 +- .../repos/builtin/packages/py-symfit/package.py | 2 +- .../repos/builtin/packages/py-sympy/package.py | 2 +- .../repos/builtin/packages/py-tabulate/package.py | 2 +- .../repos/builtin/packages/py-tappy/package.py | 2 +- .../repos/builtin/packages/py-terminado/package.py | 2 +- .../repos/builtin/packages/py-theano/package.py | 2 +- .../repos/builtin/packages/py-tifffile/package.py | 2 +- .../repos/builtin/packages/py-tornado/package.py | 2 +- .../repos/builtin/packages/py-tqdm/package.py | 2 +- .../repos/builtin/packages/py-traitlets/package.py | 2 +- .../repos/builtin/packages/py-tuiview/package.py | 2 +- .../repos/builtin/packages/py-twisted/package.py | 2 +- .../repos/builtin/packages/py-typing/package.py | 2 +- .../repos/builtin/packages/py-tzlocal/package.py | 2 +- .../repos/builtin/packages/py-unittest2/package.py | 2 +- .../builtin/packages/py-unittest2py3k/package.py | 2 +- .../repos/builtin/packages/py-urllib3/package.py | 2 +- .../repos/builtin/packages/py-urwid/package.py | 2 +- .../builtin/packages/py-vcversioner/package.py | 2 +- .../builtin/packages/py-virtualenv/package.py | 2 +- .../repos/builtin/packages/py-vsc-base/package.py | 2 +- .../builtin/packages/py-vsc-install/package.py | 2 +- .../repos/builtin/packages/py-wcsaxes/package.py | 2 +- .../repos/builtin/packages/py-wcwidth/package.py | 2 +- .../builtin/packages/py-webkit-server/package.py | 2 +- .../repos/builtin/packages/py-werkzeug/package.py | 2 +- .../repos/builtin/packages/py-wheel/package.py | 2 +- .../packages/py-widgetsnbextension/package.py | 2 +- .../repos/builtin/packages/py-wrapt/package.py | 2 +- .../repos/builtin/packages/py-xarray/package.py | 2 +- .../repos/builtin/packages/py-xlrd/package.py | 2 +- .../repos/builtin/packages/py-xmlrunner/package.py | 2 +- .../repos/builtin/packages/py-xopen/package.py | 2 +- .../repos/builtin/packages/py-xpyb/package.py | 2 +- .../builtin/packages/py-xvfbwrapper/package.py | 2 +- .../repos/builtin/packages/py-yapf/package.py | 2 +- var/spack/repos/builtin/packages/py-yt/package.py | 2 +- var/spack/repos/builtin/packages/py-zmq/package.py | 2 +- var/spack/repos/builtin/packages/python/package.py | 2 +- var/spack/repos/builtin/packages/qbank/package.py | 2 +- var/spack/repos/builtin/packages/qhull/package.py | 2 +- .../repos/builtin/packages/qrupdate/package.py | 2 +- .../repos/builtin/packages/qt-creator/package.py | 2 +- var/spack/repos/builtin/packages/qt/package.py | 2 +- .../repos/builtin/packages/qthreads/package.py | 2 +- .../repos/builtin/packages/r-abind/package.py | 2 +- .../repos/builtin/packages/r-adabag/package.py | 2 +- var/spack/repos/builtin/packages/r-ade4/package.py | 2 +- .../repos/builtin/packages/r-adegenet/package.py | 2 +- var/spack/repos/builtin/packages/r-ape/package.py | 2 +- .../repos/builtin/packages/r-assertthat/package.py | 2 +- .../repos/builtin/packages/r-base64enc/package.py | 2 +- var/spack/repos/builtin/packages/r-bh/package.py | 2 +- .../builtin/packages/r-biocgenerics/package.py | 2 +- .../builtin/packages/r-biocinstaller/package.py | 2 +- .../repos/builtin/packages/r-bitops/package.py | 2 +- var/spack/repos/builtin/packages/r-boot/package.py | 2 +- var/spack/repos/builtin/packages/r-brew/package.py | 2 +- var/spack/repos/builtin/packages/r-c50/package.py | 2 +- var/spack/repos/builtin/packages/r-car/package.py | 2 +- .../repos/builtin/packages/r-caret/package.py | 2 +- .../repos/builtin/packages/r-catools/package.py | 2 +- .../repos/builtin/packages/r-checkpoint/package.py | 2 +- .../repos/builtin/packages/r-chron/package.py | 2 +- .../repos/builtin/packages/r-class/package.py | 2 +- .../repos/builtin/packages/r-cluster/package.py | 2 +- var/spack/repos/builtin/packages/r-coda/package.py | 2 +- .../repos/builtin/packages/r-codetools/package.py | 2 +- var/spack/repos/builtin/packages/r-coin/package.py | 2 +- .../repos/builtin/packages/r-colorspace/package.py | 2 +- .../repos/builtin/packages/r-corrplot/package.py | 2 +- .../repos/builtin/packages/r-crayon/package.py | 2 +- .../repos/builtin/packages/r-cubature/package.py | 2 +- .../repos/builtin/packages/r-cubist/package.py | 2 +- var/spack/repos/builtin/packages/r-curl/package.py | 2 +- .../repos/builtin/packages/r-data-table/package.py | 2 +- var/spack/repos/builtin/packages/r-dbi/package.py | 2 +- .../repos/builtin/packages/r-deldir/package.py | 2 +- .../repos/builtin/packages/r-dendextend/package.py | 2 +- .../repos/builtin/packages/r-deoptim/package.py | 2 +- .../repos/builtin/packages/r-deoptimr/package.py | 2 +- .../repos/builtin/packages/r-devtools/package.py | 2 +- .../repos/builtin/packages/r-diagrammer/package.py | 2 +- .../repos/builtin/packages/r-dichromat/package.py | 2 +- .../repos/builtin/packages/r-digest/package.py | 2 +- .../repos/builtin/packages/r-diptest/package.py | 2 +- var/spack/repos/builtin/packages/r-domc/package.py | 2 +- .../repos/builtin/packages/r-doparallel/package.py | 2 +- .../repos/builtin/packages/r-dplyr/package.py | 2 +- var/spack/repos/builtin/packages/r-dt/package.py | 2 +- .../repos/builtin/packages/r-dygraphs/package.py | 2 +- .../repos/builtin/packages/r-e1071/package.py | 2 +- .../repos/builtin/packages/r-ellipse/package.py | 2 +- var/spack/repos/builtin/packages/r-ergm/package.py | 2 +- .../repos/builtin/packages/r-evaluate/package.py | 2 +- var/spack/repos/builtin/packages/r-expm/package.py | 2 +- .../repos/builtin/packages/r-factoextra/package.py | 2 +- .../repos/builtin/packages/r-factominer/package.py | 2 +- .../repos/builtin/packages/r-filehash/package.py | 2 +- .../repos/builtin/packages/r-flashclust/package.py | 2 +- .../repos/builtin/packages/r-flexmix/package.py | 2 +- .../repos/builtin/packages/r-foreach/package.py | 2 +- .../repos/builtin/packages/r-foreign/package.py | 2 +- .../repos/builtin/packages/r-formatr/package.py | 2 +- .../repos/builtin/packages/r-formula/package.py | 2 +- var/spack/repos/builtin/packages/r-fpc/package.py | 2 +- .../repos/builtin/packages/r-gdata/package.py | 2 +- .../repos/builtin/packages/r-geosphere/package.py | 2 +- .../repos/builtin/packages/r-ggmap/package.py | 2 +- .../repos/builtin/packages/r-ggplot2/package.py | 2 +- .../repos/builtin/packages/r-ggpubr/package.py | 2 +- .../repos/builtin/packages/r-ggrepel/package.py | 2 +- .../repos/builtin/packages/r-ggsci/package.py | 2 +- .../repos/builtin/packages/r-ggvis/package.py | 2 +- .../repos/builtin/packages/r-gistr/package.py | 2 +- .../repos/builtin/packages/r-git2r/package.py | 2 +- .../repos/builtin/packages/r-glmnet/package.py | 2 +- .../repos/builtin/packages/r-gmodels/package.py | 2 +- var/spack/repos/builtin/packages/r-gmp/package.py | 2 +- .../repos/builtin/packages/r-googlevis/package.py | 2 +- .../repos/builtin/packages/r-gridbase/package.py | 2 +- .../repos/builtin/packages/r-gridextra/package.py | 2 +- .../repos/builtin/packages/r-gtable/package.py | 2 +- .../repos/builtin/packages/r-gtools/package.py | 2 +- .../repos/builtin/packages/r-hexbin/package.py | 2 +- .../repos/builtin/packages/r-highr/package.py | 2 +- .../repos/builtin/packages/r-htmltools/package.py | 2 +- .../builtin/packages/r-htmlwidgets/package.py | 2 +- .../repos/builtin/packages/r-httpuv/package.py | 2 +- var/spack/repos/builtin/packages/r-httr/package.py | 2 +- .../repos/builtin/packages/r-igraph/package.py | 2 +- .../repos/builtin/packages/r-influencer/package.py | 2 +- .../repos/builtin/packages/r-inline/package.py | 2 +- .../repos/builtin/packages/r-ipred/package.py | 2 +- .../repos/builtin/packages/r-irdisplay/package.py | 2 +- .../repos/builtin/packages/r-irkernel/package.py | 2 +- .../repos/builtin/packages/r-irlba/package.py | 2 +- .../repos/builtin/packages/r-iterators/package.py | 2 +- var/spack/repos/builtin/packages/r-jpeg/package.py | 2 +- .../repos/builtin/packages/r-jsonlite/package.py | 2 +- .../repos/builtin/packages/r-kernlab/package.py | 2 +- .../repos/builtin/packages/r-kernsmooth/package.py | 2 +- var/spack/repos/builtin/packages/r-kknn/package.py | 2 +- .../repos/builtin/packages/r-knitr/package.py | 2 +- .../repos/builtin/packages/r-labeling/package.py | 2 +- .../builtin/packages/r-laplacesdemon/package.py | 2 +- .../repos/builtin/packages/r-lattice/package.py | 2 +- var/spack/repos/builtin/packages/r-lava/package.py | 2 +- .../repos/builtin/packages/r-lazyeval/package.py | 2 +- .../repos/builtin/packages/r-leaflet/package.py | 2 +- .../repos/builtin/packages/r-leaps/package.py | 2 +- .../repos/builtin/packages/r-learnbayes/package.py | 2 +- var/spack/repos/builtin/packages/r-lme4/package.py | 2 +- .../repos/builtin/packages/r-lmtest/package.py | 2 +- .../repos/builtin/packages/r-lpsolve/package.py | 2 +- .../repos/builtin/packages/r-lubridate/package.py | 2 +- .../repos/builtin/packages/r-magic/package.py | 2 +- .../repos/builtin/packages/r-magrittr/package.py | 2 +- .../repos/builtin/packages/r-mapproj/package.py | 2 +- var/spack/repos/builtin/packages/r-maps/package.py | 2 +- .../repos/builtin/packages/r-maptools/package.py | 2 +- .../repos/builtin/packages/r-markdown/package.py | 2 +- var/spack/repos/builtin/packages/r-mass/package.py | 2 +- .../repos/builtin/packages/r-matrix/package.py | 2 +- .../builtin/packages/r-matrixmodels/package.py | 2 +- .../repos/builtin/packages/r-mclust/package.py | 2 +- var/spack/repos/builtin/packages/r-mda/package.py | 2 +- .../repos/builtin/packages/r-memoise/package.py | 2 +- var/spack/repos/builtin/packages/r-mgcv/package.py | 2 +- var/spack/repos/builtin/packages/r-mime/package.py | 2 +- .../repos/builtin/packages/r-minqa/package.py | 2 +- .../repos/builtin/packages/r-mlbench/package.py | 2 +- .../builtin/packages/r-modelmetrics/package.py | 2 +- .../repos/builtin/packages/r-modeltools/package.py | 2 +- .../repos/builtin/packages/r-multcomp/package.py | 2 +- .../repos/builtin/packages/r-munsell/package.py | 2 +- .../repos/builtin/packages/r-mvtnorm/package.py | 2 +- .../repos/builtin/packages/r-ncdf4/package.py | 2 +- .../repos/builtin/packages/r-network/package.py | 2 +- .../repos/builtin/packages/r-networkd3/package.py | 2 +- var/spack/repos/builtin/packages/r-nlme/package.py | 2 +- .../repos/builtin/packages/r-nloptr/package.py | 2 +- var/spack/repos/builtin/packages/r-nmf/package.py | 2 +- var/spack/repos/builtin/packages/r-nnet/package.py | 2 +- var/spack/repos/builtin/packages/r-np/package.py | 2 +- .../repos/builtin/packages/r-numderiv/package.py | 2 +- .../repos/builtin/packages/r-openssl/package.py | 2 +- .../repos/builtin/packages/r-packrat/package.py | 2 +- .../repos/builtin/packages/r-pacman/package.py | 2 +- .../repos/builtin/packages/r-party/package.py | 2 +- .../repos/builtin/packages/r-partykit/package.py | 2 +- .../repos/builtin/packages/r-pbdzmq/package.py | 2 +- .../repos/builtin/packages/r-pbkrtest/package.py | 2 +- .../repos/builtin/packages/r-permute/package.py | 2 +- .../repos/builtin/packages/r-pkgmaker/package.py | 2 +- .../repos/builtin/packages/r-plotrix/package.py | 2 +- var/spack/repos/builtin/packages/r-pls/package.py | 2 +- var/spack/repos/builtin/packages/r-plyr/package.py | 2 +- var/spack/repos/builtin/packages/r-png/package.py | 2 +- .../repos/builtin/packages/r-prabclus/package.py | 2 +- .../repos/builtin/packages/r-praise/package.py | 2 +- .../repos/builtin/packages/r-prodlim/package.py | 2 +- .../repos/builtin/packages/r-proto/package.py | 2 +- var/spack/repos/builtin/packages/r-pryr/package.py | 2 +- .../repos/builtin/packages/r-quadprog/package.py | 2 +- .../repos/builtin/packages/r-quantmod/package.py | 2 +- .../repos/builtin/packages/r-quantreg/package.py | 2 +- var/spack/repos/builtin/packages/r-r6/package.py | 2 +- .../builtin/packages/r-randomforest/package.py | 2 +- .../repos/builtin/packages/r-raster/package.py | 2 +- .../repos/builtin/packages/r-rbokeh/package.py | 2 +- .../builtin/packages/r-rcolorbrewer/package.py | 2 +- var/spack/repos/builtin/packages/r-rcpp/package.py | 2 +- .../repos/builtin/packages/r-rcppeigen/package.py | 2 +- .../repos/builtin/packages/r-registry/package.py | 2 +- var/spack/repos/builtin/packages/r-repr/package.py | 2 +- .../repos/builtin/packages/r-reshape2/package.py | 2 +- var/spack/repos/builtin/packages/r-rgl/package.py | 2 +- .../builtin/packages/r-rgooglemaps/package.py | 2 +- .../repos/builtin/packages/r-rinside/package.py | 2 +- .../repos/builtin/packages/r-rjava/package.py | 2 +- .../repos/builtin/packages/r-rjson/package.py | 2 +- .../repos/builtin/packages/r-rjsonio/package.py | 2 +- .../repos/builtin/packages/r-rmarkdown/package.py | 2 +- .../repos/builtin/packages/r-rminer/package.py | 2 +- .../repos/builtin/packages/r-rmpfr/package.py | 2 +- var/spack/repos/builtin/packages/r-rmpi/package.py | 2 +- .../repos/builtin/packages/r-rmysql/package.py | 2 +- .../repos/builtin/packages/r-rngtools/package.py | 2 +- .../repos/builtin/packages/r-robustbase/package.py | 2 +- .../repos/builtin/packages/r-rodbc/package.py | 2 +- .../repos/builtin/packages/r-roxygen2/package.py | 2 +- .../repos/builtin/packages/r-rpart-plot/package.py | 2 +- .../repos/builtin/packages/r-rpart/package.py | 2 +- .../builtin/packages/r-rpostgresql/package.py | 2 +- .../repos/builtin/packages/r-rsnns/package.py | 2 +- .../repos/builtin/packages/r-rsqlite/package.py | 2 +- .../repos/builtin/packages/r-rstan/package.py | 2 +- .../repos/builtin/packages/r-rstudioapi/package.py | 2 +- var/spack/repos/builtin/packages/r-rzmq/package.py | 2 +- .../repos/builtin/packages/r-sandwich/package.py | 2 +- .../repos/builtin/packages/r-scales/package.py | 2 +- .../builtin/packages/r-scatterplot3d/package.py | 2 +- .../repos/builtin/packages/r-segmented/package.py | 2 +- .../repos/builtin/packages/r-seqinr/package.py | 2 +- .../repos/builtin/packages/r-shiny/package.py | 2 +- var/spack/repos/builtin/packages/r-snow/package.py | 2 +- var/spack/repos/builtin/packages/r-sp/package.py | 2 +- .../repos/builtin/packages/r-sparsem/package.py | 2 +- .../repos/builtin/packages/r-spdep/package.py | 2 +- .../builtin/packages/r-stanheaders/package.py | 2 +- .../builtin/packages/r-statnet-common/package.py | 2 +- .../repos/builtin/packages/r-stringi/package.py | 2 +- .../repos/builtin/packages/r-stringr/package.py | 2 +- .../builtin/packages/r-strucchange/package.py | 2 +- .../repos/builtin/packages/r-survey/package.py | 2 +- .../repos/builtin/packages/r-survival/package.py | 2 +- .../repos/builtin/packages/r-tarifx/package.py | 2 +- .../repos/builtin/packages/r-testit/package.py | 2 +- .../repos/builtin/packages/r-testthat/package.py | 2 +- .../repos/builtin/packages/r-th-data/package.py | 2 +- .../repos/builtin/packages/r-threejs/package.py | 2 +- .../repos/builtin/packages/r-tibble/package.py | 2 +- .../repos/builtin/packages/r-tidyr/package.py | 2 +- .../builtin/packages/r-trimcluster/package.py | 2 +- .../repos/builtin/packages/r-trust/package.py | 2 +- var/spack/repos/builtin/packages/r-ttr/package.py | 2 +- var/spack/repos/builtin/packages/r-uuid/package.py | 2 +- var/spack/repos/builtin/packages/r-vcd/package.py | 2 +- .../repos/builtin/packages/r-vegan/package.py | 2 +- .../repos/builtin/packages/r-viridis/package.py | 2 +- .../builtin/packages/r-viridislite/package.py | 2 +- .../repos/builtin/packages/r-visnetwork/package.py | 2 +- .../repos/builtin/packages/r-whisker/package.py | 2 +- .../repos/builtin/packages/r-withr/package.py | 2 +- .../repos/builtin/packages/r-xgboost/package.py | 2 +- .../repos/builtin/packages/r-xlconnect/package.py | 2 +- .../builtin/packages/r-xlconnectjars/package.py | 2 +- var/spack/repos/builtin/packages/r-xlsx/package.py | 2 +- .../repos/builtin/packages/r-xlsxjars/package.py | 2 +- var/spack/repos/builtin/packages/r-xml/package.py | 2 +- .../repos/builtin/packages/r-xtable/package.py | 2 +- var/spack/repos/builtin/packages/r-xts/package.py | 2 +- var/spack/repos/builtin/packages/r-yaml/package.py | 2 +- var/spack/repos/builtin/packages/r-zoo/package.py | 2 +- var/spack/repos/builtin/packages/r/package.py | 2 +- var/spack/repos/builtin/packages/raja/package.py | 2 +- .../repos/builtin/packages/random123/package.py | 2 +- .../repos/builtin/packages/randrproto/package.py | 2 +- var/spack/repos/builtin/packages/ravel/package.py | 2 +- .../repos/builtin/packages/readline/package.py | 2 +- .../repos/builtin/packages/recordproto/package.py | 2 +- var/spack/repos/builtin/packages/relion/package.py | 2 +- var/spack/repos/builtin/packages/rempi/package.py | 2 +- var/spack/repos/builtin/packages/rename/package.py | 2 +- .../repos/builtin/packages/rendercheck/package.py | 2 +- .../repos/builtin/packages/renderproto/package.py | 2 +- .../builtin/packages/resourceproto/package.py | 2 +- var/spack/repos/builtin/packages/rgb/package.py | 2 +- .../repos/builtin/packages/rockstar/package.py | 2 +- var/spack/repos/builtin/packages/root/package.py | 2 +- var/spack/repos/builtin/packages/rose/package.py | 2 +- var/spack/repos/builtin/packages/rstart/package.py | 2 +- var/spack/repos/builtin/packages/rsync/package.py | 2 +- var/spack/repos/builtin/packages/ruby/package.py | 2 +- .../repos/builtin/packages/rust-bindgen/package.py | 2 +- var/spack/repos/builtin/packages/rust/package.py | 2 +- var/spack/repos/builtin/packages/samrai/package.py | 2 +- .../repos/builtin/packages/samtools/package.py | 2 +- var/spack/repos/builtin/packages/sas/package.py | 2 +- var/spack/repos/builtin/packages/saws/package.py | 8 +- var/spack/repos/builtin/packages/sbt/package.py | 2 +- var/spack/repos/builtin/packages/scala/package.py | 2 +- .../repos/builtin/packages/scalasca/package.py | 2 +- var/spack/repos/builtin/packages/scons/package.py | 2 +- .../repos/builtin/packages/scorec-core/package.py | 2 +- var/spack/repos/builtin/packages/scorep/package.py | 2 +- var/spack/repos/builtin/packages/scotch/package.py | 2 +- var/spack/repos/builtin/packages/scr/package.py | 2 +- var/spack/repos/builtin/packages/screen/package.py | 2 +- .../repos/builtin/packages/scripts/package.py | 2 +- .../builtin/packages/scrnsaverproto/package.py | 2 +- var/spack/repos/builtin/packages/sctk/package.py | 10 +- .../repos/builtin/packages/sdl2-image/package.py | 2 +- var/spack/repos/builtin/packages/sdl2/package.py | 2 +- var/spack/repos/builtin/packages/sed/package.py | 2 +- var/spack/repos/builtin/packages/seqtk/package.py | 2 +- var/spack/repos/builtin/packages/serf/package.py | 2 +- .../repos/builtin/packages/sessreg/package.py | 2 +- .../repos/builtin/packages/setxkbmap/package.py | 2 +- var/spack/repos/builtin/packages/sga/package.py | 4 +- .../repos/builtin/packages/shiny-server/package.py | 2 +- .../repos/builtin/packages/showfont/package.py | 2 +- var/spack/repos/builtin/packages/silo/package.py | 2 +- var/spack/repos/builtin/packages/simul/package.py | 4 +- .../repos/builtin/packages/simulationio/package.py | 2 +- var/spack/repos/builtin/packages/slepc/package.py | 2 +- .../repos/builtin/packages/smproxy/package.py | 2 +- .../repos/builtin/packages/snakemake/package.py | 2 +- var/spack/repos/builtin/packages/snappy/package.py | 2 +- var/spack/repos/builtin/packages/sowing/package.py | 2 +- var/spack/repos/builtin/packages/sox/package.py | 2 +- var/spack/repos/builtin/packages/spark/package.py | 2 +- .../repos/builtin/packages/sparsehash/package.py | 2 +- var/spack/repos/builtin/packages/spdlog/package.py | 2 +- .../repos/builtin/packages/spectrum-mpi/package.py | 2 +- var/spack/repos/builtin/packages/speex/package.py | 4 +- .../repos/builtin/packages/sph2pipe/package.py | 2 +- .../repos/builtin/packages/spherepack/package.py | 2 +- .../repos/builtin/packages/spindle/package.py | 2 +- var/spack/repos/builtin/packages/spot/package.py | 2 +- var/spack/repos/builtin/packages/sqlite/package.py | 2 +- .../repos/builtin/packages/sst-dumpi/package.py | 2 +- .../repos/builtin/packages/sst-macro/package.py | 2 +- .../builtin/packages/staden-io-lib/package.py | 4 +- .../builtin/packages/star-ccm-plus/package.py | 2 +- var/spack/repos/builtin/packages/star/package.py | 2 +- var/spack/repos/builtin/packages/stat/package.py | 2 +- var/spack/repos/builtin/packages/stc/package.py | 2 +- var/spack/repos/builtin/packages/stream/package.py | 2 +- var/spack/repos/builtin/packages/stress/package.py | 2 +- .../repos/builtin/packages/sublime-text/package.py | 2 +- .../repos/builtin/packages/subversion/package.py | 2 +- .../repos/builtin/packages/suite-sparse/package.py | 2 +- .../repos/builtin/packages/sundials/package.py | 2 +- .../repos/builtin/packages/superlu-dist/package.py | 2 +- .../repos/builtin/packages/superlu-mt/package.py | 2 +- .../repos/builtin/packages/superlu/package.py | 2 +- .../repos/builtin/packages/swiftsim/package.py | 2 +- var/spack/repos/builtin/packages/swig/package.py | 2 +- .../repos/builtin/packages/symengine/package.py | 2 +- var/spack/repos/builtin/packages/sympol/package.py | 2 +- var/spack/repos/builtin/packages/sz/package.py | 2 +- var/spack/repos/builtin/packages/szip/package.py | 2 +- var/spack/repos/builtin/packages/talloc/package.py | 2 +- var/spack/repos/builtin/packages/tar/package.py | 2 +- var/spack/repos/builtin/packages/task/package.py | 2 +- var/spack/repos/builtin/packages/taskd/package.py | 2 +- var/spack/repos/builtin/packages/tau/package.py | 2 +- var/spack/repos/builtin/packages/tbb/package.py | 2 +- var/spack/repos/builtin/packages/tcl/package.py | 2 +- var/spack/repos/builtin/packages/tetgen/package.py | 2 +- var/spack/repos/builtin/packages/tethex/package.py | 2 +- .../repos/builtin/packages/texinfo/package.py | 2 +- .../repos/builtin/packages/texlive/package.py | 2 +- .../packages/the-platinum-searcher/package.py | 2 +- .../packages/the-silver-searcher/package.py | 2 +- var/spack/repos/builtin/packages/thrift/package.py | 2 +- .../repos/builtin/packages/tinyxml/package.py | 2 +- .../repos/builtin/packages/tinyxml2/package.py | 2 +- var/spack/repos/builtin/packages/tk/package.py | 2 +- var/spack/repos/builtin/packages/tmux/package.py | 2 +- .../repos/builtin/packages/tmuxinator/package.py | 2 +- .../repos/builtin/packages/transset/package.py | 2 +- .../repos/builtin/packages/trapproto/package.py | 2 +- var/spack/repos/builtin/packages/tree/package.py | 2 +- .../repos/builtin/packages/triangle/package.py | 2 +- .../repos/builtin/packages/trilinos/package.py | 2 +- .../repos/builtin/packages/trimmomatic/package.py | 2 +- .../repos/builtin/packages/turbine/package.py | 2 +- .../repos/builtin/packages/turbomole/package.py | 2 +- var/spack/repos/builtin/packages/tut/package.py | 2 +- var/spack/repos/builtin/packages/twm/package.py | 2 +- .../repos/builtin/packages/uberftp/package.py | 2 +- .../repos/builtin/packages/udunits2/package.py | 2 +- .../repos/builtin/packages/uncrustify/package.py | 2 +- .../repos/builtin/packages/unibilium/package.py | 2 +- var/spack/repos/builtin/packages/unison/package.py | 2 +- var/spack/repos/builtin/packages/units/package.py | 2 +- .../repos/builtin/packages/unixodbc/package.py | 2 +- .../repos/builtin/packages/util-linux/package.py | 2 +- .../repos/builtin/packages/util-macros/package.py | 2 +- var/spack/repos/builtin/packages/uuid/package.py | 2 +- .../repos/builtin/packages/valgrind/package.py | 2 +- .../repos/builtin/packages/vampirtrace/package.py | 2 +- var/spack/repos/builtin/packages/vc/package.py | 2 +- .../repos/builtin/packages/vcftools/package.py | 2 +- var/spack/repos/builtin/packages/vcsh/package.py | 2 +- var/spack/repos/builtin/packages/vdt/package.py | 2 +- .../repos/builtin/packages/vecgeom/package.py | 2 +- .../repos/builtin/packages/veclibfort/package.py | 2 +- .../repos/builtin/packages/videoproto/package.py | 2 +- .../repos/builtin/packages/viewres/package.py | 2 +- var/spack/repos/builtin/packages/vim/package.py | 2 +- .../repos/builtin/packages/virtualgl/package.py | 2 +- var/spack/repos/builtin/packages/visit/package.py | 2 +- .../repos/builtin/packages/vizglow/package.py | 2 +- var/spack/repos/builtin/packages/voropp/package.py | 2 +- .../repos/builtin/packages/votca-csg/package.py | 2 +- .../repos/builtin/packages/votca-ctp/package.py | 2 +- .../repos/builtin/packages/votca-moo/package.py | 2 +- .../repos/builtin/packages/votca-tools/package.py | 2 +- var/spack/repos/builtin/packages/vtk/package.py | 2 +- .../repos/builtin/packages/wannier90/package.py | 2 +- var/spack/repos/builtin/packages/wget/package.py | 2 +- .../builtin/packages/windowswmproto/package.py | 2 +- var/spack/repos/builtin/packages/wt/package.py | 2 +- var/spack/repos/builtin/packages/wx/package.py | 2 +- .../repos/builtin/packages/wxpropgrid/package.py | 2 +- .../repos/builtin/packages/x11perf/package.py | 2 +- .../repos/builtin/packages/xapian-core/package.py | 2 +- var/spack/repos/builtin/packages/xauth/package.py | 2 +- .../repos/builtin/packages/xbacklight/package.py | 2 +- var/spack/repos/builtin/packages/xbiff/package.py | 2 +- .../repos/builtin/packages/xbitmaps/package.py | 2 +- var/spack/repos/builtin/packages/xcalc/package.py | 2 +- .../repos/builtin/packages/xcb-demo/package.py | 2 +- .../repos/builtin/packages/xcb-proto/package.py | 2 +- .../builtin/packages/xcb-util-cursor/package.py | 2 +- .../builtin/packages/xcb-util-errors/package.py | 2 +- .../builtin/packages/xcb-util-image/package.py | 2 +- .../builtin/packages/xcb-util-keysyms/package.py | 2 +- .../packages/xcb-util-renderutil/package.py | 2 +- .../repos/builtin/packages/xcb-util-wm/package.py | 2 +- .../repos/builtin/packages/xcb-util/package.py | 2 +- .../repos/builtin/packages/xclipboard/package.py | 2 +- var/spack/repos/builtin/packages/xclock/package.py | 2 +- .../repos/builtin/packages/xcmiscproto/package.py | 2 +- var/spack/repos/builtin/packages/xcmsdb/package.py | 2 +- .../repos/builtin/packages/xcompmgr/package.py | 2 +- .../repos/builtin/packages/xconsole/package.py | 2 +- .../builtin/packages/xcursor-themes/package.py | 2 +- .../repos/builtin/packages/xcursorgen/package.py | 2 +- .../repos/builtin/packages/xdbedizzy/package.py | 2 +- .../repos/builtin/packages/xditview/package.py | 2 +- var/spack/repos/builtin/packages/xdm/package.py | 2 +- .../repos/builtin/packages/xdpyinfo/package.py | 2 +- .../repos/builtin/packages/xdriinfo/package.py | 2 +- var/spack/repos/builtin/packages/xedit/package.py | 2 +- .../repos/builtin/packages/xerces-c/package.py | 2 +- var/spack/repos/builtin/packages/xev/package.py | 2 +- .../repos/builtin/packages/xextproto/package.py | 2 +- var/spack/repos/builtin/packages/xeyes/package.py | 2 +- .../builtin/packages/xf86bigfontproto/package.py | 2 +- .../repos/builtin/packages/xf86dga/package.py | 2 +- .../repos/builtin/packages/xf86dgaproto/package.py | 2 +- .../repos/builtin/packages/xf86driproto/package.py | 2 +- .../builtin/packages/xf86miscproto/package.py | 2 +- .../builtin/packages/xf86rushproto/package.py | 2 +- .../builtin/packages/xf86vidmodeproto/package.py | 2 +- var/spack/repos/builtin/packages/xfd/package.py | 2 +- .../repos/builtin/packages/xfindproxy/package.py | 2 +- .../repos/builtin/packages/xfontsel/package.py | 2 +- var/spack/repos/builtin/packages/xfs/package.py | 2 +- .../repos/builtin/packages/xfsinfo/package.py | 2 +- var/spack/repos/builtin/packages/xfwp/package.py | 2 +- var/spack/repos/builtin/packages/xgamma/package.py | 2 +- var/spack/repos/builtin/packages/xgc/package.py | 2 +- var/spack/repos/builtin/packages/xhost/package.py | 2 +- .../builtin/packages/xineramaproto/package.py | 2 +- var/spack/repos/builtin/packages/xinit/package.py | 2 +- var/spack/repos/builtin/packages/xinput/package.py | 2 +- .../repos/builtin/packages/xkbcomp/package.py | 2 +- .../repos/builtin/packages/xkbdata/package.py | 2 +- var/spack/repos/builtin/packages/xkbevd/package.py | 2 +- .../repos/builtin/packages/xkbprint/package.py | 2 +- .../repos/builtin/packages/xkbutils/package.py | 2 +- .../builtin/packages/xkeyboard-config/package.py | 2 +- var/spack/repos/builtin/packages/xkill/package.py | 2 +- var/spack/repos/builtin/packages/xload/package.py | 2 +- var/spack/repos/builtin/packages/xlogo/package.py | 2 +- .../repos/builtin/packages/xlsatoms/package.py | 2 +- .../repos/builtin/packages/xlsclients/package.py | 2 +- .../repos/builtin/packages/xlsfonts/package.py | 2 +- var/spack/repos/builtin/packages/xmag/package.py | 2 +- var/spack/repos/builtin/packages/xman/package.py | 2 +- .../repos/builtin/packages/xmessage/package.py | 2 +- var/spack/repos/builtin/packages/xmh/package.py | 2 +- var/spack/repos/builtin/packages/xmlto/package.py | 2 +- .../repos/builtin/packages/xmodmap/package.py | 2 +- var/spack/repos/builtin/packages/xmore/package.py | 2 +- .../builtin/packages/xorg-cf-files/package.py | 2 +- .../repos/builtin/packages/xorg-docs/package.py | 2 +- .../repos/builtin/packages/xorg-gtest/package.py | 2 +- .../repos/builtin/packages/xorg-server/package.py | 2 +- .../builtin/packages/xorg-sgml-doctools/package.py | 2 +- .../repos/builtin/packages/xphelloworld/package.py | 2 +- .../repos/builtin/packages/xplsprinters/package.py | 2 +- var/spack/repos/builtin/packages/xpr/package.py | 2 +- .../packages/xprehashprinterlist/package.py | 2 +- var/spack/repos/builtin/packages/xprop/package.py | 2 +- var/spack/repos/builtin/packages/xproto/package.py | 2 +- .../packages/xproxymanagementprotocol/package.py | 2 +- var/spack/repos/builtin/packages/xqilla/package.py | 2 +- var/spack/repos/builtin/packages/xrandr/package.py | 2 +- var/spack/repos/builtin/packages/xrdb/package.py | 2 +- .../repos/builtin/packages/xrefresh/package.py | 2 +- var/spack/repos/builtin/packages/xrootd/package.py | 2 +- var/spack/repos/builtin/packages/xrx/package.py | 2 +- var/spack/repos/builtin/packages/xscope/package.py | 2 +- var/spack/repos/builtin/packages/xsdk/package.py | 2 +- .../repos/builtin/packages/xsdktrilinos/package.py | 2 +- var/spack/repos/builtin/packages/xset/package.py | 2 +- .../repos/builtin/packages/xsetmode/package.py | 2 +- .../repos/builtin/packages/xsetpointer/package.py | 2 +- .../repos/builtin/packages/xsetroot/package.py | 2 +- var/spack/repos/builtin/packages/xsm/package.py | 2 +- .../repos/builtin/packages/xstdcmap/package.py | 2 +- var/spack/repos/builtin/packages/xterm/package.py | 2 +- var/spack/repos/builtin/packages/xtrans/package.py | 2 +- var/spack/repos/builtin/packages/xtrap/package.py | 2 +- var/spack/repos/builtin/packages/xts/package.py | 2 +- .../repos/builtin/packages/xvidtune/package.py | 2 +- var/spack/repos/builtin/packages/xvinfo/package.py | 2 +- var/spack/repos/builtin/packages/xwd/package.py | 2 +- .../repos/builtin/packages/xwininfo/package.py | 2 +- var/spack/repos/builtin/packages/xwud/package.py | 2 +- var/spack/repos/builtin/packages/xz/package.py | 2 +- .../repos/builtin/packages/yaml-cpp/package.py | 2 +- var/spack/repos/builtin/packages/yasm/package.py | 2 +- var/spack/repos/builtin/packages/yorick/package.py | 2 +- var/spack/repos/builtin/packages/z3/package.py | 2 +- var/spack/repos/builtin/packages/zeromq/package.py | 2 +- var/spack/repos/builtin/packages/zfp/package.py | 2 +- var/spack/repos/builtin/packages/zip/package.py | 2 +- var/spack/repos/builtin/packages/zlib/package.py | 2 +- var/spack/repos/builtin/packages/zoltan/package.py | 2 +- var/spack/repos/builtin/packages/zsh/package.py | 2 +- var/spack/repos/builtin/packages/zstd/package.py | 2 +- 1854 files changed, 2297 insertions(+), 2158 deletions(-) create mode 100644 NOTICE (limited to 'lib') diff --git a/LICENSE b/LICENSE index d7d101a3ac..744bb9f3b5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,135 +1,197 @@ -######################################################################## -GNU LESSER GENERAL PUBLIC LICENSE (Lesser GPL) -Version 2.1, February 1999 -######################################################################## -Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -Produced at the Lawrence Livermore National Laboratory. - -This file is part of Spack. -Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. -LLNL-CODE-647188 - -For details, see https://github.com/llnl/spack - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License (as -published by the Free Software Foundation) version 2.1, 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 Lesser 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 - -######################################################################## -LLNL NOTICE AND TERMS AND CONDITIONS OF THE GNU LGPL - -LLNL Preamble Notice - -A. This notice is required to be provided under LLNL's contract with - the U.S. Department of Energy (DOE). This work was produced at the - Lawrence Livermore National Laboratory under Contract - No. DE-AC52-07NA27344 with the DOE. - -B. Neither the United States Government nor Lawrence Livermore - National Security, LLC nor any of their employees, makes any - warranty, express or implied, or assumes any liability or - responsibility for the accuracy, completeness, or usefulness of any - information, apparatus, product, or process disclosed, or - represents that its use would not infringe privately-owned rights. - -C. Also, reference herein to any specific commercial products, - process, or services by trade name, trademark, manufacturer or - otherwise does not necessarily constitute or imply its endorsement, - recommendation, or favoring by the United States Government or - Lawrence Livermore National Security, LLC. The views and opinions - of authors expressed herein do not necessarily state or reflect - those of the United States Government or Lawrence Livermore - National Security, LLC, and shall not be used for advertising or - product endorsement purposes. - -The precise terms and conditions for copying, distribution and -modification follows. - -######################################################################## -GNU LESSER GENERAL PUBLIC LICENSE -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License Agreement applies to any software library or other + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). Each -licensee is addressed as "you". +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". -A "library" means a collection of software functions and/or data + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. -The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is +straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) -"Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control -compilation and installation of the library. Activities other than -copying, distribution and modification are not covered by this -License; they are outside its scope. The act of running a program -using the Library is not restricted, and output from such a program is -covered only if its contents constitute a work based on the Library -(independent of the use of the Library in a tool for writing -it). Whether that is true depends on what the Library does and what -the program that uses the Library does. - -1. You may copy and distribute verbatim copies of the Library's +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the -Library. You may charge a fee for the physical act of transferring a -copy, and you may at your option offer warranty protection in exchange -for a fee. - -2. You may modify your copy or copies of the Library or any portion of -it, thus forming a work based on the Library, and copy and distribute -such modifications or work under the terms of Section 1 above, -provided that you also meet all of these conditions: - -a) The modified work must itself be a software library. - -b) You must cause the files modified to carry prominent notices -stating that you changed the files and the date of any change. - -c) You must cause the whole of the work to be licensed at no charge to -all third parties under the terms of this License. - -d) If a facility in the modified Library refers to a function or a -table of data to be supplied by an application program that uses the -facility, other than as an argument passed when the facility is -invoked, then you must make a good faith effort to ensure that, in the -event an application does not supply such function or table, the -facility still operates, and performs whatever part of its purpose -remains meaningful. (For example, a function in a library to compute -square roots has a purpose that is entirely well-defined independent -of the application. Therefore, Subsection 2d requires that any -application-supplied function or table used by this function must be -optional: if the application does not supply it, the square root -function must still compute square roots.) - -These requirements apply to the modified work as a whole. If +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you +sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the @@ -146,189 +208,191 @@ with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. -3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the +instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in +that version instead if you wish.) Do not make any other change in these notices. -Once this change is made in a given copy, it is irreversible for that -copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. This -option is useful when you wish to copy part of the code of the Library -into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative -of it, under Section 2) in object code or executable form under the -terms of Sections 1 and 2 above provided that you accompany it with -the complete corresponding machine- readable source code, which must -be distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange. - -If distribution of object code is made by offering access to copy from -a designated place, then offering equivalent access to copy the source -code from the same place satisfies the requirement to distribute the -source code, even though third parties are not compelled to copy the -source along with the object code. - -5. A program that contains no derivative of any portion of the + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a work, -in isolation, is not a derivative work of the Library, and therefore -falls outside the scope of this License. +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. -However, linking a "work that uses the Library" with the Library + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. Section -6 states terms for distribution of such executables. +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. -When a "work that uses the Library" uses material from a header file + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is -not. Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. -If such an object file uses only numerical parameters, data structure -layouts and accessors, and small macros and small inline functions -(ten lines or less in length), then the use of the object file is -unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under section 6.) + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) -Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section -6. Any executables containing that work also fall under Section 6, + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. -6. As an exception to the Sections above, you may also combine or link -a "work that uses the Library" with the Library to produce a work -containing portions of the Library, and distribute that work under -terms of your choice, provided that the terms permit modification of -the work for the customer's own use and reverse engineering for -debugging such modifications. + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. -You must give prominent notice with each copy of the work that the + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work +this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one +directing the user to the copy of this License. Also, you must do one of these things: -a) Accompany the work with the complete corresponding machine-readable -source code for the Library including whatever changes were used in -the work (which must be distributed under Sections 1 and 2 above); -and, if the work is an executable liked with the Library, with the -complete machine-readable "work that uses the Library", as object code -and/or source code, so that the user can modify the Library and then -relink to produce a modified executable containing the modified -Library. (It is understood that the user who changes the contents of -definitions files in the Library will not necessarily be able to -recompile the application to use the modified definitions.) - -b) Use a suitable shared library mechanism for linking with the -Library. A suitable mechanism is one that (1) uses at run time a copy -of the library already present on the user's computer system, rather -than copying library functions into the executable, and (2) will -operate properly with a modified version of the library, if the user -installs one, as long as the modified version is interface- compatible -with the version that the work was made with. - -c) Accompany the work with a written offer, valid for at least three -years, to give the same user the materials specified in Subsection 6a, -above, for a charge no more than the cost of performing this -distribution. - -d) If distribution of the work is made by offering access to copy from -a designated place, offer equivalent access to copy the above -specified materials from the same place. - -e) Verify that the user has already received a copy of these materials -or that you have already sent this user a copy. - -For an executable, the required form of the "work that uses the + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, +reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. -It may happen that this requirement contradicts the license -restrictions of other propriety libraries that do not normally -accompany the operating system. Such a contradiction means you cannot + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. -7. You may place library facilities that are a work based on the + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: -a) Accompany the combined library with a copy of the same work based -on the Library, uncombined with any other library facilities. This -must be distributed under the terms of the Sections above. - -b) Give prominent notice with the combined library of the fact that -part of it is a work based on the Library, and explaining where to -find the accompanying uncombined form of the same work. - -1 You may not copy, modify, sublicense, link with, or distribute the -Library except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense, link with, or distribute the -Library is void, and will automatically terminate your rights under -this License. However, parties who have received copies, or rights, -from you under this License will not have their licenses terminated so -long as such parties remain in full compliance. - -2 You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. -3 Each time you redistribute the Library (or any work based on the + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted -herein. You are not responsible for enforcing compliance by third -parties with this License. +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. -4 If, as a consequence of a court judgment or allegation of patent + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot +excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent +may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply, and the section as a whole is intended to apply in other -circumstances. +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is -implemented by public license practices. Many people have made +implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing @@ -338,56 +402,102 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. -1 If the distribution and/or use of the Library is restricted in + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. Such -new versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a +the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. -2 If you wish to incorporate parts of the Library into other free + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is +write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our +Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. -NO WARRANTY + NO WARRANTY -1 BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT -WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER -PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, -EITHER EXPRESSED OR IMPLIED INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -2 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE - -LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL -OR CONSQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000..ed0d0df792 --- /dev/null +++ b/NOTICE @@ -0,0 +1,32 @@ +######################################################################## +LLNL NOTICE AND TERMS AND CONDITIONS OF THE GNU LGPL +######################################################################## + +LLNL Preamble Notice + +A. This notice is required to be provided under LLNL's contract with + the U.S. Department of Energy (DOE). This work was produced at the + Lawrence Livermore National Laboratory under Contract + No. DE-AC52-07NA27344 with the DOE. + +B. Neither the United States Government nor Lawrence Livermore + National Security, LLC nor any of their employees, makes any + warranty, express or implied, or assumes any liability or + responsibility for the accuracy, completeness, or usefulness of any + information, apparatus, product, or process disclosed, or + represents that its use would not infringe privately-owned rights. + +C. Also, reference herein to any specific commercial products, + process, or services by trade name, trademark, manufacturer or + otherwise does not necessarily constitute or imply its endorsement, + recommendation, or favoring by the United States Government or + Lawrence Livermore National Security, LLC. The views and opinions + of authors expressed herein do not necessarily state or reflect + those of the United States Government or Lawrence Livermore + National Security, LLC, and shall not be used for advertising or + product endorsement purposes. + +See the LICENSE file for the precise terms and conditions for copying, +distribution and modification. + +######################################################################## diff --git a/README.md b/README.md index 7e83f0eddb..81510b54ca 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ If you are referencing Spack in a publication, please cite the following paper: Release ---------------- Spack is released under an LGPL license. For more details see the -LICENSE file. +NOTICE and LICENSE files. ``LLNL-CODE-647188`` diff --git a/bin/sbang b/bin/sbang index ed54f7dad7..0b883a5feb 100755 --- a/bin/sbang +++ b/bin/sbang @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/bin/spack b/bin/spack index 496c705042..d95c07844c 100755 --- a/bin/spack +++ b/bin/spack @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/bin/spack-python b/bin/spack-python index 96bc367866..f79f859717 100755 --- a/bin/spack-python +++ b/bin/spack-python @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/docs/conf.py b/lib/spack/docs/conf.py index ee2b314aa3..887d04b565 100644 --- a/lib/spack/docs/conf.py +++ b/lib/spack/docs/conf.py @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/docs/tutorial/examples/0.package.py b/lib/spack/docs/tutorial/examples/0.package.py index 7ff04d8f17..691f364df6 100644 --- a/lib/spack/docs/tutorial/examples/0.package.py +++ b/lib/spack/docs/tutorial/examples/0.package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/docs/tutorial/examples/1.package.py b/lib/spack/docs/tutorial/examples/1.package.py index ed156fb34b..ec2f23d5ea 100644 --- a/lib/spack/docs/tutorial/examples/1.package.py +++ b/lib/spack/docs/tutorial/examples/1.package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/docs/tutorial/examples/2.package.py b/lib/spack/docs/tutorial/examples/2.package.py index 93274cb587..8dfb149ca4 100644 --- a/lib/spack/docs/tutorial/examples/2.package.py +++ b/lib/spack/docs/tutorial/examples/2.package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/docs/tutorial/examples/3.package.py b/lib/spack/docs/tutorial/examples/3.package.py index e732a7187d..58208a26a4 100644 --- a/lib/spack/docs/tutorial/examples/3.package.py +++ b/lib/spack/docs/tutorial/examples/3.package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/docs/tutorial/examples/4.package.py b/lib/spack/docs/tutorial/examples/4.package.py index 8f3fae37ed..05735cf3d0 100644 --- a/lib/spack/docs/tutorial/examples/4.package.py +++ b/lib/spack/docs/tutorial/examples/4.package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/env/cc b/lib/spack/env/cc index aa3c2aa4b1..afec3eefaa 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/external/__init__.py b/lib/spack/external/__init__.py index 48fe4ec5ac..d3d085eee3 100644 --- a/lib/spack/external/__init__.py +++ b/lib/spack/external/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/__init__.py b/lib/spack/llnl/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/llnl/__init__.py +++ b/lib/spack/llnl/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/__init__.py b/lib/spack/llnl/util/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/llnl/util/__init__.py +++ b/lib/spack/llnl/util/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index f7fae7eb44..88e000b6d3 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 9821ec7416..012befeada 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/link_tree.py b/lib/spack/llnl/util/link_tree.py index d6547e933a..7e77cd738c 100644 --- a/lib/spack/llnl/util/link_tree.py +++ b/lib/spack/llnl/util/link_tree.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/lock.py b/lib/spack/llnl/util/lock.py index a45ddec691..2cab436e2d 100644 --- a/lib/spack/llnl/util/lock.py +++ b/lib/spack/llnl/util/lock.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index b28ac22c1f..59e20ebfe3 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py index 774f4035fd..fff449a51c 100644 --- a/lib/spack/llnl/util/tty/colify.py +++ b/lib/spack/llnl/util/tty/colify.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/tty/color.py b/lib/spack/llnl/util/tty/color.py index bb1563f82b..fc3b697827 100644 --- a/lib/spack/llnl/util/tty/color.py +++ b/lib/spack/llnl/util/tty/color.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index 34916ef7e7..4bf7c77d2c 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index b67fcaf2f6..1f583fff61 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/abi.py b/lib/spack/spack/abi.py index 401b99cf71..4354a8b5c8 100644 --- a/lib/spack/spack/abi.py +++ b/lib/spack/spack/abi.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/architecture.py b/lib/spack/spack/architecture.py index bace3c49f6..487948dd4e 100644 --- a/lib/spack/spack/architecture.py +++ b/lib/spack/spack/architecture.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index ac44e57c09..49fecdb59c 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/__init__.py b/lib/spack/spack/build_systems/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/build_systems/__init__.py +++ b/lib/spack/spack/build_systems/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 2e4c86ea3e..4378d7aa58 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 43d177d3cb..4435a995fc 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index 2311158bfe..b1f55e5ed6 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/perl.py b/lib/spack/spack/build_systems/perl.py index 2f272373d2..aabb53d589 100644 --- a/lib/spack/spack/build_systems/perl.py +++ b/lib/spack/spack/build_systems/perl.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index c52c529b50..63dd67d400 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index a659f75b98..8f7af8cd32 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/build_systems/waf.py b/lib/spack/spack/build_systems/waf.py index bb4fa6c369..afe019028b 100644 --- a/lib/spack/spack/build_systems/waf.py +++ b/lib/spack/spack/build_systems/waf.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index 622ef4d96c..f691038734 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/activate.py b/lib/spack/spack/cmd/activate.py index f7e826efd6..73faa83f08 100644 --- a/lib/spack/spack/cmd/activate.py +++ b/lib/spack/spack/cmd/activate.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/arch.py b/lib/spack/spack/cmd/arch.py index d4241dcae9..1d02847826 100644 --- a/lib/spack/spack/cmd/arch.py +++ b/lib/spack/spack/cmd/arch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index b6daf4f09b..135dd66d39 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index cc63c6593b..413b73a08e 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/cd.py b/lib/spack/spack/cmd/cd.py index 531f3c59fd..4ee671d8b9 100644 --- a/lib/spack/spack/cmd/cd.py +++ b/lib/spack/spack/cmd/cd.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index d8a17fd383..858ecdf54f 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py index 23507822ef..b7812bffc4 100644 --- a/lib/spack/spack/cmd/clean.py +++ b/lib/spack/spack/cmd/clean.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/common/__init__.py b/lib/spack/spack/cmd/common/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/cmd/common/__init__.py +++ b/lib/spack/spack/cmd/common/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index 3115501439..46ff44c84a 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index f2eeca20ab..d5aa25ee8e 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/compilers.py b/lib/spack/spack/cmd/compilers.py index f0e21f987e..1cac261aff 100644 --- a/lib/spack/spack/cmd/compilers.py +++ b/lib/spack/spack/cmd/compilers.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index 61c2c6f0e8..09cb9a900e 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 7cab566052..4b590e6176 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 648400e41e..62de3e24e9 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -54,7 +54,7 @@ package_template = '''\ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/deactivate.py b/lib/spack/spack/cmd/deactivate.py index 3d8020d064..d58555afad 100644 --- a/lib/spack/spack/cmd/deactivate.py +++ b/lib/spack/spack/cmd/deactivate.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/debug.py b/lib/spack/spack/cmd/debug.py index ba5f783839..33c866e962 100644 --- a/lib/spack/spack/cmd/debug.py +++ b/lib/spack/spack/cmd/debug.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 6c481548d3..c983dd79ce 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/diy.py b/lib/spack/spack/cmd/diy.py index 14d28bb3f4..16a6f4c7a0 100644 --- a/lib/spack/spack/cmd/diy.py +++ b/lib/spack/spack/cmd/diy.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/docs.py b/lib/spack/spack/cmd/docs.py index fe026da4a7..a2bab84a50 100644 --- a/lib/spack/spack/cmd/docs.py +++ b/lib/spack/spack/cmd/docs.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py index 0287b8cd67..bd7fb773ec 100644 --- a/lib/spack/spack/cmd/edit.py +++ b/lib/spack/spack/cmd/edit.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index 034b710b85..b11216044a 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py index d073d42cc3..03130820de 100644 --- a/lib/spack/spack/cmd/extensions.py +++ b/lib/spack/spack/cmd/extensions.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py index cf39d4a40b..15fd22d606 100644 --- a/lib/spack/spack/cmd/fetch.py +++ b/lib/spack/spack/cmd/fetch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index 0142155fe1..cbf91e4a8a 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index 9753b20e78..fee03b4f5d 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/gpg.py b/lib/spack/spack/cmd/gpg.py index ff511b6520..1f46033813 100644 --- a/lib/spack/spack/cmd/gpg.py +++ b/lib/spack/spack/cmd/gpg.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py index 3a82f39ce5..e42e355f8f 100644 --- a/lib/spack/spack/cmd/graph.py +++ b/lib/spack/spack/cmd/graph.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/help.py b/lib/spack/spack/cmd/help.py index 313b082e2f..7522499dab 100644 --- a/lib/spack/spack/cmd/help.py +++ b/lib/spack/spack/cmd/help.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 43d086d4b3..575b65f8b0 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index f030e5b2df..ec24ed9c62 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index 72be99d260..5b915b94ec 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/load.py b/lib/spack/spack/cmd/load.py index 106a95c9c2..2a5d14a1bf 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/location.py b/lib/spack/spack/cmd/location.py index e713d028d2..e150a28238 100644 --- a/lib/spack/spack/cmd/location.py +++ b/lib/spack/spack/cmd/location.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/md5.py b/lib/spack/spack/cmd/md5.py index 1d121f0120..0c341e5bad 100644 --- a/lib/spack/spack/cmd/md5.py +++ b/lib/spack/spack/cmd/md5.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index e5b3b492b4..bfc36c4107 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py index f8253aad6f..ed20ad4029 100644 --- a/lib/spack/spack/cmd/module.py +++ b/lib/spack/spack/cmd/module.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/patch.py b/lib/spack/spack/cmd/patch.py index dfe45b0494..9c26f385fb 100644 --- a/lib/spack/spack/cmd/patch.py +++ b/lib/spack/spack/cmd/patch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index aca69e9c99..42fecf23df 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/providers.py b/lib/spack/spack/cmd/providers.py index f30c28a951..51566eb26d 100644 --- a/lib/spack/spack/cmd/providers.py +++ b/lib/spack/spack/cmd/providers.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/purge.py b/lib/spack/spack/cmd/purge.py index b7ebb0fc69..ac2aa1c21f 100644 --- a/lib/spack/spack/cmd/purge.py +++ b/lib/spack/spack/cmd/purge.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/pydoc.py b/lib/spack/spack/cmd/pydoc.py index c9003184c4..657ee9f89b 100644 --- a/lib/spack/spack/cmd/pydoc.py +++ b/lib/spack/spack/cmd/pydoc.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/python.py b/lib/spack/spack/cmd/python.py index 3c4fbf9e87..c0a056007a 100644 --- a/lib/spack/spack/cmd/python.py +++ b/lib/spack/spack/cmd/python.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/reindex.py b/lib/spack/spack/cmd/reindex.py index dff127bc06..1fb9392c2f 100644 --- a/lib/spack/spack/cmd/reindex.py +++ b/lib/spack/spack/cmd/reindex.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py index 5beb0083e2..6dc8833f86 100644 --- a/lib/spack/spack/cmd/repo.py +++ b/lib/spack/spack/cmd/repo.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/restage.py b/lib/spack/spack/cmd/restage.py index 4cecf4b42e..637ff95699 100644 --- a/lib/spack/spack/cmd/restage.py +++ b/lib/spack/spack/cmd/restage.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/setup.py b/lib/spack/spack/cmd/setup.py index 79e7bca1ab..8f5a4fd015 100644 --- a/lib/spack/spack/cmd/setup.py +++ b/lib/spack/spack/cmd/setup.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index f4105900cb..ee1ec882e2 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/stage.py b/lib/spack/spack/cmd/stage.py index a469cd896d..99c2db8a56 100644 --- a/lib/spack/spack/cmd/stage.py +++ b/lib/spack/spack/cmd/stage.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py index f7ec6a10e0..70aa1865af 100644 --- a/lib/spack/spack/cmd/test.py +++ b/lib/spack/spack/cmd/test.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index 6880409c56..499521ede0 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/unload.py b/lib/spack/spack/cmd/unload.py index 8a0511f64c..e5bf8f093e 100644 --- a/lib/spack/spack/cmd/unload.py +++ b/lib/spack/spack/cmd/unload.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/unuse.py b/lib/spack/spack/cmd/unuse.py index 77312d1204..326553e0bd 100644 --- a/lib/spack/spack/cmd/unuse.py +++ b/lib/spack/spack/cmd/unuse.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py index 28118a178a..49c29ff469 100644 --- a/lib/spack/spack/cmd/url.py +++ b/lib/spack/spack/cmd/url.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/use.py b/lib/spack/spack/cmd/use.py index e67de3a8b3..da3ded0d5a 100644 --- a/lib/spack/spack/cmd/use.py +++ b/lib/spack/spack/cmd/use.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py index 446f0a876d..0678fed8af 100644 --- a/lib/spack/spack/cmd/versions.py +++ b/lib/spack/spack/cmd/versions.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/cmd/view.py b/lib/spack/spack/cmd/view.py index 8fb94d3f37..325fb0af96 100644 --- a/lib/spack/spack/cmd/view.py +++ b/lib/spack/spack/cmd/view.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py index bfce31a9a3..c547275d6b 100644 --- a/lib/spack/spack/compiler.py +++ b/lib/spack/spack/compiler.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 826e74bbbb..53b2572ab9 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/cce.py b/lib/spack/spack/compilers/cce.py index 94956b9d83..936614efac 100644 --- a/lib/spack/spack/compilers/cce.py +++ b/lib/spack/spack/compilers/cce.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py index f2f0883b20..dd26c5e13b 100644 --- a/lib/spack/spack/compilers/clang.py +++ b/lib/spack/spack/compilers/clang.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/gcc.py b/lib/spack/spack/compilers/gcc.py index 826ddbf432..a6c91c6ed2 100644 --- a/lib/spack/spack/compilers/gcc.py +++ b/lib/spack/spack/compilers/gcc.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/intel.py b/lib/spack/spack/compilers/intel.py index 8461753962..fb286a69d7 100644 --- a/lib/spack/spack/compilers/intel.py +++ b/lib/spack/spack/compilers/intel.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/nag.py b/lib/spack/spack/compilers/nag.py index c1da95a6c3..7fb8a23e96 100644 --- a/lib/spack/spack/compilers/nag.py +++ b/lib/spack/spack/compilers/nag.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/pgi.py b/lib/spack/spack/compilers/pgi.py index cfc3d8ea57..2226023954 100644 --- a/lib/spack/spack/compilers/pgi.py +++ b/lib/spack/spack/compilers/pgi.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py index 686807ae33..96e9e8b4ca 100644 --- a/lib/spack/spack/compilers/xl.py +++ b/lib/spack/spack/compilers/xl.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py index d08e700f42..dd6dc91aae 100644 --- a/lib/spack/spack/compilers/xl_r.py +++ b/lib/spack/spack/compilers/xl_r.py @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index d7f21e8c81..b938346001 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index d0d6b6be2d..d3a385ea80 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 123c3a8998..75862ff87c 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 43ac71c679..2b160bc8a3 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index e7c9d6c590..5e9341ced9 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index 83a5139410..bb760bfd2f 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index 09969b2b41..7b86415202 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index 8dd3c2b36b..baba038c6c 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/file_cache.py b/lib/spack/spack/file_cache.py index 95a8bc7ce6..f09be4ecd5 100644 --- a/lib/spack/spack/file_cache.py +++ b/lib/spack/spack/file_cache.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py index 04e6cc7fca..09c39e75f3 100644 --- a/lib/spack/spack/graph.py +++ b/lib/spack/spack/graph.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/__init__.py b/lib/spack/spack/hooks/__init__.py index 9ed04a4768..1dce48fdf0 100644 --- a/lib/spack/spack/hooks/__init__.py +++ b/lib/spack/spack/hooks/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/case_consistency.py b/lib/spack/spack/hooks/case_consistency.py index 2b88291666..fcf9ee2588 100644 --- a/lib/spack/spack/hooks/case_consistency.py +++ b/lib/spack/spack/hooks/case_consistency.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/extensions.py b/lib/spack/spack/hooks/extensions.py index 7d2a39e24f..f915768dd0 100644 --- a/lib/spack/spack/hooks/extensions.py +++ b/lib/spack/spack/hooks/extensions.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/licensing.py b/lib/spack/spack/hooks/licensing.py index 85f7a96c31..b3b379c606 100644 --- a/lib/spack/spack/hooks/licensing.py +++ b/lib/spack/spack/hooks/licensing.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/module_file_generation.py b/lib/spack/spack/hooks/module_file_generation.py index b02c2e871d..decec3438d 100644 --- a/lib/spack/spack/hooks/module_file_generation.py +++ b/lib/spack/spack/hooks/module_file_generation.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py index 09691b3f0f..e86f8260b8 100644 --- a/lib/spack/spack/hooks/sbang.py +++ b/lib/spack/spack/hooks/sbang.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/hooks/yaml_version_check.py b/lib/spack/spack/hooks/yaml_version_check.py index a4b38198bc..7264ee1e6f 100644 --- a/lib/spack/spack/hooks/yaml_version_check.py +++ b/lib/spack/spack/hooks/yaml_version_check.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index 543d871f42..3ae8403bcf 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py index 1c0618e6e0..9b9f816db4 100644 --- a/lib/spack/spack/mirror.py +++ b/lib/spack/spack/mirror.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py index 8c702f1111..f23baa7204 100644 --- a/lib/spack/spack/modules.py +++ b/lib/spack/spack/modules.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/multimethod.py b/lib/spack/spack/multimethod.py index 67737c8bed..9b4c481326 100644 --- a/lib/spack/spack/multimethod.py +++ b/lib/spack/spack/multimethod.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/operating_systems/__init__.py b/lib/spack/spack/operating_systems/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/operating_systems/__init__.py +++ b/lib/spack/spack/operating_systems/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/operating_systems/cnk.py b/lib/spack/spack/operating_systems/cnk.py index 7e02fdd5b2..abd252ddcb 100644 --- a/lib/spack/spack/operating_systems/cnk.py +++ b/lib/spack/spack/operating_systems/cnk.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/operating_systems/cnl.py b/lib/spack/spack/operating_systems/cnl.py index 95f23a076e..61d50b4011 100644 --- a/lib/spack/spack/operating_systems/cnl.py +++ b/lib/spack/spack/operating_systems/cnl.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/operating_systems/linux_distro.py b/lib/spack/spack/operating_systems/linux_distro.py index fb2797fd36..0e97317b1b 100644 --- a/lib/spack/spack/operating_systems/linux_distro.py +++ b/lib/spack/spack/operating_systems/linux_distro.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/operating_systems/mac_os.py b/lib/spack/spack/operating_systems/mac_os.py index a75ce8a946..ab1eb6a64b 100644 --- a/lib/spack/spack/operating_systems/mac_os.py +++ b/lib/spack/spack/operating_systems/mac_os.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 90e55e2ce0..d6029d46b1 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index f9c4ced97e..2e70a3b7dc 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/package_test.py b/lib/spack/spack/package_test.py index fa424287f3..3e04125e78 100644 --- a/lib/spack/spack/package_test.py +++ b/lib/spack/spack/package_test.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/parse.py b/lib/spack/spack/parse.py index 880bb09b4e..3df268d259 100644 --- a/lib/spack/spack/parse.py +++ b/lib/spack/spack/parse.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index ee83748319..78bb15f41c 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/platforms/__init__.py b/lib/spack/spack/platforms/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/platforms/__init__.py +++ b/lib/spack/spack/platforms/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/platforms/bgq.py b/lib/spack/spack/platforms/bgq.py index 8ff33dd418..5978f20acf 100644 --- a/lib/spack/spack/platforms/bgq.py +++ b/lib/spack/spack/platforms/bgq.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/platforms/cray.py b/lib/spack/spack/platforms/cray.py index 76f7e59674..9a7301d1f8 100644 --- a/lib/spack/spack/platforms/cray.py +++ b/lib/spack/spack/platforms/cray.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/platforms/darwin.py b/lib/spack/spack/platforms/darwin.py index 3f6dc77655..f33b268833 100644 --- a/lib/spack/spack/platforms/darwin.py +++ b/lib/spack/spack/platforms/darwin.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/platforms/linux.py b/lib/spack/spack/platforms/linux.py index d7cdd643c0..ffbe32ddeb 100644 --- a/lib/spack/spack/platforms/linux.py +++ b/lib/spack/spack/platforms/linux.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/platforms/test.py b/lib/spack/spack/platforms/test.py index a40e1f3b44..d299508c97 100644 --- a/lib/spack/spack/platforms/test.py +++ b/lib/spack/spack/platforms/test.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/provider_index.py b/lib/spack/spack/provider_index.py index 8d64d100b1..9e6d53e8ac 100644 --- a/lib/spack/spack/provider_index.py +++ b/lib/spack/spack/provider_index.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/repository.py b/lib/spack/spack/repository.py index 3e43cce781..0a6a774315 100644 --- a/lib/spack/spack/repository.py +++ b/lib/spack/spack/repository.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/resource.py b/lib/spack/spack/resource.py index 1d4d448298..be36216e9d 100644 --- a/lib/spack/spack/resource.py +++ b/lib/spack/spack/resource.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/__init__.py b/lib/spack/spack/schema/__init__.py index de45ea921f..e793ae7376 100644 --- a/lib/spack/spack/schema/__init__.py +++ b/lib/spack/spack/schema/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/compilers.py b/lib/spack/spack/schema/compilers.py index 282eddf91b..8ddba1fb22 100644 --- a/lib/spack/spack/schema/compilers.py +++ b/lib/spack/spack/schema/compilers.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py index 6c655db915..abcb8d6051 100644 --- a/lib/spack/spack/schema/config.py +++ b/lib/spack/spack/schema/config.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/mirrors.py b/lib/spack/spack/schema/mirrors.py index 60b865bb42..db3d1163db 100644 --- a/lib/spack/spack/schema/mirrors.py +++ b/lib/spack/spack/schema/mirrors.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/modules.py b/lib/spack/spack/schema/modules.py index 2059e14fa6..4f7cedf53f 100644 --- a/lib/spack/spack/schema/modules.py +++ b/lib/spack/spack/schema/modules.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/packages.py b/lib/spack/spack/schema/packages.py index bf5648b1b7..8662a43a84 100644 --- a/lib/spack/spack/schema/packages.py +++ b/lib/spack/spack/schema/packages.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/schema/repos.py b/lib/spack/spack/schema/repos.py index c7a3495ae1..a189941989 100644 --- a/lib/spack/spack/schema/repos.py +++ b/lib/spack/spack/schema/repos.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index b4b80dab6f..db8dcf61a8 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 086c4c90f5..09f18f7d67 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/store.py b/lib/spack/spack/store.py index 4a5c8d18a7..f30e06849a 100644 --- a/lib/spack/spack/store.py +++ b/lib/spack/spack/store.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/__init__.py b/lib/spack/spack/test/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/test/__init__.py +++ b/lib/spack/spack/test/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py index f658b1951f..70cdc62685 100644 --- a/lib/spack/spack/test/architecture.py +++ b/lib/spack/spack/test/architecture.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/build_system_guess.py b/lib/spack/spack/test/build_system_guess.py index 73b619cb22..733173e3fc 100644 --- a/lib/spack/spack/test/build_system_guess.py +++ b/lib/spack/spack/test/build_system_guess.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/build_systems.py b/lib/spack/spack/test/build_systems.py index 8e771c8a68..3b93ed006d 100644 --- a/lib/spack/spack/test/build_systems.py +++ b/lib/spack/spack/test/build_systems.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index 74b6b31654..4b01fa3499 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/__init__.py b/lib/spack/spack/test/cmd/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/test/cmd/__init__.py +++ b/lib/spack/spack/test/cmd/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/find.py b/lib/spack/spack/test/cmd/find.py index dcd123d46e..b082b71c06 100644 --- a/lib/spack/spack/test/cmd/find.py +++ b/lib/spack/spack/test/cmd/find.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/flake8.py b/lib/spack/spack/test/cmd/flake8.py index f0fc339f8b..65f9e509ba 100644 --- a/lib/spack/spack/test/cmd/flake8.py +++ b/lib/spack/spack/test/cmd/flake8.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py index e4dbb681a6..189c827d05 100644 --- a/lib/spack/spack/test/cmd/gpg.py +++ b/lib/spack/spack/test/cmd/gpg.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index b57d39b441..7f9db1baa2 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/module.py b/lib/spack/spack/test/cmd/module.py index 03ce1ef206..8d15afdd0c 100644 --- a/lib/spack/spack/test/cmd/module.py +++ b/lib/spack/spack/test/cmd/module.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/python.py b/lib/spack/spack/test/cmd/python.py index 5dc82bd90e..5ad8456e49 100644 --- a/lib/spack/spack/test/cmd/python.py +++ b/lib/spack/spack/test/cmd/python.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/test_compiler_cmd.py b/lib/spack/spack/test/cmd/test_compiler_cmd.py index b046cdb922..39898980d9 100644 --- a/lib/spack/spack/test/cmd/test_compiler_cmd.py +++ b/lib/spack/spack/test/cmd/test_compiler_cmd.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/uninstall.py b/lib/spack/spack/test/cmd/uninstall.py index 5765f4613d..a47c76715b 100644 --- a/lib/spack/spack/test/cmd/uninstall.py +++ b/lib/spack/spack/test/cmd/uninstall.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/cmd/url.py b/lib/spack/spack/test/cmd/url.py index 3bc0bc7820..ae585b328f 100644 --- a/lib/spack/spack/test/cmd/url.py +++ b/lib/spack/spack/test/cmd/url.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/compilers.py b/lib/spack/spack/test/compilers.py index bc21ec886e..1bb6b41ffc 100644 --- a/lib/spack/spack/test/compilers.py +++ b/lib/spack/spack/test/compilers.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 1b659cb091..414b0fab84 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index 0b9f7a0046..5e880bc4d6 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py index ed8f78ceb4..2363754a00 100644 --- a/lib/spack/spack/test/config.py +++ b/lib/spack/spack/test/config.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index 19e7844090..c23fb466a5 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/data/sourceme_first.sh b/lib/spack/spack/test/data/sourceme_first.sh index ee21fabbd5..8fcec2fa3a 100644 --- a/lib/spack/spack/test/data/sourceme_first.sh +++ b/lib/spack/spack/test/data/sourceme_first.sh @@ -9,7 +9,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/data/sourceme_parameters.sh b/lib/spack/spack/test/data/sourceme_parameters.sh index 2ee0cc87bd..5f76c62435 100644 --- a/lib/spack/spack/test/data/sourceme_parameters.sh +++ b/lib/spack/spack/test/data/sourceme_parameters.sh @@ -9,7 +9,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/data/sourceme_second.sh b/lib/spack/spack/test/data/sourceme_second.sh index 2269225e45..07c814740e 100644 --- a/lib/spack/spack/test/data/sourceme_second.sh +++ b/lib/spack/spack/test/data/sourceme_second.sh @@ -9,7 +9,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/data/sourceme_unicode.sh b/lib/spack/spack/test/data/sourceme_unicode.sh index f01f6a4927..0080ee7337 100644 --- a/lib/spack/spack/test/data/sourceme_unicode.sh +++ b/lib/spack/spack/test/data/sourceme_unicode.sh @@ -9,7 +9,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index 6f8a2ef5d2..19a7141fa3 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index d1365c0e76..3119f0ebed 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index cdc2e68085..671d6ee6c9 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/file_cache.py b/lib/spack/spack/test/file_cache.py index af52380e34..6f0020f042 100644 --- a/lib/spack/spack/test/file_cache.py +++ b/lib/spack/spack/test/file_cache.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/file_list.py b/lib/spack/spack/test/file_list.py index 10c86d0d08..f9ae331597 100644 --- a/lib/spack/spack/test/file_list.py +++ b/lib/spack/spack/test/file_list.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py index 093f0a7053..098115371f 100644 --- a/lib/spack/spack/test/git_fetch.py +++ b/lib/spack/spack/test/git_fetch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py index 46dd4f1bc6..420c8f1180 100644 --- a/lib/spack/spack/test/graph.py +++ b/lib/spack/spack/test/graph.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py index c0318c58ff..ff1ed8862f 100644 --- a/lib/spack/spack/test/hg_fetch.py +++ b/lib/spack/spack/test/hg_fetch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index 13d3e2ee94..3a934d5ea2 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/link_tree.py b/lib/spack/spack/test/link_tree.py index 9fb4e8216e..ae293b6e67 100644 --- a/lib/spack/spack/test/link_tree.py +++ b/lib/spack/spack/test/link_tree.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/lock.py b/lib/spack/spack/test/lock.py index 214797c1f6..5a4c3073f5 100644 --- a/lib/spack/spack/test/lock.py +++ b/lib/spack/spack/test/lock.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/make_executable.py b/lib/spack/spack/test/make_executable.py index 1b3f384a8b..8eb5057fb7 100644 --- a/lib/spack/spack/test/make_executable.py +++ b/lib/spack/spack/test/make_executable.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/mirror.py b/lib/spack/spack/test/mirror.py index 21dbb8f4f6..16ea04434d 100644 --- a/lib/spack/spack/test/mirror.py +++ b/lib/spack/spack/test/mirror.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/module_parsing.py b/lib/spack/spack/test/module_parsing.py index 6ddb9d2dbf..d306915834 100644 --- a/lib/spack/spack/test/module_parsing.py +++ b/lib/spack/spack/test/module_parsing.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py index e8ebebf736..bd37196f2a 100644 --- a/lib/spack/spack/test/modules.py +++ b/lib/spack/spack/test/modules.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py index 003936a77a..404bfe5c8b 100644 --- a/lib/spack/spack/test/multimethod.py +++ b/lib/spack/spack/test/multimethod.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/namespace_trie.py b/lib/spack/spack/test/namespace_trie.py index 35ded3b7ee..62812856a9 100644 --- a/lib/spack/spack/test/namespace_trie.py +++ b/lib/spack/spack/test/namespace_trie.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/optional_deps.py b/lib/spack/spack/test/optional_deps.py index d2b8c3e3ac..db2267f047 100644 --- a/lib/spack/spack/test/optional_deps.py +++ b/lib/spack/spack/test/optional_deps.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py index c1902413ea..e8cc9571da 100644 --- a/lib/spack/spack/test/package_sanity.py +++ b/lib/spack/spack/test/package_sanity.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index 8ae2effc38..681060aad3 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/pattern.py b/lib/spack/spack/test/pattern.py index bd75206563..e4475546ae 100644 --- a/lib/spack/spack/test/pattern.py +++ b/lib/spack/spack/test/pattern.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/provider_index.py b/lib/spack/spack/test/provider_index.py index 69a5c3cd40..08abea857d 100644 --- a/lib/spack/spack/test/provider_index.py +++ b/lib/spack/spack/test/provider_index.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/python_version.py b/lib/spack/spack/test/python_version.py index 35b6ad7da7..55372c5fa2 100644 --- a/lib/spack/spack/test/python_version.py +++ b/lib/spack/spack/test/python_version.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/sbang.py b/lib/spack/spack/test/sbang.py index b1e2da3c3b..c0831a4e2d 100644 --- a/lib/spack/spack/test/sbang.py +++ b/lib/spack/spack/test/sbang.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/spack_yaml.py b/lib/spack/spack/test/spack_yaml.py index 53649eb1ec..742d934e76 100644 --- a/lib/spack/spack/test/spack_yaml.py +++ b/lib/spack/spack/test/spack_yaml.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index af6a4efd95..07a9b72e09 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 4b21e8d0e1..1623133ef3 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index 906aa77bb2..5d1ace6b86 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py index 866cdebd26..52007383c6 100644 --- a/lib/spack/spack/test/spec_yaml.py +++ b/lib/spack/spack/test/spec_yaml.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/stage.py b/lib/spack/spack/test/stage.py index 5b4c46e0bf..62605452c6 100644 --- a/lib/spack/spack/test/stage.py +++ b/lib/spack/spack/test/stage.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py index 1a7cc3ecd1..bef5db76de 100644 --- a/lib/spack/spack/test/svn_fetch.py +++ b/lib/spack/spack/test/svn_fetch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/url_fetch.py b/lib/spack/spack/test/url_fetch.py index c9299f45a1..ff9f96070c 100644 --- a/lib/spack/spack/test/url_fetch.py +++ b/lib/spack/spack/test/url_fetch.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 5489cc8d26..5b24821a28 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/url_substitution.py b/lib/spack/spack/test/url_substitution.py index 61bd178db8..1a54af1e3c 100644 --- a/lib/spack/spack/test/url_substitution.py +++ b/lib/spack/spack/test/url_substitution.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/variant.py b/lib/spack/spack/test/variant.py index 565b6dac86..6fb08bff13 100644 --- a/lib/spack/spack/test/variant.py +++ b/lib/spack/spack/test/variant.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index 71ea3af9e9..3b04e1d4aa 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/test/web.py b/lib/spack/spack/test/web.py index 9fa95a8d18..d50e0e3d54 100644 --- a/lib/spack/spack/test/web.py +++ b/lib/spack/spack/test/web.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index f20ca1f918..88557596fd 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/__init__.py b/lib/spack/spack/util/__init__.py index ed1ec23bca..445b6fdbd7 100644 --- a/lib/spack/spack/util/__init__.py +++ b/lib/spack/spack/util/__init__.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/compression.py b/lib/spack/spack/util/compression.py index caec70064d..bfff66fb07 100644 --- a/lib/spack/spack/util/compression.py +++ b/lib/spack/spack/util/compression.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/crypto.py b/lib/spack/spack/util/crypto.py index f0d48702a1..65ffa40963 100644 --- a/lib/spack/spack/util/crypto.py +++ b/lib/spack/spack/util/crypto.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/debug.py b/lib/spack/spack/util/debug.py index cf485a611d..2b7e540fd3 100644 --- a/lib/spack/spack/util/debug.py +++ b/lib/spack/spack/util/debug.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index 934a999327..6bd5c61e79 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 4222a48b82..584e224db7 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/gpg.py b/lib/spack/spack/util/gpg.py index ccaf33519b..ebb14a71f6 100644 --- a/lib/spack/spack/util/gpg.py +++ b/lib/spack/spack/util/gpg.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/module_cmd.py b/lib/spack/spack/util/module_cmd.py index bdd8463757..4de3fb051e 100644 --- a/lib/spack/spack/util/module_cmd.py +++ b/lib/spack/spack/util/module_cmd.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/multiproc.py b/lib/spack/spack/util/multiproc.py index f465a3dbdc..559ed19eec 100644 --- a/lib/spack/spack/util/multiproc.py +++ b/lib/spack/spack/util/multiproc.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py index e70b0a6ce0..d7ff920559 100644 --- a/lib/spack/spack/util/naming.py +++ b/lib/spack/spack/util/naming.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/path.py b/lib/spack/spack/util/path.py index 7235f6b756..0edab60f21 100644 --- a/lib/spack/spack/util/path.py +++ b/lib/spack/spack/util/path.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/pattern.py b/lib/spack/spack/util/pattern.py index bebca1f419..7400ba73aa 100644 --- a/lib/spack/spack/util/pattern.py +++ b/lib/spack/spack/util/pattern.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/prefix.py b/lib/spack/spack/util/prefix.py index ca880c53b7..8ce9836c66 100644 --- a/lib/spack/spack/util/prefix.py +++ b/lib/spack/spack/util/prefix.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/spack_json.py b/lib/spack/spack/util/spack_json.py index 82fa700821..50d3f7005d 100644 --- a/lib/spack/spack/util/spack_json.py +++ b/lib/spack/spack/util/spack_json.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/spack_yaml.py b/lib/spack/spack/util/spack_yaml.py index 6533004392..58e82f6508 100644 --- a/lib/spack/spack/util/spack_yaml.py +++ b/lib/spack/spack/util/spack_yaml.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/string.py b/lib/spack/spack/util/string.py index dae7afbf46..9f3fd63702 100644 --- a/lib/spack/spack/util/string.py +++ b/lib/spack/spack/util/string.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index f803c6cea3..e7e6f80ec8 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index 2acea30ddd..1361fb5152 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 1c931ae90a..10fac49e9d 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh index 8bb08dafde..7d933315a6 100755 --- a/share/spack/setup-env.csh +++ b/share/spack/setup-env.csh @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh index a67ae04b24..5c1558f7fc 100755 --- a/share/spack/setup-env.sh +++ b/share/spack/setup-env.sh @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 818f4d8acf..d9ae65b8b5 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index e39ad13bd1..59d8b9e330 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/b/package.py b/var/spack/repos/builtin.mock/packages/b/package.py index 5729f24e79..f89481d70b 100644 --- a/var/spack/repos/builtin.mock/packages/b/package.py +++ b/var/spack/repos/builtin.mock/packages/b/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/boost/package.py b/var/spack/repos/builtin.mock/packages/boost/package.py index 5d86c4559f..60cc915e2e 100644 --- a/var/spack/repos/builtin.mock/packages/boost/package.py +++ b/var/spack/repos/builtin.mock/packages/boost/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/c/package.py b/var/spack/repos/builtin.mock/packages/c/package.py index 80777a05bb..1037861b93 100644 --- a/var/spack/repos/builtin.mock/packages/c/package.py +++ b/var/spack/repos/builtin.mock/packages/c/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/callpath/package.py b/var/spack/repos/builtin.mock/packages/callpath/package.py index c00f408866..40c8565ab6 100644 --- a/var/spack/repos/builtin.mock/packages/callpath/package.py +++ b/var/spack/repos/builtin.mock/packages/callpath/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/canfail/package.py b/var/spack/repos/builtin.mock/packages/canfail/package.py index 18def38562..5b4135b33f 100644 --- a/var/spack/repos/builtin.mock/packages/canfail/package.py +++ b/var/spack/repos/builtin.mock/packages/canfail/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/cmake-client/package.py b/var/spack/repos/builtin.mock/packages/cmake-client/package.py index e82d2cd781..8b09422487 100644 --- a/var/spack/repos/builtin.mock/packages/cmake-client/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake-client/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/cmake/package.py b/var/spack/repos/builtin.mock/packages/cmake/package.py index c8b6464e69..8dc1397fc8 100644 --- a/var/spack/repos/builtin.mock/packages/cmake/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py index 37805537a2..a5865a90e3 100644 --- a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py +++ b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/conflict/package.py b/var/spack/repos/builtin.mock/packages/conflict/package.py index a6ba4b5c58..e13b34dcc5 100644 --- a/var/spack/repos/builtin.mock/packages/conflict/package.py +++ b/var/spack/repos/builtin.mock/packages/conflict/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/develop-test/package.py b/var/spack/repos/builtin.mock/packages/develop-test/package.py index 0c693c60fb..b9c9dad852 100644 --- a/var/spack/repos/builtin.mock/packages/develop-test/package.py +++ b/var/spack/repos/builtin.mock/packages/develop-test/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/direct-mpich/package.py b/var/spack/repos/builtin.mock/packages/direct-mpich/package.py index f38589ad4d..4c02338bc2 100644 --- a/var/spack/repos/builtin.mock/packages/direct-mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/direct-mpich/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py index 0c9fc1164a..1b7ba0e2d7 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py index 40b65266d4..6096d552d8 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py index 7b6e4abe5f..6b77ec5a0a 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond/package.py index 0b0f300b35..19530360ad 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtbuild1/package.py b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py index 8d3b28b539..7416718ce8 100644 --- a/var/spack/repos/builtin.mock/packages/dtbuild1/package.py +++ b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtbuild2/package.py b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py index 9ea65735ff..5f22364447 100644 --- a/var/spack/repos/builtin.mock/packages/dtbuild2/package.py +++ b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtbuild3/package.py b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py index 261c69e01e..070dac9d45 100644 --- a/var/spack/repos/builtin.mock/packages/dtbuild3/package.py +++ b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtlink1/package.py b/var/spack/repos/builtin.mock/packages/dtlink1/package.py index 0269e08b65..4cd5b24394 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink1/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtlink2/package.py b/var/spack/repos/builtin.mock/packages/dtlink2/package.py index ad55c5ad48..a34317c364 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink2/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtlink3/package.py b/var/spack/repos/builtin.mock/packages/dtlink3/package.py index 2b425103bd..433ceeeec2 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink3/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtlink4/package.py b/var/spack/repos/builtin.mock/packages/dtlink4/package.py index d7af5ecbfc..f694b7882f 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink4/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtlink5/package.py b/var/spack/repos/builtin.mock/packages/dtlink5/package.py index a9a22734cd..f03556a428 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink5/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink5/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtrun1/package.py b/var/spack/repos/builtin.mock/packages/dtrun1/package.py index af9539ba68..a0a29804db 100644 --- a/var/spack/repos/builtin.mock/packages/dtrun1/package.py +++ b/var/spack/repos/builtin.mock/packages/dtrun1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtrun2/package.py b/var/spack/repos/builtin.mock/packages/dtrun2/package.py index a6cf0110b3..15bfa4aed7 100644 --- a/var/spack/repos/builtin.mock/packages/dtrun2/package.py +++ b/var/spack/repos/builtin.mock/packages/dtrun2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtrun3/package.py b/var/spack/repos/builtin.mock/packages/dtrun3/package.py index 426320c247..e4519286b5 100644 --- a/var/spack/repos/builtin.mock/packages/dtrun3/package.py +++ b/var/spack/repos/builtin.mock/packages/dtrun3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dttop/package.py b/var/spack/repos/builtin.mock/packages/dttop/package.py index 99c86523e1..be29daeb30 100644 --- a/var/spack/repos/builtin.mock/packages/dttop/package.py +++ b/var/spack/repos/builtin.mock/packages/dttop/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dtuse/package.py b/var/spack/repos/builtin.mock/packages/dtuse/package.py index c77d700b98..8c2a85c126 100644 --- a/var/spack/repos/builtin.mock/packages/dtuse/package.py +++ b/var/spack/repos/builtin.mock/packages/dtuse/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/dyninst/package.py b/var/spack/repos/builtin.mock/packages/dyninst/package.py index daf1b82ec6..009fdb7c2c 100644 --- a/var/spack/repos/builtin.mock/packages/dyninst/package.py +++ b/var/spack/repos/builtin.mock/packages/dyninst/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/e/package.py b/var/spack/repos/builtin.mock/packages/e/package.py index c764007563..6edc27f903 100644 --- a/var/spack/repos/builtin.mock/packages/e/package.py +++ b/var/spack/repos/builtin.mock/packages/e/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/extendee/package.py b/var/spack/repos/builtin.mock/packages/extendee/package.py index f86bcf7de5..fc2ae16ae6 100644 --- a/var/spack/repos/builtin.mock/packages/extendee/package.py +++ b/var/spack/repos/builtin.mock/packages/extendee/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/extension1/package.py b/var/spack/repos/builtin.mock/packages/extension1/package.py index d3babc6ce4..ea07e08119 100644 --- a/var/spack/repos/builtin.mock/packages/extension1/package.py +++ b/var/spack/repos/builtin.mock/packages/extension1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/extension2/package.py b/var/spack/repos/builtin.mock/packages/extension2/package.py index fcb23ab8ed..ab959a20a8 100644 --- a/var/spack/repos/builtin.mock/packages/extension2/package.py +++ b/var/spack/repos/builtin.mock/packages/extension2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/externalmodule/package.py b/var/spack/repos/builtin.mock/packages/externalmodule/package.py index f7c9b056a4..1fc59f67bc 100644 --- a/var/spack/repos/builtin.mock/packages/externalmodule/package.py +++ b/var/spack/repos/builtin.mock/packages/externalmodule/package.py @@ -8,7 +8,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/externalprereq/package.py b/var/spack/repos/builtin.mock/packages/externalprereq/package.py index 226742f2cb..caf44e1ba8 100644 --- a/var/spack/repos/builtin.mock/packages/externalprereq/package.py +++ b/var/spack/repos/builtin.mock/packages/externalprereq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/externaltest/package.py b/var/spack/repos/builtin.mock/packages/externaltest/package.py index 252c42556e..bbf47cedfd 100644 --- a/var/spack/repos/builtin.mock/packages/externaltest/package.py +++ b/var/spack/repos/builtin.mock/packages/externaltest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/externaltool/package.py b/var/spack/repos/builtin.mock/packages/externaltool/package.py index d2daddd350..925188a646 100644 --- a/var/spack/repos/builtin.mock/packages/externaltool/package.py +++ b/var/spack/repos/builtin.mock/packages/externaltool/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/externalvirtual/package.py b/var/spack/repos/builtin.mock/packages/externalvirtual/package.py index 6310a17bc9..292ff9de41 100644 --- a/var/spack/repos/builtin.mock/packages/externalvirtual/package.py +++ b/var/spack/repos/builtin.mock/packages/externalvirtual/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/failing-build/package.py b/var/spack/repos/builtin.mock/packages/failing-build/package.py index a36553992e..d7d16db78e 100644 --- a/var/spack/repos/builtin.mock/packages/failing-build/package.py +++ b/var/spack/repos/builtin.mock/packages/failing-build/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/fake/package.py b/var/spack/repos/builtin.mock/packages/fake/package.py index b83eec7470..e1cc33dbf2 100644 --- a/var/spack/repos/builtin.mock/packages/fake/package.py +++ b/var/spack/repos/builtin.mock/packages/fake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/flake8/package.py b/var/spack/repos/builtin.mock/packages/flake8/package.py index 22598bead1..db425e82ee 100644 --- a/var/spack/repos/builtin.mock/packages/flake8/package.py +++ b/var/spack/repos/builtin.mock/packages/flake8/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/git-test/package.py b/var/spack/repos/builtin.mock/packages/git-test/package.py index 730e71ac6b..83b94c0d65 100644 --- a/var/spack/repos/builtin.mock/packages/git-test/package.py +++ b/var/spack/repos/builtin.mock/packages/git-test/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/hg-test/package.py b/var/spack/repos/builtin.mock/packages/hg-test/package.py index 70a9b7f2c7..50f6fef0a6 100644 --- a/var/spack/repos/builtin.mock/packages/hg-test/package.py +++ b/var/spack/repos/builtin.mock/packages/hg-test/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/hypre/package.py b/var/spack/repos/builtin.mock/packages/hypre/package.py index b9e31b09dc..a620b1b14c 100644 --- a/var/spack/repos/builtin.mock/packages/hypre/package.py +++ b/var/spack/repos/builtin.mock/packages/hypre/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py b/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py index 77b8022b1c..1a56a260f3 100644 --- a/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/libdwarf/package.py b/var/spack/repos/builtin.mock/packages/libdwarf/package.py index 0fcbe4a62e..10d6fa8e88 100644 --- a/var/spack/repos/builtin.mock/packages/libdwarf/package.py +++ b/var/spack/repos/builtin.mock/packages/libdwarf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/libelf/package.py b/var/spack/repos/builtin.mock/packages/libelf/package.py index 90d00ad339..3a2fe603ef 100644 --- a/var/spack/repos/builtin.mock/packages/libelf/package.py +++ b/var/spack/repos/builtin.mock/packages/libelf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/mpich/package.py b/var/spack/repos/builtin.mock/packages/mpich/package.py index 936127398c..28d7b57f2d 100644 --- a/var/spack/repos/builtin.mock/packages/mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/mpich/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/mpich2/package.py b/var/spack/repos/builtin.mock/packages/mpich2/package.py index c92b4ba43a..bdb5f914c9 100644 --- a/var/spack/repos/builtin.mock/packages/mpich2/package.py +++ b/var/spack/repos/builtin.mock/packages/mpich2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/mpileaks/package.py b/var/spack/repos/builtin.mock/packages/mpileaks/package.py index c84fdf2238..31cf0bd2b9 100644 --- a/var/spack/repos/builtin.mock/packages/mpileaks/package.py +++ b/var/spack/repos/builtin.mock/packages/mpileaks/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py b/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py index 5f85dec9b5..a2425eaaa1 100644 --- a/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py +++ b/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/multimethod-base/package.py b/var/spack/repos/builtin.mock/packages/multimethod-base/package.py index bd3b29c5ee..68b4ca51d3 100644 --- a/var/spack/repos/builtin.mock/packages/multimethod-base/package.py +++ b/var/spack/repos/builtin.mock/packages/multimethod-base/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/multimethod/package.py b/var/spack/repos/builtin.mock/packages/multimethod/package.py index c0e347bc93..fa8d4b0342 100644 --- a/var/spack/repos/builtin.mock/packages/multimethod/package.py +++ b/var/spack/repos/builtin.mock/packages/multimethod/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py index 13c3b02e77..f20bf7c369 100644 --- a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py +++ b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/netlib-blas/package.py b/var/spack/repos/builtin.mock/packages/netlib-blas/package.py index 0a5b1d0e6a..a1f3cfcb2b 100644 --- a/var/spack/repos/builtin.mock/packages/netlib-blas/package.py +++ b/var/spack/repos/builtin.mock/packages/netlib-blas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py b/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py index 755d3001a4..820a6b681e 100644 --- a/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py +++ b/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py b/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py index 0f14fbaa61..5e47081641 100644 --- a/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py +++ b/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/openblas/package.py b/var/spack/repos/builtin.mock/packages/openblas/package.py index f6cdeeea49..58c6ec78d2 100644 --- a/var/spack/repos/builtin.mock/packages/openblas/package.py +++ b/var/spack/repos/builtin.mock/packages/openblas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py index 337f54e24e..5838ffb792 100644 --- a/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py +++ b/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py index 2904b3782d..51b7fa028a 100644 --- a/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py +++ b/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py index 2c07e61769..165adec23a 100644 --- a/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py +++ b/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/othervirtual/package.py b/var/spack/repos/builtin.mock/packages/othervirtual/package.py index 83bc07df98..5b019cfdb2 100644 --- a/var/spack/repos/builtin.mock/packages/othervirtual/package.py +++ b/var/spack/repos/builtin.mock/packages/othervirtual/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/python/package.py b/var/spack/repos/builtin.mock/packages/python/package.py index a5290161ad..da33e66f87 100644 --- a/var/spack/repos/builtin.mock/packages/python/package.py +++ b/var/spack/repos/builtin.mock/packages/python/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/svn-test/package.py b/var/spack/repos/builtin.mock/packages/svn-test/package.py index 01d0929c28..a24057f089 100644 --- a/var/spack/repos/builtin.mock/packages/svn-test/package.py +++ b/var/spack/repos/builtin.mock/packages/svn-test/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py b/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py index 2129d9788b..58c52ec892 100644 --- a/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py +++ b/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/url-test/package.py b/var/spack/repos/builtin.mock/packages/url-test/package.py index a1f9af7d7d..b23c4f65c2 100644 --- a/var/spack/repos/builtin.mock/packages/url-test/package.py +++ b/var/spack/repos/builtin.mock/packages/url-test/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin.mock/packages/zmpi/package.py b/var/spack/repos/builtin.mock/packages/zmpi/package.py index b6a5b33011..1e5b0a6706 100644 --- a/var/spack/repos/builtin.mock/packages/zmpi/package.py +++ b/var/spack/repos/builtin.mock/packages/zmpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py index d73b89ea69..66157b3546 100644 --- a/var/spack/repos/builtin/packages/abinit/package.py +++ b/var/spack/repos/builtin/packages/abinit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/abyss/package.py b/var/spack/repos/builtin/packages/abyss/package.py index 9f4a31a47e..e8e0fb4d45 100644 --- a/var/spack/repos/builtin/packages/abyss/package.py +++ b/var/spack/repos/builtin/packages/abyss/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ack/package.py b/var/spack/repos/builtin/packages/ack/package.py index b377c30fe9..7a81177814 100644 --- a/var/spack/repos/builtin/packages/ack/package.py +++ b/var/spack/repos/builtin/packages/ack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/activeharmony/package.py b/var/spack/repos/builtin/packages/activeharmony/package.py index 6a4e67a1ca..25720e8bcb 100644 --- a/var/spack/repos/builtin/packages/activeharmony/package.py +++ b/var/spack/repos/builtin/packages/activeharmony/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/adept-utils/package.py b/var/spack/repos/builtin/packages/adept-utils/package.py index 1a6998fd96..609dff2fe7 100644 --- a/var/spack/repos/builtin/packages/adept-utils/package.py +++ b/var/spack/repos/builtin/packages/adept-utils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/adios/package.py b/var/spack/repos/builtin/packages/adios/package.py index 7d660390ac..2d7b9e2997 100644 --- a/var/spack/repos/builtin/packages/adios/package.py +++ b/var/spack/repos/builtin/packages/adios/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/adlbx/package.py b/var/spack/repos/builtin/packages/adlbx/package.py index ad54320007..6793d68c33 100644 --- a/var/spack/repos/builtin/packages/adlbx/package.py +++ b/var/spack/repos/builtin/packages/adlbx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/adol-c/package.py b/var/spack/repos/builtin/packages/adol-c/package.py index 954de6fb4a..5de1a31b87 100644 --- a/var/spack/repos/builtin/packages/adol-c/package.py +++ b/var/spack/repos/builtin/packages/adol-c/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/allinea-forge/package.py b/var/spack/repos/builtin/packages/allinea-forge/package.py index ac60762cc3..766a28a0e0 100644 --- a/var/spack/repos/builtin/packages/allinea-forge/package.py +++ b/var/spack/repos/builtin/packages/allinea-forge/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/allinea-reports/package.py b/var/spack/repos/builtin/packages/allinea-reports/package.py index 13863c271d..70452290ee 100644 --- a/var/spack/repos/builtin/packages/allinea-reports/package.py +++ b/var/spack/repos/builtin/packages/allinea-reports/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/alquimia/package.py b/var/spack/repos/builtin/packages/alquimia/package.py index 9e35aa9e15..b8d3f60840 100644 --- a/var/spack/repos/builtin/packages/alquimia/package.py +++ b/var/spack/repos/builtin/packages/alquimia/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/amrex/package.py b/var/spack/repos/builtin/packages/amrex/package.py index 0147ffb69d..a13200b3e0 100644 --- a/var/spack/repos/builtin/packages/amrex/package.py +++ b/var/spack/repos/builtin/packages/amrex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/andi/package.py b/var/spack/repos/builtin/packages/andi/package.py index 0d48ad69af..092f5021cc 100644 --- a/var/spack/repos/builtin/packages/andi/package.py +++ b/var/spack/repos/builtin/packages/andi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ant/package.py b/var/spack/repos/builtin/packages/ant/package.py index cbd05c7dec..b2fb647694 100644 --- a/var/spack/repos/builtin/packages/ant/package.py +++ b/var/spack/repos/builtin/packages/ant/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/antlr/package.py b/var/spack/repos/builtin/packages/antlr/package.py index 88653a8ea9..e6332d20b3 100644 --- a/var/spack/repos/builtin/packages/antlr/package.py +++ b/var/spack/repos/builtin/packages/antlr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ape/package.py b/var/spack/repos/builtin/packages/ape/package.py index 7e28329080..05a08257a1 100644 --- a/var/spack/repos/builtin/packages/ape/package.py +++ b/var/spack/repos/builtin/packages/ape/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py index 832e10a1ec..55e22342b1 100644 --- a/var/spack/repos/builtin/packages/apex/package.py +++ b/var/spack/repos/builtin/packages/apex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/applewmproto/package.py b/var/spack/repos/builtin/packages/applewmproto/package.py index 41d7c4c10a..805eeb33cc 100644 --- a/var/spack/repos/builtin/packages/applewmproto/package.py +++ b/var/spack/repos/builtin/packages/applewmproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/appres/package.py b/var/spack/repos/builtin/packages/appres/package.py index ff13937a0e..e98004ce9a 100644 --- a/var/spack/repos/builtin/packages/appres/package.py +++ b/var/spack/repos/builtin/packages/appres/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/apr-util/package.py b/var/spack/repos/builtin/packages/apr-util/package.py index 88d86ddd65..4b63e41600 100644 --- a/var/spack/repos/builtin/packages/apr-util/package.py +++ b/var/spack/repos/builtin/packages/apr-util/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/apr/package.py b/var/spack/repos/builtin/packages/apr/package.py index 0cd51f52e3..53a3c1e59b 100644 --- a/var/spack/repos/builtin/packages/apr/package.py +++ b/var/spack/repos/builtin/packages/apr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/archer/package.py b/var/spack/repos/builtin/packages/archer/package.py index 247743ed0d..9c577e6517 100644 --- a/var/spack/repos/builtin/packages/archer/package.py +++ b/var/spack/repos/builtin/packages/archer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/argtable/package.py b/var/spack/repos/builtin/packages/argtable/package.py index 8e1bec15f9..a7ffb886da 100644 --- a/var/spack/repos/builtin/packages/argtable/package.py +++ b/var/spack/repos/builtin/packages/argtable/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py index 0729afd8c8..90fc78d8c3 100644 --- a/var/spack/repos/builtin/packages/armadillo/package.py +++ b/var/spack/repos/builtin/packages/armadillo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py index 5da29828b2..6b6f6271c4 100644 --- a/var/spack/repos/builtin/packages/arpack-ng/package.py +++ b/var/spack/repos/builtin/packages/arpack-ng/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/arpack/package.py b/var/spack/repos/builtin/packages/arpack/package.py index 91b5f06a4a..831a379fce 100644 --- a/var/spack/repos/builtin/packages/arpack/package.py +++ b/var/spack/repos/builtin/packages/arpack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/asciidoc/package.py b/var/spack/repos/builtin/packages/asciidoc/package.py index 428bb7d645..9d8de2b763 100644 --- a/var/spack/repos/builtin/packages/asciidoc/package.py +++ b/var/spack/repos/builtin/packages/asciidoc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/astra/package.py b/var/spack/repos/builtin/packages/astra/package.py index e32e70cada..1358657f83 100644 --- a/var/spack/repos/builtin/packages/astra/package.py +++ b/var/spack/repos/builtin/packages/astra/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/astyle/package.py b/var/spack/repos/builtin/packages/astyle/package.py index 7eeb68cdf8..a6ab9fffc6 100644 --- a/var/spack/repos/builtin/packages/astyle/package.py +++ b/var/spack/repos/builtin/packages/astyle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/atk/package.py b/var/spack/repos/builtin/packages/atk/package.py index 8b6a51c52f..1cccca2668 100644 --- a/var/spack/repos/builtin/packages/atk/package.py +++ b/var/spack/repos/builtin/packages/atk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/atlas/package.py b/var/spack/repos/builtin/packages/atlas/package.py index 525701c57b..af2d0ff111 100644 --- a/var/spack/repos/builtin/packages/atlas/package.py +++ b/var/spack/repos/builtin/packages/atlas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/atompaw/package.py b/var/spack/repos/builtin/packages/atompaw/package.py index 987eb86e30..016681bf49 100644 --- a/var/spack/repos/builtin/packages/atompaw/package.py +++ b/var/spack/repos/builtin/packages/atompaw/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/atop/package.py b/var/spack/repos/builtin/packages/atop/package.py index 7a34d129f7..396220962c 100644 --- a/var/spack/repos/builtin/packages/atop/package.py +++ b/var/spack/repos/builtin/packages/atop/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/autoconf/package.py b/var/spack/repos/builtin/packages/autoconf/package.py index 694622fe80..9d7aed4c00 100644 --- a/var/spack/repos/builtin/packages/autoconf/package.py +++ b/var/spack/repos/builtin/packages/autoconf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/autogen/package.py b/var/spack/repos/builtin/packages/autogen/package.py index e79af636b5..39fc6a4cc6 100644 --- a/var/spack/repos/builtin/packages/autogen/package.py +++ b/var/spack/repos/builtin/packages/autogen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/automaded/package.py b/var/spack/repos/builtin/packages/automaded/package.py index 7e586b2991..1edeecf245 100644 --- a/var/spack/repos/builtin/packages/automaded/package.py +++ b/var/spack/repos/builtin/packages/automaded/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/automake/package.py b/var/spack/repos/builtin/packages/automake/package.py index 4f022e5cad..4a38712db9 100644 --- a/var/spack/repos/builtin/packages/automake/package.py +++ b/var/spack/repos/builtin/packages/automake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bamtools/package.py b/var/spack/repos/builtin/packages/bamtools/package.py index 79e71cc0f2..f29af2618d 100644 --- a/var/spack/repos/builtin/packages/bamtools/package.py +++ b/var/spack/repos/builtin/packages/bamtools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bamutil/package.py b/var/spack/repos/builtin/packages/bamutil/package.py index 89aaa0e9ac..164e0438de 100644 --- a/var/spack/repos/builtin/packages/bamutil/package.py +++ b/var/spack/repos/builtin/packages/bamutil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bash-completion/package.py b/var/spack/repos/builtin/packages/bash-completion/package.py index 0bd4d7c294..680ac71ad1 100644 --- a/var/spack/repos/builtin/packages/bash-completion/package.py +++ b/var/spack/repos/builtin/packages/bash-completion/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bash/package.py b/var/spack/repos/builtin/packages/bash/package.py index 17159989d0..86675fc4bf 100644 --- a/var/spack/repos/builtin/packages/bash/package.py +++ b/var/spack/repos/builtin/packages/bash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bats/package.py b/var/spack/repos/builtin/packages/bats/package.py index e68dd7a48d..bcbb55bf16 100644 --- a/var/spack/repos/builtin/packages/bats/package.py +++ b/var/spack/repos/builtin/packages/bats/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bazel/package.py b/var/spack/repos/builtin/packages/bazel/package.py index 0e0f99966a..17b7992a1b 100644 --- a/var/spack/repos/builtin/packages/bazel/package.py +++ b/var/spack/repos/builtin/packages/bazel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bbcp/package.py b/var/spack/repos/builtin/packages/bbcp/package.py index 5d5e64a390..76aef3d20c 100644 --- a/var/spack/repos/builtin/packages/bbcp/package.py +++ b/var/spack/repos/builtin/packages/bbcp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bcftools/package.py b/var/spack/repos/builtin/packages/bcftools/package.py index b9954c328a..6a276709ef 100644 --- a/var/spack/repos/builtin/packages/bcftools/package.py +++ b/var/spack/repos/builtin/packages/bcftools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bcl2fastq2/package.py b/var/spack/repos/builtin/packages/bcl2fastq2/package.py index 2aff74b8a8..1a7fff360c 100644 --- a/var/spack/repos/builtin/packages/bcl2fastq2/package.py +++ b/var/spack/repos/builtin/packages/bcl2fastq2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bdftopcf/package.py b/var/spack/repos/builtin/packages/bdftopcf/package.py index b6ddd04418..68590c5a08 100644 --- a/var/spack/repos/builtin/packages/bdftopcf/package.py +++ b/var/spack/repos/builtin/packages/bdftopcf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bdw-gc/package.py b/var/spack/repos/builtin/packages/bdw-gc/package.py index 9282f566be..a0606e78b1 100644 --- a/var/spack/repos/builtin/packages/bdw-gc/package.py +++ b/var/spack/repos/builtin/packages/bdw-gc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bear/package.py b/var/spack/repos/builtin/packages/bear/package.py index 8c8eb87fb3..7078931c59 100644 --- a/var/spack/repos/builtin/packages/bear/package.py +++ b/var/spack/repos/builtin/packages/bear/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bedtools2/package.py b/var/spack/repos/builtin/packages/bedtools2/package.py index 46f3185154..a16f0cb203 100644 --- a/var/spack/repos/builtin/packages/bedtools2/package.py +++ b/var/spack/repos/builtin/packages/bedtools2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/beforelight/package.py b/var/spack/repos/builtin/packages/beforelight/package.py index 3c0cbcf3cb..51341e6998 100644 --- a/var/spack/repos/builtin/packages/beforelight/package.py +++ b/var/spack/repos/builtin/packages/beforelight/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/benchmark/package.py b/var/spack/repos/builtin/packages/benchmark/package.py index 9c74be8d1e..9e2009750d 100644 --- a/var/spack/repos/builtin/packages/benchmark/package.py +++ b/var/spack/repos/builtin/packages/benchmark/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bertini/package.py b/var/spack/repos/builtin/packages/bertini/package.py index c6d169fbcc..4e1ac87e57 100644 --- a/var/spack/repos/builtin/packages/bertini/package.py +++ b/var/spack/repos/builtin/packages/bertini/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bib2xhtml/package.py b/var/spack/repos/builtin/packages/bib2xhtml/package.py index 56038eea18..99bd1ce4c9 100644 --- a/var/spack/repos/builtin/packages/bib2xhtml/package.py +++ b/var/spack/repos/builtin/packages/bib2xhtml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bigreqsproto/package.py b/var/spack/repos/builtin/packages/bigreqsproto/package.py index f2542d921e..4fdfe1e7f2 100644 --- a/var/spack/repos/builtin/packages/bigreqsproto/package.py +++ b/var/spack/repos/builtin/packages/bigreqsproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/binutils/package.py b/var/spack/repos/builtin/packages/binutils/package.py index 41a8312519..abfe33df9c 100644 --- a/var/spack/repos/builtin/packages/binutils/package.py +++ b/var/spack/repos/builtin/packages/binutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py index e9bfa32b39..10a8967178 100644 --- a/var/spack/repos/builtin/packages/bison/package.py +++ b/var/spack/repos/builtin/packages/bison/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bitmap/package.py b/var/spack/repos/builtin/packages/bitmap/package.py index 80bc496013..c656ab31df 100644 --- a/var/spack/repos/builtin/packages/bitmap/package.py +++ b/var/spack/repos/builtin/packages/bitmap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/blast-plus/package.py b/var/spack/repos/builtin/packages/blast-plus/package.py index 3faf852739..23c47bcec9 100644 --- a/var/spack/repos/builtin/packages/blast-plus/package.py +++ b/var/spack/repos/builtin/packages/blast-plus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/blat/package.py b/var/spack/repos/builtin/packages/blat/package.py index 8a9cce50c1..6d55f14f1e 100644 --- a/var/spack/repos/builtin/packages/blat/package.py +++ b/var/spack/repos/builtin/packages/blat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,7 +26,7 @@ from spack import * class Blat(Package): - """BLAT (BLAST-like alignment tool) is a pairwise sequence + """BLAT (BLAST-like alignment tool) is a pairwise sequence alignment algorithm.""" homepage = "https://genome.ucsc.edu/FAQ/FAQblat.html" diff --git a/var/spack/repos/builtin/packages/blaze/package.py b/var/spack/repos/builtin/packages/blaze/package.py index ccc62f6089..509f6ab986 100644 --- a/var/spack/repos/builtin/packages/blaze/package.py +++ b/var/spack/repos/builtin/packages/blaze/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -33,7 +33,7 @@ class Blaze(Package): domain-specific language with HPC-grade performance, making it one of the most intuitive and fastest C++ math libraries available. """ - + homepage = "https://bitbucket.org/blaze-lib/blaze/overview" url = "https://bitbucket.org/blaze-lib/blaze/downloads/blaze-3.1.tar.gz" diff --git a/var/spack/repos/builtin/packages/bliss/package.py b/var/spack/repos/builtin/packages/bliss/package.py index a81a806807..9abb7143a2 100644 --- a/var/spack/repos/builtin/packages/bliss/package.py +++ b/var/spack/repos/builtin/packages/bliss/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/blitz/package.py b/var/spack/repos/builtin/packages/blitz/package.py index d6fd31d637..7fc7e64e76 100644 --- a/var/spack/repos/builtin/packages/blitz/package.py +++ b/var/spack/repos/builtin/packages/blitz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bml/package.py b/var/spack/repos/builtin/packages/bml/package.py index e881a0e93c..87dc1c9e80 100644 --- a/var/spack/repos/builtin/packages/bml/package.py +++ b/var/spack/repos/builtin/packages/bml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index 4076b61ed8..cf63b229c0 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/boostmplcartesianproduct/package.py b/var/spack/repos/builtin/packages/boostmplcartesianproduct/package.py index 2744183fed..c64cb9a0e0 100644 --- a/var/spack/repos/builtin/packages/boostmplcartesianproduct/package.py +++ b/var/spack/repos/builtin/packages/boostmplcartesianproduct/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bowtie/package.py b/var/spack/repos/builtin/packages/bowtie/package.py index 57c867a06d..05f9140edb 100644 --- a/var/spack/repos/builtin/packages/bowtie/package.py +++ b/var/spack/repos/builtin/packages/bowtie/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bowtie2/package.py b/var/spack/repos/builtin/packages/bowtie2/package.py index 8d541b15c3..564e2d27f8 100644 --- a/var/spack/repos/builtin/packages/bowtie2/package.py +++ b/var/spack/repos/builtin/packages/bowtie2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/boxlib/package.py b/var/spack/repos/builtin/packages/boxlib/package.py index dd23c05fc3..75030e925c 100644 --- a/var/spack/repos/builtin/packages/boxlib/package.py +++ b/var/spack/repos/builtin/packages/boxlib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bpp-core/package.py b/var/spack/repos/builtin/packages/bpp-core/package.py index f716a2ee05..e7cc1abf29 100644 --- a/var/spack/repos/builtin/packages/bpp-core/package.py +++ b/var/spack/repos/builtin/packages/bpp-core/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bpp-phyl/package.py b/var/spack/repos/builtin/packages/bpp-phyl/package.py index 4ff77f1540..4d73d6bd59 100644 --- a/var/spack/repos/builtin/packages/bpp-phyl/package.py +++ b/var/spack/repos/builtin/packages/bpp-phyl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bpp-seq/package.py b/var/spack/repos/builtin/packages/bpp-seq/package.py index 15c99da2b1..6e1f06a64b 100644 --- a/var/spack/repos/builtin/packages/bpp-seq/package.py +++ b/var/spack/repos/builtin/packages/bpp-seq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bpp-suite/package.py b/var/spack/repos/builtin/packages/bpp-suite/package.py index d15030622e..8223c40275 100644 --- a/var/spack/repos/builtin/packages/bpp-suite/package.py +++ b/var/spack/repos/builtin/packages/bpp-suite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/brigand/package.py b/var/spack/repos/builtin/packages/brigand/package.py index d9f01283e0..ff379e096b 100644 --- a/var/spack/repos/builtin/packages/brigand/package.py +++ b/var/spack/repos/builtin/packages/brigand/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bwa/package.py b/var/spack/repos/builtin/packages/bwa/package.py index 6b326ae6fe..0b3ac66b3e 100644 --- a/var/spack/repos/builtin/packages/bwa/package.py +++ b/var/spack/repos/builtin/packages/bwa/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py index 741c6302cb..532c670a0b 100644 --- a/var/spack/repos/builtin/packages/bzip2/package.py +++ b/var/spack/repos/builtin/packages/bzip2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/c-blosc/package.py b/var/spack/repos/builtin/packages/c-blosc/package.py index 8bb0e295af..186f314f1e 100644 --- a/var/spack/repos/builtin/packages/c-blosc/package.py +++ b/var/spack/repos/builtin/packages/c-blosc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/caffe/package.py b/var/spack/repos/builtin/packages/caffe/package.py index ba01c25a6e..4e2ef26dbb 100644 --- a/var/spack/repos/builtin/packages/caffe/package.py +++ b/var/spack/repos/builtin/packages/caffe/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cairo/package.py b/var/spack/repos/builtin/packages/cairo/package.py index a7e0d150b8..f02c26a8f1 100644 --- a/var/spack/repos/builtin/packages/cairo/package.py +++ b/var/spack/repos/builtin/packages/cairo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/caliper/package.py b/var/spack/repos/builtin/packages/caliper/package.py index 2350880d22..7758b20328 100644 --- a/var/spack/repos/builtin/packages/caliper/package.py +++ b/var/spack/repos/builtin/packages/caliper/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py index 27a04393f5..9ded62e5c5 100644 --- a/var/spack/repos/builtin/packages/callpath/package.py +++ b/var/spack/repos/builtin/packages/callpath/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py index aa7c7dc98c..e92c5b5b43 100644 --- a/var/spack/repos/builtin/packages/cantera/package.py +++ b/var/spack/repos/builtin/packages/cantera/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cask/package.py b/var/spack/repos/builtin/packages/cask/package.py index b48365b61d..e259dae8c2 100644 --- a/var/spack/repos/builtin/packages/cask/package.py +++ b/var/spack/repos/builtin/packages/cask/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/catch/package.py b/var/spack/repos/builtin/packages/catch/package.py index f439d3d8c2..f65f7aeb25 100644 --- a/var/spack/repos/builtin/packages/catch/package.py +++ b/var/spack/repos/builtin/packages/catch/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cbench/package.py b/var/spack/repos/builtin/packages/cbench/package.py index 4ce2cd5394..f2cf386a29 100644 --- a/var/spack/repos/builtin/packages/cbench/package.py +++ b/var/spack/repos/builtin/packages/cbench/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cblas/package.py b/var/spack/repos/builtin/packages/cblas/package.py index 0828141307..2ac5f820ec 100644 --- a/var/spack/repos/builtin/packages/cblas/package.py +++ b/var/spack/repos/builtin/packages/cblas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py index 3d8572232c..9b4439f6b6 100644 --- a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py +++ b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cbtf-krell/package.py b/var/spack/repos/builtin/packages/cbtf-krell/package.py index 3f36942e9a..0114ad4e4a 100644 --- a/var/spack/repos/builtin/packages/cbtf-krell/package.py +++ b/var/spack/repos/builtin/packages/cbtf-krell/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cbtf-lanl/package.py b/var/spack/repos/builtin/packages/cbtf-lanl/package.py index 1545c7bf8b..a2a258be3a 100644 --- a/var/spack/repos/builtin/packages/cbtf-lanl/package.py +++ b/var/spack/repos/builtin/packages/cbtf-lanl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cbtf/package.py b/var/spack/repos/builtin/packages/cbtf/package.py index 7c9626c90e..a9b141985f 100644 --- a/var/spack/repos/builtin/packages/cbtf/package.py +++ b/var/spack/repos/builtin/packages/cbtf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ccache/package.py b/var/spack/repos/builtin/packages/ccache/package.py index 1b4019dc87..78a7059913 100644 --- a/var/spack/repos/builtin/packages/ccache/package.py +++ b/var/spack/repos/builtin/packages/ccache/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cctools/package.py b/var/spack/repos/builtin/packages/cctools/package.py index 165d684a9f..ad9e3763c2 100644 --- a/var/spack/repos/builtin/packages/cctools/package.py +++ b/var/spack/repos/builtin/packages/cctools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cdd/package.py b/var/spack/repos/builtin/packages/cdd/package.py index 96414bc54b..4f4d59785e 100644 --- a/var/spack/repos/builtin/packages/cdd/package.py +++ b/var/spack/repos/builtin/packages/cdd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cddlib/package.py b/var/spack/repos/builtin/packages/cddlib/package.py index 002c302599..7c38abd28d 100644 --- a/var/spack/repos/builtin/packages/cddlib/package.py +++ b/var/spack/repos/builtin/packages/cddlib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cdo/package.py b/var/spack/repos/builtin/packages/cdo/package.py index 3cee41b299..898f7ff1b8 100644 --- a/var/spack/repos/builtin/packages/cdo/package.py +++ b/var/spack/repos/builtin/packages/cdo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cereal/package.py b/var/spack/repos/builtin/packages/cereal/package.py index 7f1f103a94..22da01e789 100644 --- a/var/spack/repos/builtin/packages/cereal/package.py +++ b/var/spack/repos/builtin/packages/cereal/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cfitsio/package.py b/var/spack/repos/builtin/packages/cfitsio/package.py index b382f87f5b..40c85413c7 100644 --- a/var/spack/repos/builtin/packages/cfitsio/package.py +++ b/var/spack/repos/builtin/packages/cfitsio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cgal/package.py b/var/spack/repos/builtin/packages/cgal/package.py index 60762006f9..235d02ccde 100644 --- a/var/spack/repos/builtin/packages/cgal/package.py +++ b/var/spack/repos/builtin/packages/cgal/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cgm/package.py b/var/spack/repos/builtin/packages/cgm/package.py index 336cea8867..80e47cbd27 100644 --- a/var/spack/repos/builtin/packages/cgm/package.py +++ b/var/spack/repos/builtin/packages/cgm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cgns/package.py b/var/spack/repos/builtin/packages/cgns/package.py index ba3fd7f821..24f932a8d0 100644 --- a/var/spack/repos/builtin/packages/cgns/package.py +++ b/var/spack/repos/builtin/packages/cgns/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/charm/package.py b/var/spack/repos/builtin/packages/charm/package.py index 9f08d820d2..fd869f4c60 100644 --- a/var/spack/repos/builtin/packages/charm/package.py +++ b/var/spack/repos/builtin/packages/charm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/chombo/package.py b/var/spack/repos/builtin/packages/chombo/package.py index 1ae50e6bc0..3b3cb1e624 100644 --- a/var/spack/repos/builtin/packages/chombo/package.py +++ b/var/spack/repos/builtin/packages/chombo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cityhash/package.py b/var/spack/repos/builtin/packages/cityhash/package.py index b98f39a336..4564d49531 100644 --- a/var/spack/repos/builtin/packages/cityhash/package.py +++ b/var/spack/repos/builtin/packages/cityhash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cleverleaf/package.py b/var/spack/repos/builtin/packages/cleverleaf/package.py index 3bd1f0b5d0..6ce9f51111 100644 --- a/var/spack/repos/builtin/packages/cleverleaf/package.py +++ b/var/spack/repos/builtin/packages/cleverleaf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/clhep/package.py b/var/spack/repos/builtin/packages/clhep/package.py index 02a9da9e27..063188b419 100644 --- a/var/spack/repos/builtin/packages/clhep/package.py +++ b/var/spack/repos/builtin/packages/clhep/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cloog/package.py b/var/spack/repos/builtin/packages/cloog/package.py index a979ae83fc..601806d204 100644 --- a/var/spack/repos/builtin/packages/cloog/package.py +++ b/var/spack/repos/builtin/packages/cloog/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/clustalo/package.py b/var/spack/repos/builtin/packages/clustalo/package.py index 9e985f0cd7..d46b7d467c 100644 --- a/var/spack/repos/builtin/packages/clustalo/package.py +++ b/var/spack/repos/builtin/packages/clustalo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/clustalw/package.py b/var/spack/repos/builtin/packages/clustalw/package.py index 97f193c628..959a11963b 100644 --- a/var/spack/repos/builtin/packages/clustalw/package.py +++ b/var/spack/repos/builtin/packages/clustalw/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py index 70d6c14351..05ba0e8131 100644 --- a/var/spack/repos/builtin/packages/cmake/package.py +++ b/var/spack/repos/builtin/packages/cmake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cmocka/package.py b/var/spack/repos/builtin/packages/cmocka/package.py index c82c38a46a..b0d9414ac6 100644 --- a/var/spack/repos/builtin/packages/cmocka/package.py +++ b/var/spack/repos/builtin/packages/cmocka/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cmor/package.py b/var/spack/repos/builtin/packages/cmor/package.py index 2dcd1c5ba1..8c85875672 100644 --- a/var/spack/repos/builtin/packages/cmor/package.py +++ b/var/spack/repos/builtin/packages/cmor/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cnmem/package.py b/var/spack/repos/builtin/packages/cnmem/package.py index 0c62023952..cdbd0c86d4 100644 --- a/var/spack/repos/builtin/packages/cnmem/package.py +++ b/var/spack/repos/builtin/packages/cnmem/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cntk/package.py b/var/spack/repos/builtin/packages/cntk/package.py index 025498fa8a..d58165379c 100644 --- a/var/spack/repos/builtin/packages/cntk/package.py +++ b/var/spack/repos/builtin/packages/cntk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cntk1bitsgd/package.py b/var/spack/repos/builtin/packages/cntk1bitsgd/package.py index 7cc3c7030a..e6faddf276 100644 --- a/var/spack/repos/builtin/packages/cntk1bitsgd/package.py +++ b/var/spack/repos/builtin/packages/cntk1bitsgd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/coinhsl/package.py b/var/spack/repos/builtin/packages/coinhsl/package.py index 87d866ec58..4af87380b6 100644 --- a/var/spack/repos/builtin/packages/coinhsl/package.py +++ b/var/spack/repos/builtin/packages/coinhsl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/compiz/package.py b/var/spack/repos/builtin/packages/compiz/package.py index 92820db10d..19ceb8f65a 100644 --- a/var/spack/repos/builtin/packages/compiz/package.py +++ b/var/spack/repos/builtin/packages/compiz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/compositeproto/package.py b/var/spack/repos/builtin/packages/compositeproto/package.py index 3d445bd7e8..8ba249536c 100644 --- a/var/spack/repos/builtin/packages/compositeproto/package.py +++ b/var/spack/repos/builtin/packages/compositeproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/conduit/package.py b/var/spack/repos/builtin/packages/conduit/package.py index d97c6534e4..f59d1835b5 100644 --- a/var/spack/repos/builtin/packages/conduit/package.py +++ b/var/spack/repos/builtin/packages/conduit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/constype/package.py b/var/spack/repos/builtin/packages/constype/package.py index 3a62e89727..4efcb5bcd0 100644 --- a/var/spack/repos/builtin/packages/constype/package.py +++ b/var/spack/repos/builtin/packages/constype/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/converge/package.py b/var/spack/repos/builtin/packages/converge/package.py index a6c3b5091d..96b6c24a0a 100644 --- a/var/spack/repos/builtin/packages/converge/package.py +++ b/var/spack/repos/builtin/packages/converge/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/coreutils/package.py b/var/spack/repos/builtin/packages/coreutils/package.py index 7999eb3cf0..beea64a5ee 100644 --- a/var/spack/repos/builtin/packages/coreutils/package.py +++ b/var/spack/repos/builtin/packages/coreutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cosmomc/package.py b/var/spack/repos/builtin/packages/cosmomc/package.py index e04965b25c..acbaa82202 100644 --- a/var/spack/repos/builtin/packages/cosmomc/package.py +++ b/var/spack/repos/builtin/packages/cosmomc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index 2a41de54e0..ca4c783142 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cppad/package.py b/var/spack/repos/builtin/packages/cppad/package.py index c13c2c5be9..11e0dda2d2 100644 --- a/var/spack/repos/builtin/packages/cppad/package.py +++ b/var/spack/repos/builtin/packages/cppad/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cppcheck/package.py b/var/spack/repos/builtin/packages/cppcheck/package.py index 3bf6a46fec..cbdfc0ef0d 100644 --- a/var/spack/repos/builtin/packages/cppcheck/package.py +++ b/var/spack/repos/builtin/packages/cppcheck/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cpprestsdk/package.py b/var/spack/repos/builtin/packages/cpprestsdk/package.py index 6095203563..6cb378a2f3 100644 --- a/var/spack/repos/builtin/packages/cpprestsdk/package.py +++ b/var/spack/repos/builtin/packages/cpprestsdk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cppunit/package.py b/var/spack/repos/builtin/packages/cppunit/package.py index 78956798b5..283175e0bd 100644 --- a/var/spack/repos/builtin/packages/cppunit/package.py +++ b/var/spack/repos/builtin/packages/cppunit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cram/package.py b/var/spack/repos/builtin/packages/cram/package.py index bef26cdcbd..f0c33ae2c6 100644 --- a/var/spack/repos/builtin/packages/cram/package.py +++ b/var/spack/repos/builtin/packages/cram/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cryptopp/package.py b/var/spack/repos/builtin/packages/cryptopp/package.py index 142bd4f253..7ba7a87a0d 100644 --- a/var/spack/repos/builtin/packages/cryptopp/package.py +++ b/var/spack/repos/builtin/packages/cryptopp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cscope/package.py b/var/spack/repos/builtin/packages/cscope/package.py index 8f7ebd5cd7..bbd93976c6 100644 --- a/var/spack/repos/builtin/packages/cscope/package.py +++ b/var/spack/repos/builtin/packages/cscope/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cub/package.py b/var/spack/repos/builtin/packages/cub/package.py index 1c9da5c188..b868410587 100644 --- a/var/spack/repos/builtin/packages/cub/package.py +++ b/var/spack/repos/builtin/packages/cub/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cube/package.py b/var/spack/repos/builtin/packages/cube/package.py index 7164aefce7..f1533a9bd3 100644 --- a/var/spack/repos/builtin/packages/cube/package.py +++ b/var/spack/repos/builtin/packages/cube/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cuda-memtest/package.py b/var/spack/repos/builtin/packages/cuda-memtest/package.py index a11e288b69..16d68d1a19 100644 --- a/var/spack/repos/builtin/packages/cuda-memtest/package.py +++ b/var/spack/repos/builtin/packages/cuda-memtest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cuda/package.py b/var/spack/repos/builtin/packages/cuda/package.py index eabb5a846c..fd59bbe485 100644 --- a/var/spack/repos/builtin/packages/cuda/package.py +++ b/var/spack/repos/builtin/packages/cuda/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cudnn/package.py b/var/spack/repos/builtin/packages/cudnn/package.py index 4340591c16..dcb26af73d 100644 --- a/var/spack/repos/builtin/packages/cudnn/package.py +++ b/var/spack/repos/builtin/packages/cudnn/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/curl/package.py b/var/spack/repos/builtin/packages/curl/package.py index 6f8a3e8625..56cc27de64 100644 --- a/var/spack/repos/builtin/packages/curl/package.py +++ b/var/spack/repos/builtin/packages/curl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/cvs/package.py b/var/spack/repos/builtin/packages/cvs/package.py index e84c1ed92f..e0a5cfdd88 100644 --- a/var/spack/repos/builtin/packages/cvs/package.py +++ b/var/spack/repos/builtin/packages/cvs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py index c5803fb3ad..dba2871c4d 100644 --- a/var/spack/repos/builtin/packages/czmq/package.py +++ b/var/spack/repos/builtin/packages/czmq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py index c40229f83b..fc8f478bf3 100644 --- a/var/spack/repos/builtin/packages/dakota/package.py +++ b/var/spack/repos/builtin/packages/dakota/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/damageproto/package.py b/var/spack/repos/builtin/packages/damageproto/package.py index 22eeeeddcb..8092a33ba5 100644 --- a/var/spack/repos/builtin/packages/damageproto/package.py +++ b/var/spack/repos/builtin/packages/damageproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/damselfly/package.py b/var/spack/repos/builtin/packages/damselfly/package.py index a37728c92b..e78bb21f44 100644 --- a/var/spack/repos/builtin/packages/damselfly/package.py +++ b/var/spack/repos/builtin/packages/damselfly/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/darshan-runtime/package.py b/var/spack/repos/builtin/packages/darshan-runtime/package.py index 93b2744e19..e18ad1de98 100644 --- a/var/spack/repos/builtin/packages/darshan-runtime/package.py +++ b/var/spack/repos/builtin/packages/darshan-runtime/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/darshan-util/package.py b/var/spack/repos/builtin/packages/darshan-util/package.py index 2a970fa95f..968ad669f0 100644 --- a/var/spack/repos/builtin/packages/darshan-util/package.py +++ b/var/spack/repos/builtin/packages/darshan-util/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dash/package.py b/var/spack/repos/builtin/packages/dash/package.py index 823c14a747..3d9b6c823d 100644 --- a/var/spack/repos/builtin/packages/dash/package.py +++ b/var/spack/repos/builtin/packages/dash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/datamash/package.py b/var/spack/repos/builtin/packages/datamash/package.py index a11b156c46..422920ec86 100644 --- a/var/spack/repos/builtin/packages/datamash/package.py +++ b/var/spack/repos/builtin/packages/datamash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dbus/package.py b/var/spack/repos/builtin/packages/dbus/package.py index fdca68f53f..44f6868318 100644 --- a/var/spack/repos/builtin/packages/dbus/package.py +++ b/var/spack/repos/builtin/packages/dbus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index 0148fae7a2..51d851b9b1 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dejagnu/package.py b/var/spack/repos/builtin/packages/dejagnu/package.py index 0ea4aa260a..73b97aaa52 100644 --- a/var/spack/repos/builtin/packages/dejagnu/package.py +++ b/var/spack/repos/builtin/packages/dejagnu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dia/package.py b/var/spack/repos/builtin/packages/dia/package.py index d04cce27dc..ec1583bd26 100644 --- a/var/spack/repos/builtin/packages/dia/package.py +++ b/var/spack/repos/builtin/packages/dia/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/direnv/package.py b/var/spack/repos/builtin/packages/direnv/package.py index 336ea9f907..e1fbd861dc 100644 --- a/var/spack/repos/builtin/packages/direnv/package.py +++ b/var/spack/repos/builtin/packages/direnv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dmxproto/package.py b/var/spack/repos/builtin/packages/dmxproto/package.py index 7aa0251191..2483ccac95 100644 --- a/var/spack/repos/builtin/packages/dmxproto/package.py +++ b/var/spack/repos/builtin/packages/dmxproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/docbook-xml/package.py b/var/spack/repos/builtin/packages/docbook-xml/package.py index cff971f373..65dd37ceae 100644 --- a/var/spack/repos/builtin/packages/docbook-xml/package.py +++ b/var/spack/repos/builtin/packages/docbook-xml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/docbook-xsl/package.py b/var/spack/repos/builtin/packages/docbook-xsl/package.py index 2554e4d7bf..3ff1aebab0 100644 --- a/var/spack/repos/builtin/packages/docbook-xsl/package.py +++ b/var/spack/repos/builtin/packages/docbook-xsl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dos2unix/package.py b/var/spack/repos/builtin/packages/dos2unix/package.py index 4005eb48a0..a76cff21b2 100644 --- a/var/spack/repos/builtin/packages/dos2unix/package.py +++ b/var/spack/repos/builtin/packages/dos2unix/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/double-conversion/package.py b/var/spack/repos/builtin/packages/double-conversion/package.py index 52fa5fc9a1..be4dccdff6 100644 --- a/var/spack/repos/builtin/packages/double-conversion/package.py +++ b/var/spack/repos/builtin/packages/double-conversion/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py index 560e6aa95f..61740fe91a 100644 --- a/var/spack/repos/builtin/packages/doxygen/package.py +++ b/var/spack/repos/builtin/packages/doxygen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dri2proto/package.py b/var/spack/repos/builtin/packages/dri2proto/package.py index 4c906013b4..2ccbbd209f 100644 --- a/var/spack/repos/builtin/packages/dri2proto/package.py +++ b/var/spack/repos/builtin/packages/dri2proto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dri3proto/package.py b/var/spack/repos/builtin/packages/dri3proto/package.py index be8b521aae..60a5d5de6c 100644 --- a/var/spack/repos/builtin/packages/dri3proto/package.py +++ b/var/spack/repos/builtin/packages/dri3proto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dtcmp/package.py b/var/spack/repos/builtin/packages/dtcmp/package.py index e59e246d47..b8aaa07b65 100644 --- a/var/spack/repos/builtin/packages/dtcmp/package.py +++ b/var/spack/repos/builtin/packages/dtcmp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py index 8f9a2ffb4a..752c01787e 100644 --- a/var/spack/repos/builtin/packages/dyninst/package.py +++ b/var/spack/repos/builtin/packages/dyninst/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/easybuild/package.py b/var/spack/repos/builtin/packages/easybuild/package.py index 156601ed65..fb4b53ad84 100644 --- a/var/spack/repos/builtin/packages/easybuild/package.py +++ b/var/spack/repos/builtin/packages/easybuild/package.py @@ -5,7 +5,7 @@ # Created by Kenneth Hoste, kenneth.hoste@gmail.com # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/eccodes/package.py b/var/spack/repos/builtin/packages/eccodes/package.py index 709315e4b4..137f445c69 100644 --- a/var/spack/repos/builtin/packages/eccodes/package.py +++ b/var/spack/repos/builtin/packages/eccodes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/editres/package.py b/var/spack/repos/builtin/packages/editres/package.py index d1823ec6fd..2cbb4053e6 100644 --- a/var/spack/repos/builtin/packages/editres/package.py +++ b/var/spack/repos/builtin/packages/editres/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py index 07277fc3e3..0aefe416e3 100644 --- a/var/spack/repos/builtin/packages/eigen/package.py +++ b/var/spack/repos/builtin/packages/eigen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/elemental/package.py b/var/spack/repos/builtin/packages/elemental/package.py index 0021c7832b..d86ee985f7 100644 --- a/var/spack/repos/builtin/packages/elemental/package.py +++ b/var/spack/repos/builtin/packages/elemental/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index 2594d73c37..b49ac4a53b 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/elk/package.py b/var/spack/repos/builtin/packages/elk/package.py index 23948a1a06..63893fad69 100644 --- a/var/spack/repos/builtin/packages/elk/package.py +++ b/var/spack/repos/builtin/packages/elk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/elpa/package.py b/var/spack/repos/builtin/packages/elpa/package.py index 403e48f2cb..85d1706b2b 100644 --- a/var/spack/repos/builtin/packages/elpa/package.py +++ b/var/spack/repos/builtin/packages/elpa/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/emacs/package.py b/var/spack/repos/builtin/packages/emacs/package.py index 195cb1281f..ff94145578 100644 --- a/var/spack/repos/builtin/packages/emacs/package.py +++ b/var/spack/repos/builtin/packages/emacs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/encodings/package.py b/var/spack/repos/builtin/packages/encodings/package.py index 67b21a6e07..de6e8913b8 100644 --- a/var/spack/repos/builtin/packages/encodings/package.py +++ b/var/spack/repos/builtin/packages/encodings/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/environment-modules/package.py b/var/spack/repos/builtin/packages/environment-modules/package.py index 11ddb12876..293816734f 100644 --- a/var/spack/repos/builtin/packages/environment-modules/package.py +++ b/var/spack/repos/builtin/packages/environment-modules/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/es/package.py b/var/spack/repos/builtin/packages/es/package.py index 3ca39c74a2..3db13d7f7a 100644 --- a/var/spack/repos/builtin/packages/es/package.py +++ b/var/spack/repos/builtin/packages/es/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/esmf/package.py b/var/spack/repos/builtin/packages/esmf/package.py index 9c8b9d2c2e..0866dacdb6 100644 --- a/var/spack/repos/builtin/packages/esmf/package.py +++ b/var/spack/repos/builtin/packages/esmf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/espresso/package.py b/var/spack/repos/builtin/packages/espresso/package.py index b53374fa9e..b77e14ec76 100644 --- a/var/spack/repos/builtin/packages/espresso/package.py +++ b/var/spack/repos/builtin/packages/espresso/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/espressopp/package.py b/var/spack/repos/builtin/packages/espressopp/package.py index 61aad512dc..e71291bec8 100644 --- a/var/spack/repos/builtin/packages/espressopp/package.py +++ b/var/spack/repos/builtin/packages/espressopp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/etsf-io/package.py b/var/spack/repos/builtin/packages/etsf-io/package.py index c1e6f2eded..89ba87c81e 100644 --- a/var/spack/repos/builtin/packages/etsf-io/package.py +++ b/var/spack/repos/builtin/packages/etsf-io/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/everytrace-example/package.py b/var/spack/repos/builtin/packages/everytrace-example/package.py index 17a7ed8658..08d3b2fa67 100644 --- a/var/spack/repos/builtin/packages/everytrace-example/package.py +++ b/var/spack/repos/builtin/packages/everytrace-example/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/everytrace/package.py b/var/spack/repos/builtin/packages/everytrace/package.py index 11d2a66bf4..413bf2a944 100644 --- a/var/spack/repos/builtin/packages/everytrace/package.py +++ b/var/spack/repos/builtin/packages/everytrace/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/evieext/package.py b/var/spack/repos/builtin/packages/evieext/package.py index 8814ae31c0..30ae66c33a 100644 --- a/var/spack/repos/builtin/packages/evieext/package.py +++ b/var/spack/repos/builtin/packages/evieext/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/exmcutils/package.py b/var/spack/repos/builtin/packages/exmcutils/package.py index 73f3df3c9b..85d30c48c2 100644 --- a/var/spack/repos/builtin/packages/exmcutils/package.py +++ b/var/spack/repos/builtin/packages/exmcutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/exodusii/package.py b/var/spack/repos/builtin/packages/exodusii/package.py index 67024673b2..84f2b49843 100644 --- a/var/spack/repos/builtin/packages/exodusii/package.py +++ b/var/spack/repos/builtin/packages/exodusii/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/exonerate/package.py b/var/spack/repos/builtin/packages/exonerate/package.py index 2615d859d6..3821617a70 100644 --- a/var/spack/repos/builtin/packages/exonerate/package.py +++ b/var/spack/repos/builtin/packages/exonerate/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/expat/package.py b/var/spack/repos/builtin/packages/expat/package.py index 13ac816ea5..8f85c2914b 100644 --- a/var/spack/repos/builtin/packages/expat/package.py +++ b/var/spack/repos/builtin/packages/expat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/expect/package.py b/var/spack/repos/builtin/packages/expect/package.py index a8ea99a8ae..fa89a64c9c 100644 --- a/var/spack/repos/builtin/packages/expect/package.py +++ b/var/spack/repos/builtin/packages/expect/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/extrae/package.py b/var/spack/repos/builtin/packages/extrae/package.py index 5a596ab9f7..b68276bae4 100644 --- a/var/spack/repos/builtin/packages/extrae/package.py +++ b/var/spack/repos/builtin/packages/extrae/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/exuberant-ctags/package.py b/var/spack/repos/builtin/packages/exuberant-ctags/package.py index 5d1c1eafc6..8086850809 100644 --- a/var/spack/repos/builtin/packages/exuberant-ctags/package.py +++ b/var/spack/repos/builtin/packages/exuberant-ctags/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/f90cache/package.py b/var/spack/repos/builtin/packages/f90cache/package.py index 1aae152b3e..566e7ca626 100644 --- a/var/spack/repos/builtin/packages/f90cache/package.py +++ b/var/spack/repos/builtin/packages/f90cache/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/farmhash/package.py b/var/spack/repos/builtin/packages/farmhash/package.py index 13ed781d17..90b0cf256f 100644 --- a/var/spack/repos/builtin/packages/farmhash/package.py +++ b/var/spack/repos/builtin/packages/farmhash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fastmath/package.py b/var/spack/repos/builtin/packages/fastmath/package.py index cae9b10ae4..1a483057d3 100644 --- a/var/spack/repos/builtin/packages/fastmath/package.py +++ b/var/spack/repos/builtin/packages/fastmath/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fastqc/package.py b/var/spack/repos/builtin/packages/fastqc/package.py index 21b607c90a..ae06252fc1 100644 --- a/var/spack/repos/builtin/packages/fastqc/package.py +++ b/var/spack/repos/builtin/packages/fastqc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fastx-toolkit/package.py b/var/spack/repos/builtin/packages/fastx-toolkit/package.py index fed54b9b36..7e06ba89ea 100644 --- a/var/spack/repos/builtin/packages/fastx-toolkit/package.py +++ b/var/spack/repos/builtin/packages/fastx-toolkit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fenics/package.py b/var/spack/repos/builtin/packages/fenics/package.py index 1db9614dc2..34afa0d609 100644 --- a/var/spack/repos/builtin/packages/fenics/package.py +++ b/var/spack/repos/builtin/packages/fenics/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ferret/package.py b/var/spack/repos/builtin/packages/ferret/package.py index 4dcff54b8f..f2a32fdd70 100644 --- a/var/spack/repos/builtin/packages/ferret/package.py +++ b/var/spack/repos/builtin/packages/ferret/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ffmpeg/package.py b/var/spack/repos/builtin/packages/ffmpeg/package.py index 810a7b52cc..80017f5eb6 100644 --- a/var/spack/repos/builtin/packages/ffmpeg/package.py +++ b/var/spack/repos/builtin/packages/ffmpeg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -40,8 +40,8 @@ class Ffmpeg(AutotoolsPackage): def configure_args(self): spec = self.spec config_args = ['--enable-pic'] - + if '+shared' in spec: - config_args.append('--enable-shared') - + config_args.append('--enable-shared') + return config_args diff --git a/var/spack/repos/builtin/packages/fftw/package.py b/var/spack/repos/builtin/packages/fftw/package.py index ce45409581..82f49e7ca2 100644 --- a/var/spack/repos/builtin/packages/fftw/package.py +++ b/var/spack/repos/builtin/packages/fftw/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/findutils/package.py b/var/spack/repos/builtin/packages/findutils/package.py index f436e53d1a..74237bc6be 100644 --- a/var/spack/repos/builtin/packages/findutils/package.py +++ b/var/spack/repos/builtin/packages/findutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fio/package.py b/var/spack/repos/builtin/packages/fio/package.py index 09554968ef..0b99ff9cd3 100644 --- a/var/spack/repos/builtin/packages/fio/package.py +++ b/var/spack/repos/builtin/packages/fio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fish/package.py b/var/spack/repos/builtin/packages/fish/package.py index 715d4797e3..474b31d005 100644 --- a/var/spack/repos/builtin/packages/fish/package.py +++ b/var/spack/repos/builtin/packages/fish/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fixesproto/package.py b/var/spack/repos/builtin/packages/fixesproto/package.py index 934848727f..b3fb0a872b 100644 --- a/var/spack/repos/builtin/packages/fixesproto/package.py +++ b/var/spack/repos/builtin/packages/fixesproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flac/package.py b/var/spack/repos/builtin/packages/flac/package.py index 022273ed16..54584224e3 100644 --- a/var/spack/repos/builtin/packages/flac/package.py +++ b/var/spack/repos/builtin/packages/flac/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flann/package.py b/var/spack/repos/builtin/packages/flann/package.py index bb7af21fa9..6505a643d5 100644 --- a/var/spack/repos/builtin/packages/flann/package.py +++ b/var/spack/repos/builtin/packages/flann/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flash/package.py b/var/spack/repos/builtin/packages/flash/package.py index 3c1b82eb58..7f4cd8e27d 100644 --- a/var/spack/repos/builtin/packages/flash/package.py +++ b/var/spack/repos/builtin/packages/flash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flecsale/package.py b/var/spack/repos/builtin/packages/flecsale/package.py index eafc1b7998..b22c553d2a 100644 --- a/var/spack/repos/builtin/packages/flecsale/package.py +++ b/var/spack/repos/builtin/packages/flecsale/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flecsi/package.py b/var/spack/repos/builtin/packages/flecsi/package.py index 24c3e6b4d7..5c0f51b2d1 100644 --- a/var/spack/repos/builtin/packages/flecsi/package.py +++ b/var/spack/repos/builtin/packages/flecsi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py index eda45c28a6..0d720d307c 100644 --- a/var/spack/repos/builtin/packages/flex/package.py +++ b/var/spack/repos/builtin/packages/flex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flint/package.py b/var/spack/repos/builtin/packages/flint/package.py index c39b17db2c..641b96ace4 100644 --- a/var/spack/repos/builtin/packages/flint/package.py +++ b/var/spack/repos/builtin/packages/flint/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fltk/package.py b/var/spack/repos/builtin/packages/fltk/package.py index f29b64b02b..95ec978024 100644 --- a/var/spack/repos/builtin/packages/fltk/package.py +++ b/var/spack/repos/builtin/packages/fltk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/flux/package.py b/var/spack/repos/builtin/packages/flux/package.py index 6f368fbef4..4c80fb1dcc 100644 --- a/var/spack/repos/builtin/packages/flux/package.py +++ b/var/spack/repos/builtin/packages/flux/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py index d417ef8cf3..91837af720 100644 --- a/var/spack/repos/builtin/packages/foam-extend/package.py +++ b/var/spack/repos/builtin/packages/foam-extend/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files for our notice and the LGPL. # # License # ------- diff --git a/var/spack/repos/builtin/packages/folly/package.py b/var/spack/repos/builtin/packages/folly/package.py index bf9eb1cbd0..13b03de39b 100644 --- a/var/spack/repos/builtin/packages/folly/package.py +++ b/var/spack/repos/builtin/packages/folly/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py index bde6f352da..c39b6d3ef2 100644 --- a/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py index 380fcf363e..9da16e5712 100644 --- a/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py index 9782d259b5..c2c4bb3646 100644 --- a/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py index 9b687a7814..300d299d69 100644 --- a/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py b/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py index 14004e9883..2d5f4745ce 100644 --- a/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-alias/package.py b/var/spack/repos/builtin/packages/font-alias/package.py index eb8c79fe2a..4a75c7b731 100644 --- a/var/spack/repos/builtin/packages/font-alias/package.py +++ b/var/spack/repos/builtin/packages/font-alias/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-arabic-misc/package.py b/var/spack/repos/builtin/packages/font-arabic-misc/package.py index 8307d58d6e..f34109c491 100644 --- a/var/spack/repos/builtin/packages/font-arabic-misc/package.py +++ b/var/spack/repos/builtin/packages/font-arabic-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bh-100dpi/package.py b/var/spack/repos/builtin/packages/font-bh-100dpi/package.py index 1d488a6cd9..23305a489b 100644 --- a/var/spack/repos/builtin/packages/font-bh-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-100dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bh-75dpi/package.py b/var/spack/repos/builtin/packages/font-bh-75dpi/package.py index 22420dd887..18d2726de2 100644 --- a/var/spack/repos/builtin/packages/font-bh-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-75dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py index 173195a557..5eb2fbb378 100644 --- a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py index 9066823bc3..4db1ec4978 100644 --- a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bh-ttf/package.py b/var/spack/repos/builtin/packages/font-bh-ttf/package.py index a10b88d355..f571700b29 100644 --- a/var/spack/repos/builtin/packages/font-bh-ttf/package.py +++ b/var/spack/repos/builtin/packages/font-bh-ttf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bh-type1/package.py b/var/spack/repos/builtin/packages/font-bh-type1/package.py index fffc2e4095..60d41103a3 100644 --- a/var/spack/repos/builtin/packages/font-bh-type1/package.py +++ b/var/spack/repos/builtin/packages/font-bh-type1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py b/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py index e8e11ae627..495c371d0d 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py b/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py index 5dd033964b..fd57c53d4f 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py b/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py index e746f241df..040632a4c2 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-bitstream-type1/package.py b/var/spack/repos/builtin/packages/font-bitstream-type1/package.py index 65289685c3..c8d26b3e03 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-type1/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-type1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py b/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py index 07e1330fe6..b1c65250b4 100644 --- a/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-cursor-misc/package.py b/var/spack/repos/builtin/packages/font-cursor-misc/package.py index 6fddc015e3..f96ec0f713 100644 --- a/var/spack/repos/builtin/packages/font-cursor-misc/package.py +++ b/var/spack/repos/builtin/packages/font-cursor-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-daewoo-misc/package.py b/var/spack/repos/builtin/packages/font-daewoo-misc/package.py index 3dd3b59b14..2b092259ac 100644 --- a/var/spack/repos/builtin/packages/font-daewoo-misc/package.py +++ b/var/spack/repos/builtin/packages/font-daewoo-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-dec-misc/package.py b/var/spack/repos/builtin/packages/font-dec-misc/package.py index 035ae3eb15..1537e6f569 100644 --- a/var/spack/repos/builtin/packages/font-dec-misc/package.py +++ b/var/spack/repos/builtin/packages/font-dec-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-ibm-type1/package.py b/var/spack/repos/builtin/packages/font-ibm-type1/package.py index 34bbe85cfb..3b51051a4a 100644 --- a/var/spack/repos/builtin/packages/font-ibm-type1/package.py +++ b/var/spack/repos/builtin/packages/font-ibm-type1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-isas-misc/package.py b/var/spack/repos/builtin/packages/font-isas-misc/package.py index b0575f8ffc..b12a01a14a 100644 --- a/var/spack/repos/builtin/packages/font-isas-misc/package.py +++ b/var/spack/repos/builtin/packages/font-isas-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-jis-misc/package.py b/var/spack/repos/builtin/packages/font-jis-misc/package.py index a5bee3fe31..5d347231db 100644 --- a/var/spack/repos/builtin/packages/font-jis-misc/package.py +++ b/var/spack/repos/builtin/packages/font-jis-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-micro-misc/package.py b/var/spack/repos/builtin/packages/font-micro-misc/package.py index 930a299beb..206bf596a2 100644 --- a/var/spack/repos/builtin/packages/font-micro-misc/package.py +++ b/var/spack/repos/builtin/packages/font-micro-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py b/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py index 4d25552732..6cef597778 100644 --- a/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py b/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py index 6ccdc4e482..66bca90d9b 100644 --- a/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py +++ b/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-misc-meltho/package.py b/var/spack/repos/builtin/packages/font-misc-meltho/package.py index eda84e2b32..2c93678765 100644 --- a/var/spack/repos/builtin/packages/font-misc-meltho/package.py +++ b/var/spack/repos/builtin/packages/font-misc-meltho/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-misc-misc/package.py b/var/spack/repos/builtin/packages/font-misc-misc/package.py index c960d18b39..79ce98c2c1 100644 --- a/var/spack/repos/builtin/packages/font-misc-misc/package.py +++ b/var/spack/repos/builtin/packages/font-misc-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-mutt-misc/package.py b/var/spack/repos/builtin/packages/font-mutt-misc/package.py index a5d4cae060..39c3e256bd 100644 --- a/var/spack/repos/builtin/packages/font-mutt-misc/package.py +++ b/var/spack/repos/builtin/packages/font-mutt-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-schumacher-misc/package.py b/var/spack/repos/builtin/packages/font-schumacher-misc/package.py index 193fa2691e..d209c0d734 100644 --- a/var/spack/repos/builtin/packages/font-schumacher-misc/package.py +++ b/var/spack/repos/builtin/packages/font-schumacher-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py b/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py index 5914a3c9de..66db505a10 100644 --- a/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-sony-misc/package.py b/var/spack/repos/builtin/packages/font-sony-misc/package.py index 145ee20971..792b7556d8 100644 --- a/var/spack/repos/builtin/packages/font-sony-misc/package.py +++ b/var/spack/repos/builtin/packages/font-sony-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-sun-misc/package.py b/var/spack/repos/builtin/packages/font-sun-misc/package.py index dcf5b9e217..3fe3dfb511 100644 --- a/var/spack/repos/builtin/packages/font-sun-misc/package.py +++ b/var/spack/repos/builtin/packages/font-sun-misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-util/package.py b/var/spack/repos/builtin/packages/font-util/package.py index 03a466d00a..5aac7cd59e 100644 --- a/var/spack/repos/builtin/packages/font-util/package.py +++ b/var/spack/repos/builtin/packages/font-util/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py b/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py index 0af366c742..1ee6210641 100644 --- a/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/font-xfree86-type1/package.py b/var/spack/repos/builtin/packages/font-xfree86-type1/package.py index dceac106a9..b20c1c4194 100644 --- a/var/spack/repos/builtin/packages/font-xfree86-type1/package.py +++ b/var/spack/repos/builtin/packages/font-xfree86-type1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fontcacheproto/package.py b/var/spack/repos/builtin/packages/fontcacheproto/package.py index f793aba9cf..d385ab353d 100644 --- a/var/spack/repos/builtin/packages/fontcacheproto/package.py +++ b/var/spack/repos/builtin/packages/fontcacheproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fontconfig/package.py b/var/spack/repos/builtin/packages/fontconfig/package.py index 9f0fc2b795..e7d1068496 100644 --- a/var/spack/repos/builtin/packages/fontconfig/package.py +++ b/var/spack/repos/builtin/packages/fontconfig/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fontsproto/package.py b/var/spack/repos/builtin/packages/fontsproto/package.py index 03e825c2f7..e584a81ce9 100644 --- a/var/spack/repos/builtin/packages/fontsproto/package.py +++ b/var/spack/repos/builtin/packages/fontsproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fonttosfnt/package.py b/var/spack/repos/builtin/packages/fonttosfnt/package.py index e8cc3a6f6f..37f2dfe923 100644 --- a/var/spack/repos/builtin/packages/fonttosfnt/package.py +++ b/var/spack/repos/builtin/packages/fonttosfnt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/freetype/package.py b/var/spack/repos/builtin/packages/freetype/package.py index f574677af9..9d3211f83b 100644 --- a/var/spack/repos/builtin/packages/freetype/package.py +++ b/var/spack/repos/builtin/packages/freetype/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fslsfonts/package.py b/var/spack/repos/builtin/packages/fslsfonts/package.py index 2becf5a346..febba4d6f8 100644 --- a/var/spack/repos/builtin/packages/fslsfonts/package.py +++ b/var/spack/repos/builtin/packages/fslsfonts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/fstobdf/package.py b/var/spack/repos/builtin/packages/fstobdf/package.py index 7b2d433ef2..5fd3ba837f 100644 --- a/var/spack/repos/builtin/packages/fstobdf/package.py +++ b/var/spack/repos/builtin/packages/fstobdf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/funhpc/package.py b/var/spack/repos/builtin/packages/funhpc/package.py index d676e97810..3526118c9e 100644 --- a/var/spack/repos/builtin/packages/funhpc/package.py +++ b/var/spack/repos/builtin/packages/funhpc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gasnet/package.py b/var/spack/repos/builtin/packages/gasnet/package.py index 452704075e..a27cf25dd6 100644 --- a/var/spack/repos/builtin/packages/gasnet/package.py +++ b/var/spack/repos/builtin/packages/gasnet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gawk/package.py b/var/spack/repos/builtin/packages/gawk/package.py index 431e21d6ae..bb331527e6 100644 --- a/var/spack/repos/builtin/packages/gawk/package.py +++ b/var/spack/repos/builtin/packages/gawk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gbenchmark/package.py b/var/spack/repos/builtin/packages/gbenchmark/package.py index a25ddd7a4d..591a5403f0 100644 --- a/var/spack/repos/builtin/packages/gbenchmark/package.py +++ b/var/spack/repos/builtin/packages/gbenchmark/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index 5560e36457..7fa9b81dde 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gccmakedep/package.py b/var/spack/repos/builtin/packages/gccmakedep/package.py index 1e082bb050..a3af53be2d 100644 --- a/var/spack/repos/builtin/packages/gccmakedep/package.py +++ b/var/spack/repos/builtin/packages/gccmakedep/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gccxml/package.py b/var/spack/repos/builtin/packages/gccxml/package.py index ec8363a7ca..8b5bdc7e0f 100644 --- a/var/spack/repos/builtin/packages/gccxml/package.py +++ b/var/spack/repos/builtin/packages/gccxml/package.py @@ -4,7 +4,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gconf/package.py b/var/spack/repos/builtin/packages/gconf/package.py index 6502301784..5bd0c9c37b 100644 --- a/var/spack/repos/builtin/packages/gconf/package.py +++ b/var/spack/repos/builtin/packages/gconf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py index 1b9a4f0818..9d0c7cf4e0 100644 --- a/var/spack/repos/builtin/packages/gdal/package.py +++ b/var/spack/repos/builtin/packages/gdal/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gdb/package.py b/var/spack/repos/builtin/packages/gdb/package.py index d502d2449d..36c1af35fe 100644 --- a/var/spack/repos/builtin/packages/gdb/package.py +++ b/var/spack/repos/builtin/packages/gdb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gdbm/package.py b/var/spack/repos/builtin/packages/gdbm/package.py index b3e405d0ba..488ca4702b 100644 --- a/var/spack/repos/builtin/packages/gdbm/package.py +++ b/var/spack/repos/builtin/packages/gdbm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py index 6b9328e45d..b3f881cc85 100644 --- a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py +++ b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/geant4/package.py b/var/spack/repos/builtin/packages/geant4/package.py index c940c254bc..cb04d67481 100644 --- a/var/spack/repos/builtin/packages/geant4/package.py +++ b/var/spack/repos/builtin/packages/geant4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gemmlowp/package.py b/var/spack/repos/builtin/packages/gemmlowp/package.py index 3cc4a1135f..98bb69b1ba 100644 --- a/var/spack/repos/builtin/packages/gemmlowp/package.py +++ b/var/spack/repos/builtin/packages/gemmlowp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/geos/package.py b/var/spack/repos/builtin/packages/geos/package.py index 2419eed038..bbd712fa2d 100644 --- a/var/spack/repos/builtin/packages/geos/package.py +++ b/var/spack/repos/builtin/packages/geos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gettext/package.py b/var/spack/repos/builtin/packages/gettext/package.py index efb9c3c088..7fff421952 100644 --- a/var/spack/repos/builtin/packages/gettext/package.py +++ b/var/spack/repos/builtin/packages/gettext/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gflags/package.py b/var/spack/repos/builtin/packages/gflags/package.py index 7e04c9b682..57a01f8c78 100644 --- a/var/spack/repos/builtin/packages/gflags/package.py +++ b/var/spack/repos/builtin/packages/gflags/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ghostscript-fonts/package.py b/var/spack/repos/builtin/packages/ghostscript-fonts/package.py index 86c937d555..69b1194322 100644 --- a/var/spack/repos/builtin/packages/ghostscript-fonts/package.py +++ b/var/spack/repos/builtin/packages/ghostscript-fonts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ghostscript/package.py b/var/spack/repos/builtin/packages/ghostscript/package.py index 255abaa6bd..8463dcea0e 100644 --- a/var/spack/repos/builtin/packages/ghostscript/package.py +++ b/var/spack/repos/builtin/packages/ghostscript/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/giflib/package.py b/var/spack/repos/builtin/packages/giflib/package.py index feca5b046b..50077c93f6 100644 --- a/var/spack/repos/builtin/packages/giflib/package.py +++ b/var/spack/repos/builtin/packages/giflib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/git-lfs/package.py b/var/spack/repos/builtin/packages/git-lfs/package.py index 14f8cbe0d3..5711366ea0 100644 --- a/var/spack/repos/builtin/packages/git-lfs/package.py +++ b/var/spack/repos/builtin/packages/git-lfs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py index ca34969bfe..847eff62f3 100644 --- a/var/spack/repos/builtin/packages/git/package.py +++ b/var/spack/repos/builtin/packages/git/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gl2ps/package.py b/var/spack/repos/builtin/packages/gl2ps/package.py index 606e97e27b..eff6402552 100644 --- a/var/spack/repos/builtin/packages/gl2ps/package.py +++ b/var/spack/repos/builtin/packages/gl2ps/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/glew/package.py b/var/spack/repos/builtin/packages/glew/package.py index 5df7c8642f..68ca924de6 100644 --- a/var/spack/repos/builtin/packages/glew/package.py +++ b/var/spack/repos/builtin/packages/glew/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py index 83099fa150..b4b888a487 100644 --- a/var/spack/repos/builtin/packages/glib/package.py +++ b/var/spack/repos/builtin/packages/glib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/glm/package.py b/var/spack/repos/builtin/packages/glm/package.py index c565b3cae7..9825cbdb94 100644 --- a/var/spack/repos/builtin/packages/glm/package.py +++ b/var/spack/repos/builtin/packages/glm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/global/package.py b/var/spack/repos/builtin/packages/global/package.py index fedf41c829..a137dd7dd3 100644 --- a/var/spack/repos/builtin/packages/global/package.py +++ b/var/spack/repos/builtin/packages/global/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/globalarrays/package.py b/var/spack/repos/builtin/packages/globalarrays/package.py index bce1a8f37a..19af1b6301 100644 --- a/var/spack/repos/builtin/packages/globalarrays/package.py +++ b/var/spack/repos/builtin/packages/globalarrays/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -56,5 +56,5 @@ class Globalarrays(CMakePackage): '-DCMAKE_Fortran_COMPILER=%s' % self.compiler.f77, '-DCMAKE_Fortran_FLAGS=-qzerosize' ]) - + return options diff --git a/var/spack/repos/builtin/packages/globus-toolkit/package.py b/var/spack/repos/builtin/packages/globus-toolkit/package.py index 5cdc0689a7..856223ee74 100644 --- a/var/spack/repos/builtin/packages/globus-toolkit/package.py +++ b/var/spack/repos/builtin/packages/globus-toolkit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/glog/package.py b/var/spack/repos/builtin/packages/glog/package.py index 3ea17d2f0c..551f36037a 100644 --- a/var/spack/repos/builtin/packages/glog/package.py +++ b/var/spack/repos/builtin/packages/glog/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/glpk/package.py b/var/spack/repos/builtin/packages/glpk/package.py index da3ccdeef1..15941b4211 100644 --- a/var/spack/repos/builtin/packages/glpk/package.py +++ b/var/spack/repos/builtin/packages/glpk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/glproto/package.py b/var/spack/repos/builtin/packages/glproto/package.py index 8a5eaef660..7013baff38 100644 --- a/var/spack/repos/builtin/packages/glproto/package.py +++ b/var/spack/repos/builtin/packages/glproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gmake/package.py b/var/spack/repos/builtin/packages/gmake/package.py index ed89a46758..5bb4fdb2aa 100644 --- a/var/spack/repos/builtin/packages/gmake/package.py +++ b/var/spack/repos/builtin/packages/gmake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gmime/package.py b/var/spack/repos/builtin/packages/gmime/package.py index 93d0a71021..1882fad2e7 100644 --- a/var/spack/repos/builtin/packages/gmime/package.py +++ b/var/spack/repos/builtin/packages/gmime/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gmp/package.py b/var/spack/repos/builtin/packages/gmp/package.py index 023ecd6069..b7a9fa74cf 100644 --- a/var/spack/repos/builtin/packages/gmp/package.py +++ b/var/spack/repos/builtin/packages/gmp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py index 80598bff83..3c9eff5619 100644 --- a/var/spack/repos/builtin/packages/gmsh/package.py +++ b/var/spack/repos/builtin/packages/gmsh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gnat/package.py b/var/spack/repos/builtin/packages/gnat/package.py index b0ecbc7f5f..e6fb814c08 100644 --- a/var/spack/repos/builtin/packages/gnat/package.py +++ b/var/spack/repos/builtin/packages/gnat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gnu-prolog/package.py b/var/spack/repos/builtin/packages/gnu-prolog/package.py index 1e0487c654..4300d581d2 100644 --- a/var/spack/repos/builtin/packages/gnu-prolog/package.py +++ b/var/spack/repos/builtin/packages/gnu-prolog/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gnupg/package.py b/var/spack/repos/builtin/packages/gnupg/package.py index 0239c15d0e..51987e2dd8 100644 --- a/var/spack/repos/builtin/packages/gnupg/package.py +++ b/var/spack/repos/builtin/packages/gnupg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gnuplot/package.py b/var/spack/repos/builtin/packages/gnuplot/package.py index c2ac6d1ba8..c5d8f315c5 100644 --- a/var/spack/repos/builtin/packages/gnuplot/package.py +++ b/var/spack/repos/builtin/packages/gnuplot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gnutls/package.py b/var/spack/repos/builtin/packages/gnutls/package.py index bef2433ed2..9dfb0713fd 100644 --- a/var/spack/repos/builtin/packages/gnutls/package.py +++ b/var/spack/repos/builtin/packages/gnutls/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/go-bootstrap/package.py b/var/spack/repos/builtin/packages/go-bootstrap/package.py index 43409610e8..7a35308616 100644 --- a/var/spack/repos/builtin/packages/go-bootstrap/package.py +++ b/var/spack/repos/builtin/packages/go-bootstrap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index 05a903ea74..9d6ea49dd8 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gobject-introspection/package.py b/var/spack/repos/builtin/packages/gobject-introspection/package.py index 55ea0369a4..44078d059e 100644 --- a/var/spack/repos/builtin/packages/gobject-introspection/package.py +++ b/var/spack/repos/builtin/packages/gobject-introspection/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/googletest/package.py b/var/spack/repos/builtin/packages/googletest/package.py index 44a96bc170..517655fced 100644 --- a/var/spack/repos/builtin/packages/googletest/package.py +++ b/var/spack/repos/builtin/packages/googletest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gource/package.py b/var/spack/repos/builtin/packages/gource/package.py index 7d12697d63..5118169c7c 100644 --- a/var/spack/repos/builtin/packages/gource/package.py +++ b/var/spack/repos/builtin/packages/gource/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gperf/package.py b/var/spack/repos/builtin/packages/gperf/package.py index e7dffa017a..7e19221e40 100644 --- a/var/spack/repos/builtin/packages/gperf/package.py +++ b/var/spack/repos/builtin/packages/gperf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gperftools/package.py b/var/spack/repos/builtin/packages/gperftools/package.py index 300e0ae765..1c208595ad 100644 --- a/var/spack/repos/builtin/packages/gperftools/package.py +++ b/var/spack/repos/builtin/packages/gperftools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/grackle/package.py b/var/spack/repos/builtin/packages/grackle/package.py index 7e3777158f..02f6f17611 100644 --- a/var/spack/repos/builtin/packages/grackle/package.py +++ b/var/spack/repos/builtin/packages/grackle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gradle/package.py b/var/spack/repos/builtin/packages/gradle/package.py index a5622e70e9..d39ba5e685 100644 --- a/var/spack/repos/builtin/packages/gradle/package.py +++ b/var/spack/repos/builtin/packages/gradle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -27,11 +27,11 @@ from distutils.dir_util import copy_tree class Gradle(Package): - """Gradle is an open source build automation system that builds - upon the concepts of Apache Ant and Apache Maven and introduces - a Groovy-based domain-specific language (DSL) instead of the XML + """Gradle is an open source build automation system that builds + upon the concepts of Apache Ant and Apache Maven and introduces + a Groovy-based domain-specific language (DSL) instead of the XML form used by Apache Maven for declaring the project configuration. - Gradle uses a directed acyclic graph ("DAG") to determine the + Gradle uses a directed acyclic graph ("DAG") to determine the order in which tasks can be run.""" homepage = "https://gradle.org" diff --git a/var/spack/repos/builtin/packages/grandr/package.py b/var/spack/repos/builtin/packages/grandr/package.py index dd56426ef8..e8910b519e 100644 --- a/var/spack/repos/builtin/packages/grandr/package.py +++ b/var/spack/repos/builtin/packages/grandr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/graphlib/package.py b/var/spack/repos/builtin/packages/graphlib/package.py index 1e0eb2bf3b..0ed50001f6 100644 --- a/var/spack/repos/builtin/packages/graphlib/package.py +++ b/var/spack/repos/builtin/packages/graphlib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py index 9a0337e656..9efbc85789 100644 --- a/var/spack/repos/builtin/packages/graphviz/package.py +++ b/var/spack/repos/builtin/packages/graphviz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/grib-api/package.py b/var/spack/repos/builtin/packages/grib-api/package.py index 704ac7bd58..9597964c94 100644 --- a/var/spack/repos/builtin/packages/grib-api/package.py +++ b/var/spack/repos/builtin/packages/grib-api/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py index 424c098733..97fd569d1f 100644 --- a/var/spack/repos/builtin/packages/gromacs/package.py +++ b/var/spack/repos/builtin/packages/gromacs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gsl/package.py b/var/spack/repos/builtin/packages/gsl/package.py index f13a9a66e8..4c95612d6d 100644 --- a/var/spack/repos/builtin/packages/gsl/package.py +++ b/var/spack/repos/builtin/packages/gsl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gtkplus/package.py b/var/spack/repos/builtin/packages/gtkplus/package.py index ac34eeebcb..1b85bb0a4c 100644 --- a/var/spack/repos/builtin/packages/gtkplus/package.py +++ b/var/spack/repos/builtin/packages/gtkplus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/gts/package.py b/var/spack/repos/builtin/packages/gts/package.py index ea9443fb9d..adac0e1d05 100644 --- a/var/spack/repos/builtin/packages/gts/package.py +++ b/var/spack/repos/builtin/packages/gts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/guile/package.py b/var/spack/repos/builtin/packages/guile/package.py index 90847a0088..ff3ca84b00 100644 --- a/var/spack/repos/builtin/packages/guile/package.py +++ b/var/spack/repos/builtin/packages/guile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/h5hut/package.py b/var/spack/repos/builtin/packages/h5hut/package.py index b12549df0d..5b0a9fa5a2 100644 --- a/var/spack/repos/builtin/packages/h5hut/package.py +++ b/var/spack/repos/builtin/packages/h5hut/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/h5part/package.py b/var/spack/repos/builtin/packages/h5part/package.py index 3ff407accd..71c569d379 100644 --- a/var/spack/repos/builtin/packages/h5part/package.py +++ b/var/spack/repos/builtin/packages/h5part/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/h5utils/package.py b/var/spack/repos/builtin/packages/h5utils/package.py index 2a51ca22f2..0ed9516f34 100644 --- a/var/spack/repos/builtin/packages/h5utils/package.py +++ b/var/spack/repos/builtin/packages/h5utils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/h5z-zfp/package.py b/var/spack/repos/builtin/packages/h5z-zfp/package.py index b98823a1bd..0063c2fd37 100644 --- a/var/spack/repos/builtin/packages/h5z-zfp/package.py +++ b/var/spack/repos/builtin/packages/h5z-zfp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hadoop/package.py b/var/spack/repos/builtin/packages/hadoop/package.py index a87b19a8cc..4981a0bb58 100644 --- a/var/spack/repos/builtin/packages/hadoop/package.py +++ b/var/spack/repos/builtin/packages/hadoop/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/harfbuzz/package.py b/var/spack/repos/builtin/packages/harfbuzz/package.py index 0ae8e21e1b..5323607fb8 100644 --- a/var/spack/repos/builtin/packages/harfbuzz/package.py +++ b/var/spack/repos/builtin/packages/harfbuzz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/harminv/package.py b/var/spack/repos/builtin/packages/harminv/package.py index 67baf42b5d..d96e31b3c3 100644 --- a/var/spack/repos/builtin/packages/harminv/package.py +++ b/var/spack/repos/builtin/packages/harminv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hdf/package.py b/var/spack/repos/builtin/packages/hdf/package.py index 2554bd0f96..3944f91124 100644 --- a/var/spack/repos/builtin/packages/hdf/package.py +++ b/var/spack/repos/builtin/packages/hdf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hdf5-blosc/package.py b/var/spack/repos/builtin/packages/hdf5-blosc/package.py index 288f958134..95d37cc02f 100644 --- a/var/spack/repos/builtin/packages/hdf5-blosc/package.py +++ b/var/spack/repos/builtin/packages/hdf5-blosc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 2f2f016177..782b7c32cf 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/help2man/package.py b/var/spack/repos/builtin/packages/help2man/package.py index 506b1c1465..d4a8ba9fe4 100644 --- a/var/spack/repos/builtin/packages/help2man/package.py +++ b/var/spack/repos/builtin/packages/help2man/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hepmc/package.py b/var/spack/repos/builtin/packages/hepmc/package.py index ab80dcf6ba..dfad9adb48 100644 --- a/var/spack/repos/builtin/packages/hepmc/package.py +++ b/var/spack/repos/builtin/packages/hepmc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/heppdt/package.py b/var/spack/repos/builtin/packages/heppdt/package.py index 65946fb102..4a534a8c8a 100644 --- a/var/spack/repos/builtin/packages/heppdt/package.py +++ b/var/spack/repos/builtin/packages/heppdt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/highfive/package.py b/var/spack/repos/builtin/packages/highfive/package.py index 3ee9cfeba0..2a071d7958 100644 --- a/var/spack/repos/builtin/packages/highfive/package.py +++ b/var/spack/repos/builtin/packages/highfive/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/highwayhash/package.py b/var/spack/repos/builtin/packages/highwayhash/package.py index 8abc1cab86..031f526cdb 100644 --- a/var/spack/repos/builtin/packages/highwayhash/package.py +++ b/var/spack/repos/builtin/packages/highwayhash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hmmer/package.py b/var/spack/repos/builtin/packages/hmmer/package.py index 6a236e9fc9..6f152d85d6 100644 --- a/var/spack/repos/builtin/packages/hmmer/package.py +++ b/var/spack/repos/builtin/packages/hmmer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py index bc1ffd4d5b..9c1ad387b2 100644 --- a/var/spack/repos/builtin/packages/hoomd-blue/package.py +++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py b/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py index 86d95a1e21..dfc4529642 100644 --- a/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py +++ b/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hpctoolkit/package.py b/var/spack/repos/builtin/packages/hpctoolkit/package.py index b6e03627de..8239f51a0b 100644 --- a/var/spack/repos/builtin/packages/hpctoolkit/package.py +++ b/var/spack/repos/builtin/packages/hpctoolkit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hpl/package.py b/var/spack/repos/builtin/packages/hpl/package.py index 166e3d8d58..460f131e6a 100644 --- a/var/spack/repos/builtin/packages/hpl/package.py +++ b/var/spack/repos/builtin/packages/hpl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hpx5/package.py b/var/spack/repos/builtin/packages/hpx5/package.py index 55f253f467..12e5c80016 100644 --- a/var/spack/repos/builtin/packages/hpx5/package.py +++ b/var/spack/repos/builtin/packages/hpx5/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hsakmt/package.py b/var/spack/repos/builtin/packages/hsakmt/package.py index 534d5e4c84..2adb852a60 100644 --- a/var/spack/repos/builtin/packages/hsakmt/package.py +++ b/var/spack/repos/builtin/packages/hsakmt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hstr/package.py b/var/spack/repos/builtin/packages/hstr/package.py index 0efae70d87..ce0650e5e8 100644 --- a/var/spack/repos/builtin/packages/hstr/package.py +++ b/var/spack/repos/builtin/packages/hstr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/htop/package.py b/var/spack/repos/builtin/packages/htop/package.py index 45dc6f3132..d88a6fe3c9 100644 --- a/var/spack/repos/builtin/packages/htop/package.py +++ b/var/spack/repos/builtin/packages/htop/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/htslib/package.py b/var/spack/repos/builtin/packages/htslib/package.py index 8914a5c1e9..4c033c4272 100644 --- a/var/spack/repos/builtin/packages/htslib/package.py +++ b/var/spack/repos/builtin/packages/htslib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/httpie/package.py b/var/spack/repos/builtin/packages/httpie/package.py index 0981dc2d3d..8068ffc9b5 100644 --- a/var/spack/repos/builtin/packages/httpie/package.py +++ b/var/spack/repos/builtin/packages/httpie/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -42,6 +42,6 @@ class Httpie(PythonPackage): depends_on('py-pysocks', type=('build', 'run'), when="+socks") # Concretization problem breaks this. Unconditional for now... # https://github.com/LLNL/spack/issues/3628 - # depends_on('py-argparse@1.2.1:', type=('build', 'run'), + # depends_on('py-argparse@1.2.1:', type=('build', 'run'), # when='^python@:2.6,3.0:3.1') depends_on('py-argparse@1.2.1:', type=('build', 'run')) diff --git a/var/spack/repos/builtin/packages/hub/package.py b/var/spack/repos/builtin/packages/hub/package.py index 5d7c082897..c038a67761 100644 --- a/var/spack/repos/builtin/packages/hub/package.py +++ b/var/spack/repos/builtin/packages/hub/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hunspell/package.py b/var/spack/repos/builtin/packages/hunspell/package.py index 4e4cdce948..15c1079e4d 100644 --- a/var/spack/repos/builtin/packages/hunspell/package.py +++ b/var/spack/repos/builtin/packages/hunspell/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hwloc/package.py b/var/spack/repos/builtin/packages/hwloc/package.py index b2db0b3b38..f7ccaa4f38 100644 --- a/var/spack/repos/builtin/packages/hwloc/package.py +++ b/var/spack/repos/builtin/packages/hwloc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hydra/package.py b/var/spack/repos/builtin/packages/hydra/package.py index fd894b68ee..1c1632d418 100644 --- a/var/spack/repos/builtin/packages/hydra/package.py +++ b/var/spack/repos/builtin/packages/hydra/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py index 9af1fecd8c..8dca02d4dd 100644 --- a/var/spack/repos/builtin/packages/hypre/package.py +++ b/var/spack/repos/builtin/packages/hypre/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ibmisc/package.py b/var/spack/repos/builtin/packages/ibmisc/package.py index 181ae6d92b..8640e5d3c5 100644 --- a/var/spack/repos/builtin/packages/ibmisc/package.py +++ b/var/spack/repos/builtin/packages/ibmisc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/iceauth/package.py b/var/spack/repos/builtin/packages/iceauth/package.py index 6af0d0b4bb..bd2493347b 100644 --- a/var/spack/repos/builtin/packages/iceauth/package.py +++ b/var/spack/repos/builtin/packages/iceauth/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/icet/package.py b/var/spack/repos/builtin/packages/icet/package.py index ca3251ac40..126375c6c2 100644 --- a/var/spack/repos/builtin/packages/icet/package.py +++ b/var/spack/repos/builtin/packages/icet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ico/package.py b/var/spack/repos/builtin/packages/ico/package.py index 2163e8566e..a81f004a2e 100644 --- a/var/spack/repos/builtin/packages/ico/package.py +++ b/var/spack/repos/builtin/packages/ico/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/icu4c/package.py b/var/spack/repos/builtin/packages/icu4c/package.py index 5b69dfea0f..f5f75931b6 100644 --- a/var/spack/repos/builtin/packages/icu4c/package.py +++ b/var/spack/repos/builtin/packages/icu4c/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/id3lib/package.py b/var/spack/repos/builtin/packages/id3lib/package.py index 0e8a40394f..65030085de 100644 --- a/var/spack/repos/builtin/packages/id3lib/package.py +++ b/var/spack/repos/builtin/packages/id3lib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ilmbase/package.py b/var/spack/repos/builtin/packages/ilmbase/package.py index 7f478f2341..23e77ccfa3 100644 --- a/var/spack/repos/builtin/packages/ilmbase/package.py +++ b/var/spack/repos/builtin/packages/ilmbase/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/image-magick/package.py b/var/spack/repos/builtin/packages/image-magick/package.py index 8d0804ecc9..77f7f795e7 100644 --- a/var/spack/repos/builtin/packages/image-magick/package.py +++ b/var/spack/repos/builtin/packages/image-magick/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/imake/package.py b/var/spack/repos/builtin/packages/imake/package.py index b15a019156..23dbd45723 100644 --- a/var/spack/repos/builtin/packages/imake/package.py +++ b/var/spack/repos/builtin/packages/imake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/inputproto/package.py b/var/spack/repos/builtin/packages/inputproto/package.py index 220c314ac6..b2ece2fb14 100644 --- a/var/spack/repos/builtin/packages/inputproto/package.py +++ b/var/spack/repos/builtin/packages/inputproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel-daal/package.py b/var/spack/repos/builtin/packages/intel-daal/package.py index 9ccd291bcc..7fb6371e7e 100644 --- a/var/spack/repos/builtin/packages/intel-daal/package.py +++ b/var/spack/repos/builtin/packages/intel-daal/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel-gpu-tools/package.py b/var/spack/repos/builtin/packages/intel-gpu-tools/package.py index 53a6a04e3f..004d91e7de 100644 --- a/var/spack/repos/builtin/packages/intel-gpu-tools/package.py +++ b/var/spack/repos/builtin/packages/intel-gpu-tools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel-ipp/package.py b/var/spack/repos/builtin/packages/intel-ipp/package.py index 3c247e94c7..c9cfa609c8 100644 --- a/var/spack/repos/builtin/packages/intel-ipp/package.py +++ b/var/spack/repos/builtin/packages/intel-ipp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index 0cce184e47..e1b4049ef8 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py index 75aa5257aa..d0167552b0 100644 --- a/var/spack/repos/builtin/packages/intel-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-mpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py index a1b59563ba..01bdf29bb2 100644 --- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py +++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intel/package.py b/var/spack/repos/builtin/packages/intel/package.py index 74ff4ca325..e013811f66 100644 --- a/var/spack/repos/builtin/packages/intel/package.py +++ b/var/spack/repos/builtin/packages/intel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/intltool/package.py b/var/spack/repos/builtin/packages/intltool/package.py index a9e3a8a062..c54cae1323 100644 --- a/var/spack/repos/builtin/packages/intltool/package.py +++ b/var/spack/repos/builtin/packages/intltool/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ior/package.py b/var/spack/repos/builtin/packages/ior/package.py index 04e32d8887..ef5fa5b7be 100644 --- a/var/spack/repos/builtin/packages/ior/package.py +++ b/var/spack/repos/builtin/packages/ior/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/iozone/package.py b/var/spack/repos/builtin/packages/iozone/package.py index 530c609f0d..9278b881b0 100644 --- a/var/spack/repos/builtin/packages/iozone/package.py +++ b/var/spack/repos/builtin/packages/iozone/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py index d5bc0b21a4..77faeb8051 100644 --- a/var/spack/repos/builtin/packages/ipopt/package.py +++ b/var/spack/repos/builtin/packages/ipopt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/isaac-server/package.py b/var/spack/repos/builtin/packages/isaac-server/package.py index c88a465e21..75e80959ac 100644 --- a/var/spack/repos/builtin/packages/isaac-server/package.py +++ b/var/spack/repos/builtin/packages/isaac-server/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/isaac/package.py b/var/spack/repos/builtin/packages/isaac/package.py index 390006174e..e54e00630b 100644 --- a/var/spack/repos/builtin/packages/isaac/package.py +++ b/var/spack/repos/builtin/packages/isaac/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/isl/package.py b/var/spack/repos/builtin/packages/isl/package.py index 530864d4d3..bc7c240e1d 100644 --- a/var/spack/repos/builtin/packages/isl/package.py +++ b/var/spack/repos/builtin/packages/isl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/itstool/package.py b/var/spack/repos/builtin/packages/itstool/package.py index c78e740499..3aa2885006 100644 --- a/var/spack/repos/builtin/packages/itstool/package.py +++ b/var/spack/repos/builtin/packages/itstool/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jansson/package.py b/var/spack/repos/builtin/packages/jansson/package.py index e6100607aa..f6c9d8b799 100644 --- a/var/spack/repos/builtin/packages/jansson/package.py +++ b/var/spack/repos/builtin/packages/jansson/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jasper/package.py b/var/spack/repos/builtin/packages/jasper/package.py index d4bb00b39e..ed188ca922 100644 --- a/var/spack/repos/builtin/packages/jasper/package.py +++ b/var/spack/repos/builtin/packages/jasper/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jdk/package.py b/var/spack/repos/builtin/packages/jdk/package.py index 9939772f47..a018529bae 100644 --- a/var/spack/repos/builtin/packages/jdk/package.py +++ b/var/spack/repos/builtin/packages/jdk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jemalloc/package.py b/var/spack/repos/builtin/packages/jemalloc/package.py index 2f1354d1b2..82f0fbc998 100644 --- a/var/spack/repos/builtin/packages/jemalloc/package.py +++ b/var/spack/repos/builtin/packages/jemalloc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jmol/package.py b/var/spack/repos/builtin/packages/jmol/package.py index ec58fa844a..3529515d3f 100644 --- a/var/spack/repos/builtin/packages/jmol/package.py +++ b/var/spack/repos/builtin/packages/jmol/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jpeg/package.py b/var/spack/repos/builtin/packages/jpeg/package.py index 5c45a2889c..babb6e5f82 100644 --- a/var/spack/repos/builtin/packages/jpeg/package.py +++ b/var/spack/repos/builtin/packages/jpeg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jq/package.py b/var/spack/repos/builtin/packages/jq/package.py index 28e1c4dcfb..06abcd461f 100644 --- a/var/spack/repos/builtin/packages/jq/package.py +++ b/var/spack/repos/builtin/packages/jq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/json-c/package.py b/var/spack/repos/builtin/packages/json-c/package.py index d5ec92f2bd..986538c445 100644 --- a/var/spack/repos/builtin/packages/json-c/package.py +++ b/var/spack/repos/builtin/packages/json-c/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/jsoncpp/package.py b/var/spack/repos/builtin/packages/jsoncpp/package.py index 5169b338ee..d21b948264 100644 --- a/var/spack/repos/builtin/packages/jsoncpp/package.py +++ b/var/spack/repos/builtin/packages/jsoncpp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/judy/package.py b/var/spack/repos/builtin/packages/judy/package.py index ddcec05c22..7e62ca3e99 100644 --- a/var/spack/repos/builtin/packages/judy/package.py +++ b/var/spack/repos/builtin/packages/judy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py index ad44d02619..61ffd2efc6 100644 --- a/var/spack/repos/builtin/packages/julia/package.py +++ b/var/spack/repos/builtin/packages/julia/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/kaldi/package.py b/var/spack/repos/builtin/packages/kaldi/package.py index d2344d2838..c149c944ce 100644 --- a/var/spack/repos/builtin/packages/kaldi/package.py +++ b/var/spack/repos/builtin/packages/kaldi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/kbproto/package.py b/var/spack/repos/builtin/packages/kbproto/package.py index aaf4c9e1d1..9a141cc7f3 100644 --- a/var/spack/repos/builtin/packages/kbproto/package.py +++ b/var/spack/repos/builtin/packages/kbproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/kdiff3/package.py b/var/spack/repos/builtin/packages/kdiff3/package.py index 48f4b9c379..f03d9d00b9 100644 --- a/var/spack/repos/builtin/packages/kdiff3/package.py +++ b/var/spack/repos/builtin/packages/kdiff3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/kealib/package.py b/var/spack/repos/builtin/packages/kealib/package.py index 5346fc8cb9..b417c6be78 100644 --- a/var/spack/repos/builtin/packages/kealib/package.py +++ b/var/spack/repos/builtin/packages/kealib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/kokkos/package.py b/var/spack/repos/builtin/packages/kokkos/package.py index 00eadfa548..2a82a4c5d6 100644 --- a/var/spack/repos/builtin/packages/kokkos/package.py +++ b/var/spack/repos/builtin/packages/kokkos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/kripke/package.py b/var/spack/repos/builtin/packages/kripke/package.py index cf8d2b7e39..1be19448a9 100644 --- a/var/spack/repos/builtin/packages/kripke/package.py +++ b/var/spack/repos/builtin/packages/kripke/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lammps/package.py b/var/spack/repos/builtin/packages/lammps/package.py index 6c80873f14..c1909451d1 100644 --- a/var/spack/repos/builtin/packages/lammps/package.py +++ b/var/spack/repos/builtin/packages/lammps/package.py @@ -8,7 +8,7 @@ # # For details, see https://github.com/llnl/spack # -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as # published by the Free Software Foundation) version 2.1, February 1999. diff --git a/var/spack/repos/builtin/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py index c7b44e35df..7362a68050 100644 --- a/var/spack/repos/builtin/packages/launchmon/package.py +++ b/var/spack/repos/builtin/packages/launchmon/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lbann/package.py b/var/spack/repos/builtin/packages/lbann/package.py index 38839c9bf0..b79f9244c9 100644 --- a/var/spack/repos/builtin/packages/lbann/package.py +++ b/var/spack/repos/builtin/packages/lbann/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lbxproxy/package.py b/var/spack/repos/builtin/packages/lbxproxy/package.py index 3895134a7c..b7c65d72c0 100644 --- a/var/spack/repos/builtin/packages/lbxproxy/package.py +++ b/var/spack/repos/builtin/packages/lbxproxy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lcms/package.py b/var/spack/repos/builtin/packages/lcms/package.py index 5025e68c4a..a7b8f86d5f 100644 --- a/var/spack/repos/builtin/packages/lcms/package.py +++ b/var/spack/repos/builtin/packages/lcms/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/legion/package.py b/var/spack/repos/builtin/packages/legion/package.py index 783bd417a0..79a1ee533d 100644 --- a/var/spack/repos/builtin/packages/legion/package.py +++ b/var/spack/repos/builtin/packages/legion/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/leveldb/package.py b/var/spack/repos/builtin/packages/leveldb/package.py index 7d2c470b60..ec52161b64 100644 --- a/var/spack/repos/builtin/packages/leveldb/package.py +++ b/var/spack/repos/builtin/packages/leveldb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libaio/package.py b/var/spack/repos/builtin/packages/libaio/package.py index c34ac13e60..e7f2a7487b 100644 --- a/var/spack/repos/builtin/packages/libaio/package.py +++ b/var/spack/repos/builtin/packages/libaio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libapplewm/package.py b/var/spack/repos/builtin/packages/libapplewm/package.py index 35091985e3..053555b572 100644 --- a/var/spack/repos/builtin/packages/libapplewm/package.py +++ b/var/spack/repos/builtin/packages/libapplewm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libarchive/package.py b/var/spack/repos/builtin/packages/libarchive/package.py index 0edb3521d1..cc99e77278 100644 --- a/var/spack/repos/builtin/packages/libarchive/package.py +++ b/var/spack/repos/builtin/packages/libarchive/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libassuan/package.py b/var/spack/repos/builtin/packages/libassuan/package.py index 9c53bd5e4b..53a3bc69e5 100644 --- a/var/spack/repos/builtin/packages/libassuan/package.py +++ b/var/spack/repos/builtin/packages/libassuan/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libatomic-ops/package.py b/var/spack/repos/builtin/packages/libatomic-ops/package.py index 74f95079e1..5600509212 100644 --- a/var/spack/repos/builtin/packages/libatomic-ops/package.py +++ b/var/spack/repos/builtin/packages/libatomic-ops/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libbson/package.py b/var/spack/repos/builtin/packages/libbson/package.py index 4f5b9011e9..1eaa1c9b78 100644 --- a/var/spack/repos/builtin/packages/libbson/package.py +++ b/var/spack/repos/builtin/packages/libbson/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libcanberra/package.py b/var/spack/repos/builtin/packages/libcanberra/package.py index dfeb5c9c3e..840cdc4de3 100644 --- a/var/spack/repos/builtin/packages/libcanberra/package.py +++ b/var/spack/repos/builtin/packages/libcanberra/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libcap/package.py b/var/spack/repos/builtin/packages/libcap/package.py index a0e3065c88..b5b25069a3 100644 --- a/var/spack/repos/builtin/packages/libcap/package.py +++ b/var/spack/repos/builtin/packages/libcap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libcerf/package.py b/var/spack/repos/builtin/packages/libcerf/package.py index 82637431d6..8d75ab3a28 100644 --- a/var/spack/repos/builtin/packages/libcerf/package.py +++ b/var/spack/repos/builtin/packages/libcerf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libcircle/package.py b/var/spack/repos/builtin/packages/libcircle/package.py index e106329219..ec9eb76238 100644 --- a/var/spack/repos/builtin/packages/libcircle/package.py +++ b/var/spack/repos/builtin/packages/libcircle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libconfig/package.py b/var/spack/repos/builtin/packages/libconfig/package.py index 54aeec5b2f..76bf314f09 100644 --- a/var/spack/repos/builtin/packages/libconfig/package.py +++ b/var/spack/repos/builtin/packages/libconfig/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libctl/package.py b/var/spack/repos/builtin/packages/libctl/package.py index 7357939c1b..1364b5de0e 100644 --- a/var/spack/repos/builtin/packages/libctl/package.py +++ b/var/spack/repos/builtin/packages/libctl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libdivsufsort/package.py b/var/spack/repos/builtin/packages/libdivsufsort/package.py index 88355f8725..df51b7c37e 100644 --- a/var/spack/repos/builtin/packages/libdivsufsort/package.py +++ b/var/spack/repos/builtin/packages/libdivsufsort/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libdmx/package.py b/var/spack/repos/builtin/packages/libdmx/package.py index 2aeb5b9fbb..5c4106ca64 100644 --- a/var/spack/repos/builtin/packages/libdmx/package.py +++ b/var/spack/repos/builtin/packages/libdmx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libdrm/package.py b/var/spack/repos/builtin/packages/libdrm/package.py index 781e792884..00422b4417 100644 --- a/var/spack/repos/builtin/packages/libdrm/package.py +++ b/var/spack/repos/builtin/packages/libdrm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py index 153b243e98..32144e96ba 100644 --- a/var/spack/repos/builtin/packages/libdwarf/package.py +++ b/var/spack/repos/builtin/packages/libdwarf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -52,11 +52,9 @@ class Libdwarf(Package): parallel = False - def patch(self): filter_file(r'^typedef struct Elf Elf;$', '', 'libdwarf/libdwarf.h.in') - def install(self, spec, prefix): # elfutils contains a dwarf.h that conflicts with libdwarf's diff --git a/var/spack/repos/builtin/packages/libedit/package.py b/var/spack/repos/builtin/packages/libedit/package.py index 8b09436921..4fd61ec6c8 100644 --- a/var/spack/repos/builtin/packages/libedit/package.py +++ b/var/spack/repos/builtin/packages/libedit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py index 68db7b99c2..965c611049 100644 --- a/var/spack/repos/builtin/packages/libelf/package.py +++ b/var/spack/repos/builtin/packages/libelf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libemos/package.py b/var/spack/repos/builtin/packages/libemos/package.py index 9670e7529e..371a8437b7 100644 --- a/var/spack/repos/builtin/packages/libemos/package.py +++ b/var/spack/repos/builtin/packages/libemos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libepoxy/package.py b/var/spack/repos/builtin/packages/libepoxy/package.py index 32c95fdda4..705d82890a 100644 --- a/var/spack/repos/builtin/packages/libepoxy/package.py +++ b/var/spack/repos/builtin/packages/libepoxy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libevent/package.py b/var/spack/repos/builtin/packages/libevent/package.py index f06c46a715..93711491fa 100644 --- a/var/spack/repos/builtin/packages/libevent/package.py +++ b/var/spack/repos/builtin/packages/libevent/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libffi/package.py b/var/spack/repos/builtin/packages/libffi/package.py index 79ba50d77a..67369447c9 100644 --- a/var/spack/repos/builtin/packages/libffi/package.py +++ b/var/spack/repos/builtin/packages/libffi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libfontenc/package.py b/var/spack/repos/builtin/packages/libfontenc/package.py index 945f74ccad..d80c5bde6e 100644 --- a/var/spack/repos/builtin/packages/libfontenc/package.py +++ b/var/spack/repos/builtin/packages/libfontenc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libfs/package.py b/var/spack/repos/builtin/packages/libfs/package.py index 96cb396b0a..462d925a35 100644 --- a/var/spack/repos/builtin/packages/libfs/package.py +++ b/var/spack/repos/builtin/packages/libfs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libgcrypt/package.py b/var/spack/repos/builtin/packages/libgcrypt/package.py index b196adc18b..31ab85c0ee 100644 --- a/var/spack/repos/builtin/packages/libgcrypt/package.py +++ b/var/spack/repos/builtin/packages/libgcrypt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py index d3cb549f4c..6f6c43d9f0 100644 --- a/var/spack/repos/builtin/packages/libgd/package.py +++ b/var/spack/repos/builtin/packages/libgd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libgit2/package.py b/var/spack/repos/builtin/packages/libgit2/package.py index d3163e3923..ae53612ce6 100644 --- a/var/spack/repos/builtin/packages/libgit2/package.py +++ b/var/spack/repos/builtin/packages/libgit2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libgpg-error/package.py b/var/spack/repos/builtin/packages/libgpg-error/package.py index e0565f2c4c..3d12c235d3 100644 --- a/var/spack/repos/builtin/packages/libgpg-error/package.py +++ b/var/spack/repos/builtin/packages/libgpg-error/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libgpuarray/package.py b/var/spack/repos/builtin/packages/libgpuarray/package.py index 73cbc33385..0c42e90f16 100644 --- a/var/spack/repos/builtin/packages/libgpuarray/package.py +++ b/var/spack/repos/builtin/packages/libgpuarray/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libgtextutils/package.py b/var/spack/repos/builtin/packages/libgtextutils/package.py index adecc6c7f7..830e441316 100644 --- a/var/spack/repos/builtin/packages/libgtextutils/package.py +++ b/var/spack/repos/builtin/packages/libgtextutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libharu/package.py b/var/spack/repos/builtin/packages/libharu/package.py index 54477fc7b5..a262a0badc 100644 --- a/var/spack/repos/builtin/packages/libharu/package.py +++ b/var/spack/repos/builtin/packages/libharu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libhio/package.py b/var/spack/repos/builtin/packages/libhio/package.py index d26811daf7..12ef32cd90 100644 --- a/var/spack/repos/builtin/packages/libhio/package.py +++ b/var/spack/repos/builtin/packages/libhio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libice/package.py b/var/spack/repos/builtin/packages/libice/package.py index 36436df501..b11bca16b4 100644 --- a/var/spack/repos/builtin/packages/libice/package.py +++ b/var/spack/repos/builtin/packages/libice/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libiconv/package.py b/var/spack/repos/builtin/packages/libiconv/package.py index 571088c562..4bc2f52649 100644 --- a/var/spack/repos/builtin/packages/libiconv/package.py +++ b/var/spack/repos/builtin/packages/libiconv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libint/package.py b/var/spack/repos/builtin/packages/libint/package.py index 569aa68b68..3853d2c57f 100644 --- a/var/spack/repos/builtin/packages/libint/package.py +++ b/var/spack/repos/builtin/packages/libint/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py index 8b9413bc86..3573390b7d 100644 --- a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py +++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libksba/package.py b/var/spack/repos/builtin/packages/libksba/package.py index ab9bcedc27..b796e7a562 100644 --- a/var/spack/repos/builtin/packages/libksba/package.py +++ b/var/spack/repos/builtin/packages/libksba/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/liblbxutil/package.py b/var/spack/repos/builtin/packages/liblbxutil/package.py index fe1be09cf9..0cd4c5767b 100644 --- a/var/spack/repos/builtin/packages/liblbxutil/package.py +++ b/var/spack/repos/builtin/packages/liblbxutil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libmatheval/package.py b/var/spack/repos/builtin/packages/libmatheval/package.py index 7af0a2e52a..a13c9000de 100644 --- a/var/spack/repos/builtin/packages/libmatheval/package.py +++ b/var/spack/repos/builtin/packages/libmatheval/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libmesh/package.py b/var/spack/repos/builtin/packages/libmesh/package.py index 6ceef8dbf6..5cad209597 100644 --- a/var/spack/repos/builtin/packages/libmesh/package.py +++ b/var/spack/repos/builtin/packages/libmesh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libmng/package.py b/var/spack/repos/builtin/packages/libmng/package.py index f1c451902c..dca8c03aa0 100644 --- a/var/spack/repos/builtin/packages/libmng/package.py +++ b/var/spack/repos/builtin/packages/libmng/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libmongoc/package.py b/var/spack/repos/builtin/packages/libmongoc/package.py index c7a53a4a42..57854d7ae8 100644 --- a/var/spack/repos/builtin/packages/libmongoc/package.py +++ b/var/spack/repos/builtin/packages/libmongoc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libmonitor/package.py b/var/spack/repos/builtin/packages/libmonitor/package.py index 26a87c78fa..42410de82d 100644 --- a/var/spack/repos/builtin/packages/libmonitor/package.py +++ b/var/spack/repos/builtin/packages/libmonitor/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libnbc/package.py b/var/spack/repos/builtin/packages/libnbc/package.py index e135fa6835..0fdd0d9234 100644 --- a/var/spack/repos/builtin/packages/libnbc/package.py +++ b/var/spack/repos/builtin/packages/libnbc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libogg/package.py b/var/spack/repos/builtin/packages/libogg/package.py index bb80764b7c..2b53900f49 100644 --- a/var/spack/repos/builtin/packages/libogg/package.py +++ b/var/spack/repos/builtin/packages/libogg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/liboldx/package.py b/var/spack/repos/builtin/packages/liboldx/package.py index 1bec00bfe3..d89af8d70f 100644 --- a/var/spack/repos/builtin/packages/liboldx/package.py +++ b/var/spack/repos/builtin/packages/liboldx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libpciaccess/package.py b/var/spack/repos/builtin/packages/libpciaccess/package.py index ec75c0993b..7cbeebd2fc 100644 --- a/var/spack/repos/builtin/packages/libpciaccess/package.py +++ b/var/spack/repos/builtin/packages/libpciaccess/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libpfm4/package.py b/var/spack/repos/builtin/packages/libpfm4/package.py index c7463afeeb..858a68b953 100644 --- a/var/spack/repos/builtin/packages/libpfm4/package.py +++ b/var/spack/repos/builtin/packages/libpfm4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libpng/package.py b/var/spack/repos/builtin/packages/libpng/package.py index d4141851ae..a78f964841 100644 --- a/var/spack/repos/builtin/packages/libpng/package.py +++ b/var/spack/repos/builtin/packages/libpng/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libpsl/package.py b/var/spack/repos/builtin/packages/libpsl/package.py index 3a545f6f18..b3c029b78c 100644 --- a/var/spack/repos/builtin/packages/libpsl/package.py +++ b/var/spack/repos/builtin/packages/libpsl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libpthread-stubs/package.py b/var/spack/repos/builtin/packages/libpthread-stubs/package.py index d1dab82e70..536f80471d 100644 --- a/var/spack/repos/builtin/packages/libpthread-stubs/package.py +++ b/var/spack/repos/builtin/packages/libpthread-stubs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libquo/package.py b/var/spack/repos/builtin/packages/libquo/package.py index 76a508f9c6..653e033459 100644 --- a/var/spack/repos/builtin/packages/libquo/package.py +++ b/var/spack/repos/builtin/packages/libquo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libsigsegv/package.py b/var/spack/repos/builtin/packages/libsigsegv/package.py index 8104de6072..67a94b2895 100644 --- a/var/spack/repos/builtin/packages/libsigsegv/package.py +++ b/var/spack/repos/builtin/packages/libsigsegv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libsm/package.py b/var/spack/repos/builtin/packages/libsm/package.py index 9479da07d7..2a8be06486 100644 --- a/var/spack/repos/builtin/packages/libsm/package.py +++ b/var/spack/repos/builtin/packages/libsm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libsodium/package.py b/var/spack/repos/builtin/packages/libsodium/package.py index 6d21d65345..d8d6b4d7bb 100644 --- a/var/spack/repos/builtin/packages/libsodium/package.py +++ b/var/spack/repos/builtin/packages/libsodium/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libspatialindex/package.py b/var/spack/repos/builtin/packages/libspatialindex/package.py index 5dd839a7c3..7790c8dab2 100644 --- a/var/spack/repos/builtin/packages/libspatialindex/package.py +++ b/var/spack/repos/builtin/packages/libspatialindex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libsplash/package.py b/var/spack/repos/builtin/packages/libsplash/package.py index 61ead25177..2a0d2dfb09 100644 --- a/var/spack/repos/builtin/packages/libsplash/package.py +++ b/var/spack/repos/builtin/packages/libsplash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libssh2/package.py b/var/spack/repos/builtin/packages/libssh2/package.py index 2c582b477e..c5978f0688 100644 --- a/var/spack/repos/builtin/packages/libssh2/package.py +++ b/var/spack/repos/builtin/packages/libssh2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -32,7 +32,7 @@ class Libssh2(CMakePackage): url = "https://www.libssh2.org/download/libssh2-1.7.0.tar.gz" version('1.7.0', 'b01662a210e94cccf2f76094db7dac5c') - version('1.4.3', '071004c60c5d6f90354ad1b701013a0b') # CentOS7 + version('1.4.3', '071004c60c5d6f90354ad1b701013a0b') # CentOS7 variant('shared', default=True, description="Build shared libraries") diff --git a/var/spack/repos/builtin/packages/libtermkey/package.py b/var/spack/repos/builtin/packages/libtermkey/package.py index 359e077284..40a17c1c3e 100644 --- a/var/spack/repos/builtin/packages/libtermkey/package.py +++ b/var/spack/repos/builtin/packages/libtermkey/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libtiff/package.py b/var/spack/repos/builtin/packages/libtiff/package.py index de5b577c47..2fcccad739 100644 --- a/var/spack/repos/builtin/packages/libtiff/package.py +++ b/var/spack/repos/builtin/packages/libtiff/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libtool/package.py b/var/spack/repos/builtin/packages/libtool/package.py index f0a7de3798..662859d52e 100644 --- a/var/spack/repos/builtin/packages/libtool/package.py +++ b/var/spack/repos/builtin/packages/libtool/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libunistring/package.py b/var/spack/repos/builtin/packages/libunistring/package.py index 1037a0ed3f..296788a2c3 100644 --- a/var/spack/repos/builtin/packages/libunistring/package.py +++ b/var/spack/repos/builtin/packages/libunistring/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libunwind/package.py b/var/spack/repos/builtin/packages/libunwind/package.py index 1e727f84f3..79e5d35061 100644 --- a/var/spack/repos/builtin/packages/libunwind/package.py +++ b/var/spack/repos/builtin/packages/libunwind/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libuuid/package.py b/var/spack/repos/builtin/packages/libuuid/package.py index 31f109cba3..b7eefdb1f0 100644 --- a/var/spack/repos/builtin/packages/libuuid/package.py +++ b/var/spack/repos/builtin/packages/libuuid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libuv/package.py b/var/spack/repos/builtin/packages/libuv/package.py index 2f303280da..784034d96c 100644 --- a/var/spack/repos/builtin/packages/libuv/package.py +++ b/var/spack/repos/builtin/packages/libuv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libvorbis/package.py b/var/spack/repos/builtin/packages/libvorbis/package.py index e716abe46d..2e25a5c230 100644 --- a/var/spack/repos/builtin/packages/libvorbis/package.py +++ b/var/spack/repos/builtin/packages/libvorbis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libvterm/package.py b/var/spack/repos/builtin/packages/libvterm/package.py index 2e1ef99b98..651b59be53 100644 --- a/var/spack/repos/builtin/packages/libvterm/package.py +++ b/var/spack/repos/builtin/packages/libvterm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libwebsockets/package.py b/var/spack/repos/builtin/packages/libwebsockets/package.py index 3ce58a4c36..d74ff72273 100644 --- a/var/spack/repos/builtin/packages/libwebsockets/package.py +++ b/var/spack/repos/builtin/packages/libwebsockets/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libwindowswm/package.py b/var/spack/repos/builtin/packages/libwindowswm/package.py index 5b331f428c..82cc3f84b0 100644 --- a/var/spack/repos/builtin/packages/libwindowswm/package.py +++ b/var/spack/repos/builtin/packages/libwindowswm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libx11/package.py b/var/spack/repos/builtin/packages/libx11/package.py index 4df1ef07ce..74f9618212 100644 --- a/var/spack/repos/builtin/packages/libx11/package.py +++ b/var/spack/repos/builtin/packages/libx11/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxau/package.py b/var/spack/repos/builtin/packages/libxau/package.py index bf4e9f5e4e..546f25171e 100644 --- a/var/spack/repos/builtin/packages/libxau/package.py +++ b/var/spack/repos/builtin/packages/libxau/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxaw/package.py b/var/spack/repos/builtin/packages/libxaw/package.py index f3779be7ed..a160444b38 100644 --- a/var/spack/repos/builtin/packages/libxaw/package.py +++ b/var/spack/repos/builtin/packages/libxaw/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxaw3d/package.py b/var/spack/repos/builtin/packages/libxaw3d/package.py index 0e350aa2ce..aa76aef674 100644 --- a/var/spack/repos/builtin/packages/libxaw3d/package.py +++ b/var/spack/repos/builtin/packages/libxaw3d/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxc/package.py b/var/spack/repos/builtin/packages/libxc/package.py index ab9f75eac4..f018bacfa3 100644 --- a/var/spack/repos/builtin/packages/libxc/package.py +++ b/var/spack/repos/builtin/packages/libxc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxcb/package.py b/var/spack/repos/builtin/packages/libxcb/package.py index 3c77e045b7..73a3f718c6 100644 --- a/var/spack/repos/builtin/packages/libxcb/package.py +++ b/var/spack/repos/builtin/packages/libxcb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxcomposite/package.py b/var/spack/repos/builtin/packages/libxcomposite/package.py index 30d3a4c0ca..c540c35f26 100644 --- a/var/spack/repos/builtin/packages/libxcomposite/package.py +++ b/var/spack/repos/builtin/packages/libxcomposite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxcursor/package.py b/var/spack/repos/builtin/packages/libxcursor/package.py index ee5065bfa4..1c931b4d72 100644 --- a/var/spack/repos/builtin/packages/libxcursor/package.py +++ b/var/spack/repos/builtin/packages/libxcursor/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxdamage/package.py b/var/spack/repos/builtin/packages/libxdamage/package.py index 4eca877421..95f6dd498e 100644 --- a/var/spack/repos/builtin/packages/libxdamage/package.py +++ b/var/spack/repos/builtin/packages/libxdamage/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxdmcp/package.py b/var/spack/repos/builtin/packages/libxdmcp/package.py index 7c4fd068f0..9ff35638f3 100644 --- a/var/spack/repos/builtin/packages/libxdmcp/package.py +++ b/var/spack/repos/builtin/packages/libxdmcp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxevie/package.py b/var/spack/repos/builtin/packages/libxevie/package.py index 7435027b48..8c9e0049de 100644 --- a/var/spack/repos/builtin/packages/libxevie/package.py +++ b/var/spack/repos/builtin/packages/libxevie/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxext/package.py b/var/spack/repos/builtin/packages/libxext/package.py index 528f00cc35..36c712b153 100644 --- a/var/spack/repos/builtin/packages/libxext/package.py +++ b/var/spack/repos/builtin/packages/libxext/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxfixes/package.py b/var/spack/repos/builtin/packages/libxfixes/package.py index 6add3bb56d..87e037286e 100644 --- a/var/spack/repos/builtin/packages/libxfixes/package.py +++ b/var/spack/repos/builtin/packages/libxfixes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxfont/package.py b/var/spack/repos/builtin/packages/libxfont/package.py index 7538c34f07..eee73dde01 100644 --- a/var/spack/repos/builtin/packages/libxfont/package.py +++ b/var/spack/repos/builtin/packages/libxfont/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxfont2/package.py b/var/spack/repos/builtin/packages/libxfont2/package.py index bc1dc06dd0..9b4e7e463d 100644 --- a/var/spack/repos/builtin/packages/libxfont2/package.py +++ b/var/spack/repos/builtin/packages/libxfont2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxfontcache/package.py b/var/spack/repos/builtin/packages/libxfontcache/package.py index c4a4d5675a..ad4bfceb77 100644 --- a/var/spack/repos/builtin/packages/libxfontcache/package.py +++ b/var/spack/repos/builtin/packages/libxfontcache/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxft/package.py b/var/spack/repos/builtin/packages/libxft/package.py index 8385b4168a..405c29883c 100644 --- a/var/spack/repos/builtin/packages/libxft/package.py +++ b/var/spack/repos/builtin/packages/libxft/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxi/package.py b/var/spack/repos/builtin/packages/libxi/package.py index 5334ef9044..c6821c00aa 100644 --- a/var/spack/repos/builtin/packages/libxi/package.py +++ b/var/spack/repos/builtin/packages/libxi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxinerama/package.py b/var/spack/repos/builtin/packages/libxinerama/package.py index 9e3633629a..2deb6df2f2 100644 --- a/var/spack/repos/builtin/packages/libxinerama/package.py +++ b/var/spack/repos/builtin/packages/libxinerama/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxkbfile/package.py b/var/spack/repos/builtin/packages/libxkbfile/package.py index daafa8dd65..5a15ebe7a4 100644 --- a/var/spack/repos/builtin/packages/libxkbfile/package.py +++ b/var/spack/repos/builtin/packages/libxkbfile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxkbui/package.py b/var/spack/repos/builtin/packages/libxkbui/package.py index b6a40b656d..4782783111 100644 --- a/var/spack/repos/builtin/packages/libxkbui/package.py +++ b/var/spack/repos/builtin/packages/libxkbui/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py index 6a9e6e6510..f3601aa2b5 100644 --- a/var/spack/repos/builtin/packages/libxml2/package.py +++ b/var/spack/repos/builtin/packages/libxml2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxmu/package.py b/var/spack/repos/builtin/packages/libxmu/package.py index 937cf75013..a18cf34563 100644 --- a/var/spack/repos/builtin/packages/libxmu/package.py +++ b/var/spack/repos/builtin/packages/libxmu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxp/package.py b/var/spack/repos/builtin/packages/libxp/package.py index 95d4bfa2f8..bf405e9ace 100644 --- a/var/spack/repos/builtin/packages/libxp/package.py +++ b/var/spack/repos/builtin/packages/libxp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxpm/package.py b/var/spack/repos/builtin/packages/libxpm/package.py index b0a00cdb7e..09d0b0ec61 100644 --- a/var/spack/repos/builtin/packages/libxpm/package.py +++ b/var/spack/repos/builtin/packages/libxpm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxpresent/package.py b/var/spack/repos/builtin/packages/libxpresent/package.py index 5237b164a0..eb2e037af2 100644 --- a/var/spack/repos/builtin/packages/libxpresent/package.py +++ b/var/spack/repos/builtin/packages/libxpresent/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxprintapputil/package.py b/var/spack/repos/builtin/packages/libxprintapputil/package.py index ef1963c300..4a5b7f29a9 100644 --- a/var/spack/repos/builtin/packages/libxprintapputil/package.py +++ b/var/spack/repos/builtin/packages/libxprintapputil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxprintutil/package.py b/var/spack/repos/builtin/packages/libxprintutil/package.py index b55123a397..d464c430a4 100644 --- a/var/spack/repos/builtin/packages/libxprintutil/package.py +++ b/var/spack/repos/builtin/packages/libxprintutil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxrandr/package.py b/var/spack/repos/builtin/packages/libxrandr/package.py index 773be3ab8b..a9709ff90c 100644 --- a/var/spack/repos/builtin/packages/libxrandr/package.py +++ b/var/spack/repos/builtin/packages/libxrandr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxrender/package.py b/var/spack/repos/builtin/packages/libxrender/package.py index 1775dd83b3..9ef9e1a78a 100644 --- a/var/spack/repos/builtin/packages/libxrender/package.py +++ b/var/spack/repos/builtin/packages/libxrender/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxres/package.py b/var/spack/repos/builtin/packages/libxres/package.py index c8a7740346..f6593fad0b 100644 --- a/var/spack/repos/builtin/packages/libxres/package.py +++ b/var/spack/repos/builtin/packages/libxres/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxscrnsaver/package.py b/var/spack/repos/builtin/packages/libxscrnsaver/package.py index 14f3aa0f04..97b293796f 100644 --- a/var/spack/repos/builtin/packages/libxscrnsaver/package.py +++ b/var/spack/repos/builtin/packages/libxscrnsaver/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxshmfence/package.py b/var/spack/repos/builtin/packages/libxshmfence/package.py index 63604865bd..c8b2e60a7c 100644 --- a/var/spack/repos/builtin/packages/libxshmfence/package.py +++ b/var/spack/repos/builtin/packages/libxshmfence/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxslt/package.py b/var/spack/repos/builtin/packages/libxslt/package.py index 3396f10242..53c0438508 100644 --- a/var/spack/repos/builtin/packages/libxslt/package.py +++ b/var/spack/repos/builtin/packages/libxslt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxsmm/package.py b/var/spack/repos/builtin/packages/libxsmm/package.py index eb9bf12350..4901f539f3 100644 --- a/var/spack/repos/builtin/packages/libxsmm/package.py +++ b/var/spack/repos/builtin/packages/libxsmm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxstream/package.py b/var/spack/repos/builtin/packages/libxstream/package.py index 0996e6b9e8..ab0c07edbe 100644 --- a/var/spack/repos/builtin/packages/libxstream/package.py +++ b/var/spack/repos/builtin/packages/libxstream/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxt/package.py b/var/spack/repos/builtin/packages/libxt/package.py index 1bab6854d9..0dbe2dc45e 100644 --- a/var/spack/repos/builtin/packages/libxt/package.py +++ b/var/spack/repos/builtin/packages/libxt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxtrap/package.py b/var/spack/repos/builtin/packages/libxtrap/package.py index 2b22fb1679..e678b3ae1d 100644 --- a/var/spack/repos/builtin/packages/libxtrap/package.py +++ b/var/spack/repos/builtin/packages/libxtrap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxtst/package.py b/var/spack/repos/builtin/packages/libxtst/package.py index aaff481afc..c815af7d2c 100644 --- a/var/spack/repos/builtin/packages/libxtst/package.py +++ b/var/spack/repos/builtin/packages/libxtst/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxv/package.py b/var/spack/repos/builtin/packages/libxv/package.py index 2662da8647..220171ef3b 100644 --- a/var/spack/repos/builtin/packages/libxv/package.py +++ b/var/spack/repos/builtin/packages/libxv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxvmc/package.py b/var/spack/repos/builtin/packages/libxvmc/package.py index 8492f660a4..6ce97ed625 100644 --- a/var/spack/repos/builtin/packages/libxvmc/package.py +++ b/var/spack/repos/builtin/packages/libxvmc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxxf86dga/package.py b/var/spack/repos/builtin/packages/libxxf86dga/package.py index 501a40705f..4650264aed 100644 --- a/var/spack/repos/builtin/packages/libxxf86dga/package.py +++ b/var/spack/repos/builtin/packages/libxxf86dga/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxxf86misc/package.py b/var/spack/repos/builtin/packages/libxxf86misc/package.py index 8e6f743183..5a6c1f33f6 100644 --- a/var/spack/repos/builtin/packages/libxxf86misc/package.py +++ b/var/spack/repos/builtin/packages/libxxf86misc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libxxf86vm/package.py b/var/spack/repos/builtin/packages/libxxf86vm/package.py index 6f91c62a2d..b85eb07862 100644 --- a/var/spack/repos/builtin/packages/libxxf86vm/package.py +++ b/var/spack/repos/builtin/packages/libxxf86vm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/libzip/package.py b/var/spack/repos/builtin/packages/libzip/package.py index e3dc9ab2bb..073b8df36f 100644 --- a/var/spack/repos/builtin/packages/libzip/package.py +++ b/var/spack/repos/builtin/packages/libzip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/likwid/package.py b/var/spack/repos/builtin/packages/likwid/package.py index 8d1687a11a..70cde61edf 100644 --- a/var/spack/repos/builtin/packages/likwid/package.py +++ b/var/spack/repos/builtin/packages/likwid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/linux-headers/package.py b/var/spack/repos/builtin/packages/linux-headers/package.py index 6acb0d6dc1..b996192e67 100644 --- a/var/spack/repos/builtin/packages/linux-headers/package.py +++ b/var/spack/repos/builtin/packages/linux-headers/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/listres/package.py b/var/spack/repos/builtin/packages/listres/package.py index 3727ddc0b4..c654945728 100644 --- a/var/spack/repos/builtin/packages/listres/package.py +++ b/var/spack/repos/builtin/packages/listres/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py index 6a167cca33..4624451e69 100644 --- a/var/spack/repos/builtin/packages/llvm-lld/package.py +++ b/var/spack/repos/builtin/packages/llvm-lld/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py index 7cc42e0f28..3479b08bc5 100644 --- a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py +++ b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -40,7 +40,7 @@ class LlvmOpenmpOmpt(Package): # align-to-tr-rebased branch version('3.9.2b', git='https://github.com/OpenMPToolsInterface/LLVM-openmp.git', - commit='982a08bcf3df9fb5afc04ac3bada47f19cc4e3d3') + commit='982a08bcf3df9fb5afc04ac3bada47f19cc4e3d3') depends_on('cmake', type='build') depends_on('llvm') diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index 868e336778..1f88d94882 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lmdb/package.py b/var/spack/repos/builtin/packages/lmdb/package.py index 8c6c23d8dc..5a0aef35a4 100644 --- a/var/spack/repos/builtin/packages/lmdb/package.py +++ b/var/spack/repos/builtin/packages/lmdb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lmod/package.py b/var/spack/repos/builtin/packages/lmod/package.py index 89a5ba3412..08a01647a4 100644 --- a/var/spack/repos/builtin/packages/lmod/package.py +++ b/var/spack/repos/builtin/packages/lmod/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lndir/package.py b/var/spack/repos/builtin/packages/lndir/package.py index ce3a199fe2..51b0a09228 100644 --- a/var/spack/repos/builtin/packages/lndir/package.py +++ b/var/spack/repos/builtin/packages/lndir/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/log4cxx/package.py b/var/spack/repos/builtin/packages/log4cxx/package.py index b6611544df..14715f36cf 100644 --- a/var/spack/repos/builtin/packages/log4cxx/package.py +++ b/var/spack/repos/builtin/packages/log4cxx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lrslib/package.py b/var/spack/repos/builtin/packages/lrslib/package.py index 3825867bb6..19e44b911f 100644 --- a/var/spack/repos/builtin/packages/lrslib/package.py +++ b/var/spack/repos/builtin/packages/lrslib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lrzip/package.py b/var/spack/repos/builtin/packages/lrzip/package.py index 42542acfdb..73941adf8d 100644 --- a/var/spack/repos/builtin/packages/lrzip/package.py +++ b/var/spack/repos/builtin/packages/lrzip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lua-jit/package.py b/var/spack/repos/builtin/packages/lua-jit/package.py index 5f7de8ff06..c32226dd12 100644 --- a/var/spack/repos/builtin/packages/lua-jit/package.py +++ b/var/spack/repos/builtin/packages/lua-jit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lua-luafilesystem/package.py b/var/spack/repos/builtin/packages/lua-luafilesystem/package.py index 7a5c90f36f..806d0d2cd7 100644 --- a/var/spack/repos/builtin/packages/lua-luafilesystem/package.py +++ b/var/spack/repos/builtin/packages/lua-luafilesystem/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lua-luaposix/package.py b/var/spack/repos/builtin/packages/lua-luaposix/package.py index 3803a938c8..120a871e26 100644 --- a/var/spack/repos/builtin/packages/lua-luaposix/package.py +++ b/var/spack/repos/builtin/packages/lua-luaposix/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py index b0d8b69943..0680e1a3b5 100644 --- a/var/spack/repos/builtin/packages/lua/package.py +++ b/var/spack/repos/builtin/packages/lua/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/luit/package.py b/var/spack/repos/builtin/packages/luit/package.py index 54fd740bdc..b016d0eaa7 100644 --- a/var/spack/repos/builtin/packages/luit/package.py +++ b/var/spack/repos/builtin/packages/luit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lulesh/package.py b/var/spack/repos/builtin/packages/lulesh/package.py index e880d4fa14..6a07976377 100644 --- a/var/spack/repos/builtin/packages/lulesh/package.py +++ b/var/spack/repos/builtin/packages/lulesh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lwgrp/package.py b/var/spack/repos/builtin/packages/lwgrp/package.py index 169f7540be..de44693098 100644 --- a/var/spack/repos/builtin/packages/lwgrp/package.py +++ b/var/spack/repos/builtin/packages/lwgrp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lwm2/package.py b/var/spack/repos/builtin/packages/lwm2/package.py index 03cb634271..d96a9e1c0d 100644 --- a/var/spack/repos/builtin/packages/lwm2/package.py +++ b/var/spack/repos/builtin/packages/lwm2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lz4/package.py b/var/spack/repos/builtin/packages/lz4/package.py index 8529941919..c7a46be3ff 100644 --- a/var/spack/repos/builtin/packages/lz4/package.py +++ b/var/spack/repos/builtin/packages/lz4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lzma/package.py b/var/spack/repos/builtin/packages/lzma/package.py index 3eb97a2d9f..577f35e4cf 100644 --- a/var/spack/repos/builtin/packages/lzma/package.py +++ b/var/spack/repos/builtin/packages/lzma/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/lzo/package.py b/var/spack/repos/builtin/packages/lzo/package.py index e9c98842f4..98cbadbfb7 100644 --- a/var/spack/repos/builtin/packages/lzo/package.py +++ b/var/spack/repos/builtin/packages/lzo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/m4/package.py b/var/spack/repos/builtin/packages/m4/package.py index 33929eea6f..c01828d720 100644 --- a/var/spack/repos/builtin/packages/m4/package.py +++ b/var/spack/repos/builtin/packages/m4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mad-numdiff/package.py b/var/spack/repos/builtin/packages/mad-numdiff/package.py index 45252b2a96..4d0c9c1ef7 100644 --- a/var/spack/repos/builtin/packages/mad-numdiff/package.py +++ b/var/spack/repos/builtin/packages/mad-numdiff/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mafft/package.py b/var/spack/repos/builtin/packages/mafft/package.py index 131b8c58f9..47d05af711 100644 --- a/var/spack/repos/builtin/packages/mafft/package.py +++ b/var/spack/repos/builtin/packages/mafft/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/magics/package.py b/var/spack/repos/builtin/packages/magics/package.py index 1b3e3e87bf..d69dedf3ea 100644 --- a/var/spack/repos/builtin/packages/magics/package.py +++ b/var/spack/repos/builtin/packages/magics/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/magma/package.py b/var/spack/repos/builtin/packages/magma/package.py index c45974c7c6..74f265e329 100644 --- a/var/spack/repos/builtin/packages/magma/package.py +++ b/var/spack/repos/builtin/packages/magma/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/makedepend/package.py b/var/spack/repos/builtin/packages/makedepend/package.py index 68be988d82..e1b254be1c 100644 --- a/var/spack/repos/builtin/packages/makedepend/package.py +++ b/var/spack/repos/builtin/packages/makedepend/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mallocmc/package.py b/var/spack/repos/builtin/packages/mallocmc/package.py index 0e533b3e10..3134a3c1e6 100644 --- a/var/spack/repos/builtin/packages/mallocmc/package.py +++ b/var/spack/repos/builtin/packages/mallocmc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mariadb/package.py b/var/spack/repos/builtin/packages/mariadb/package.py index 6313d10052..6374fdb8d3 100644 --- a/var/spack/repos/builtin/packages/mariadb/package.py +++ b/var/spack/repos/builtin/packages/mariadb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/matio/package.py b/var/spack/repos/builtin/packages/matio/package.py index 3c48b8f3fc..eb8c517e63 100644 --- a/var/spack/repos/builtin/packages/matio/package.py +++ b/var/spack/repos/builtin/packages/matio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -39,7 +39,6 @@ class Matio(AutotoolsPackage): description='support for version 7.3 mat files via hdf5') variant("shared", default=True, description='Enables the build of shared libraries.') - depends_on("zlib", when="+zlib") depends_on("hdf5", when="+hdf5") diff --git a/var/spack/repos/builtin/packages/matlab/package.py b/var/spack/repos/builtin/packages/matlab/package.py index 589116b08b..4d2b91546e 100644 --- a/var/spack/repos/builtin/packages/matlab/package.py +++ b/var/spack/repos/builtin/packages/matlab/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/maven/package.py b/var/spack/repos/builtin/packages/maven/package.py index 60c9e387cb..347f05a764 100644 --- a/var/spack/repos/builtin/packages/maven/package.py +++ b/var/spack/repos/builtin/packages/maven/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mawk/package.py b/var/spack/repos/builtin/packages/mawk/package.py index d13bbe0f7b..872fcbe101 100644 --- a/var/spack/repos/builtin/packages/mawk/package.py +++ b/var/spack/repos/builtin/packages/mawk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mbedtls/package.py b/var/spack/repos/builtin/packages/mbedtls/package.py index 493ea59f0b..b93b82abd0 100644 --- a/var/spack/repos/builtin/packages/mbedtls/package.py +++ b/var/spack/repos/builtin/packages/mbedtls/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mdtest/package.py b/var/spack/repos/builtin/packages/mdtest/package.py index 06f3949bbe..a77494b9b6 100644 --- a/var/spack/repos/builtin/packages/mdtest/package.py +++ b/var/spack/repos/builtin/packages/mdtest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,8 +26,8 @@ from spack import * class Mdtest(Package): - """mdtest is an MPI-coordinated metadata benchmark test - that performs open/stat/close operations on files + """mdtest is an MPI-coordinated metadata benchmark test + that performs open/stat/close operations on files and directories and then reports the performance.""" homepage = "https://github.com/LLNL/mdtest" diff --git a/var/spack/repos/builtin/packages/meep/package.py b/var/spack/repos/builtin/packages/meep/package.py index f64edd767b..f99e1506a3 100644 --- a/var/spack/repos/builtin/packages/meep/package.py +++ b/var/spack/repos/builtin/packages/meep/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/memaxes/package.py b/var/spack/repos/builtin/packages/memaxes/package.py index ffad167788..f426309b99 100644 --- a/var/spack/repos/builtin/packages/memaxes/package.py +++ b/var/spack/repos/builtin/packages/memaxes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/meme/package.py b/var/spack/repos/builtin/packages/meme/package.py index 87174c391e..05e88fec8b 100644 --- a/var/spack/repos/builtin/packages/meme/package.py +++ b/var/spack/repos/builtin/packages/meme/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mercurial/package.py b/var/spack/repos/builtin/packages/mercurial/package.py index b383560cfe..1cfb4f59c9 100644 --- a/var/spack/repos/builtin/packages/mercurial/package.py +++ b/var/spack/repos/builtin/packages/mercurial/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mesa-glu/package.py b/var/spack/repos/builtin/packages/mesa-glu/package.py index ecc60b6135..cb2f12ad43 100644 --- a/var/spack/repos/builtin/packages/mesa-glu/package.py +++ b/var/spack/repos/builtin/packages/mesa-glu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py index 0c7aed7fca..22439c46d3 100644 --- a/var/spack/repos/builtin/packages/mesa/package.py +++ b/var/spack/repos/builtin/packages/mesa/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mesquite/package.py b/var/spack/repos/builtin/packages/mesquite/package.py index d67d8aaac4..fd18d4ddae 100644 --- a/var/spack/repos/builtin/packages/mesquite/package.py +++ b/var/spack/repos/builtin/packages/mesquite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py index 3b904dd015..2f450951e3 100644 --- a/var/spack/repos/builtin/packages/metis/package.py +++ b/var/spack/repos/builtin/packages/metis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index 8f6f3a7855..2848d77887 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/miniconda2/package.py b/var/spack/repos/builtin/packages/miniconda2/package.py index 52fc2a2f66..aed9f8e08c 100644 --- a/var/spack/repos/builtin/packages/miniconda2/package.py +++ b/var/spack/repos/builtin/packages/miniconda2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/miniconda3/package.py b/var/spack/repos/builtin/packages/miniconda3/package.py index bf9905c312..bbe7df3acd 100644 --- a/var/spack/repos/builtin/packages/miniconda3/package.py +++ b/var/spack/repos/builtin/packages/miniconda3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mitos/package.py b/var/spack/repos/builtin/packages/mitos/package.py index 4ccddb3592..0e87f7c376 100644 --- a/var/spack/repos/builtin/packages/mitos/package.py +++ b/var/spack/repos/builtin/packages/mitos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mkfontdir/package.py b/var/spack/repos/builtin/packages/mkfontdir/package.py index 1a43a028a8..40a22d2d4d 100644 --- a/var/spack/repos/builtin/packages/mkfontdir/package.py +++ b/var/spack/repos/builtin/packages/mkfontdir/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mkfontscale/package.py b/var/spack/repos/builtin/packages/mkfontscale/package.py index 397ba03a62..d2114c4dc5 100644 --- a/var/spack/repos/builtin/packages/mkfontscale/package.py +++ b/var/spack/repos/builtin/packages/mkfontscale/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/moab/package.py b/var/spack/repos/builtin/packages/moab/package.py index f46aaabf0b..4798f842f0 100644 --- a/var/spack/repos/builtin/packages/moab/package.py +++ b/var/spack/repos/builtin/packages/moab/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mono/package.py b/var/spack/repos/builtin/packages/mono/package.py index 4a2692262b..a63ab9d622 100644 --- a/var/spack/repos/builtin/packages/mono/package.py +++ b/var/spack/repos/builtin/packages/mono/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mosh/package.py b/var/spack/repos/builtin/packages/mosh/package.py index dd0b914cb6..2fb1fd5e99 100644 --- a/var/spack/repos/builtin/packages/mosh/package.py +++ b/var/spack/repos/builtin/packages/mosh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mozjs/package.py b/var/spack/repos/builtin/packages/mozjs/package.py index 26d3a42b3e..6fbb8133ce 100644 --- a/var/spack/repos/builtin/packages/mozjs/package.py +++ b/var/spack/repos/builtin/packages/mozjs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpc/package.py b/var/spack/repos/builtin/packages/mpc/package.py index 8a807399e8..5996b424b3 100644 --- a/var/spack/repos/builtin/packages/mpc/package.py +++ b/var/spack/repos/builtin/packages/mpc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpe2/package.py b/var/spack/repos/builtin/packages/mpe2/package.py index 78201281bb..aa897f34fd 100644 --- a/var/spack/repos/builtin/packages/mpe2/package.py +++ b/var/spack/repos/builtin/packages/mpe2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpfr/package.py b/var/spack/repos/builtin/packages/mpfr/package.py index 2d88fa1522..c809b6bbb4 100644 --- a/var/spack/repos/builtin/packages/mpfr/package.py +++ b/var/spack/repos/builtin/packages/mpfr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpibash/package.py b/var/spack/repos/builtin/packages/mpibash/package.py index f3feaaaa42..cfa8f30502 100644 --- a/var/spack/repos/builtin/packages/mpibash/package.py +++ b/var/spack/repos/builtin/packages/mpibash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index c22f92cf38..f61a160d98 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpifileutils/package.py b/var/spack/repos/builtin/packages/mpifileutils/package.py index 102a1e9ff9..03ec613e0b 100644 --- a/var/spack/repos/builtin/packages/mpifileutils/package.py +++ b/var/spack/repos/builtin/packages/mpifileutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpileaks/package.py b/var/spack/repos/builtin/packages/mpileaks/package.py index ec4e9b30cc..d212019ddd 100644 --- a/var/spack/repos/builtin/packages/mpileaks/package.py +++ b/var/spack/repos/builtin/packages/mpileaks/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpip/package.py b/var/spack/repos/builtin/packages/mpip/package.py index 235c66c882..f75df37278 100644 --- a/var/spack/repos/builtin/packages/mpip/package.py +++ b/var/spack/repos/builtin/packages/mpip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mpir/package.py b/var/spack/repos/builtin/packages/mpir/package.py index b939a690b2..033bbcd925 100644 --- a/var/spack/repos/builtin/packages/mpir/package.py +++ b/var/spack/repos/builtin/packages/mpir/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mrnet/package.py b/var/spack/repos/builtin/packages/mrnet/package.py index 81938827f1..46e00fea58 100644 --- a/var/spack/repos/builtin/packages/mrnet/package.py +++ b/var/spack/repos/builtin/packages/mrnet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/msgpack-c/package.py b/var/spack/repos/builtin/packages/msgpack-c/package.py index 9a726e2356..5771fba86d 100644 --- a/var/spack/repos/builtin/packages/msgpack-c/package.py +++ b/var/spack/repos/builtin/packages/msgpack-c/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/multiverso/package.py b/var/spack/repos/builtin/packages/multiverso/package.py index 1537202905..285f53ef3c 100644 --- a/var/spack/repos/builtin/packages/multiverso/package.py +++ b/var/spack/repos/builtin/packages/multiverso/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mummer/package.py b/var/spack/repos/builtin/packages/mummer/package.py index b8cd61531c..72450db537 100644 --- a/var/spack/repos/builtin/packages/mummer/package.py +++ b/var/spack/repos/builtin/packages/mummer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mumps/package.py b/var/spack/repos/builtin/packages/mumps/package.py index 55aac441f0..9d74ec4b6f 100644 --- a/var/spack/repos/builtin/packages/mumps/package.py +++ b/var/spack/repos/builtin/packages/mumps/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/munge/package.py b/var/spack/repos/builtin/packages/munge/package.py index 38dbfa1cc1..f26a041f06 100644 --- a/var/spack/repos/builtin/packages/munge/package.py +++ b/var/spack/repos/builtin/packages/munge/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/muparser/package.py b/var/spack/repos/builtin/packages/muparser/package.py index 1373c8cd7b..7c63973006 100644 --- a/var/spack/repos/builtin/packages/muparser/package.py +++ b/var/spack/repos/builtin/packages/muparser/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/muster/package.py b/var/spack/repos/builtin/packages/muster/package.py index 81817e48dc..bcc68ade27 100644 --- a/var/spack/repos/builtin/packages/muster/package.py +++ b/var/spack/repos/builtin/packages/muster/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py index 91b151516d..7a3d8f1e02 100644 --- a/var/spack/repos/builtin/packages/mvapich2/package.py +++ b/var/spack/repos/builtin/packages/mvapich2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/mxml/package.py b/var/spack/repos/builtin/packages/mxml/package.py index ef05b85da0..c0ff5f6cd9 100644 --- a/var/spack/repos/builtin/packages/mxml/package.py +++ b/var/spack/repos/builtin/packages/mxml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nag/package.py b/var/spack/repos/builtin/packages/nag/package.py index f2dd5cc95b..d5dd8feb2d 100644 --- a/var/spack/repos/builtin/packages/nag/package.py +++ b/var/spack/repos/builtin/packages/nag/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nalu/package.py b/var/spack/repos/builtin/packages/nalu/package.py index ed3785c5c7..fc6d79e9ea 100644 --- a/var/spack/repos/builtin/packages/nalu/package.py +++ b/var/spack/repos/builtin/packages/nalu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/namd/package.py b/var/spack/repos/builtin/packages/namd/package.py index 160d508004..d7f77835a8 100644 --- a/var/spack/repos/builtin/packages/namd/package.py +++ b/var/spack/repos/builtin/packages/namd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nano/package.py b/var/spack/repos/builtin/packages/nano/package.py index 49415bb7ef..3eef97039c 100644 --- a/var/spack/repos/builtin/packages/nano/package.py +++ b/var/spack/repos/builtin/packages/nano/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nasm/package.py b/var/spack/repos/builtin/packages/nasm/package.py index 979d002b4c..73a4e43a4f 100644 --- a/var/spack/repos/builtin/packages/nasm/package.py +++ b/var/spack/repos/builtin/packages/nasm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nauty/package.py b/var/spack/repos/builtin/packages/nauty/package.py index 0d5eed251b..11c7945f39 100644 --- a/var/spack/repos/builtin/packages/nauty/package.py +++ b/var/spack/repos/builtin/packages/nauty/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nccl/package.py b/var/spack/repos/builtin/packages/nccl/package.py index 52be43aa25..409a270971 100644 --- a/var/spack/repos/builtin/packages/nccl/package.py +++ b/var/spack/repos/builtin/packages/nccl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nccmp/package.py b/var/spack/repos/builtin/packages/nccmp/package.py index d59ca09381..16a7467857 100644 --- a/var/spack/repos/builtin/packages/nccmp/package.py +++ b/var/spack/repos/builtin/packages/nccmp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ncdu/package.py b/var/spack/repos/builtin/packages/ncdu/package.py index 0842a592cc..9adacc0f31 100644 --- a/var/spack/repos/builtin/packages/ncdu/package.py +++ b/var/spack/repos/builtin/packages/ncdu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ncftp/package.py b/var/spack/repos/builtin/packages/ncftp/package.py index 8b515af242..626045a19c 100644 --- a/var/spack/repos/builtin/packages/ncftp/package.py +++ b/var/spack/repos/builtin/packages/ncftp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,7 +26,7 @@ from spack import * class Ncftp(AutotoolsPackage): - """NcFTP Client is a set of application programs implementing the + """NcFTP Client is a set of application programs implementing the File Transfer Protocol.""" homepage = "http://www.ncftp.com/" diff --git a/var/spack/repos/builtin/packages/ncl/package.py b/var/spack/repos/builtin/packages/ncl/package.py index 01e49f24f7..21d9a0ca88 100644 --- a/var/spack/repos/builtin/packages/ncl/package.py +++ b/var/spack/repos/builtin/packages/ncl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nco/package.py b/var/spack/repos/builtin/packages/nco/package.py index aeccee7a74..9a96685d54 100644 --- a/var/spack/repos/builtin/packages/nco/package.py +++ b/var/spack/repos/builtin/packages/nco/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ncurses/package.py b/var/spack/repos/builtin/packages/ncurses/package.py index bf3c3d596b..6754a372cd 100644 --- a/var/spack/repos/builtin/packages/ncurses/package.py +++ b/var/spack/repos/builtin/packages/ncurses/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ncview/package.py b/var/spack/repos/builtin/packages/ncview/package.py index ecd733ccea..a9a33421a1 100644 --- a/var/spack/repos/builtin/packages/ncview/package.py +++ b/var/spack/repos/builtin/packages/ncview/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ndiff/package.py b/var/spack/repos/builtin/packages/ndiff/package.py index dc41add03f..66bf6d6994 100644 --- a/var/spack/repos/builtin/packages/ndiff/package.py +++ b/var/spack/repos/builtin/packages/ndiff/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netcdf-cxx/package.py b/var/spack/repos/builtin/packages/netcdf-cxx/package.py index 2ad710fc45..120fa07a4c 100644 --- a/var/spack/repos/builtin/packages/netcdf-cxx/package.py +++ b/var/spack/repos/builtin/packages/netcdf-cxx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py index 36ab8766b9..2493a3e908 100644 --- a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py +++ b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netcdf-fortran/package.py b/var/spack/repos/builtin/packages/netcdf-fortran/package.py index 3f6a5bbf04..8c2d167000 100644 --- a/var/spack/repos/builtin/packages/netcdf-fortran/package.py +++ b/var/spack/repos/builtin/packages/netcdf-fortran/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py index f3f0ed59a6..262036d771 100644 --- a/var/spack/repos/builtin/packages/netcdf/package.py +++ b/var/spack/repos/builtin/packages/netcdf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netgauge/package.py b/var/spack/repos/builtin/packages/netgauge/package.py index e7e669410b..b1880733c9 100644 --- a/var/spack/repos/builtin/packages/netgauge/package.py +++ b/var/spack/repos/builtin/packages/netgauge/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py index fa11ae6367..f1274b5c29 100644 --- a/var/spack/repos/builtin/packages/netlib-lapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py index e860926f96..d6419b744e 100644 --- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nettle/package.py b/var/spack/repos/builtin/packages/nettle/package.py index fd410d5102..83cbcb80dc 100644 --- a/var/spack/repos/builtin/packages/nettle/package.py +++ b/var/spack/repos/builtin/packages/nettle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nextflow/package.py b/var/spack/repos/builtin/packages/nextflow/package.py index 850775ceee..a44df66b07 100644 --- a/var/spack/repos/builtin/packages/nextflow/package.py +++ b/var/spack/repos/builtin/packages/nextflow/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nfft/package.py b/var/spack/repos/builtin/packages/nfft/package.py index daedcff22f..771ed36cb2 100644 --- a/var/spack/repos/builtin/packages/nfft/package.py +++ b/var/spack/repos/builtin/packages/nfft/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nginx/package.py b/var/spack/repos/builtin/packages/nginx/package.py index 1ab2f27695..a18ad9b293 100644 --- a/var/spack/repos/builtin/packages/nginx/package.py +++ b/var/spack/repos/builtin/packages/nginx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ninja/package.py b/var/spack/repos/builtin/packages/ninja/package.py index 87da2913fd..28aa36c465 100644 --- a/var/spack/repos/builtin/packages/ninja/package.py +++ b/var/spack/repos/builtin/packages/ninja/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nmap/package.py b/var/spack/repos/builtin/packages/nmap/package.py index f4576cde53..20204c0b06 100644 --- a/var/spack/repos/builtin/packages/nmap/package.py +++ b/var/spack/repos/builtin/packages/nmap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,8 +26,8 @@ from spack import * class Nmap(AutotoolsPackage): - """Nmap ("Network Mapper") is a free and open source (license) - utility for network discovery and security auditing. + """Nmap ("Network Mapper") is a free and open source (license) + utility for network discovery and security auditing. It also provides ncat an updated nc""" homepage = "https://nmap.org" diff --git a/var/spack/repos/builtin/packages/node-js/package.py b/var/spack/repos/builtin/packages/node-js/package.py index 208ba5e15d..5a8772fbf8 100644 --- a/var/spack/repos/builtin/packages/node-js/package.py +++ b/var/spack/repos/builtin/packages/node-js/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/notmuch/package.py b/var/spack/repos/builtin/packages/notmuch/package.py index fea7cd8920..0462867f54 100644 --- a/var/spack/repos/builtin/packages/notmuch/package.py +++ b/var/spack/repos/builtin/packages/notmuch/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,8 +26,8 @@ from spack import * class Notmuch(AutotoolsPackage): - """Notmuch is a mail indexer. - + """Notmuch is a mail indexer. + Essentially, is a very thin front end on top of xapian. """ diff --git a/var/spack/repos/builtin/packages/npb/package.py b/var/spack/repos/builtin/packages/npb/package.py index a6e428b344..26d46c3090 100644 --- a/var/spack/repos/builtin/packages/npb/package.py +++ b/var/spack/repos/builtin/packages/npb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/npm/package.py b/var/spack/repos/builtin/packages/npm/package.py index 6196da42e3..8e252e7b65 100644 --- a/var/spack/repos/builtin/packages/npm/package.py +++ b/var/spack/repos/builtin/packages/npm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/npth/package.py b/var/spack/repos/builtin/packages/npth/package.py index ac4264036c..fa166a45c1 100644 --- a/var/spack/repos/builtin/packages/npth/package.py +++ b/var/spack/repos/builtin/packages/npth/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nspr/package.py b/var/spack/repos/builtin/packages/nspr/package.py index 482a11ab05..bda5db551b 100644 --- a/var/spack/repos/builtin/packages/nspr/package.py +++ b/var/spack/repos/builtin/packages/nspr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/numdiff/package.py b/var/spack/repos/builtin/packages/numdiff/package.py index 6b8266eaa1..d9d2bc88cd 100644 --- a/var/spack/repos/builtin/packages/numdiff/package.py +++ b/var/spack/repos/builtin/packages/numdiff/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/nwchem/package.py b/var/spack/repos/builtin/packages/nwchem/package.py index 10c5ec5701..f526dcda88 100644 --- a/var/spack/repos/builtin/packages/nwchem/package.py +++ b/var/spack/repos/builtin/packages/nwchem/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ocaml/package.py b/var/spack/repos/builtin/packages/ocaml/package.py index 75c19ec7c6..dc1c0dde20 100644 --- a/var/spack/repos/builtin/packages/ocaml/package.py +++ b/var/spack/repos/builtin/packages/ocaml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -38,6 +38,6 @@ class Ocaml(Package): def install(self, spec, prefix): configure('-prefix', '{0}'.format(prefix)) - + make('world.opt') make('install') diff --git a/var/spack/repos/builtin/packages/oce/package.py b/var/spack/repos/builtin/packages/oce/package.py index 8a45239262..9f7fd8eef7 100644 --- a/var/spack/repos/builtin/packages/oce/package.py +++ b/var/spack/repos/builtin/packages/oce/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/oclock/package.py b/var/spack/repos/builtin/packages/oclock/package.py index ec656b23f1..3db0d63bbe 100644 --- a/var/spack/repos/builtin/packages/oclock/package.py +++ b/var/spack/repos/builtin/packages/oclock/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/octave-splines/package.py b/var/spack/repos/builtin/packages/octave-splines/package.py index 11c9cc5ba7..51de0858ab 100644 --- a/var/spack/repos/builtin/packages/octave-splines/package.py +++ b/var/spack/repos/builtin/packages/octave-splines/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py index b02ed33613..f18be0186f 100644 --- a/var/spack/repos/builtin/packages/octave/package.py +++ b/var/spack/repos/builtin/packages/octave/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/octopus/package.py b/var/spack/repos/builtin/packages/octopus/package.py index 14255a0b19..9e70699d84 100644 --- a/var/spack/repos/builtin/packages/octopus/package.py +++ b/var/spack/repos/builtin/packages/octopus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ompss/package.py b/var/spack/repos/builtin/packages/ompss/package.py index 02925974ea..cf03bc6fde 100644 --- a/var/spack/repos/builtin/packages/ompss/package.py +++ b/var/spack/repos/builtin/packages/ompss/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ompt-openmp/package.py b/var/spack/repos/builtin/packages/ompt-openmp/package.py index 40159e4c6c..daa3fed670 100644 --- a/var/spack/repos/builtin/packages/ompt-openmp/package.py +++ b/var/spack/repos/builtin/packages/ompt-openmp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/oniguruma/package.py b/var/spack/repos/builtin/packages/oniguruma/package.py index 8a5b8005b6..4a9bc7c12b 100644 --- a/var/spack/repos/builtin/packages/oniguruma/package.py +++ b/var/spack/repos/builtin/packages/oniguruma/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ont-albacore/package.py b/var/spack/repos/builtin/packages/ont-albacore/package.py index c4ec25d62a..a0f4506a4d 100644 --- a/var/spack/repos/builtin/packages/ont-albacore/package.py +++ b/var/spack/repos/builtin/packages/ont-albacore/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/opari2/package.py b/var/spack/repos/builtin/packages/opari2/package.py index cbe515ffe9..bd79943c64 100644 --- a/var/spack/repos/builtin/packages/opari2/package.py +++ b/var/spack/repos/builtin/packages/opari2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openbabel/package.py b/var/spack/repos/builtin/packages/openbabel/package.py index 014d1183f3..e67785eca8 100644 --- a/var/spack/repos/builtin/packages/openbabel/package.py +++ b/var/spack/repos/builtin/packages/openbabel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index 5353bdcc48..d79e2c27f8 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/opencoarrays/package.py b/var/spack/repos/builtin/packages/opencoarrays/package.py index 22d2152495..0449155bc7 100644 --- a/var/spack/repos/builtin/packages/opencoarrays/package.py +++ b/var/spack/repos/builtin/packages/opencoarrays/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py index 162939167c..09fa68b9c0 100644 --- a/var/spack/repos/builtin/packages/opencv/package.py +++ b/var/spack/repos/builtin/packages/opencv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openexr/package.py b/var/spack/repos/builtin/packages/openexr/package.py index 3619bd063c..b82a305b18 100644 --- a/var/spack/repos/builtin/packages/openexr/package.py +++ b/var/spack/repos/builtin/packages/openexr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openfoam-com/package.py b/var/spack/repos/builtin/packages/openfoam-com/package.py index c6dd6dbe9a..ce7be181b5 100644 --- a/var/spack/repos/builtin/packages/openfoam-com/package.py +++ b/var/spack/repos/builtin/packages/openfoam-com/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for the LLNL notice and the LGPL. +# Please also see the NOTICE and LICENSE files for the LLNL notice and LGPL. # # License # ------- diff --git a/var/spack/repos/builtin/packages/openfoam-org/package.py b/var/spack/repos/builtin/packages/openfoam-org/package.py index 02c27a0db5..017f6cc232 100644 --- a/var/spack/repos/builtin/packages/openfoam-org/package.py +++ b/var/spack/repos/builtin/packages/openfoam-org/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for the LLNL notice and the LGPL. +# Please also see the NOTICE and LICENSE files for the LLNL notice and LGPL. # # License # ------- diff --git a/var/spack/repos/builtin/packages/openfst/package.py b/var/spack/repos/builtin/packages/openfst/package.py index 7a555f5b4c..f6fa7b5e56 100644 --- a/var/spack/repos/builtin/packages/openfst/package.py +++ b/var/spack/repos/builtin/packages/openfst/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openjpeg/package.py b/var/spack/repos/builtin/packages/openjpeg/package.py index b22de4452a..977a7b687b 100644 --- a/var/spack/repos/builtin/packages/openjpeg/package.py +++ b/var/spack/repos/builtin/packages/openjpeg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 345f9c34f3..e685cfce88 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openscenegraph/package.py b/var/spack/repos/builtin/packages/openscenegraph/package.py index 565941ff0e..28a7187da8 100644 --- a/var/spack/repos/builtin/packages/openscenegraph/package.py +++ b/var/spack/repos/builtin/packages/openscenegraph/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index 6ad28ce3b7..7b1c66e5d1 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openssh/package.py b/var/spack/repos/builtin/packages/openssh/package.py index e241653527..5fd2c87cd2 100644 --- a/var/spack/repos/builtin/packages/openssh/package.py +++ b/var/spack/repos/builtin/packages/openssh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/openssl/package.py b/var/spack/repos/builtin/packages/openssl/package.py index 67f978e80c..35b8c4b030 100644 --- a/var/spack/repos/builtin/packages/openssl/package.py +++ b/var/spack/repos/builtin/packages/openssl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/opium/package.py b/var/spack/repos/builtin/packages/opium/package.py index 4c50bcfaf2..2080fdb9d8 100644 --- a/var/spack/repos/builtin/packages/opium/package.py +++ b/var/spack/repos/builtin/packages/opium/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/opus/package.py b/var/spack/repos/builtin/packages/opus/package.py index e1061dfdcf..6c579bca68 100644 --- a/var/spack/repos/builtin/packages/opus/package.py +++ b/var/spack/repos/builtin/packages/opus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py b/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py index 161ba6254a..44c396e508 100644 --- a/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py +++ b/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/otf/package.py b/var/spack/repos/builtin/packages/otf/package.py index 39eb5a85aa..6ac85f4b10 100644 --- a/var/spack/repos/builtin/packages/otf/package.py +++ b/var/spack/repos/builtin/packages/otf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/otf2/package.py b/var/spack/repos/builtin/packages/otf2/package.py index 3a52d16fa6..5b78ae935b 100644 --- a/var/spack/repos/builtin/packages/otf2/package.py +++ b/var/spack/repos/builtin/packages/otf2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/p4est/package.py b/var/spack/repos/builtin/packages/p4est/package.py index ef3f2f54d1..cc8a7bd353 100644 --- a/var/spack/repos/builtin/packages/p4est/package.py +++ b/var/spack/repos/builtin/packages/p4est/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pagmo/package.py b/var/spack/repos/builtin/packages/pagmo/package.py index eeeb437db7..bb6136c6ec 100644 --- a/var/spack/repos/builtin/packages/pagmo/package.py +++ b/var/spack/repos/builtin/packages/pagmo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/panda/package.py b/var/spack/repos/builtin/packages/panda/package.py index fb14bd5643..7e5f7710d2 100644 --- a/var/spack/repos/builtin/packages/panda/package.py +++ b/var/spack/repos/builtin/packages/panda/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pango/package.py b/var/spack/repos/builtin/packages/pango/package.py index 6b97bd641e..a95eecf041 100644 --- a/var/spack/repos/builtin/packages/pango/package.py +++ b/var/spack/repos/builtin/packages/pango/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/papi/package.py b/var/spack/repos/builtin/packages/papi/package.py index 115f1604b7..8b0707b663 100644 --- a/var/spack/repos/builtin/packages/papi/package.py +++ b/var/spack/repos/builtin/packages/papi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/paradiseo/package.py b/var/spack/repos/builtin/packages/paradiseo/package.py index 97ea19bc87..4b9bad0f3e 100644 --- a/var/spack/repos/builtin/packages/paradiseo/package.py +++ b/var/spack/repos/builtin/packages/paradiseo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/parallel-netcdf/package.py b/var/spack/repos/builtin/packages/parallel-netcdf/package.py index 43f93db0c6..6d22217440 100644 --- a/var/spack/repos/builtin/packages/parallel-netcdf/package.py +++ b/var/spack/repos/builtin/packages/parallel-netcdf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/parallel/package.py b/var/spack/repos/builtin/packages/parallel/package.py index 11e9497288..5dfcc1b06f 100644 --- a/var/spack/repos/builtin/packages/parallel/package.py +++ b/var/spack/repos/builtin/packages/parallel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/paraver/package.py b/var/spack/repos/builtin/packages/paraver/package.py index d7fe2152c3..a3847dc94d 100644 --- a/var/spack/repos/builtin/packages/paraver/package.py +++ b/var/spack/repos/builtin/packages/paraver/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py index cb5acf0e23..fb491f58e2 100644 --- a/var/spack/repos/builtin/packages/paraview/package.py +++ b/var/spack/repos/builtin/packages/paraview/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py index c66829f94e..d7079d0468 100644 --- a/var/spack/repos/builtin/packages/parmetis/package.py +++ b/var/spack/repos/builtin/packages/parmetis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/parmgridgen/package.py b/var/spack/repos/builtin/packages/parmgridgen/package.py index eaab9b0b87..50eca81053 100644 --- a/var/spack/repos/builtin/packages/parmgridgen/package.py +++ b/var/spack/repos/builtin/packages/parmgridgen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/parpack/package.py b/var/spack/repos/builtin/packages/parpack/package.py index 84bc88b3b0..f3420cbb7a 100644 --- a/var/spack/repos/builtin/packages/parpack/package.py +++ b/var/spack/repos/builtin/packages/parpack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/patch/package.py b/var/spack/repos/builtin/packages/patch/package.py index 3bdaf8c3bd..1b0e6389a6 100644 --- a/var/spack/repos/builtin/packages/patch/package.py +++ b/var/spack/repos/builtin/packages/patch/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/patchelf/package.py b/var/spack/repos/builtin/packages/patchelf/package.py index d36366f557..c25361b76e 100644 --- a/var/spack/repos/builtin/packages/patchelf/package.py +++ b/var/spack/repos/builtin/packages/patchelf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pax-utils/package.py b/var/spack/repos/builtin/packages/pax-utils/package.py index 3c0b81034e..2bed52fb0e 100644 --- a/var/spack/repos/builtin/packages/pax-utils/package.py +++ b/var/spack/repos/builtin/packages/pax-utils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pcre/package.py b/var/spack/repos/builtin/packages/pcre/package.py index 581dfe531e..15c5b9854c 100644 --- a/var/spack/repos/builtin/packages/pcre/package.py +++ b/var/spack/repos/builtin/packages/pcre/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pcre2/package.py b/var/spack/repos/builtin/packages/pcre2/package.py index 5fb582cab0..07b2a9085b 100644 --- a/var/spack/repos/builtin/packages/pcre2/package.py +++ b/var/spack/repos/builtin/packages/pcre2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pdsh/package.py b/var/spack/repos/builtin/packages/pdsh/package.py index b54afca6fc..3d0d265409 100644 --- a/var/spack/repos/builtin/packages/pdsh/package.py +++ b/var/spack/repos/builtin/packages/pdsh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pdt/package.py b/var/spack/repos/builtin/packages/pdt/package.py index 1012911cd5..42cdfbc41b 100644 --- a/var/spack/repos/builtin/packages/pdt/package.py +++ b/var/spack/repos/builtin/packages/pdt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pegtl/package.py b/var/spack/repos/builtin/packages/pegtl/package.py index 7bbea542ad..46b65c666d 100644 --- a/var/spack/repos/builtin/packages/pegtl/package.py +++ b/var/spack/repos/builtin/packages/pegtl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/perl-dbi/package.py b/var/spack/repos/builtin/packages/perl-dbi/package.py index d1c6a11fb4..d9de80edd0 100644 --- a/var/spack/repos/builtin/packages/perl-dbi/package.py +++ b/var/spack/repos/builtin/packages/perl-dbi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py b/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py index b675212395..f8bc19cf35 100644 --- a/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py +++ b/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/perl-module-build/package.py b/var/spack/repos/builtin/packages/perl-module-build/package.py index cccc5d7b5a..11f5580647 100644 --- a/var/spack/repos/builtin/packages/perl-module-build/package.py +++ b/var/spack/repos/builtin/packages/perl-module-build/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/perl-term-readkey/package.py b/var/spack/repos/builtin/packages/perl-term-readkey/package.py index b9ab06dce1..51599011fa 100644 --- a/var/spack/repos/builtin/packages/perl-term-readkey/package.py +++ b/var/spack/repos/builtin/packages/perl-term-readkey/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/perl-xml-parser/package.py b/var/spack/repos/builtin/packages/perl-xml-parser/package.py index 23e1af9213..c8981e7d39 100644 --- a/var/spack/repos/builtin/packages/perl-xml-parser/package.py +++ b/var/spack/repos/builtin/packages/perl-xml-parser/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py index 95b2ae8726..d9952cc936 100644 --- a/var/spack/repos/builtin/packages/perl/package.py +++ b/var/spack/repos/builtin/packages/perl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py index c379365dcb..1002211810 100644 --- a/var/spack/repos/builtin/packages/petsc/package.py +++ b/var/spack/repos/builtin/packages/petsc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pexsi/package.py b/var/spack/repos/builtin/packages/pexsi/package.py index 04d22c4da8..0d4496c104 100644 --- a/var/spack/repos/builtin/packages/pexsi/package.py +++ b/var/spack/repos/builtin/packages/pexsi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pfft/package.py b/var/spack/repos/builtin/packages/pfft/package.py index 3d05a834e9..a89a199efb 100644 --- a/var/spack/repos/builtin/packages/pfft/package.py +++ b/var/spack/repos/builtin/packages/pfft/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pflotran/package.py b/var/spack/repos/builtin/packages/pflotran/package.py index b7e623cb05..e18e6a7ea0 100644 --- a/var/spack/repos/builtin/packages/pflotran/package.py +++ b/var/spack/repos/builtin/packages/pflotran/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pgi/package.py b/var/spack/repos/builtin/packages/pgi/package.py index 4a9295249c..e1c9b0130b 100644 --- a/var/spack/repos/builtin/packages/pgi/package.py +++ b/var/spack/repos/builtin/packages/pgi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/phasta/package.py b/var/spack/repos/builtin/packages/phasta/package.py index e5e794bcfa..aa47214706 100644 --- a/var/spack/repos/builtin/packages/phasta/package.py +++ b/var/spack/repos/builtin/packages/phasta/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/picard/package.py b/var/spack/repos/builtin/packages/picard/package.py index 0a52db4264..3705c13f75 100644 --- a/var/spack/repos/builtin/packages/picard/package.py +++ b/var/spack/repos/builtin/packages/picard/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pidx/package.py b/var/spack/repos/builtin/packages/pidx/package.py index e19bb9e470..f79ff7eec4 100644 --- a/var/spack/repos/builtin/packages/pidx/package.py +++ b/var/spack/repos/builtin/packages/pidx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pigz/package.py b/var/spack/repos/builtin/packages/pigz/package.py index 7ba120417a..e9fe482c51 100644 --- a/var/spack/repos/builtin/packages/pigz/package.py +++ b/var/spack/repos/builtin/packages/pigz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,7 +26,7 @@ from spack import * class Pigz(MakefilePackage): - """A parallel implementation of gzip for modern multi-processor, + """A parallel implementation of gzip for modern multi-processor, multi-core machines.""" homepage = "http://zlib.net/pigz/" diff --git a/var/spack/repos/builtin/packages/piranha/package.py b/var/spack/repos/builtin/packages/piranha/package.py index dbf949f000..8d684ce277 100644 --- a/var/spack/repos/builtin/packages/piranha/package.py +++ b/var/spack/repos/builtin/packages/piranha/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pixman/package.py b/var/spack/repos/builtin/packages/pixman/package.py index 4d5bd4767a..fa01d21acb 100644 --- a/var/spack/repos/builtin/packages/pixman/package.py +++ b/var/spack/repos/builtin/packages/pixman/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pkg-config/package.py b/var/spack/repos/builtin/packages/pkg-config/package.py index 2e23aae3fe..dfb6608cf3 100644 --- a/var/spack/repos/builtin/packages/pkg-config/package.py +++ b/var/spack/repos/builtin/packages/pkg-config/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/planck-likelihood/package.py b/var/spack/repos/builtin/packages/planck-likelihood/package.py index 8d7b9c5e34..9f66b9b41c 100644 --- a/var/spack/repos/builtin/packages/planck-likelihood/package.py +++ b/var/spack/repos/builtin/packages/planck-likelihood/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/plumed/package.py b/var/spack/repos/builtin/packages/plumed/package.py index 5b22fdb4ea..fb655a9949 100644 --- a/var/spack/repos/builtin/packages/plumed/package.py +++ b/var/spack/repos/builtin/packages/plumed/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pmgr-collective/package.py b/var/spack/repos/builtin/packages/pmgr-collective/package.py index f6466a7954..0ba1cc5fd5 100644 --- a/var/spack/repos/builtin/packages/pmgr-collective/package.py +++ b/var/spack/repos/builtin/packages/pmgr-collective/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pnfft/package.py b/var/spack/repos/builtin/packages/pnfft/package.py index 3e56b9be4e..7bb74859d6 100644 --- a/var/spack/repos/builtin/packages/pnfft/package.py +++ b/var/spack/repos/builtin/packages/pnfft/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pngwriter/package.py b/var/spack/repos/builtin/packages/pngwriter/package.py index ef3e28aded..664421ceab 100644 --- a/var/spack/repos/builtin/packages/pngwriter/package.py +++ b/var/spack/repos/builtin/packages/pngwriter/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pocl/package.py b/var/spack/repos/builtin/packages/pocl/package.py index 8becd9e9f7..33273ea9e6 100644 --- a/var/spack/repos/builtin/packages/pocl/package.py +++ b/var/spack/repos/builtin/packages/pocl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/polymake/package.py b/var/spack/repos/builtin/packages/polymake/package.py index c0bb9082ae..693eac2895 100644 --- a/var/spack/repos/builtin/packages/polymake/package.py +++ b/var/spack/repos/builtin/packages/polymake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/porta/package.py b/var/spack/repos/builtin/packages/porta/package.py index b620daf78f..b2b7076be3 100644 --- a/var/spack/repos/builtin/packages/porta/package.py +++ b/var/spack/repos/builtin/packages/porta/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/portage/package.py b/var/spack/repos/builtin/packages/portage/package.py index 51166b97a3..92e4266552 100644 --- a/var/spack/repos/builtin/packages/portage/package.py +++ b/var/spack/repos/builtin/packages/portage/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/postgresql/package.py b/var/spack/repos/builtin/packages/postgresql/package.py index f8a2894538..4142dda185 100644 --- a/var/spack/repos/builtin/packages/postgresql/package.py +++ b/var/spack/repos/builtin/packages/postgresql/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ppl/package.py b/var/spack/repos/builtin/packages/ppl/package.py index 73404103f0..e059ee26d8 100644 --- a/var/spack/repos/builtin/packages/ppl/package.py +++ b/var/spack/repos/builtin/packages/ppl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/prank/package.py b/var/spack/repos/builtin/packages/prank/package.py index 09b73e795f..7f8fe95634 100644 --- a/var/spack/repos/builtin/packages/prank/package.py +++ b/var/spack/repos/builtin/packages/prank/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/presentproto/package.py b/var/spack/repos/builtin/packages/presentproto/package.py index 32560ade65..d6da6d6bea 100644 --- a/var/spack/repos/builtin/packages/presentproto/package.py +++ b/var/spack/repos/builtin/packages/presentproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/printproto/package.py b/var/spack/repos/builtin/packages/printproto/package.py index 0f905c3172..66f978c89f 100644 --- a/var/spack/repos/builtin/packages/printproto/package.py +++ b/var/spack/repos/builtin/packages/printproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/proj/package.py b/var/spack/repos/builtin/packages/proj/package.py index 3008baa690..85bbf02ac6 100644 --- a/var/spack/repos/builtin/packages/proj/package.py +++ b/var/spack/repos/builtin/packages/proj/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/protobuf/package.py b/var/spack/repos/builtin/packages/protobuf/package.py index 0a073b837a..50b190f70e 100644 --- a/var/spack/repos/builtin/packages/protobuf/package.py +++ b/var/spack/repos/builtin/packages/protobuf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/proxymngr/package.py b/var/spack/repos/builtin/packages/proxymngr/package.py index 896f2d00b7..e7a2a70dc4 100644 --- a/var/spack/repos/builtin/packages/proxymngr/package.py +++ b/var/spack/repos/builtin/packages/proxymngr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pruners-ninja/package.py b/var/spack/repos/builtin/packages/pruners-ninja/package.py index effbd979c3..660512380b 100644 --- a/var/spack/repos/builtin/packages/pruners-ninja/package.py +++ b/var/spack/repos/builtin/packages/pruners-ninja/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py index 976b5d3c4e..41633ffceb 100644 --- a/var/spack/repos/builtin/packages/psi4/package.py +++ b/var/spack/repos/builtin/packages/psi4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pstreams/package.py b/var/spack/repos/builtin/packages/pstreams/package.py index 30e9fccb10..be684a3b29 100644 --- a/var/spack/repos/builtin/packages/pstreams/package.py +++ b/var/spack/repos/builtin/packages/pstreams/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pugixml/package.py b/var/spack/repos/builtin/packages/pugixml/package.py index f7872bf68f..8d720e271e 100644 --- a/var/spack/repos/builtin/packages/pugixml/package.py +++ b/var/spack/repos/builtin/packages/pugixml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pumi/package.py b/var/spack/repos/builtin/packages/pumi/package.py index 40d37c6ce6..909dc85582 100644 --- a/var/spack/repos/builtin/packages/pumi/package.py +++ b/var/spack/repos/builtin/packages/pumi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/pvm/package.py b/var/spack/repos/builtin/packages/pvm/package.py index 79aed3431d..ecbb4d21bd 100644 --- a/var/spack/repos/builtin/packages/pvm/package.py +++ b/var/spack/repos/builtin/packages/pvm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-3to2/package.py b/var/spack/repos/builtin/packages/py-3to2/package.py index 80b95fcbfd..e1d939d474 100644 --- a/var/spack/repos/builtin/packages/py-3to2/package.py +++ b/var/spack/repos/builtin/packages/py-3to2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-4suite-xml/package.py b/var/spack/repos/builtin/packages/py-4suite-xml/package.py index 759f87c063..05c7d775ec 100644 --- a/var/spack/repos/builtin/packages/py-4suite-xml/package.py +++ b/var/spack/repos/builtin/packages/py-4suite-xml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-abipy/package.py b/var/spack/repos/builtin/packages/py-abipy/package.py index d113512f50..b43491b52f 100644 --- a/var/spack/repos/builtin/packages/py-abipy/package.py +++ b/var/spack/repos/builtin/packages/py-abipy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-alabaster/package.py b/var/spack/repos/builtin/packages/py-alabaster/package.py index ae082de17f..39645a02e3 100644 --- a/var/spack/repos/builtin/packages/py-alabaster/package.py +++ b/var/spack/repos/builtin/packages/py-alabaster/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-apache-libcloud/package.py b/var/spack/repos/builtin/packages/py-apache-libcloud/package.py index 1f265370f6..bf2f309cff 100644 --- a/var/spack/repos/builtin/packages/py-apache-libcloud/package.py +++ b/var/spack/repos/builtin/packages/py-apache-libcloud/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-appdirs/package.py b/var/spack/repos/builtin/packages/py-appdirs/package.py index 802d59b99b..487ef261fe 100644 --- a/var/spack/repos/builtin/packages/py-appdirs/package.py +++ b/var/spack/repos/builtin/packages/py-appdirs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-appnope/package.py b/var/spack/repos/builtin/packages/py-appnope/package.py index 59dac3a8b3..49d3b2796d 100644 --- a/var/spack/repos/builtin/packages/py-appnope/package.py +++ b/var/spack/repos/builtin/packages/py-appnope/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-apscheduler/package.py b/var/spack/repos/builtin/packages/py-apscheduler/package.py index 96b3e0d474..163783be12 100644 --- a/var/spack/repos/builtin/packages/py-apscheduler/package.py +++ b/var/spack/repos/builtin/packages/py-apscheduler/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-argcomplete/package.py b/var/spack/repos/builtin/packages/py-argcomplete/package.py index 585540f23b..ff35e98d80 100644 --- a/var/spack/repos/builtin/packages/py-argcomplete/package.py +++ b/var/spack/repos/builtin/packages/py-argcomplete/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-argparse/package.py b/var/spack/repos/builtin/packages/py-argparse/package.py index ea34f5c2fe..94041c1c7f 100644 --- a/var/spack/repos/builtin/packages/py-argparse/package.py +++ b/var/spack/repos/builtin/packages/py-argparse/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ase/package.py b/var/spack/repos/builtin/packages/py-ase/package.py index 8800826ce5..46175e8a72 100644 --- a/var/spack/repos/builtin/packages/py-ase/package.py +++ b/var/spack/repos/builtin/packages/py-ase/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-asn1crypto/package.py b/var/spack/repos/builtin/packages/py-asn1crypto/package.py index 838a8a4182..9e72f29c36 100644 --- a/var/spack/repos/builtin/packages/py-asn1crypto/package.py +++ b/var/spack/repos/builtin/packages/py-asn1crypto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-astroid/package.py b/var/spack/repos/builtin/packages/py-astroid/package.py index f275813d86..9ccbff6177 100644 --- a/var/spack/repos/builtin/packages/py-astroid/package.py +++ b/var/spack/repos/builtin/packages/py-astroid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-astropy/package.py b/var/spack/repos/builtin/packages/py-astropy/package.py index d8c262cfdd..27358c9467 100644 --- a/var/spack/repos/builtin/packages/py-astropy/package.py +++ b/var/spack/repos/builtin/packages/py-astropy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-attrs/package.py b/var/spack/repos/builtin/packages/py-attrs/package.py index b99b55da06..bc9a557a52 100644 --- a/var/spack/repos/builtin/packages/py-attrs/package.py +++ b/var/spack/repos/builtin/packages/py-attrs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-autopep8/package.py b/var/spack/repos/builtin/packages/py-autopep8/package.py index 25698bc880..7db3658c02 100644 --- a/var/spack/repos/builtin/packages/py-autopep8/package.py +++ b/var/spack/repos/builtin/packages/py-autopep8/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-babel/package.py b/var/spack/repos/builtin/packages/py-babel/package.py index d9ab3bc494..4b9f6c7462 100644 --- a/var/spack/repos/builtin/packages/py-babel/package.py +++ b/var/spack/repos/builtin/packages/py-babel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-backports-abc/package.py b/var/spack/repos/builtin/packages/py-backports-abc/package.py index 7d062bff6a..6bdfd99eff 100644 --- a/var/spack/repos/builtin/packages/py-backports-abc/package.py +++ b/var/spack/repos/builtin/packages/py-backports-abc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py b/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py index adadad76bd..5abe2d58cf 100644 --- a/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py +++ b/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py b/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py index 2c2caaed61..994729081f 100644 --- a/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py +++ b/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py index 723adacff8..fd1d0c6092 100644 --- a/var/spack/repos/builtin/packages/py-basemap/package.py +++ b/var/spack/repos/builtin/packages/py-basemap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py b/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py index f97c01dced..740c753093 100644 --- a/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py +++ b/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-binwalk/package.py b/var/spack/repos/builtin/packages/py-binwalk/package.py index b900274967..a27c3462c0 100644 --- a/var/spack/repos/builtin/packages/py-binwalk/package.py +++ b/var/spack/repos/builtin/packages/py-binwalk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-biopython/package.py b/var/spack/repos/builtin/packages/py-biopython/package.py index 3411e244f9..1c8c613002 100644 --- a/var/spack/repos/builtin/packages/py-biopython/package.py +++ b/var/spack/repos/builtin/packages/py-biopython/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-bleach/package.py b/var/spack/repos/builtin/packages/py-bleach/package.py index bb9c4e9398..628b58cd0c 100644 --- a/var/spack/repos/builtin/packages/py-bleach/package.py +++ b/var/spack/repos/builtin/packages/py-bleach/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-blessings/package.py b/var/spack/repos/builtin/packages/py-blessings/package.py index b38f34b412..39c6c16da1 100644 --- a/var/spack/repos/builtin/packages/py-blessings/package.py +++ b/var/spack/repos/builtin/packages/py-blessings/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-bokeh/package.py b/var/spack/repos/builtin/packages/py-bokeh/package.py index 2394b376d5..04f0b84422 100644 --- a/var/spack/repos/builtin/packages/py-bokeh/package.py +++ b/var/spack/repos/builtin/packages/py-bokeh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-boltons/package.py b/var/spack/repos/builtin/packages/py-boltons/package.py index da86792f8d..e5e371db39 100644 --- a/var/spack/repos/builtin/packages/py-boltons/package.py +++ b/var/spack/repos/builtin/packages/py-boltons/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-bottleneck/package.py b/var/spack/repos/builtin/packages/py-bottleneck/package.py index c804076125..99177ef98a 100644 --- a/var/spack/repos/builtin/packages/py-bottleneck/package.py +++ b/var/spack/repos/builtin/packages/py-bottleneck/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-brian/package.py b/var/spack/repos/builtin/packages/py-brian/package.py index e3046c939a..aff3c4da1f 100644 --- a/var/spack/repos/builtin/packages/py-brian/package.py +++ b/var/spack/repos/builtin/packages/py-brian/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-brian2/package.py b/var/spack/repos/builtin/packages/py-brian2/package.py index c3582a516d..35b5bb59b9 100644 --- a/var/spack/repos/builtin/packages/py-brian2/package.py +++ b/var/spack/repos/builtin/packages/py-brian2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cclib/package.py b/var/spack/repos/builtin/packages/py-cclib/package.py index b59376d7b8..fd1decfed8 100644 --- a/var/spack/repos/builtin/packages/py-cclib/package.py +++ b/var/spack/repos/builtin/packages/py-cclib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cdat-lite/package.py b/var/spack/repos/builtin/packages/py-cdat-lite/package.py index 2006c0eadd..cec2ce1fbc 100644 --- a/var/spack/repos/builtin/packages/py-cdat-lite/package.py +++ b/var/spack/repos/builtin/packages/py-cdat-lite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cdo/package.py b/var/spack/repos/builtin/packages/py-cdo/package.py index 2bf4a2623c..a843d06722 100644 --- a/var/spack/repos/builtin/packages/py-cdo/package.py +++ b/var/spack/repos/builtin/packages/py-cdo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-certifi/package.py b/var/spack/repos/builtin/packages/py-certifi/package.py index 7d8095f3f9..ec2db8cf62 100644 --- a/var/spack/repos/builtin/packages/py-certifi/package.py +++ b/var/spack/repos/builtin/packages/py-certifi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py index 4d1f6ee5ad..ca37b77446 100644 --- a/var/spack/repos/builtin/packages/py-cffi/package.py +++ b/var/spack/repos/builtin/packages/py-cffi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-chardet/package.py b/var/spack/repos/builtin/packages/py-chardet/package.py index 82e6df80ea..3276ed42bb 100644 --- a/var/spack/repos/builtin/packages/py-chardet/package.py +++ b/var/spack/repos/builtin/packages/py-chardet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-click/package.py b/var/spack/repos/builtin/packages/py-click/package.py index 6645134f48..2fabfb9fcf 100644 --- a/var/spack/repos/builtin/packages/py-click/package.py +++ b/var/spack/repos/builtin/packages/py-click/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-colorama/package.py b/var/spack/repos/builtin/packages/py-colorama/package.py index 82938cfdb5..f8ebfd70b2 100644 --- a/var/spack/repos/builtin/packages/py-colorama/package.py +++ b/var/spack/repos/builtin/packages/py-colorama/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-configparser/package.py b/var/spack/repos/builtin/packages/py-configparser/package.py index a489c89327..f728d41e74 100644 --- a/var/spack/repos/builtin/packages/py-configparser/package.py +++ b/var/spack/repos/builtin/packages/py-configparser/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-counter/package.py b/var/spack/repos/builtin/packages/py-counter/package.py index 9be0edd839..c36007800d 100644 --- a/var/spack/repos/builtin/packages/py-counter/package.py +++ b/var/spack/repos/builtin/packages/py-counter/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-coverage/package.py b/var/spack/repos/builtin/packages/py-coverage/package.py index c55b4373fc..596ae268c9 100644 --- a/var/spack/repos/builtin/packages/py-coverage/package.py +++ b/var/spack/repos/builtin/packages/py-coverage/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cpuinfo/package.py b/var/spack/repos/builtin/packages/py-cpuinfo/package.py index bc517624eb..fddd648b47 100644 --- a/var/spack/repos/builtin/packages/py-cpuinfo/package.py +++ b/var/spack/repos/builtin/packages/py-cpuinfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cryptography/package.py b/var/spack/repos/builtin/packages/py-cryptography/package.py index 93531acc21..4a0d5a30fc 100644 --- a/var/spack/repos/builtin/packages/py-cryptography/package.py +++ b/var/spack/repos/builtin/packages/py-cryptography/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-csvkit/package.py b/var/spack/repos/builtin/packages/py-csvkit/package.py index 5e18f5f8b2..a1bf48ca92 100644 --- a/var/spack/repos/builtin/packages/py-csvkit/package.py +++ b/var/spack/repos/builtin/packages/py-csvkit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-current/package.py b/var/spack/repos/builtin/packages/py-current/package.py index 8f28c32017..d710a31a7c 100644 --- a/var/spack/repos/builtin/packages/py-current/package.py +++ b/var/spack/repos/builtin/packages/py-current/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cutadapt/package.py b/var/spack/repos/builtin/packages/py-cutadapt/package.py index 30c6c4332f..f81f6d62c1 100644 --- a/var/spack/repos/builtin/packages/py-cutadapt/package.py +++ b/var/spack/repos/builtin/packages/py-cutadapt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cycler/package.py b/var/spack/repos/builtin/packages/py-cycler/package.py index f2b2a15018..ee18fc1214 100644 --- a/var/spack/repos/builtin/packages/py-cycler/package.py +++ b/var/spack/repos/builtin/packages/py-cycler/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-cython/package.py b/var/spack/repos/builtin/packages/py-cython/package.py index c84728cf3e..f372e90e19 100644 --- a/var/spack/repos/builtin/packages/py-cython/package.py +++ b/var/spack/repos/builtin/packages/py-cython/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dask/package.py b/var/spack/repos/builtin/packages/py-dask/package.py index 4113c2ac0b..6141505995 100644 --- a/var/spack/repos/builtin/packages/py-dask/package.py +++ b/var/spack/repos/builtin/packages/py-dask/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dateutil/package.py b/var/spack/repos/builtin/packages/py-dateutil/package.py index 3ab5ad029c..08d43a0ad0 100644 --- a/var/spack/repos/builtin/packages/py-dateutil/package.py +++ b/var/spack/repos/builtin/packages/py-dateutil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dbf/package.py b/var/spack/repos/builtin/packages/py-dbf/package.py index 56403405e8..a5c20d62a1 100644 --- a/var/spack/repos/builtin/packages/py-dbf/package.py +++ b/var/spack/repos/builtin/packages/py-dbf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-decorator/package.py b/var/spack/repos/builtin/packages/py-decorator/package.py index e5734866ec..b30de06246 100644 --- a/var/spack/repos/builtin/packages/py-decorator/package.py +++ b/var/spack/repos/builtin/packages/py-decorator/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dev/package.py b/var/spack/repos/builtin/packages/py-dev/package.py index 449ed7dd80..6ebcb211de 100644 --- a/var/spack/repos/builtin/packages/py-dev/package.py +++ b/var/spack/repos/builtin/packages/py-dev/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dill/package.py b/var/spack/repos/builtin/packages/py-dill/package.py index 7ef166feeb..d574f9df19 100644 --- a/var/spack/repos/builtin/packages/py-dill/package.py +++ b/var/spack/repos/builtin/packages/py-dill/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-docutils/package.py b/var/spack/repos/builtin/packages/py-docutils/package.py index 76a723e34d..c05100b324 100644 --- a/var/spack/repos/builtin/packages/py-docutils/package.py +++ b/var/spack/repos/builtin/packages/py-docutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-doxypy/package.py b/var/spack/repos/builtin/packages/py-doxypy/package.py index dcfe6b3b88..91f4224916 100644 --- a/var/spack/repos/builtin/packages/py-doxypy/package.py +++ b/var/spack/repos/builtin/packages/py-doxypy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-doxypypy/package.py b/var/spack/repos/builtin/packages/py-doxypypy/package.py index 7d22fe1c65..cdb8f07f86 100644 --- a/var/spack/repos/builtin/packages/py-doxypypy/package.py +++ b/var/spack/repos/builtin/packages/py-doxypypy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dryscrape/package.py b/var/spack/repos/builtin/packages/py-dryscrape/package.py index e3dd3506a2..00fd1e7919 100644 --- a/var/spack/repos/builtin/packages/py-dryscrape/package.py +++ b/var/spack/repos/builtin/packages/py-dryscrape/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dxchange/package.py b/var/spack/repos/builtin/packages/py-dxchange/package.py index b981960438..b273beb8b4 100644 --- a/var/spack/repos/builtin/packages/py-dxchange/package.py +++ b/var/spack/repos/builtin/packages/py-dxchange/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-dxfile/package.py b/var/spack/repos/builtin/packages/py-dxfile/package.py index ed8cc0b631..43398b2e9c 100644 --- a/var/spack/repos/builtin/packages/py-dxfile/package.py +++ b/var/spack/repos/builtin/packages/py-dxfile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-easybuild-easyblocks/package.py b/var/spack/repos/builtin/packages/py-easybuild-easyblocks/package.py index 0f1aa923ec..d8b6b8a887 100644 --- a/var/spack/repos/builtin/packages/py-easybuild-easyblocks/package.py +++ b/var/spack/repos/builtin/packages/py-easybuild-easyblocks/package.py @@ -5,7 +5,7 @@ # Created by Kenneth Hoste, kenneth.hoste@gmail.com # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-easybuild-easyconfigs/package.py b/var/spack/repos/builtin/packages/py-easybuild-easyconfigs/package.py index 1631557731..c1c51280cf 100644 --- a/var/spack/repos/builtin/packages/py-easybuild-easyconfigs/package.py +++ b/var/spack/repos/builtin/packages/py-easybuild-easyconfigs/package.py @@ -5,7 +5,7 @@ # Created by Kenneth Hoste, kenneth.hoste@gmail.com # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-easybuild-framework/package.py b/var/spack/repos/builtin/packages/py-easybuild-framework/package.py index 7b3bfa5e49..5d37c3c84c 100644 --- a/var/spack/repos/builtin/packages/py-easybuild-framework/package.py +++ b/var/spack/repos/builtin/packages/py-easybuild-framework/package.py @@ -5,7 +5,7 @@ # Created by Kenneth Hoste, kenneth.hoste@gmail.com # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-edffile/package.py b/var/spack/repos/builtin/packages/py-edffile/package.py index 878387a8ee..28e8fa3746 100644 --- a/var/spack/repos/builtin/packages/py-edffile/package.py +++ b/var/spack/repos/builtin/packages/py-edffile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-elasticsearch/package.py b/var/spack/repos/builtin/packages/py-elasticsearch/package.py index 823d3cc741..645c0bbe59 100644 --- a/var/spack/repos/builtin/packages/py-elasticsearch/package.py +++ b/var/spack/repos/builtin/packages/py-elasticsearch/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-elephant/package.py b/var/spack/repos/builtin/packages/py-elephant/package.py index eee222e19a..5a690e3b9f 100644 --- a/var/spack/repos/builtin/packages/py-elephant/package.py +++ b/var/spack/repos/builtin/packages/py-elephant/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-emcee/package.py b/var/spack/repos/builtin/packages/py-emcee/package.py index 65fa67eb34..2410244919 100644 --- a/var/spack/repos/builtin/packages/py-emcee/package.py +++ b/var/spack/repos/builtin/packages/py-emcee/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-entrypoints/package.py b/var/spack/repos/builtin/packages/py-entrypoints/package.py index 2c5082ffd1..f93092b317 100644 --- a/var/spack/repos/builtin/packages/py-entrypoints/package.py +++ b/var/spack/repos/builtin/packages/py-entrypoints/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-enum34/package.py b/var/spack/repos/builtin/packages/py-enum34/package.py index 572734a895..9f9e05bd7c 100644 --- a/var/spack/repos/builtin/packages/py-enum34/package.py +++ b/var/spack/repos/builtin/packages/py-enum34/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-epydoc/package.py b/var/spack/repos/builtin/packages/py-epydoc/package.py index e13d431f91..93a6018acb 100644 --- a/var/spack/repos/builtin/packages/py-epydoc/package.py +++ b/var/spack/repos/builtin/packages/py-epydoc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-et-xmlfile/package.py b/var/spack/repos/builtin/packages/py-et-xmlfile/package.py index eccb941701..565440158e 100644 --- a/var/spack/repos/builtin/packages/py-et-xmlfile/package.py +++ b/var/spack/repos/builtin/packages/py-et-xmlfile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-fasteners/package.py b/var/spack/repos/builtin/packages/py-fasteners/package.py index a5805b755d..ae496b42dc 100644 --- a/var/spack/repos/builtin/packages/py-fasteners/package.py +++ b/var/spack/repos/builtin/packages/py-fasteners/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-fiscalyear/package.py b/var/spack/repos/builtin/packages/py-fiscalyear/package.py index 2c9cc771c2..866067e1b3 100644 --- a/var/spack/repos/builtin/packages/py-fiscalyear/package.py +++ b/var/spack/repos/builtin/packages/py-fiscalyear/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-flake8/package.py b/var/spack/repos/builtin/packages/py-flake8/package.py index fdaed8c394..eb99ab3a1d 100644 --- a/var/spack/repos/builtin/packages/py-flake8/package.py +++ b/var/spack/repos/builtin/packages/py-flake8/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-flask/package.py b/var/spack/repos/builtin/packages/py-flask/package.py index 15f668642c..b489ce131e 100644 --- a/var/spack/repos/builtin/packages/py-flask/package.py +++ b/var/spack/repos/builtin/packages/py-flask/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-flexx/package.py b/var/spack/repos/builtin/packages/py-flexx/package.py index 6e6fbad4b3..4310331199 100644 --- a/var/spack/repos/builtin/packages/py-flexx/package.py +++ b/var/spack/repos/builtin/packages/py-flexx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-funcsigs/package.py b/var/spack/repos/builtin/packages/py-funcsigs/package.py index ea8b71f25f..7d173842d1 100644 --- a/var/spack/repos/builtin/packages/py-funcsigs/package.py +++ b/var/spack/repos/builtin/packages/py-funcsigs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-functools32/package.py b/var/spack/repos/builtin/packages/py-functools32/package.py index f2fb0df555..a01b022df5 100644 --- a/var/spack/repos/builtin/packages/py-functools32/package.py +++ b/var/spack/repos/builtin/packages/py-functools32/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-future/package.py b/var/spack/repos/builtin/packages/py-future/package.py index 6c41fd7070..25c3e18649 100644 --- a/var/spack/repos/builtin/packages/py-future/package.py +++ b/var/spack/repos/builtin/packages/py-future/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-futures/package.py b/var/spack/repos/builtin/packages/py-futures/package.py index c6c1d8134f..7d78f3f875 100644 --- a/var/spack/repos/builtin/packages/py-futures/package.py +++ b/var/spack/repos/builtin/packages/py-futures/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-genders/package.py b/var/spack/repos/builtin/packages/py-genders/package.py index 2123f4eb3f..2acc438c6f 100644 --- a/var/spack/repos/builtin/packages/py-genders/package.py +++ b/var/spack/repos/builtin/packages/py-genders/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-genshi/package.py b/var/spack/repos/builtin/packages/py-genshi/package.py index 462dbfe802..4d721ae74c 100644 --- a/var/spack/repos/builtin/packages/py-genshi/package.py +++ b/var/spack/repos/builtin/packages/py-genshi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-git-review/package.py b/var/spack/repos/builtin/packages/py-git-review/package.py index 6e6ebbbdaf..8987b1c302 100644 --- a/var/spack/repos/builtin/packages/py-git-review/package.py +++ b/var/spack/repos/builtin/packages/py-git-review/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-git2/package.py b/var/spack/repos/builtin/packages/py-git2/package.py index a750ecae0e..5adafe1f96 100644 --- a/var/spack/repos/builtin/packages/py-git2/package.py +++ b/var/spack/repos/builtin/packages/py-git2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-gnuplot/package.py b/var/spack/repos/builtin/packages/py-gnuplot/package.py index a23aa2585f..fe1c48fe88 100644 --- a/var/spack/repos/builtin/packages/py-gnuplot/package.py +++ b/var/spack/repos/builtin/packages/py-gnuplot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-griddataformats/package.py b/var/spack/repos/builtin/packages/py-griddataformats/package.py index ee77959e96..81ef3b9dda 100644 --- a/var/spack/repos/builtin/packages/py-griddataformats/package.py +++ b/var/spack/repos/builtin/packages/py-griddataformats/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-guidata/package.py b/var/spack/repos/builtin/packages/py-guidata/package.py index 57863de39c..ad960bb5d0 100644 --- a/var/spack/repos/builtin/packages/py-guidata/package.py +++ b/var/spack/repos/builtin/packages/py-guidata/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-guiqwt/package.py b/var/spack/repos/builtin/packages/py-guiqwt/package.py index 8422ff5197..585c5f4598 100644 --- a/var/spack/repos/builtin/packages/py-guiqwt/package.py +++ b/var/spack/repos/builtin/packages/py-guiqwt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-h5py/package.py b/var/spack/repos/builtin/packages/py-h5py/package.py index 34ef7b121c..9838f56db5 100644 --- a/var/spack/repos/builtin/packages/py-h5py/package.py +++ b/var/spack/repos/builtin/packages/py-h5py/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-html2text/package.py b/var/spack/repos/builtin/packages/py-html2text/package.py index 32341f328a..7ea6dc5921 100644 --- a/var/spack/repos/builtin/packages/py-html2text/package.py +++ b/var/spack/repos/builtin/packages/py-html2text/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-html5lib/package.py b/var/spack/repos/builtin/packages/py-html5lib/package.py index 9a8664fe43..05a5f5ceea 100644 --- a/var/spack/repos/builtin/packages/py-html5lib/package.py +++ b/var/spack/repos/builtin/packages/py-html5lib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-httpbin/package.py b/var/spack/repos/builtin/packages/py-httpbin/package.py index 70557ca840..0d426c5e2c 100644 --- a/var/spack/repos/builtin/packages/py-httpbin/package.py +++ b/var/spack/repos/builtin/packages/py-httpbin/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-hypothesis/package.py b/var/spack/repos/builtin/packages/py-hypothesis/package.py index 866d151f3e..d2bcfed2f2 100644 --- a/var/spack/repos/builtin/packages/py-hypothesis/package.py +++ b/var/spack/repos/builtin/packages/py-hypothesis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-idna/package.py b/var/spack/repos/builtin/packages/py-idna/package.py index 5a191430f2..aa8c230bf7 100644 --- a/var/spack/repos/builtin/packages/py-idna/package.py +++ b/var/spack/repos/builtin/packages/py-idna/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-imagesize/package.py b/var/spack/repos/builtin/packages/py-imagesize/package.py index 44491f79f0..3c8de20db0 100644 --- a/var/spack/repos/builtin/packages/py-imagesize/package.py +++ b/var/spack/repos/builtin/packages/py-imagesize/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-iminuit/package.py b/var/spack/repos/builtin/packages/py-iminuit/package.py index 0b93a0f2b8..b4b51f67f0 100644 --- a/var/spack/repos/builtin/packages/py-iminuit/package.py +++ b/var/spack/repos/builtin/packages/py-iminuit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-importlib/package.py b/var/spack/repos/builtin/packages/py-importlib/package.py index 8d16c6b80a..3375cc9853 100644 --- a/var/spack/repos/builtin/packages/py-importlib/package.py +++ b/var/spack/repos/builtin/packages/py-importlib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ipaddress/package.py b/var/spack/repos/builtin/packages/py-ipaddress/package.py index 5e088ed75e..d7a7e69e7f 100644 --- a/var/spack/repos/builtin/packages/py-ipaddress/package.py +++ b/var/spack/repos/builtin/packages/py-ipaddress/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ipdb/package.py b/var/spack/repos/builtin/packages/py-ipdb/package.py index 67a9231ca5..8c6598d109 100644 --- a/var/spack/repos/builtin/packages/py-ipdb/package.py +++ b/var/spack/repos/builtin/packages/py-ipdb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ipykernel/package.py b/var/spack/repos/builtin/packages/py-ipykernel/package.py index ff68f09fff..943db24cee 100644 --- a/var/spack/repos/builtin/packages/py-ipykernel/package.py +++ b/var/spack/repos/builtin/packages/py-ipykernel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ipython-genutils/package.py b/var/spack/repos/builtin/packages/py-ipython-genutils/package.py index 55496e1eb9..d72d2ff515 100644 --- a/var/spack/repos/builtin/packages/py-ipython-genutils/package.py +++ b/var/spack/repos/builtin/packages/py-ipython-genutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py index f559c163ab..16da6027e4 100644 --- a/var/spack/repos/builtin/packages/py-ipython/package.py +++ b/var/spack/repos/builtin/packages/py-ipython/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ipywidgets/package.py b/var/spack/repos/builtin/packages/py-ipywidgets/package.py index 03b0c8bfcf..496477ba8a 100644 --- a/var/spack/repos/builtin/packages/py-ipywidgets/package.py +++ b/var/spack/repos/builtin/packages/py-ipywidgets/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-itsdangerous/package.py b/var/spack/repos/builtin/packages/py-itsdangerous/package.py index 82e66c2eeb..a693c341ae 100644 --- a/var/spack/repos/builtin/packages/py-itsdangerous/package.py +++ b/var/spack/repos/builtin/packages/py-itsdangerous/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jdcal/package.py b/var/spack/repos/builtin/packages/py-jdcal/package.py index 5eb2e57d82..b4e08ca77f 100644 --- a/var/spack/repos/builtin/packages/py-jdcal/package.py +++ b/var/spack/repos/builtin/packages/py-jdcal/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jedi/package.py b/var/spack/repos/builtin/packages/py-jedi/package.py index 81f83f9ab7..c90c77ee68 100644 --- a/var/spack/repos/builtin/packages/py-jedi/package.py +++ b/var/spack/repos/builtin/packages/py-jedi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jinja2/package.py b/var/spack/repos/builtin/packages/py-jinja2/package.py index 36439d1d36..31180594de 100644 --- a/var/spack/repos/builtin/packages/py-jinja2/package.py +++ b/var/spack/repos/builtin/packages/py-jinja2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-joblib/package.py b/var/spack/repos/builtin/packages/py-joblib/package.py index 75ebae6804..50e10663a7 100644 --- a/var/spack/repos/builtin/packages/py-joblib/package.py +++ b/var/spack/repos/builtin/packages/py-joblib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jpype/package.py b/var/spack/repos/builtin/packages/py-jpype/package.py index 3c20c813f8..b82a43ca2f 100644 --- a/var/spack/repos/builtin/packages/py-jpype/package.py +++ b/var/spack/repos/builtin/packages/py-jpype/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jsonschema/package.py b/var/spack/repos/builtin/packages/py-jsonschema/package.py index b1a0ac6606..8a69361bab 100644 --- a/var/spack/repos/builtin/packages/py-jsonschema/package.py +++ b/var/spack/repos/builtin/packages/py-jsonschema/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-junit-xml/package.py b/var/spack/repos/builtin/packages/py-junit-xml/package.py index 887193e347..3c21b5056b 100644 --- a/var/spack/repos/builtin/packages/py-junit-xml/package.py +++ b/var/spack/repos/builtin/packages/py-junit-xml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jupyter-client/package.py b/var/spack/repos/builtin/packages/py-jupyter-client/package.py index 2d89616afd..8fc9a12445 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-client/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-client/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jupyter-console/package.py b/var/spack/repos/builtin/packages/py-jupyter-console/package.py index 6ed49b72c9..bd039a765c 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-console/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-console/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jupyter-core/package.py b/var/spack/repos/builtin/packages/py-jupyter-core/package.py index a3d2bee1a9..547133a345 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-core/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-core/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py b/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py index b82f8b2787..2f0f9e977d 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-keras/package.py b/var/spack/repos/builtin/packages/py-keras/package.py index 1ca706b20e..9c1e639667 100644 --- a/var/spack/repos/builtin/packages/py-keras/package.py +++ b/var/spack/repos/builtin/packages/py-keras/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-latexcodec/package.py b/var/spack/repos/builtin/packages/py-latexcodec/package.py index bdc96d2c68..2f9ef63220 100644 --- a/var/spack/repos/builtin/packages/py-latexcodec/package.py +++ b/var/spack/repos/builtin/packages/py-latexcodec/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-lazy/package.py b/var/spack/repos/builtin/packages/py-lazy/package.py index 7dd8775f8a..e1946dc9c8 100644 --- a/var/spack/repos/builtin/packages/py-lazy/package.py +++ b/var/spack/repos/builtin/packages/py-lazy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-lazyarray/package.py b/var/spack/repos/builtin/packages/py-lazyarray/package.py index 8dcc999f62..2af2624243 100644 --- a/var/spack/repos/builtin/packages/py-lazyarray/package.py +++ b/var/spack/repos/builtin/packages/py-lazyarray/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-libconf/package.py b/var/spack/repos/builtin/packages/py-libconf/package.py index d43479d9ef..f5beae266b 100644 --- a/var/spack/repos/builtin/packages/py-libconf/package.py +++ b/var/spack/repos/builtin/packages/py-libconf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-lit/package.py b/var/spack/repos/builtin/packages/py-lit/package.py index 238d1b1500..711986ae3f 100644 --- a/var/spack/repos/builtin/packages/py-lit/package.py +++ b/var/spack/repos/builtin/packages/py-lit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-lmfit/package.py b/var/spack/repos/builtin/packages/py-lmfit/package.py index 460c68573d..7d07a8e039 100644 --- a/var/spack/repos/builtin/packages/py-lmfit/package.py +++ b/var/spack/repos/builtin/packages/py-lmfit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-lockfile/package.py b/var/spack/repos/builtin/packages/py-lockfile/package.py index 1e57e6a1d7..12f606588d 100644 --- a/var/spack/repos/builtin/packages/py-lockfile/package.py +++ b/var/spack/repos/builtin/packages/py-lockfile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-logilab-common/package.py b/var/spack/repos/builtin/packages/py-logilab-common/package.py index 4c20885760..ab71df7689 100644 --- a/var/spack/repos/builtin/packages/py-logilab-common/package.py +++ b/var/spack/repos/builtin/packages/py-logilab-common/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-lxml/package.py b/var/spack/repos/builtin/packages/py-lxml/package.py index fe63f87639..9299d5c877 100644 --- a/var/spack/repos/builtin/packages/py-lxml/package.py +++ b/var/spack/repos/builtin/packages/py-lxml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-macs2/package.py b/var/spack/repos/builtin/packages/py-macs2/package.py index 42318faa2a..d4bfd1b0f4 100644 --- a/var/spack/repos/builtin/packages/py-macs2/package.py +++ b/var/spack/repos/builtin/packages/py-macs2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mako/package.py b/var/spack/repos/builtin/packages/py-mako/package.py index 0707d0b12f..b1ea98d963 100644 --- a/var/spack/repos/builtin/packages/py-mako/package.py +++ b/var/spack/repos/builtin/packages/py-mako/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-markdown/package.py b/var/spack/repos/builtin/packages/py-markdown/package.py index 1c9be594ae..71831ccb99 100644 --- a/var/spack/repos/builtin/packages/py-markdown/package.py +++ b/var/spack/repos/builtin/packages/py-markdown/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-markupsafe/package.py b/var/spack/repos/builtin/packages/py-markupsafe/package.py index 6c8af74a9f..95c6a115c3 100644 --- a/var/spack/repos/builtin/packages/py-markupsafe/package.py +++ b/var/spack/repos/builtin/packages/py-markupsafe/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-matplotlib/package.py b/var/spack/repos/builtin/packages/py-matplotlib/package.py index 24dfab5c92..ec5e33b45f 100644 --- a/var/spack/repos/builtin/packages/py-matplotlib/package.py +++ b/var/spack/repos/builtin/packages/py-matplotlib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mccabe/package.py b/var/spack/repos/builtin/packages/py-mccabe/package.py index c413193cdc..87a9027881 100644 --- a/var/spack/repos/builtin/packages/py-mccabe/package.py +++ b/var/spack/repos/builtin/packages/py-mccabe/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mdanalysis/package.py b/var/spack/repos/builtin/packages/py-mdanalysis/package.py index 9f96b04836..6d6f945500 100644 --- a/var/spack/repos/builtin/packages/py-mdanalysis/package.py +++ b/var/spack/repos/builtin/packages/py-mdanalysis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-meep/package.py b/var/spack/repos/builtin/packages/py-meep/package.py index 64ca4e25d9..ef50cf3f3a 100644 --- a/var/spack/repos/builtin/packages/py-meep/package.py +++ b/var/spack/repos/builtin/packages/py-meep/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mistune/package.py b/var/spack/repos/builtin/packages/py-mistune/package.py index cc859d4b78..a10f0b5024 100644 --- a/var/spack/repos/builtin/packages/py-mistune/package.py +++ b/var/spack/repos/builtin/packages/py-mistune/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mock/package.py b/var/spack/repos/builtin/packages/py-mock/package.py index 0ea571080a..f5653117d9 100644 --- a/var/spack/repos/builtin/packages/py-mock/package.py +++ b/var/spack/repos/builtin/packages/py-mock/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mongo/package.py b/var/spack/repos/builtin/packages/py-mongo/package.py index e5f1debbd0..90fec7bc61 100644 --- a/var/spack/repos/builtin/packages/py-mongo/package.py +++ b/var/spack/repos/builtin/packages/py-mongo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-monotonic/package.py b/var/spack/repos/builtin/packages/py-monotonic/package.py index b02f954ccc..3567c70db1 100644 --- a/var/spack/repos/builtin/packages/py-monotonic/package.py +++ b/var/spack/repos/builtin/packages/py-monotonic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-monty/package.py b/var/spack/repos/builtin/packages/py-monty/package.py index 19057d51d3..4993724450 100644 --- a/var/spack/repos/builtin/packages/py-monty/package.py +++ b/var/spack/repos/builtin/packages/py-monty/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py index 7f8dc6b986..a2ca9d83d8 100644 --- a/var/spack/repos/builtin/packages/py-mpi4py/package.py +++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mpmath/package.py b/var/spack/repos/builtin/packages/py-mpmath/package.py index d379e0bd03..7b57ec4d73 100644 --- a/var/spack/repos/builtin/packages/py-mpmath/package.py +++ b/var/spack/repos/builtin/packages/py-mpmath/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-multiprocess/package.py b/var/spack/repos/builtin/packages/py-multiprocess/package.py index fc4576a538..8e64a2a929 100644 --- a/var/spack/repos/builtin/packages/py-multiprocess/package.py +++ b/var/spack/repos/builtin/packages/py-multiprocess/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mx/package.py b/var/spack/repos/builtin/packages/py-mx/package.py index 9af74555b1..98b5d316cd 100644 --- a/var/spack/repos/builtin/packages/py-mx/package.py +++ b/var/spack/repos/builtin/packages/py-mx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-myhdl/package.py b/var/spack/repos/builtin/packages/py-myhdl/package.py index cf4936a3f9..ee8f8377d6 100644 --- a/var/spack/repos/builtin/packages/py-myhdl/package.py +++ b/var/spack/repos/builtin/packages/py-myhdl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-mysqldb1/package.py b/var/spack/repos/builtin/packages/py-mysqldb1/package.py index 8fd794aadb..b24ace3f79 100644 --- a/var/spack/repos/builtin/packages/py-mysqldb1/package.py +++ b/var/spack/repos/builtin/packages/py-mysqldb1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-nbconvert/package.py b/var/spack/repos/builtin/packages/py-nbconvert/package.py index 27a8259c29..4b46ae664f 100644 --- a/var/spack/repos/builtin/packages/py-nbconvert/package.py +++ b/var/spack/repos/builtin/packages/py-nbconvert/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-nbformat/package.py b/var/spack/repos/builtin/packages/py-nbformat/package.py index e318096535..d6006a1db4 100644 --- a/var/spack/repos/builtin/packages/py-nbformat/package.py +++ b/var/spack/repos/builtin/packages/py-nbformat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-neo/package.py b/var/spack/repos/builtin/packages/py-neo/package.py index b7a5180add..a4b9c8eb83 100644 --- a/var/spack/repos/builtin/packages/py-neo/package.py +++ b/var/spack/repos/builtin/packages/py-neo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,8 +26,8 @@ from spack import * class PyNeo(PythonPackage): - """Neo is a package for representing electrophysiology data in Python, - together with support for reading a wide range of neurophysiology + """Neo is a package for representing electrophysiology data in Python, + together with support for reading a wide range of neurophysiology file formats""" homepage = "http://neuralensemble.org/neo" diff --git a/var/spack/repos/builtin/packages/py-nestle/package.py b/var/spack/repos/builtin/packages/py-nestle/package.py index 22dc9debe1..1c5864ed91 100644 --- a/var/spack/repos/builtin/packages/py-nestle/package.py +++ b/var/spack/repos/builtin/packages/py-nestle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-netcdf4/package.py b/var/spack/repos/builtin/packages/py-netcdf4/package.py index e49cc5410b..a27ea51580 100644 --- a/var/spack/repos/builtin/packages/py-netcdf4/package.py +++ b/var/spack/repos/builtin/packages/py-netcdf4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-netifaces/package.py b/var/spack/repos/builtin/packages/py-netifaces/package.py index 3229af495f..6a069ae11e 100644 --- a/var/spack/repos/builtin/packages/py-netifaces/package.py +++ b/var/spack/repos/builtin/packages/py-netifaces/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-networkx/package.py b/var/spack/repos/builtin/packages/py-networkx/package.py index 6eca70c15c..6ddff5988f 100644 --- a/var/spack/repos/builtin/packages/py-networkx/package.py +++ b/var/spack/repos/builtin/packages/py-networkx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py index f3f08029a4..6876620e24 100644 --- a/var/spack/repos/builtin/packages/py-nose/package.py +++ b/var/spack/repos/builtin/packages/py-nose/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-nosexcover/package.py b/var/spack/repos/builtin/packages/py-nosexcover/package.py index 277070b0d9..5ec76bc194 100644 --- a/var/spack/repos/builtin/packages/py-nosexcover/package.py +++ b/var/spack/repos/builtin/packages/py-nosexcover/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-numexpr/package.py b/var/spack/repos/builtin/packages/py-numexpr/package.py index ee89820f5b..57250b645b 100644 --- a/var/spack/repos/builtin/packages/py-numexpr/package.py +++ b/var/spack/repos/builtin/packages/py-numexpr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index c713162e9c..4eac983706 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-numpydoc/package.py b/var/spack/repos/builtin/packages/py-numpydoc/package.py index 70f7a603a9..2052ecad24 100644 --- a/var/spack/repos/builtin/packages/py-numpydoc/package.py +++ b/var/spack/repos/builtin/packages/py-numpydoc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py b/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py index d6aea1f5ec..18ef2f59b7 100644 --- a/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py +++ b/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-openpyxl/package.py b/var/spack/repos/builtin/packages/py-openpyxl/package.py index 04d4a51f6d..6ccb5f211d 100644 --- a/var/spack/repos/builtin/packages/py-openpyxl/package.py +++ b/var/spack/repos/builtin/packages/py-openpyxl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ordereddict/package.py b/var/spack/repos/builtin/packages/py-ordereddict/package.py index 29d5786237..586cfa425b 100644 --- a/var/spack/repos/builtin/packages/py-ordereddict/package.py +++ b/var/spack/repos/builtin/packages/py-ordereddict/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-oset/package.py b/var/spack/repos/builtin/packages/py-oset/package.py index 54627323b5..50428fdd0e 100644 --- a/var/spack/repos/builtin/packages/py-oset/package.py +++ b/var/spack/repos/builtin/packages/py-oset/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-packaging/package.py b/var/spack/repos/builtin/packages/py-packaging/package.py index 4ee97a507a..ec165f72b9 100644 --- a/var/spack/repos/builtin/packages/py-packaging/package.py +++ b/var/spack/repos/builtin/packages/py-packaging/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-palettable/package.py b/var/spack/repos/builtin/packages/py-palettable/package.py index b432d4ee28..7fa6358d18 100644 --- a/var/spack/repos/builtin/packages/py-palettable/package.py +++ b/var/spack/repos/builtin/packages/py-palettable/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pandas/package.py b/var/spack/repos/builtin/packages/py-pandas/package.py index 65e70e0f5e..e8283c90eb 100644 --- a/var/spack/repos/builtin/packages/py-pandas/package.py +++ b/var/spack/repos/builtin/packages/py-pandas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-paramiko/package.py b/var/spack/repos/builtin/packages/py-paramiko/package.py index 94ddb85ec2..033145c0e0 100644 --- a/var/spack/repos/builtin/packages/py-paramiko/package.py +++ b/var/spack/repos/builtin/packages/py-paramiko/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pathlib2/package.py b/var/spack/repos/builtin/packages/py-pathlib2/package.py index 5cfc66e871..6fdb105c1c 100644 --- a/var/spack/repos/builtin/packages/py-pathlib2/package.py +++ b/var/spack/repos/builtin/packages/py-pathlib2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pathos/package.py b/var/spack/repos/builtin/packages/py-pathos/package.py index 172abdc725..e48b20929c 100644 --- a/var/spack/repos/builtin/packages/py-pathos/package.py +++ b/var/spack/repos/builtin/packages/py-pathos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pathspec/package.py b/var/spack/repos/builtin/packages/py-pathspec/package.py index e5030abc70..e9ff10b109 100644 --- a/var/spack/repos/builtin/packages/py-pathspec/package.py +++ b/var/spack/repos/builtin/packages/py-pathspec/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-patsy/package.py b/var/spack/repos/builtin/packages/py-patsy/package.py index 27be8bb41f..4ebfe697f0 100644 --- a/var/spack/repos/builtin/packages/py-patsy/package.py +++ b/var/spack/repos/builtin/packages/py-patsy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pbr/package.py b/var/spack/repos/builtin/packages/py-pbr/package.py index 7036ffee8a..e8dcae1353 100644 --- a/var/spack/repos/builtin/packages/py-pbr/package.py +++ b/var/spack/repos/builtin/packages/py-pbr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-periodictable/package.py b/var/spack/repos/builtin/packages/py-periodictable/package.py index ed1b97f1fe..84d6479fc4 100644 --- a/var/spack/repos/builtin/packages/py-periodictable/package.py +++ b/var/spack/repos/builtin/packages/py-periodictable/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-petsc4py/package.py b/var/spack/repos/builtin/packages/py-petsc4py/package.py index d2b1d30ff1..888890037c 100644 --- a/var/spack/repos/builtin/packages/py-petsc4py/package.py +++ b/var/spack/repos/builtin/packages/py-petsc4py/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pexpect/package.py b/var/spack/repos/builtin/packages/py-pexpect/package.py index 5c194c44b6..6ce99cc7d0 100644 --- a/var/spack/repos/builtin/packages/py-pexpect/package.py +++ b/var/spack/repos/builtin/packages/py-pexpect/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-phonopy/package.py b/var/spack/repos/builtin/packages/py-phonopy/package.py index b7f1003e28..852f6bd0b4 100644 --- a/var/spack/repos/builtin/packages/py-phonopy/package.py +++ b/var/spack/repos/builtin/packages/py-phonopy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pickleshare/package.py b/var/spack/repos/builtin/packages/py-pickleshare/package.py index 9bf9ff63fb..dde89ce6f8 100644 --- a/var/spack/repos/builtin/packages/py-pickleshare/package.py +++ b/var/spack/repos/builtin/packages/py-pickleshare/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pil/package.py b/var/spack/repos/builtin/packages/py-pil/package.py index fb14fb9b27..ce65d1ef77 100644 --- a/var/spack/repos/builtin/packages/py-pil/package.py +++ b/var/spack/repos/builtin/packages/py-pil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pillow/package.py b/var/spack/repos/builtin/packages/py-pillow/package.py index 6d35957819..656c9a15f2 100644 --- a/var/spack/repos/builtin/packages/py-pillow/package.py +++ b/var/spack/repos/builtin/packages/py-pillow/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pip/package.py b/var/spack/repos/builtin/packages/py-pip/package.py index 616884ea0d..6cfeae8288 100644 --- a/var/spack/repos/builtin/packages/py-pip/package.py +++ b/var/spack/repos/builtin/packages/py-pip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pkgconfig/package.py b/var/spack/repos/builtin/packages/py-pkgconfig/package.py index 87c5b1dac2..5d6af2b8e1 100644 --- a/var/spack/repos/builtin/packages/py-pkgconfig/package.py +++ b/var/spack/repos/builtin/packages/py-pkgconfig/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ply/package.py b/var/spack/repos/builtin/packages/py-ply/package.py index f5a1e537e2..f023b7ca79 100644 --- a/var/spack/repos/builtin/packages/py-ply/package.py +++ b/var/spack/repos/builtin/packages/py-ply/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pmw/package.py b/var/spack/repos/builtin/packages/py-pmw/package.py index 3293d94cd6..e7317bae0c 100644 --- a/var/spack/repos/builtin/packages/py-pmw/package.py +++ b/var/spack/repos/builtin/packages/py-pmw/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pox/package.py b/var/spack/repos/builtin/packages/py-pox/package.py index 3c22c73b85..946a6fae0f 100644 --- a/var/spack/repos/builtin/packages/py-pox/package.py +++ b/var/spack/repos/builtin/packages/py-pox/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ppft/package.py b/var/spack/repos/builtin/packages/py-ppft/package.py index a07aaf6d91..07681c57e2 100644 --- a/var/spack/repos/builtin/packages/py-ppft/package.py +++ b/var/spack/repos/builtin/packages/py-ppft/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-prettytable/package.py b/var/spack/repos/builtin/packages/py-prettytable/package.py index 2203f68af0..12bf2e7cfa 100644 --- a/var/spack/repos/builtin/packages/py-prettytable/package.py +++ b/var/spack/repos/builtin/packages/py-prettytable/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-proj/package.py b/var/spack/repos/builtin/packages/py-proj/package.py index cf230eb49f..649fa40f5c 100644 --- a/var/spack/repos/builtin/packages/py-proj/package.py +++ b/var/spack/repos/builtin/packages/py-proj/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py b/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py index da48cb932f..35500c833b 100644 --- a/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py +++ b/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-protobuf/package.py b/var/spack/repos/builtin/packages/py-protobuf/package.py index 4cdb3801a5..3d474586fb 100644 --- a/var/spack/repos/builtin/packages/py-protobuf/package.py +++ b/var/spack/repos/builtin/packages/py-protobuf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-psutil/package.py b/var/spack/repos/builtin/packages/py-psutil/package.py index 539f0bdbd7..f7b96da772 100644 --- a/var/spack/repos/builtin/packages/py-psutil/package.py +++ b/var/spack/repos/builtin/packages/py-psutil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ptyprocess/package.py b/var/spack/repos/builtin/packages/py-ptyprocess/package.py index 346b3fd26b..cdd5105796 100644 --- a/var/spack/repos/builtin/packages/py-ptyprocess/package.py +++ b/var/spack/repos/builtin/packages/py-ptyprocess/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pudb/package.py b/var/spack/repos/builtin/packages/py-pudb/package.py index ea06dc0c93..2ee28865d4 100644 --- a/var/spack/repos/builtin/packages/py-pudb/package.py +++ b/var/spack/repos/builtin/packages/py-pudb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-py/package.py b/var/spack/repos/builtin/packages/py-py/package.py index 1bba4b7252..28d9ed75ac 100644 --- a/var/spack/repos/builtin/packages/py-py/package.py +++ b/var/spack/repos/builtin/packages/py-py/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-py2cairo/package.py b/var/spack/repos/builtin/packages/py-py2cairo/package.py index 2eacf540c9..9bd3f9a9b1 100644 --- a/var/spack/repos/builtin/packages/py-py2cairo/package.py +++ b/var/spack/repos/builtin/packages/py-py2cairo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-py2neo/package.py b/var/spack/repos/builtin/packages/py-py2neo/package.py index 1db080ac97..9c2ef0e8d7 100644 --- a/var/spack/repos/builtin/packages/py-py2neo/package.py +++ b/var/spack/repos/builtin/packages/py-py2neo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-py4j/package.py b/var/spack/repos/builtin/packages/py-py4j/package.py index 3fb4b2f79f..cdb3b4db0a 100644 --- a/var/spack/repos/builtin/packages/py-py4j/package.py +++ b/var/spack/repos/builtin/packages/py-py4j/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyasn1/package.py b/var/spack/repos/builtin/packages/py-pyasn1/package.py index 885ef06389..666a20f758 100644 --- a/var/spack/repos/builtin/packages/py-pyasn1/package.py +++ b/var/spack/repos/builtin/packages/py-pyasn1/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py b/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py index ee154d2748..d0b75be3a5 100644 --- a/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py +++ b/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pybtex/package.py b/var/spack/repos/builtin/packages/py-pybtex/package.py index 99a0f5dfdc..bcdbc61ca4 100644 --- a/var/spack/repos/builtin/packages/py-pybtex/package.py +++ b/var/spack/repos/builtin/packages/py-pybtex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pychecker/package.py b/var/spack/repos/builtin/packages/py-pychecker/package.py index de09b380c9..8dcb6ee15d 100644 --- a/var/spack/repos/builtin/packages/py-pychecker/package.py +++ b/var/spack/repos/builtin/packages/py-pychecker/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pycodestyle/package.py b/var/spack/repos/builtin/packages/py-pycodestyle/package.py index 3e668a2704..4f69e749e9 100644 --- a/var/spack/repos/builtin/packages/py-pycodestyle/package.py +++ b/var/spack/repos/builtin/packages/py-pycodestyle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pycparser/package.py b/var/spack/repos/builtin/packages/py-pycparser/package.py index a2c00fe33a..d950d1578d 100644 --- a/var/spack/repos/builtin/packages/py-pycparser/package.py +++ b/var/spack/repos/builtin/packages/py-pycparser/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pycrypto/package.py b/var/spack/repos/builtin/packages/py-pycrypto/package.py index e791d38cf1..65d78dc75d 100644 --- a/var/spack/repos/builtin/packages/py-pycrypto/package.py +++ b/var/spack/repos/builtin/packages/py-pycrypto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pycurl/package.py b/var/spack/repos/builtin/packages/py-pycurl/package.py index f08509b332..91a1648d3b 100644 --- a/var/spack/repos/builtin/packages/py-pycurl/package.py +++ b/var/spack/repos/builtin/packages/py-pycurl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pydatalog/package.py b/var/spack/repos/builtin/packages/py-pydatalog/package.py index 600a34cdfc..6a51f5dc20 100644 --- a/var/spack/repos/builtin/packages/py-pydatalog/package.py +++ b/var/spack/repos/builtin/packages/py-pydatalog/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pydispatcher/package.py b/var/spack/repos/builtin/packages/py-pydispatcher/package.py index 198f6319ac..7f6e9b493e 100644 --- a/var/spack/repos/builtin/packages/py-pydispatcher/package.py +++ b/var/spack/repos/builtin/packages/py-pydispatcher/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pydot/package.py b/var/spack/repos/builtin/packages/py-pydot/package.py index 844840a606..f843bcbe2b 100644 --- a/var/spack/repos/builtin/packages/py-pydot/package.py +++ b/var/spack/repos/builtin/packages/py-pydot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyelftools/package.py b/var/spack/repos/builtin/packages/py-pyelftools/package.py index d586f14f0d..23c8b4ef90 100644 --- a/var/spack/repos/builtin/packages/py-pyelftools/package.py +++ b/var/spack/repos/builtin/packages/py-pyelftools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyfftw/package.py b/var/spack/repos/builtin/packages/py-pyfftw/package.py index d26f2756c8..c9f32f57ff 100644 --- a/var/spack/repos/builtin/packages/py-pyfftw/package.py +++ b/var/spack/repos/builtin/packages/py-pyfftw/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyflakes/package.py b/var/spack/repos/builtin/packages/py-pyflakes/package.py index 53674bb6e4..e816f1b992 100644 --- a/var/spack/repos/builtin/packages/py-pyflakes/package.py +++ b/var/spack/repos/builtin/packages/py-pyflakes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pygments/package.py b/var/spack/repos/builtin/packages/py-pygments/package.py index 771245cc10..e814589cc5 100644 --- a/var/spack/repos/builtin/packages/py-pygments/package.py +++ b/var/spack/repos/builtin/packages/py-pygments/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pygobject/package.py b/var/spack/repos/builtin/packages/py-pygobject/package.py index 4cb6d6ccb0..10b9b5ecea 100644 --- a/var/spack/repos/builtin/packages/py-pygobject/package.py +++ b/var/spack/repos/builtin/packages/py-pygobject/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pygtk/package.py b/var/spack/repos/builtin/packages/py-pygtk/package.py index 5d34a3cc86..57f422437a 100644 --- a/var/spack/repos/builtin/packages/py-pygtk/package.py +++ b/var/spack/repos/builtin/packages/py-pygtk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pylint/package.py b/var/spack/repos/builtin/packages/py-pylint/package.py index b825ed68dc..4df0e09c9f 100644 --- a/var/spack/repos/builtin/packages/py-pylint/package.py +++ b/var/spack/repos/builtin/packages/py-pylint/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pymatgen/package.py b/var/spack/repos/builtin/packages/py-pymatgen/package.py index 0ea4907b1b..d944410084 100644 --- a/var/spack/repos/builtin/packages/py-pymatgen/package.py +++ b/var/spack/repos/builtin/packages/py-pymatgen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyminifier/package.py b/var/spack/repos/builtin/packages/py-pyminifier/package.py index 8562a7a472..d085d49ea7 100644 --- a/var/spack/repos/builtin/packages/py-pyminifier/package.py +++ b/var/spack/repos/builtin/packages/py-pyminifier/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pympler/package.py b/var/spack/repos/builtin/packages/py-pympler/package.py index 51c77f117d..9ca0ddc0cf 100644 --- a/var/spack/repos/builtin/packages/py-pympler/package.py +++ b/var/spack/repos/builtin/packages/py-pympler/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pynn/package.py b/var/spack/repos/builtin/packages/py-pynn/package.py index ffe0ea64af..420c2d238b 100644 --- a/var/spack/repos/builtin/packages/py-pynn/package.py +++ b/var/spack/repos/builtin/packages/py-pynn/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pypar/package.py b/var/spack/repos/builtin/packages/py-pypar/package.py index c95698d83d..8c84826174 100644 --- a/var/spack/repos/builtin/packages/py-pypar/package.py +++ b/var/spack/repos/builtin/packages/py-pypar/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyparsing/package.py b/var/spack/repos/builtin/packages/py-pyparsing/package.py index 9baca31e91..ae4f3a3d9f 100644 --- a/var/spack/repos/builtin/packages/py-pyparsing/package.py +++ b/var/spack/repos/builtin/packages/py-pyparsing/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyprof2html/package.py b/var/spack/repos/builtin/packages/py-pyprof2html/package.py index 19e3967e35..0014d6127a 100644 --- a/var/spack/repos/builtin/packages/py-pyprof2html/package.py +++ b/var/spack/repos/builtin/packages/py-pyprof2html/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyqt/package.py b/var/spack/repos/builtin/packages/py-pyqt/package.py index e1e87880e0..3aed68f845 100644 --- a/var/spack/repos/builtin/packages/py-pyqt/package.py +++ b/var/spack/repos/builtin/packages/py-pyqt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyserial/package.py b/var/spack/repos/builtin/packages/py-pyserial/package.py index 98ecd8bffd..e2ba88d660 100644 --- a/var/spack/repos/builtin/packages/py-pyserial/package.py +++ b/var/spack/repos/builtin/packages/py-pyserial/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyside/package.py b/var/spack/repos/builtin/packages/py-pyside/package.py index 961aef7864..7735fc28df 100644 --- a/var/spack/repos/builtin/packages/py-pyside/package.py +++ b/var/spack/repos/builtin/packages/py-pyside/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pysocks/package.py b/var/spack/repos/builtin/packages/py-pysocks/package.py index 603799c446..6d0ff52400 100644 --- a/var/spack/repos/builtin/packages/py-pysocks/package.py +++ b/var/spack/repos/builtin/packages/py-pysocks/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytables/package.py b/var/spack/repos/builtin/packages/py-pytables/package.py index 3d9bfb2c2f..00fd9309be 100644 --- a/var/spack/repos/builtin/packages/py-pytables/package.py +++ b/var/spack/repos/builtin/packages/py-pytables/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytest-cov/package.py b/var/spack/repos/builtin/packages/py-pytest-cov/package.py index f40fc7872e..3a7496f766 100644 --- a/var/spack/repos/builtin/packages/py-pytest-cov/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-cov/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -29,7 +29,7 @@ class PyPytestCov(PythonPackage): """Pytest plugin for measuring coverage.""" homepage = "https://github.com/pytest-dev/pytest-cov" - url = "https://pypi.io/packages/source/p/pytest-cov/pytest-cov-2.3.1.tar.gz" + url = "https://pypi.io/packages/source/p/pytest-cov/pytest-cov-2.3.1.tar.gz" version('2.3.1', '8e7475454313a035d08f387ee6d725cb') diff --git a/var/spack/repos/builtin/packages/py-pytest-flake8/package.py b/var/spack/repos/builtin/packages/py-pytest-flake8/package.py index 8a3ee5bb4a..8299fd7dc9 100644 --- a/var/spack/repos/builtin/packages/py-pytest-flake8/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-flake8/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py b/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py index 2eb498987d..74e0b9e933 100644 --- a/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytest-mock/package.py b/var/spack/repos/builtin/packages/py-pytest-mock/package.py index 354b799e92..9cd84a01c3 100644 --- a/var/spack/repos/builtin/packages/py-pytest-mock/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-mock/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytest-runner/package.py b/var/spack/repos/builtin/packages/py-pytest-runner/package.py index 02ef5dc09d..114a9dcd13 100644 --- a/var/spack/repos/builtin/packages/py-pytest-runner/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-runner/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytest/package.py b/var/spack/repos/builtin/packages/py-pytest/package.py index c1c4ee534c..965cb26a8d 100644 --- a/var/spack/repos/builtin/packages/py-pytest/package.py +++ b/var/spack/repos/builtin/packages/py-pytest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-python-daemon/package.py b/var/spack/repos/builtin/packages/py-python-daemon/package.py index 9ed085f031..3e61231c8e 100644 --- a/var/spack/repos/builtin/packages/py-python-daemon/package.py +++ b/var/spack/repos/builtin/packages/py-python-daemon/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-python-gitlab/package.py b/var/spack/repos/builtin/packages/py-python-gitlab/package.py index 24feb1c5fa..79a5f82fbf 100644 --- a/var/spack/repos/builtin/packages/py-python-gitlab/package.py +++ b/var/spack/repos/builtin/packages/py-python-gitlab/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pythonqwt/package.py b/var/spack/repos/builtin/packages/py-pythonqwt/package.py index 22ede1f868..fd4f2825cb 100644 --- a/var/spack/repos/builtin/packages/py-pythonqwt/package.py +++ b/var/spack/repos/builtin/packages/py-pythonqwt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pytz/package.py b/var/spack/repos/builtin/packages/py-pytz/package.py index 6289651a29..0bcadd8238 100644 --- a/var/spack/repos/builtin/packages/py-pytz/package.py +++ b/var/spack/repos/builtin/packages/py-pytz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pywavelets/package.py b/var/spack/repos/builtin/packages/py-pywavelets/package.py index 8dbb597702..ffe1d5364c 100644 --- a/var/spack/repos/builtin/packages/py-pywavelets/package.py +++ b/var/spack/repos/builtin/packages/py-pywavelets/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-pyyaml/package.py b/var/spack/repos/builtin/packages/py-pyyaml/package.py index 94d8fdd0e6..def71814e3 100644 --- a/var/spack/repos/builtin/packages/py-pyyaml/package.py +++ b/var/spack/repos/builtin/packages/py-pyyaml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-qtawesome/package.py b/var/spack/repos/builtin/packages/py-qtawesome/package.py index 72fb53e3df..abaabc45f4 100644 --- a/var/spack/repos/builtin/packages/py-qtawesome/package.py +++ b/var/spack/repos/builtin/packages/py-qtawesome/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-qtconsole/package.py b/var/spack/repos/builtin/packages/py-qtconsole/package.py index 0fba249988..6fde8783b6 100644 --- a/var/spack/repos/builtin/packages/py-qtconsole/package.py +++ b/var/spack/repos/builtin/packages/py-qtconsole/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-qtpy/package.py b/var/spack/repos/builtin/packages/py-qtpy/package.py index aeaf012999..4471e33a58 100644 --- a/var/spack/repos/builtin/packages/py-qtpy/package.py +++ b/var/spack/repos/builtin/packages/py-qtpy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-quantities/package.py b/var/spack/repos/builtin/packages/py-quantities/package.py index 617415e839..c74e897805 100644 --- a/var/spack/repos/builtin/packages/py-quantities/package.py +++ b/var/spack/repos/builtin/packages/py-quantities/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-radical-utils/package.py b/var/spack/repos/builtin/packages/py-radical-utils/package.py index fc3d8452b4..97dd700f74 100644 --- a/var/spack/repos/builtin/packages/py-radical-utils/package.py +++ b/var/spack/repos/builtin/packages/py-radical-utils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-ranger/package.py b/var/spack/repos/builtin/packages/py-ranger/package.py index ecd4146280..c5fee4e8fa 100644 --- a/var/spack/repos/builtin/packages/py-ranger/package.py +++ b/var/spack/repos/builtin/packages/py-ranger/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-readme-renderer/package.py b/var/spack/repos/builtin/packages/py-readme-renderer/package.py index 19fd0c3810..e090d6a6bd 100644 --- a/var/spack/repos/builtin/packages/py-readme-renderer/package.py +++ b/var/spack/repos/builtin/packages/py-readme-renderer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-requests/package.py b/var/spack/repos/builtin/packages/py-requests/package.py index 419883eefd..065d22b436 100644 --- a/var/spack/repos/builtin/packages/py-requests/package.py +++ b/var/spack/repos/builtin/packages/py-requests/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-restview/package.py b/var/spack/repos/builtin/packages/py-restview/package.py index 2105224aea..d953650003 100644 --- a/var/spack/repos/builtin/packages/py-restview/package.py +++ b/var/spack/repos/builtin/packages/py-restview/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-rope/package.py b/var/spack/repos/builtin/packages/py-rope/package.py index 2fd7a588a0..4138096d73 100644 --- a/var/spack/repos/builtin/packages/py-rope/package.py +++ b/var/spack/repos/builtin/packages/py-rope/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-rpy2/package.py b/var/spack/repos/builtin/packages/py-rpy2/package.py index 284a41894a..aa3ac66775 100644 --- a/var/spack/repos/builtin/packages/py-rpy2/package.py +++ b/var/spack/repos/builtin/packages/py-rpy2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-rsa/package.py b/var/spack/repos/builtin/packages/py-rsa/package.py index 0821df1390..4b58a286bd 100644 --- a/var/spack/repos/builtin/packages/py-rsa/package.py +++ b/var/spack/repos/builtin/packages/py-rsa/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-rtree/package.py b/var/spack/repos/builtin/packages/py-rtree/package.py index a3604b467d..3eeb6c01d1 100644 --- a/var/spack/repos/builtin/packages/py-rtree/package.py +++ b/var/spack/repos/builtin/packages/py-rtree/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-saga-python/package.py b/var/spack/repos/builtin/packages/py-saga-python/package.py index 48f6237b6e..0b2cd60d89 100644 --- a/var/spack/repos/builtin/packages/py-saga-python/package.py +++ b/var/spack/repos/builtin/packages/py-saga-python/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-scientificpython/package.py b/var/spack/repos/builtin/packages/py-scientificpython/package.py index 0fb3524c0c..0478438ad4 100644 --- a/var/spack/repos/builtin/packages/py-scientificpython/package.py +++ b/var/spack/repos/builtin/packages/py-scientificpython/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-scikit-image/package.py b/var/spack/repos/builtin/packages/py-scikit-image/package.py index d05341f9eb..5ca6e3ebf0 100644 --- a/var/spack/repos/builtin/packages/py-scikit-image/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-image/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py index d3221a9eec..9817ff815b 100644 --- a/var/spack/repos/builtin/packages/py-scikit-learn/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py index c3ca24291f..919b7508a6 100644 --- a/var/spack/repos/builtin/packages/py-scipy/package.py +++ b/var/spack/repos/builtin/packages/py-scipy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-seaborn/package.py b/var/spack/repos/builtin/packages/py-seaborn/package.py index 3171ed2e21..26c76b7aa9 100644 --- a/var/spack/repos/builtin/packages/py-seaborn/package.py +++ b/var/spack/repos/builtin/packages/py-seaborn/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-setuptools/package.py b/var/spack/repos/builtin/packages/py-setuptools/package.py index e87349f918..768dd3b5f7 100644 --- a/var/spack/repos/builtin/packages/py-setuptools/package.py +++ b/var/spack/repos/builtin/packages/py-setuptools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sh/package.py b/var/spack/repos/builtin/packages/py-sh/package.py index c089cddf0c..60154de923 100644 --- a/var/spack/repos/builtin/packages/py-sh/package.py +++ b/var/spack/repos/builtin/packages/py-sh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-shiboken/package.py b/var/spack/repos/builtin/packages/py-shiboken/package.py index 3ad51d5fc5..c04f8a2755 100644 --- a/var/spack/repos/builtin/packages/py-shiboken/package.py +++ b/var/spack/repos/builtin/packages/py-shiboken/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-simplegeneric/package.py b/var/spack/repos/builtin/packages/py-simplegeneric/package.py index 3881f8bc88..c6db610ec4 100644 --- a/var/spack/repos/builtin/packages/py-simplegeneric/package.py +++ b/var/spack/repos/builtin/packages/py-simplegeneric/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-simplejson/package.py b/var/spack/repos/builtin/packages/py-simplejson/package.py index 29c792b8a4..81fc585967 100644 --- a/var/spack/repos/builtin/packages/py-simplejson/package.py +++ b/var/spack/repos/builtin/packages/py-simplejson/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-singledispatch/package.py b/var/spack/repos/builtin/packages/py-singledispatch/package.py index 999cfde825..08e86a24aa 100644 --- a/var/spack/repos/builtin/packages/py-singledispatch/package.py +++ b/var/spack/repos/builtin/packages/py-singledispatch/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sip/package.py b/var/spack/repos/builtin/packages/py-sip/package.py index 9d97f08433..4243cefce0 100644 --- a/var/spack/repos/builtin/packages/py-sip/package.py +++ b/var/spack/repos/builtin/packages/py-sip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py index 47a53438b5..767d43b3ba 100644 --- a/var/spack/repos/builtin/packages/py-six/package.py +++ b/var/spack/repos/builtin/packages/py-six/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-slepc4py/package.py b/var/spack/repos/builtin/packages/py-slepc4py/package.py index f02a2f2ba9..8c1a5c026f 100644 --- a/var/spack/repos/builtin/packages/py-slepc4py/package.py +++ b/var/spack/repos/builtin/packages/py-slepc4py/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -35,4 +35,4 @@ class PySlepc4py(PythonPackage): depends_on('py-setuptools', type='build') depends_on('py-petsc4py', type=('build', 'run')) - depends_on('slepc') \ No newline at end of file + depends_on('slepc') diff --git a/var/spack/repos/builtin/packages/py-sncosmo/package.py b/var/spack/repos/builtin/packages/py-sncosmo/package.py index 998fb2ce1e..c2ff03c1a9 100644 --- a/var/spack/repos/builtin/packages/py-sncosmo/package.py +++ b/var/spack/repos/builtin/packages/py-sncosmo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-snowballstemmer/package.py b/var/spack/repos/builtin/packages/py-snowballstemmer/package.py index dc8bbbef08..fa6a19a01f 100644 --- a/var/spack/repos/builtin/packages/py-snowballstemmer/package.py +++ b/var/spack/repos/builtin/packages/py-snowballstemmer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-spefile/package.py b/var/spack/repos/builtin/packages/py-spefile/package.py index d35cfae203..4ae57f64ec 100644 --- a/var/spack/repos/builtin/packages/py-spefile/package.py +++ b/var/spack/repos/builtin/packages/py-spefile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-spglib/package.py b/var/spack/repos/builtin/packages/py-spglib/package.py index 3d73b3e891..e463970feb 100644 --- a/var/spack/repos/builtin/packages/py-spglib/package.py +++ b/var/spack/repos/builtin/packages/py-spglib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py b/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py index bcc68cbc64..bcdc5fa934 100644 --- a/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py b/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py index 886b47e814..7166caef79 100644 --- a/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sphinx/package.py b/var/spack/repos/builtin/packages/py-sphinx/package.py index 89b199dd81..ba4c4badcc 100644 --- a/var/spack/repos/builtin/packages/py-sphinx/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py index 53011ee215..d186c09b8f 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py index 6255d3e4f0..a52565107f 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py index 65e751bd58..884f8c27a3 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-spyder/package.py b/var/spack/repos/builtin/packages/py-spyder/package.py index 51169e8ee4..67194f31b1 100644 --- a/var/spack/repos/builtin/packages/py-spyder/package.py +++ b/var/spack/repos/builtin/packages/py-spyder/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-spykeutils/package.py b/var/spack/repos/builtin/packages/py-spykeutils/package.py index 2aa0cabe46..3c715071f5 100644 --- a/var/spack/repos/builtin/packages/py-spykeutils/package.py +++ b/var/spack/repos/builtin/packages/py-spykeutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sqlalchemy/package.py b/var/spack/repos/builtin/packages/py-sqlalchemy/package.py index f8221058a0..81ea2790ab 100644 --- a/var/spack/repos/builtin/packages/py-sqlalchemy/package.py +++ b/var/spack/repos/builtin/packages/py-sqlalchemy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-statsmodels/package.py b/var/spack/repos/builtin/packages/py-statsmodels/package.py index 794f0691bb..9cef776e6d 100644 --- a/var/spack/repos/builtin/packages/py-statsmodels/package.py +++ b/var/spack/repos/builtin/packages/py-statsmodels/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-storm/package.py b/var/spack/repos/builtin/packages/py-storm/package.py index a6c2900414..1205b2a9cc 100644 --- a/var/spack/repos/builtin/packages/py-storm/package.py +++ b/var/spack/repos/builtin/packages/py-storm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-subprocess32/package.py b/var/spack/repos/builtin/packages/py-subprocess32/package.py index 35d11e1bee..5ed2027452 100644 --- a/var/spack/repos/builtin/packages/py-subprocess32/package.py +++ b/var/spack/repos/builtin/packages/py-subprocess32/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-symengine/package.py b/var/spack/repos/builtin/packages/py-symengine/package.py index bc48785e36..97c51d00b8 100644 --- a/var/spack/repos/builtin/packages/py-symengine/package.py +++ b/var/spack/repos/builtin/packages/py-symengine/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-symfit/package.py b/var/spack/repos/builtin/packages/py-symfit/package.py index 98c2e93c66..cbc30acf65 100644 --- a/var/spack/repos/builtin/packages/py-symfit/package.py +++ b/var/spack/repos/builtin/packages/py-symfit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-sympy/package.py b/var/spack/repos/builtin/packages/py-sympy/package.py index c47007be9f..8f82bcc009 100644 --- a/var/spack/repos/builtin/packages/py-sympy/package.py +++ b/var/spack/repos/builtin/packages/py-sympy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tabulate/package.py b/var/spack/repos/builtin/packages/py-tabulate/package.py index b0ad7da9b0..d33ca7b785 100644 --- a/var/spack/repos/builtin/packages/py-tabulate/package.py +++ b/var/spack/repos/builtin/packages/py-tabulate/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tappy/package.py b/var/spack/repos/builtin/packages/py-tappy/package.py index 840d88e869..1f7b94cbe2 100644 --- a/var/spack/repos/builtin/packages/py-tappy/package.py +++ b/var/spack/repos/builtin/packages/py-tappy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-terminado/package.py b/var/spack/repos/builtin/packages/py-terminado/package.py index 5dfd9b9068..483a3f472e 100644 --- a/var/spack/repos/builtin/packages/py-terminado/package.py +++ b/var/spack/repos/builtin/packages/py-terminado/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-theano/package.py b/var/spack/repos/builtin/packages/py-theano/package.py index 72bab1ce09..e1bbb136d0 100644 --- a/var/spack/repos/builtin/packages/py-theano/package.py +++ b/var/spack/repos/builtin/packages/py-theano/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tifffile/package.py b/var/spack/repos/builtin/packages/py-tifffile/package.py index 87383fdbfd..ef70e2ae69 100644 --- a/var/spack/repos/builtin/packages/py-tifffile/package.py +++ b/var/spack/repos/builtin/packages/py-tifffile/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tornado/package.py b/var/spack/repos/builtin/packages/py-tornado/package.py index eb9c660947..0ec044ad54 100644 --- a/var/spack/repos/builtin/packages/py-tornado/package.py +++ b/var/spack/repos/builtin/packages/py-tornado/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tqdm/package.py b/var/spack/repos/builtin/packages/py-tqdm/package.py index ba49800ada..2ca30c8e14 100644 --- a/var/spack/repos/builtin/packages/py-tqdm/package.py +++ b/var/spack/repos/builtin/packages/py-tqdm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-traitlets/package.py b/var/spack/repos/builtin/packages/py-traitlets/package.py index 78d19e3cbf..10ff5a6e38 100644 --- a/var/spack/repos/builtin/packages/py-traitlets/package.py +++ b/var/spack/repos/builtin/packages/py-traitlets/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tuiview/package.py b/var/spack/repos/builtin/packages/py-tuiview/package.py index 93726cf004..32166e6740 100644 --- a/var/spack/repos/builtin/packages/py-tuiview/package.py +++ b/var/spack/repos/builtin/packages/py-tuiview/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-twisted/package.py b/var/spack/repos/builtin/packages/py-twisted/package.py index e558adbc7f..0beb3f436b 100644 --- a/var/spack/repos/builtin/packages/py-twisted/package.py +++ b/var/spack/repos/builtin/packages/py-twisted/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-typing/package.py b/var/spack/repos/builtin/packages/py-typing/package.py index 4b1d164520..52f5fa05b0 100644 --- a/var/spack/repos/builtin/packages/py-typing/package.py +++ b/var/spack/repos/builtin/packages/py-typing/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-tzlocal/package.py b/var/spack/repos/builtin/packages/py-tzlocal/package.py index d17fd62a52..e4c085f1ce 100644 --- a/var/spack/repos/builtin/packages/py-tzlocal/package.py +++ b/var/spack/repos/builtin/packages/py-tzlocal/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-unittest2/package.py b/var/spack/repos/builtin/packages/py-unittest2/package.py index ff11ce05cd..609688f8a1 100644 --- a/var/spack/repos/builtin/packages/py-unittest2/package.py +++ b/var/spack/repos/builtin/packages/py-unittest2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py index 03134acfcd..d48ddc8a54 100644 --- a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py +++ b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-urllib3/package.py b/var/spack/repos/builtin/packages/py-urllib3/package.py index bf56ca96ad..5c56de7615 100644 --- a/var/spack/repos/builtin/packages/py-urllib3/package.py +++ b/var/spack/repos/builtin/packages/py-urllib3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-urwid/package.py b/var/spack/repos/builtin/packages/py-urwid/package.py index 8e33d2bef2..ea39b89084 100644 --- a/var/spack/repos/builtin/packages/py-urwid/package.py +++ b/var/spack/repos/builtin/packages/py-urwid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-vcversioner/package.py b/var/spack/repos/builtin/packages/py-vcversioner/package.py index 81e4f7bdda..daa2d3caf2 100644 --- a/var/spack/repos/builtin/packages/py-vcversioner/package.py +++ b/var/spack/repos/builtin/packages/py-vcversioner/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-virtualenv/package.py b/var/spack/repos/builtin/packages/py-virtualenv/package.py index a19559ddbc..7c9f4a7af3 100644 --- a/var/spack/repos/builtin/packages/py-virtualenv/package.py +++ b/var/spack/repos/builtin/packages/py-virtualenv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-vsc-base/package.py b/var/spack/repos/builtin/packages/py-vsc-base/package.py index e5e23b0015..3ccfda8466 100644 --- a/var/spack/repos/builtin/packages/py-vsc-base/package.py +++ b/var/spack/repos/builtin/packages/py-vsc-base/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-vsc-install/package.py b/var/spack/repos/builtin/packages/py-vsc-install/package.py index 452bf97992..dc0af99fec 100644 --- a/var/spack/repos/builtin/packages/py-vsc-install/package.py +++ b/var/spack/repos/builtin/packages/py-vsc-install/package.py @@ -5,7 +5,7 @@ # Created by Kenneth Hoste, kenneth.hoste@gmail.com # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-wcsaxes/package.py b/var/spack/repos/builtin/packages/py-wcsaxes/package.py index 1973fda8ec..70cb81e896 100644 --- a/var/spack/repos/builtin/packages/py-wcsaxes/package.py +++ b/var/spack/repos/builtin/packages/py-wcsaxes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-wcwidth/package.py b/var/spack/repos/builtin/packages/py-wcwidth/package.py index c4846e2ee7..a5339b7f60 100644 --- a/var/spack/repos/builtin/packages/py-wcwidth/package.py +++ b/var/spack/repos/builtin/packages/py-wcwidth/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-webkit-server/package.py b/var/spack/repos/builtin/packages/py-webkit-server/package.py index 8393ddabbf..1c3d42dc06 100644 --- a/var/spack/repos/builtin/packages/py-webkit-server/package.py +++ b/var/spack/repos/builtin/packages/py-webkit-server/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-werkzeug/package.py b/var/spack/repos/builtin/packages/py-werkzeug/package.py index f563b9ce19..a712cc84f2 100644 --- a/var/spack/repos/builtin/packages/py-werkzeug/package.py +++ b/var/spack/repos/builtin/packages/py-werkzeug/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-wheel/package.py b/var/spack/repos/builtin/packages/py-wheel/package.py index b199f990c7..6771932244 100644 --- a/var/spack/repos/builtin/packages/py-wheel/package.py +++ b/var/spack/repos/builtin/packages/py-wheel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py b/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py index 57864e307a..86465235d1 100644 --- a/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py +++ b/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-wrapt/package.py b/var/spack/repos/builtin/packages/py-wrapt/package.py index 65d0f3fc11..8b792a16ec 100644 --- a/var/spack/repos/builtin/packages/py-wrapt/package.py +++ b/var/spack/repos/builtin/packages/py-wrapt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-xarray/package.py b/var/spack/repos/builtin/packages/py-xarray/package.py index 4f29d6c91e..436f1f87d0 100644 --- a/var/spack/repos/builtin/packages/py-xarray/package.py +++ b/var/spack/repos/builtin/packages/py-xarray/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-xlrd/package.py b/var/spack/repos/builtin/packages/py-xlrd/package.py index bbd2f57b07..af8dec00da 100644 --- a/var/spack/repos/builtin/packages/py-xlrd/package.py +++ b/var/spack/repos/builtin/packages/py-xlrd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-xmlrunner/package.py b/var/spack/repos/builtin/packages/py-xmlrunner/package.py index 90978830be..73fabe6242 100644 --- a/var/spack/repos/builtin/packages/py-xmlrunner/package.py +++ b/var/spack/repos/builtin/packages/py-xmlrunner/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-xopen/package.py b/var/spack/repos/builtin/packages/py-xopen/package.py index 0137bc476f..c98ee00b1a 100644 --- a/var/spack/repos/builtin/packages/py-xopen/package.py +++ b/var/spack/repos/builtin/packages/py-xopen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-xpyb/package.py b/var/spack/repos/builtin/packages/py-xpyb/package.py index 136da54dcf..b9099daa71 100644 --- a/var/spack/repos/builtin/packages/py-xpyb/package.py +++ b/var/spack/repos/builtin/packages/py-xpyb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py b/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py index 3c10c179d1..6b04d18521 100644 --- a/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py +++ b/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-yapf/package.py b/var/spack/repos/builtin/packages/py-yapf/package.py index 5f5d32e3d0..84a21bcc59 100644 --- a/var/spack/repos/builtin/packages/py-yapf/package.py +++ b/var/spack/repos/builtin/packages/py-yapf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-yt/package.py b/var/spack/repos/builtin/packages/py-yt/package.py index bc21aa90cc..4575de0371 100644 --- a/var/spack/repos/builtin/packages/py-yt/package.py +++ b/var/spack/repos/builtin/packages/py-yt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/py-zmq/package.py b/var/spack/repos/builtin/packages/py-zmq/package.py index 7779029fcd..deddb77b95 100644 --- a/var/spack/repos/builtin/packages/py-zmq/package.py +++ b/var/spack/repos/builtin/packages/py-zmq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index e7dede8ecc..2420190f56 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/qbank/package.py b/var/spack/repos/builtin/packages/qbank/package.py index 976bda8fbd..a503ace345 100644 --- a/var/spack/repos/builtin/packages/qbank/package.py +++ b/var/spack/repos/builtin/packages/qbank/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/qhull/package.py b/var/spack/repos/builtin/packages/qhull/package.py index 4456c16bd2..308b0521fa 100644 --- a/var/spack/repos/builtin/packages/qhull/package.py +++ b/var/spack/repos/builtin/packages/qhull/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/qrupdate/package.py b/var/spack/repos/builtin/packages/qrupdate/package.py index f6b4c80cf4..5398592d22 100644 --- a/var/spack/repos/builtin/packages/qrupdate/package.py +++ b/var/spack/repos/builtin/packages/qrupdate/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/qt-creator/package.py b/var/spack/repos/builtin/packages/qt-creator/package.py index abd619530f..a3f50004ae 100644 --- a/var/spack/repos/builtin/packages/qt-creator/package.py +++ b/var/spack/repos/builtin/packages/qt-creator/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index 8a6220f757..088ac5d763 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/qthreads/package.py b/var/spack/repos/builtin/packages/qthreads/package.py index 085ce7d8b0..a4be2072c5 100644 --- a/var/spack/repos/builtin/packages/qthreads/package.py +++ b/var/spack/repos/builtin/packages/qthreads/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-abind/package.py b/var/spack/repos/builtin/packages/r-abind/package.py index 52815298cf..5b63f7b7fe 100644 --- a/var/spack/repos/builtin/packages/r-abind/package.py +++ b/var/spack/repos/builtin/packages/r-abind/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-adabag/package.py b/var/spack/repos/builtin/packages/r-adabag/package.py index a2bc90a690..87fc37362d 100644 --- a/var/spack/repos/builtin/packages/r-adabag/package.py +++ b/var/spack/repos/builtin/packages/r-adabag/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ade4/package.py b/var/spack/repos/builtin/packages/r-ade4/package.py index 9583db2f24..2951703c65 100644 --- a/var/spack/repos/builtin/packages/r-ade4/package.py +++ b/var/spack/repos/builtin/packages/r-ade4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-adegenet/package.py b/var/spack/repos/builtin/packages/r-adegenet/package.py index 47347b6897..e7e7c408e7 100644 --- a/var/spack/repos/builtin/packages/r-adegenet/package.py +++ b/var/spack/repos/builtin/packages/r-adegenet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ape/package.py b/var/spack/repos/builtin/packages/r-ape/package.py index 314f9b0c4d..9830a0e35d 100644 --- a/var/spack/repos/builtin/packages/r-ape/package.py +++ b/var/spack/repos/builtin/packages/r-ape/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-assertthat/package.py b/var/spack/repos/builtin/packages/r-assertthat/package.py index f4935eaf08..d9b6eccbbc 100644 --- a/var/spack/repos/builtin/packages/r-assertthat/package.py +++ b/var/spack/repos/builtin/packages/r-assertthat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-base64enc/package.py b/var/spack/repos/builtin/packages/r-base64enc/package.py index 1d189fac5f..6e3ac59d7f 100644 --- a/var/spack/repos/builtin/packages/r-base64enc/package.py +++ b/var/spack/repos/builtin/packages/r-base64enc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-bh/package.py b/var/spack/repos/builtin/packages/r-bh/package.py index 44f2442cab..3cdac25f0d 100644 --- a/var/spack/repos/builtin/packages/r-bh/package.py +++ b/var/spack/repos/builtin/packages/r-bh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-biocgenerics/package.py b/var/spack/repos/builtin/packages/r-biocgenerics/package.py index 654e7f1b2a..f8c0294b22 100644 --- a/var/spack/repos/builtin/packages/r-biocgenerics/package.py +++ b/var/spack/repos/builtin/packages/r-biocgenerics/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-biocinstaller/package.py b/var/spack/repos/builtin/packages/r-biocinstaller/package.py index c145de688c..fbde6a26f6 100644 --- a/var/spack/repos/builtin/packages/r-biocinstaller/package.py +++ b/var/spack/repos/builtin/packages/r-biocinstaller/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-bitops/package.py b/var/spack/repos/builtin/packages/r-bitops/package.py index 2b40e8c4d8..c9b2d6af01 100644 --- a/var/spack/repos/builtin/packages/r-bitops/package.py +++ b/var/spack/repos/builtin/packages/r-bitops/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-boot/package.py b/var/spack/repos/builtin/packages/r-boot/package.py index 27ae21c2b8..50a057bcbb 100644 --- a/var/spack/repos/builtin/packages/r-boot/package.py +++ b/var/spack/repos/builtin/packages/r-boot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-brew/package.py b/var/spack/repos/builtin/packages/r-brew/package.py index f4aea09172..c9e42339c3 100644 --- a/var/spack/repos/builtin/packages/r-brew/package.py +++ b/var/spack/repos/builtin/packages/r-brew/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-c50/package.py b/var/spack/repos/builtin/packages/r-c50/package.py index 323f8efbea..fbffd61d38 100644 --- a/var/spack/repos/builtin/packages/r-c50/package.py +++ b/var/spack/repos/builtin/packages/r-c50/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-car/package.py b/var/spack/repos/builtin/packages/r-car/package.py index 2fa7380ca3..5bd107d2d2 100644 --- a/var/spack/repos/builtin/packages/r-car/package.py +++ b/var/spack/repos/builtin/packages/r-car/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-caret/package.py b/var/spack/repos/builtin/packages/r-caret/package.py index a20a5c2280..92b6ef28d8 100644 --- a/var/spack/repos/builtin/packages/r-caret/package.py +++ b/var/spack/repos/builtin/packages/r-caret/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-catools/package.py b/var/spack/repos/builtin/packages/r-catools/package.py index 78165c59b4..6867af0e89 100644 --- a/var/spack/repos/builtin/packages/r-catools/package.py +++ b/var/spack/repos/builtin/packages/r-catools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-checkpoint/package.py b/var/spack/repos/builtin/packages/r-checkpoint/package.py index 299051ddbb..78c0d55975 100644 --- a/var/spack/repos/builtin/packages/r-checkpoint/package.py +++ b/var/spack/repos/builtin/packages/r-checkpoint/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-chron/package.py b/var/spack/repos/builtin/packages/r-chron/package.py index 00d08070ee..a86dd10eef 100644 --- a/var/spack/repos/builtin/packages/r-chron/package.py +++ b/var/spack/repos/builtin/packages/r-chron/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-class/package.py b/var/spack/repos/builtin/packages/r-class/package.py index 238e754398..feb1951f62 100644 --- a/var/spack/repos/builtin/packages/r-class/package.py +++ b/var/spack/repos/builtin/packages/r-class/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-cluster/package.py b/var/spack/repos/builtin/packages/r-cluster/package.py index b5b8544710..680982d86d 100644 --- a/var/spack/repos/builtin/packages/r-cluster/package.py +++ b/var/spack/repos/builtin/packages/r-cluster/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-coda/package.py b/var/spack/repos/builtin/packages/r-coda/package.py index 9645aab046..a0fe4eef5c 100644 --- a/var/spack/repos/builtin/packages/r-coda/package.py +++ b/var/spack/repos/builtin/packages/r-coda/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-codetools/package.py b/var/spack/repos/builtin/packages/r-codetools/package.py index 07c9b442fd..157aeb80de 100644 --- a/var/spack/repos/builtin/packages/r-codetools/package.py +++ b/var/spack/repos/builtin/packages/r-codetools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-coin/package.py b/var/spack/repos/builtin/packages/r-coin/package.py index b2208f5c15..7ab7a3fdae 100644 --- a/var/spack/repos/builtin/packages/r-coin/package.py +++ b/var/spack/repos/builtin/packages/r-coin/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-colorspace/package.py b/var/spack/repos/builtin/packages/r-colorspace/package.py index c5c022e6ab..8c16c6ba62 100644 --- a/var/spack/repos/builtin/packages/r-colorspace/package.py +++ b/var/spack/repos/builtin/packages/r-colorspace/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-corrplot/package.py b/var/spack/repos/builtin/packages/r-corrplot/package.py index bc7b7f7cde..1fdaf194db 100644 --- a/var/spack/repos/builtin/packages/r-corrplot/package.py +++ b/var/spack/repos/builtin/packages/r-corrplot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-crayon/package.py b/var/spack/repos/builtin/packages/r-crayon/package.py index 99c0d248ea..d40942e887 100644 --- a/var/spack/repos/builtin/packages/r-crayon/package.py +++ b/var/spack/repos/builtin/packages/r-crayon/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-cubature/package.py b/var/spack/repos/builtin/packages/r-cubature/package.py index 747e5e9e1f..3f436ef847 100644 --- a/var/spack/repos/builtin/packages/r-cubature/package.py +++ b/var/spack/repos/builtin/packages/r-cubature/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-cubist/package.py b/var/spack/repos/builtin/packages/r-cubist/package.py index 6e1d8d10cc..9c50c57c38 100644 --- a/var/spack/repos/builtin/packages/r-cubist/package.py +++ b/var/spack/repos/builtin/packages/r-cubist/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-curl/package.py b/var/spack/repos/builtin/packages/r-curl/package.py index 076872acc7..91bd22e267 100644 --- a/var/spack/repos/builtin/packages/r-curl/package.py +++ b/var/spack/repos/builtin/packages/r-curl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-data-table/package.py b/var/spack/repos/builtin/packages/r-data-table/package.py index c6f45ba5bf..db76130599 100644 --- a/var/spack/repos/builtin/packages/r-data-table/package.py +++ b/var/spack/repos/builtin/packages/r-data-table/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-dbi/package.py b/var/spack/repos/builtin/packages/r-dbi/package.py index 256d638812..06477a7bb6 100644 --- a/var/spack/repos/builtin/packages/r-dbi/package.py +++ b/var/spack/repos/builtin/packages/r-dbi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-deldir/package.py b/var/spack/repos/builtin/packages/r-deldir/package.py index 3e3d556a17..1bc8341241 100644 --- a/var/spack/repos/builtin/packages/r-deldir/package.py +++ b/var/spack/repos/builtin/packages/r-deldir/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-dendextend/package.py b/var/spack/repos/builtin/packages/r-dendextend/package.py index c30491ef67..33a4fb9563 100644 --- a/var/spack/repos/builtin/packages/r-dendextend/package.py +++ b/var/spack/repos/builtin/packages/r-dendextend/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-deoptim/package.py b/var/spack/repos/builtin/packages/r-deoptim/package.py index 521c5e7a4b..5c55bcc160 100644 --- a/var/spack/repos/builtin/packages/r-deoptim/package.py +++ b/var/spack/repos/builtin/packages/r-deoptim/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-deoptimr/package.py b/var/spack/repos/builtin/packages/r-deoptimr/package.py index 758b10f9e4..fa028e5fbf 100644 --- a/var/spack/repos/builtin/packages/r-deoptimr/package.py +++ b/var/spack/repos/builtin/packages/r-deoptimr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-devtools/package.py b/var/spack/repos/builtin/packages/r-devtools/package.py index f5e395c715..ed5515185f 100644 --- a/var/spack/repos/builtin/packages/r-devtools/package.py +++ b/var/spack/repos/builtin/packages/r-devtools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-diagrammer/package.py b/var/spack/repos/builtin/packages/r-diagrammer/package.py index 8db0ab3736..ada1cb2776 100644 --- a/var/spack/repos/builtin/packages/r-diagrammer/package.py +++ b/var/spack/repos/builtin/packages/r-diagrammer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-dichromat/package.py b/var/spack/repos/builtin/packages/r-dichromat/package.py index 57942674f2..0c51cc8947 100644 --- a/var/spack/repos/builtin/packages/r-dichromat/package.py +++ b/var/spack/repos/builtin/packages/r-dichromat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-digest/package.py b/var/spack/repos/builtin/packages/r-digest/package.py index 8919af2f5a..9f68dec358 100644 --- a/var/spack/repos/builtin/packages/r-digest/package.py +++ b/var/spack/repos/builtin/packages/r-digest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-diptest/package.py b/var/spack/repos/builtin/packages/r-diptest/package.py index e64a490710..aca82156b8 100644 --- a/var/spack/repos/builtin/packages/r-diptest/package.py +++ b/var/spack/repos/builtin/packages/r-diptest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-domc/package.py b/var/spack/repos/builtin/packages/r-domc/package.py index 163004f4a5..51e174185b 100644 --- a/var/spack/repos/builtin/packages/r-domc/package.py +++ b/var/spack/repos/builtin/packages/r-domc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-doparallel/package.py b/var/spack/repos/builtin/packages/r-doparallel/package.py index 04d9bd06a7..83e7c98476 100644 --- a/var/spack/repos/builtin/packages/r-doparallel/package.py +++ b/var/spack/repos/builtin/packages/r-doparallel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-dplyr/package.py b/var/spack/repos/builtin/packages/r-dplyr/package.py index 682753cc63..bb05d9cea4 100644 --- a/var/spack/repos/builtin/packages/r-dplyr/package.py +++ b/var/spack/repos/builtin/packages/r-dplyr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-dt/package.py b/var/spack/repos/builtin/packages/r-dt/package.py index 85e6fee837..473d5e1be5 100644 --- a/var/spack/repos/builtin/packages/r-dt/package.py +++ b/var/spack/repos/builtin/packages/r-dt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-dygraphs/package.py b/var/spack/repos/builtin/packages/r-dygraphs/package.py index d9e66d86f7..63304451b6 100644 --- a/var/spack/repos/builtin/packages/r-dygraphs/package.py +++ b/var/spack/repos/builtin/packages/r-dygraphs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-e1071/package.py b/var/spack/repos/builtin/packages/r-e1071/package.py index 545909bf28..19dd5b5466 100644 --- a/var/spack/repos/builtin/packages/r-e1071/package.py +++ b/var/spack/repos/builtin/packages/r-e1071/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ellipse/package.py b/var/spack/repos/builtin/packages/r-ellipse/package.py index e106a4322d..686da16b0b 100644 --- a/var/spack/repos/builtin/packages/r-ellipse/package.py +++ b/var/spack/repos/builtin/packages/r-ellipse/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ergm/package.py b/var/spack/repos/builtin/packages/r-ergm/package.py index 06e3a0379a..ae254dca43 100644 --- a/var/spack/repos/builtin/packages/r-ergm/package.py +++ b/var/spack/repos/builtin/packages/r-ergm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-evaluate/package.py b/var/spack/repos/builtin/packages/r-evaluate/package.py index ba0a9d5d15..6bb5ed8e95 100644 --- a/var/spack/repos/builtin/packages/r-evaluate/package.py +++ b/var/spack/repos/builtin/packages/r-evaluate/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-expm/package.py b/var/spack/repos/builtin/packages/r-expm/package.py index e2ad579441..f819a07641 100644 --- a/var/spack/repos/builtin/packages/r-expm/package.py +++ b/var/spack/repos/builtin/packages/r-expm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-factoextra/package.py b/var/spack/repos/builtin/packages/r-factoextra/package.py index 00052e61a5..ed42193f92 100644 --- a/var/spack/repos/builtin/packages/r-factoextra/package.py +++ b/var/spack/repos/builtin/packages/r-factoextra/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-factominer/package.py b/var/spack/repos/builtin/packages/r-factominer/package.py index 078caf4280..de5668b311 100644 --- a/var/spack/repos/builtin/packages/r-factominer/package.py +++ b/var/spack/repos/builtin/packages/r-factominer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-filehash/package.py b/var/spack/repos/builtin/packages/r-filehash/package.py index 9f67ecad37..4dcd3df5a3 100644 --- a/var/spack/repos/builtin/packages/r-filehash/package.py +++ b/var/spack/repos/builtin/packages/r-filehash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-flashclust/package.py b/var/spack/repos/builtin/packages/r-flashclust/package.py index a5adeb5016..4edb9df844 100644 --- a/var/spack/repos/builtin/packages/r-flashclust/package.py +++ b/var/spack/repos/builtin/packages/r-flashclust/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-flexmix/package.py b/var/spack/repos/builtin/packages/r-flexmix/package.py index 715a710743..65a3a9dc17 100644 --- a/var/spack/repos/builtin/packages/r-flexmix/package.py +++ b/var/spack/repos/builtin/packages/r-flexmix/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-foreach/package.py b/var/spack/repos/builtin/packages/r-foreach/package.py index 527cd5a110..166a9f20cb 100644 --- a/var/spack/repos/builtin/packages/r-foreach/package.py +++ b/var/spack/repos/builtin/packages/r-foreach/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-foreign/package.py b/var/spack/repos/builtin/packages/r-foreign/package.py index a3549068dc..45845234e0 100644 --- a/var/spack/repos/builtin/packages/r-foreign/package.py +++ b/var/spack/repos/builtin/packages/r-foreign/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-formatr/package.py b/var/spack/repos/builtin/packages/r-formatr/package.py index 814e83ffac..d1609ad718 100644 --- a/var/spack/repos/builtin/packages/r-formatr/package.py +++ b/var/spack/repos/builtin/packages/r-formatr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-formula/package.py b/var/spack/repos/builtin/packages/r-formula/package.py index 2381f5a115..5d7b7119dd 100644 --- a/var/spack/repos/builtin/packages/r-formula/package.py +++ b/var/spack/repos/builtin/packages/r-formula/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-fpc/package.py b/var/spack/repos/builtin/packages/r-fpc/package.py index 675e3b7c96..e8fff8c067 100644 --- a/var/spack/repos/builtin/packages/r-fpc/package.py +++ b/var/spack/repos/builtin/packages/r-fpc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gdata/package.py b/var/spack/repos/builtin/packages/r-gdata/package.py index b68a8b91c2..79ea4baeff 100644 --- a/var/spack/repos/builtin/packages/r-gdata/package.py +++ b/var/spack/repos/builtin/packages/r-gdata/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-geosphere/package.py b/var/spack/repos/builtin/packages/r-geosphere/package.py index 93f56a2873..a338d4b112 100644 --- a/var/spack/repos/builtin/packages/r-geosphere/package.py +++ b/var/spack/repos/builtin/packages/r-geosphere/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ggmap/package.py b/var/spack/repos/builtin/packages/r-ggmap/package.py index 40b81aef31..b7cb033d6f 100644 --- a/var/spack/repos/builtin/packages/r-ggmap/package.py +++ b/var/spack/repos/builtin/packages/r-ggmap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ggplot2/package.py b/var/spack/repos/builtin/packages/r-ggplot2/package.py index da514768fc..c8ee8acea6 100644 --- a/var/spack/repos/builtin/packages/r-ggplot2/package.py +++ b/var/spack/repos/builtin/packages/r-ggplot2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ggpubr/package.py b/var/spack/repos/builtin/packages/r-ggpubr/package.py index 538a0f5d33..bdf8774e28 100644 --- a/var/spack/repos/builtin/packages/r-ggpubr/package.py +++ b/var/spack/repos/builtin/packages/r-ggpubr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ggrepel/package.py b/var/spack/repos/builtin/packages/r-ggrepel/package.py index 8bda46f398..52baa0b077 100644 --- a/var/spack/repos/builtin/packages/r-ggrepel/package.py +++ b/var/spack/repos/builtin/packages/r-ggrepel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ggsci/package.py b/var/spack/repos/builtin/packages/r-ggsci/package.py index 5372677163..8df9c21de8 100644 --- a/var/spack/repos/builtin/packages/r-ggsci/package.py +++ b/var/spack/repos/builtin/packages/r-ggsci/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ggvis/package.py b/var/spack/repos/builtin/packages/r-ggvis/package.py index 14d65a0223..d527d2a93a 100644 --- a/var/spack/repos/builtin/packages/r-ggvis/package.py +++ b/var/spack/repos/builtin/packages/r-ggvis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gistr/package.py b/var/spack/repos/builtin/packages/r-gistr/package.py index 644d6f12d0..d8e89722e9 100644 --- a/var/spack/repos/builtin/packages/r-gistr/package.py +++ b/var/spack/repos/builtin/packages/r-gistr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-git2r/package.py b/var/spack/repos/builtin/packages/r-git2r/package.py index 2bfb2eee79..3612d6ebb5 100644 --- a/var/spack/repos/builtin/packages/r-git2r/package.py +++ b/var/spack/repos/builtin/packages/r-git2r/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-glmnet/package.py b/var/spack/repos/builtin/packages/r-glmnet/package.py index 6922fc2aaa..8f9793ec31 100644 --- a/var/spack/repos/builtin/packages/r-glmnet/package.py +++ b/var/spack/repos/builtin/packages/r-glmnet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gmodels/package.py b/var/spack/repos/builtin/packages/r-gmodels/package.py index 44fcfe0ee9..c703c2a521 100644 --- a/var/spack/repos/builtin/packages/r-gmodels/package.py +++ b/var/spack/repos/builtin/packages/r-gmodels/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gmp/package.py b/var/spack/repos/builtin/packages/r-gmp/package.py index 8919408473..12eb85e5cc 100644 --- a/var/spack/repos/builtin/packages/r-gmp/package.py +++ b/var/spack/repos/builtin/packages/r-gmp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-googlevis/package.py b/var/spack/repos/builtin/packages/r-googlevis/package.py index 2d090025cc..95101c3d06 100644 --- a/var/spack/repos/builtin/packages/r-googlevis/package.py +++ b/var/spack/repos/builtin/packages/r-googlevis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gridbase/package.py b/var/spack/repos/builtin/packages/r-gridbase/package.py index 829a394d33..ab9d7ad834 100644 --- a/var/spack/repos/builtin/packages/r-gridbase/package.py +++ b/var/spack/repos/builtin/packages/r-gridbase/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gridextra/package.py b/var/spack/repos/builtin/packages/r-gridextra/package.py index 790e7254ee..9ae3af3026 100644 --- a/var/spack/repos/builtin/packages/r-gridextra/package.py +++ b/var/spack/repos/builtin/packages/r-gridextra/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gtable/package.py b/var/spack/repos/builtin/packages/r-gtable/package.py index d47ec281a9..2bb1c713e7 100644 --- a/var/spack/repos/builtin/packages/r-gtable/package.py +++ b/var/spack/repos/builtin/packages/r-gtable/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-gtools/package.py b/var/spack/repos/builtin/packages/r-gtools/package.py index df047b6c94..3e6f5949d2 100644 --- a/var/spack/repos/builtin/packages/r-gtools/package.py +++ b/var/spack/repos/builtin/packages/r-gtools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-hexbin/package.py b/var/spack/repos/builtin/packages/r-hexbin/package.py index 21ae867da2..018d5e24ce 100644 --- a/var/spack/repos/builtin/packages/r-hexbin/package.py +++ b/var/spack/repos/builtin/packages/r-hexbin/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-highr/package.py b/var/spack/repos/builtin/packages/r-highr/package.py index 616bab728b..0fa7a850df 100644 --- a/var/spack/repos/builtin/packages/r-highr/package.py +++ b/var/spack/repos/builtin/packages/r-highr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-htmltools/package.py b/var/spack/repos/builtin/packages/r-htmltools/package.py index e6c5294c18..c679c51b0e 100644 --- a/var/spack/repos/builtin/packages/r-htmltools/package.py +++ b/var/spack/repos/builtin/packages/r-htmltools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-htmlwidgets/package.py b/var/spack/repos/builtin/packages/r-htmlwidgets/package.py index ad08721f65..bf624e7639 100644 --- a/var/spack/repos/builtin/packages/r-htmlwidgets/package.py +++ b/var/spack/repos/builtin/packages/r-htmlwidgets/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-httpuv/package.py b/var/spack/repos/builtin/packages/r-httpuv/package.py index aa8b774383..93d8508300 100644 --- a/var/spack/repos/builtin/packages/r-httpuv/package.py +++ b/var/spack/repos/builtin/packages/r-httpuv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-httr/package.py b/var/spack/repos/builtin/packages/r-httr/package.py index ec01bc0c66..e976a30f7c 100644 --- a/var/spack/repos/builtin/packages/r-httr/package.py +++ b/var/spack/repos/builtin/packages/r-httr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-igraph/package.py b/var/spack/repos/builtin/packages/r-igraph/package.py index 77bda4a3a0..0e8177d84e 100644 --- a/var/spack/repos/builtin/packages/r-igraph/package.py +++ b/var/spack/repos/builtin/packages/r-igraph/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-influencer/package.py b/var/spack/repos/builtin/packages/r-influencer/package.py index bbfed54e25..ca17e900d9 100644 --- a/var/spack/repos/builtin/packages/r-influencer/package.py +++ b/var/spack/repos/builtin/packages/r-influencer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-inline/package.py b/var/spack/repos/builtin/packages/r-inline/package.py index 9040d0fbcc..3ddd145cae 100644 --- a/var/spack/repos/builtin/packages/r-inline/package.py +++ b/var/spack/repos/builtin/packages/r-inline/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ipred/package.py b/var/spack/repos/builtin/packages/r-ipred/package.py index f504528c67..c3aa0e0d40 100644 --- a/var/spack/repos/builtin/packages/r-ipred/package.py +++ b/var/spack/repos/builtin/packages/r-ipred/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-irdisplay/package.py b/var/spack/repos/builtin/packages/r-irdisplay/package.py index f02c00d8ba..1896eccf6d 100644 --- a/var/spack/repos/builtin/packages/r-irdisplay/package.py +++ b/var/spack/repos/builtin/packages/r-irdisplay/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-irkernel/package.py b/var/spack/repos/builtin/packages/r-irkernel/package.py index e69b77f9f0..1ea52dedad 100644 --- a/var/spack/repos/builtin/packages/r-irkernel/package.py +++ b/var/spack/repos/builtin/packages/r-irkernel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-irlba/package.py b/var/spack/repos/builtin/packages/r-irlba/package.py index 4ed3fe5b39..aea557cd3f 100644 --- a/var/spack/repos/builtin/packages/r-irlba/package.py +++ b/var/spack/repos/builtin/packages/r-irlba/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-iterators/package.py b/var/spack/repos/builtin/packages/r-iterators/package.py index bc9a8c6726..6561a471f0 100644 --- a/var/spack/repos/builtin/packages/r-iterators/package.py +++ b/var/spack/repos/builtin/packages/r-iterators/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-jpeg/package.py b/var/spack/repos/builtin/packages/r-jpeg/package.py index 643b510f05..13a96d50e2 100644 --- a/var/spack/repos/builtin/packages/r-jpeg/package.py +++ b/var/spack/repos/builtin/packages/r-jpeg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-jsonlite/package.py b/var/spack/repos/builtin/packages/r-jsonlite/package.py index 34c0c88c87..364966c9c1 100644 --- a/var/spack/repos/builtin/packages/r-jsonlite/package.py +++ b/var/spack/repos/builtin/packages/r-jsonlite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-kernlab/package.py b/var/spack/repos/builtin/packages/r-kernlab/package.py index 7d3079a210..fc336e6c8c 100644 --- a/var/spack/repos/builtin/packages/r-kernlab/package.py +++ b/var/spack/repos/builtin/packages/r-kernlab/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-kernsmooth/package.py b/var/spack/repos/builtin/packages/r-kernsmooth/package.py index 59479a5ef9..e72c299919 100644 --- a/var/spack/repos/builtin/packages/r-kernsmooth/package.py +++ b/var/spack/repos/builtin/packages/r-kernsmooth/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-kknn/package.py b/var/spack/repos/builtin/packages/r-kknn/package.py index c12a359b14..27824c7fdb 100644 --- a/var/spack/repos/builtin/packages/r-kknn/package.py +++ b/var/spack/repos/builtin/packages/r-kknn/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-knitr/package.py b/var/spack/repos/builtin/packages/r-knitr/package.py index 5d604252f8..71e95b49f2 100644 --- a/var/spack/repos/builtin/packages/r-knitr/package.py +++ b/var/spack/repos/builtin/packages/r-knitr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-labeling/package.py b/var/spack/repos/builtin/packages/r-labeling/package.py index 41ac015977..7a57909787 100644 --- a/var/spack/repos/builtin/packages/r-labeling/package.py +++ b/var/spack/repos/builtin/packages/r-labeling/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-laplacesdemon/package.py b/var/spack/repos/builtin/packages/r-laplacesdemon/package.py index c2755a4920..61aca6b9d8 100644 --- a/var/spack/repos/builtin/packages/r-laplacesdemon/package.py +++ b/var/spack/repos/builtin/packages/r-laplacesdemon/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lattice/package.py b/var/spack/repos/builtin/packages/r-lattice/package.py index 7837bac1b4..faefc2de0f 100644 --- a/var/spack/repos/builtin/packages/r-lattice/package.py +++ b/var/spack/repos/builtin/packages/r-lattice/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lava/package.py b/var/spack/repos/builtin/packages/r-lava/package.py index f4c85a57ad..e3aef589b2 100644 --- a/var/spack/repos/builtin/packages/r-lava/package.py +++ b/var/spack/repos/builtin/packages/r-lava/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lazyeval/package.py b/var/spack/repos/builtin/packages/r-lazyeval/package.py index 72b73f9e0a..a48a06f38f 100644 --- a/var/spack/repos/builtin/packages/r-lazyeval/package.py +++ b/var/spack/repos/builtin/packages/r-lazyeval/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-leaflet/package.py b/var/spack/repos/builtin/packages/r-leaflet/package.py index c309c92de9..b7f39992bd 100644 --- a/var/spack/repos/builtin/packages/r-leaflet/package.py +++ b/var/spack/repos/builtin/packages/r-leaflet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-leaps/package.py b/var/spack/repos/builtin/packages/r-leaps/package.py index 3afc27e6dd..9ac7875b37 100644 --- a/var/spack/repos/builtin/packages/r-leaps/package.py +++ b/var/spack/repos/builtin/packages/r-leaps/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-learnbayes/package.py b/var/spack/repos/builtin/packages/r-learnbayes/package.py index c6b276c863..d4a6fa42fa 100644 --- a/var/spack/repos/builtin/packages/r-learnbayes/package.py +++ b/var/spack/repos/builtin/packages/r-learnbayes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lme4/package.py b/var/spack/repos/builtin/packages/r-lme4/package.py index e71da3ad81..c06e319273 100644 --- a/var/spack/repos/builtin/packages/r-lme4/package.py +++ b/var/spack/repos/builtin/packages/r-lme4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lmtest/package.py b/var/spack/repos/builtin/packages/r-lmtest/package.py index 7967f38615..27fe98f0f8 100644 --- a/var/spack/repos/builtin/packages/r-lmtest/package.py +++ b/var/spack/repos/builtin/packages/r-lmtest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lpsolve/package.py b/var/spack/repos/builtin/packages/r-lpsolve/package.py index 65570e2873..5f694f6f6d 100644 --- a/var/spack/repos/builtin/packages/r-lpsolve/package.py +++ b/var/spack/repos/builtin/packages/r-lpsolve/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-lubridate/package.py b/var/spack/repos/builtin/packages/r-lubridate/package.py index ad64ce0c39..5e2f6f0d05 100644 --- a/var/spack/repos/builtin/packages/r-lubridate/package.py +++ b/var/spack/repos/builtin/packages/r-lubridate/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-magic/package.py b/var/spack/repos/builtin/packages/r-magic/package.py index 4e2c3bb193..3844584c68 100644 --- a/var/spack/repos/builtin/packages/r-magic/package.py +++ b/var/spack/repos/builtin/packages/r-magic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-magrittr/package.py b/var/spack/repos/builtin/packages/r-magrittr/package.py index a01b601a3c..33cc9b178c 100644 --- a/var/spack/repos/builtin/packages/r-magrittr/package.py +++ b/var/spack/repos/builtin/packages/r-magrittr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mapproj/package.py b/var/spack/repos/builtin/packages/r-mapproj/package.py index 711c3dfb07..590ff0c9bd 100644 --- a/var/spack/repos/builtin/packages/r-mapproj/package.py +++ b/var/spack/repos/builtin/packages/r-mapproj/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-maps/package.py b/var/spack/repos/builtin/packages/r-maps/package.py index 0f327db31e..9c526c80df 100644 --- a/var/spack/repos/builtin/packages/r-maps/package.py +++ b/var/spack/repos/builtin/packages/r-maps/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-maptools/package.py b/var/spack/repos/builtin/packages/r-maptools/package.py index f2894568d0..217af81541 100644 --- a/var/spack/repos/builtin/packages/r-maptools/package.py +++ b/var/spack/repos/builtin/packages/r-maptools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-markdown/package.py b/var/spack/repos/builtin/packages/r-markdown/package.py index f843e64bc7..e44d67aa33 100644 --- a/var/spack/repos/builtin/packages/r-markdown/package.py +++ b/var/spack/repos/builtin/packages/r-markdown/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mass/package.py b/var/spack/repos/builtin/packages/r-mass/package.py index 56a000968d..873376c26f 100644 --- a/var/spack/repos/builtin/packages/r-mass/package.py +++ b/var/spack/repos/builtin/packages/r-mass/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-matrix/package.py b/var/spack/repos/builtin/packages/r-matrix/package.py index d2f14df063..7f30d58446 100644 --- a/var/spack/repos/builtin/packages/r-matrix/package.py +++ b/var/spack/repos/builtin/packages/r-matrix/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-matrixmodels/package.py b/var/spack/repos/builtin/packages/r-matrixmodels/package.py index 2391da8ad7..1707453552 100644 --- a/var/spack/repos/builtin/packages/r-matrixmodels/package.py +++ b/var/spack/repos/builtin/packages/r-matrixmodels/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mclust/package.py b/var/spack/repos/builtin/packages/r-mclust/package.py index 308afd5952..9c5f3dd4b0 100644 --- a/var/spack/repos/builtin/packages/r-mclust/package.py +++ b/var/spack/repos/builtin/packages/r-mclust/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mda/package.py b/var/spack/repos/builtin/packages/r-mda/package.py index 5c39cc7858..079c2a1a5a 100644 --- a/var/spack/repos/builtin/packages/r-mda/package.py +++ b/var/spack/repos/builtin/packages/r-mda/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-memoise/package.py b/var/spack/repos/builtin/packages/r-memoise/package.py index 9cabadb282..9c507391da 100644 --- a/var/spack/repos/builtin/packages/r-memoise/package.py +++ b/var/spack/repos/builtin/packages/r-memoise/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mgcv/package.py b/var/spack/repos/builtin/packages/r-mgcv/package.py index bdf6fe3a89..3a879971ff 100644 --- a/var/spack/repos/builtin/packages/r-mgcv/package.py +++ b/var/spack/repos/builtin/packages/r-mgcv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mime/package.py b/var/spack/repos/builtin/packages/r-mime/package.py index aa6e51c18b..db490bd24d 100644 --- a/var/spack/repos/builtin/packages/r-mime/package.py +++ b/var/spack/repos/builtin/packages/r-mime/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-minqa/package.py b/var/spack/repos/builtin/packages/r-minqa/package.py index afd5c37132..47fa0620ce 100644 --- a/var/spack/repos/builtin/packages/r-minqa/package.py +++ b/var/spack/repos/builtin/packages/r-minqa/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mlbench/package.py b/var/spack/repos/builtin/packages/r-mlbench/package.py index 8ab4c89058..98366d9fa8 100644 --- a/var/spack/repos/builtin/packages/r-mlbench/package.py +++ b/var/spack/repos/builtin/packages/r-mlbench/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-modelmetrics/package.py b/var/spack/repos/builtin/packages/r-modelmetrics/package.py index 03ae0ca6f7..99cb924433 100644 --- a/var/spack/repos/builtin/packages/r-modelmetrics/package.py +++ b/var/spack/repos/builtin/packages/r-modelmetrics/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-modeltools/package.py b/var/spack/repos/builtin/packages/r-modeltools/package.py index 2d80652f8c..a77bb04805 100644 --- a/var/spack/repos/builtin/packages/r-modeltools/package.py +++ b/var/spack/repos/builtin/packages/r-modeltools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-multcomp/package.py b/var/spack/repos/builtin/packages/r-multcomp/package.py index ab77b6024d..acaba46b51 100644 --- a/var/spack/repos/builtin/packages/r-multcomp/package.py +++ b/var/spack/repos/builtin/packages/r-multcomp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-munsell/package.py b/var/spack/repos/builtin/packages/r-munsell/package.py index fe43d4c746..fa635782e1 100644 --- a/var/spack/repos/builtin/packages/r-munsell/package.py +++ b/var/spack/repos/builtin/packages/r-munsell/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-mvtnorm/package.py b/var/spack/repos/builtin/packages/r-mvtnorm/package.py index 3c79b05691..31933e70a3 100644 --- a/var/spack/repos/builtin/packages/r-mvtnorm/package.py +++ b/var/spack/repos/builtin/packages/r-mvtnorm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ncdf4/package.py b/var/spack/repos/builtin/packages/r-ncdf4/package.py index 299bf0b108..31b2f4f2ee 100644 --- a/var/spack/repos/builtin/packages/r-ncdf4/package.py +++ b/var/spack/repos/builtin/packages/r-ncdf4/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-network/package.py b/var/spack/repos/builtin/packages/r-network/package.py index acf0e9a0e9..c561cb1932 100644 --- a/var/spack/repos/builtin/packages/r-network/package.py +++ b/var/spack/repos/builtin/packages/r-network/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-networkd3/package.py b/var/spack/repos/builtin/packages/r-networkd3/package.py index 2c70b45438..68501bba52 100644 --- a/var/spack/repos/builtin/packages/r-networkd3/package.py +++ b/var/spack/repos/builtin/packages/r-networkd3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-nlme/package.py b/var/spack/repos/builtin/packages/r-nlme/package.py index 0c619e5f9d..68f4a7d74e 100644 --- a/var/spack/repos/builtin/packages/r-nlme/package.py +++ b/var/spack/repos/builtin/packages/r-nlme/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-nloptr/package.py b/var/spack/repos/builtin/packages/r-nloptr/package.py index 2512cca695..edf19e653f 100644 --- a/var/spack/repos/builtin/packages/r-nloptr/package.py +++ b/var/spack/repos/builtin/packages/r-nloptr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-nmf/package.py b/var/spack/repos/builtin/packages/r-nmf/package.py index a0385d4ce2..5911652eda 100644 --- a/var/spack/repos/builtin/packages/r-nmf/package.py +++ b/var/spack/repos/builtin/packages/r-nmf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-nnet/package.py b/var/spack/repos/builtin/packages/r-nnet/package.py index 6a7651a51e..75b9be602d 100644 --- a/var/spack/repos/builtin/packages/r-nnet/package.py +++ b/var/spack/repos/builtin/packages/r-nnet/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-np/package.py b/var/spack/repos/builtin/packages/r-np/package.py index a010d37af9..4f45314f0b 100644 --- a/var/spack/repos/builtin/packages/r-np/package.py +++ b/var/spack/repos/builtin/packages/r-np/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-numderiv/package.py b/var/spack/repos/builtin/packages/r-numderiv/package.py index 1323e537ae..a6a5b0bcc1 100644 --- a/var/spack/repos/builtin/packages/r-numderiv/package.py +++ b/var/spack/repos/builtin/packages/r-numderiv/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-openssl/package.py b/var/spack/repos/builtin/packages/r-openssl/package.py index 8989fcf14c..ae5eca3f5a 100644 --- a/var/spack/repos/builtin/packages/r-openssl/package.py +++ b/var/spack/repos/builtin/packages/r-openssl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-packrat/package.py b/var/spack/repos/builtin/packages/r-packrat/package.py index e0f8c0ec4e..123ceb5caa 100644 --- a/var/spack/repos/builtin/packages/r-packrat/package.py +++ b/var/spack/repos/builtin/packages/r-packrat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-pacman/package.py b/var/spack/repos/builtin/packages/r-pacman/package.py index 3112e9ef19..41c9efbc5c 100644 --- a/var/spack/repos/builtin/packages/r-pacman/package.py +++ b/var/spack/repos/builtin/packages/r-pacman/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-party/package.py b/var/spack/repos/builtin/packages/r-party/package.py index ee006ec710..d0b39a681e 100644 --- a/var/spack/repos/builtin/packages/r-party/package.py +++ b/var/spack/repos/builtin/packages/r-party/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-partykit/package.py b/var/spack/repos/builtin/packages/r-partykit/package.py index 5c056e7b71..188507e44d 100644 --- a/var/spack/repos/builtin/packages/r-partykit/package.py +++ b/var/spack/repos/builtin/packages/r-partykit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-pbdzmq/package.py b/var/spack/repos/builtin/packages/r-pbdzmq/package.py index ee85dfe3a4..42f7f19351 100644 --- a/var/spack/repos/builtin/packages/r-pbdzmq/package.py +++ b/var/spack/repos/builtin/packages/r-pbdzmq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-pbkrtest/package.py b/var/spack/repos/builtin/packages/r-pbkrtest/package.py index 8278f67218..41971003db 100644 --- a/var/spack/repos/builtin/packages/r-pbkrtest/package.py +++ b/var/spack/repos/builtin/packages/r-pbkrtest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-permute/package.py b/var/spack/repos/builtin/packages/r-permute/package.py index 8dbc5a82be..25a3161713 100644 --- a/var/spack/repos/builtin/packages/r-permute/package.py +++ b/var/spack/repos/builtin/packages/r-permute/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-pkgmaker/package.py b/var/spack/repos/builtin/packages/r-pkgmaker/package.py index 2692d491b4..a1ea734f1d 100644 --- a/var/spack/repos/builtin/packages/r-pkgmaker/package.py +++ b/var/spack/repos/builtin/packages/r-pkgmaker/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-plotrix/package.py b/var/spack/repos/builtin/packages/r-plotrix/package.py index 9740c70594..0fcb7c29af 100644 --- a/var/spack/repos/builtin/packages/r-plotrix/package.py +++ b/var/spack/repos/builtin/packages/r-plotrix/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-pls/package.py b/var/spack/repos/builtin/packages/r-pls/package.py index c75048962e..cf9c763959 100644 --- a/var/spack/repos/builtin/packages/r-pls/package.py +++ b/var/spack/repos/builtin/packages/r-pls/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-plyr/package.py b/var/spack/repos/builtin/packages/r-plyr/package.py index f9f8176c64..eef6e9fd0f 100644 --- a/var/spack/repos/builtin/packages/r-plyr/package.py +++ b/var/spack/repos/builtin/packages/r-plyr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-png/package.py b/var/spack/repos/builtin/packages/r-png/package.py index 9808e3e3a5..9fdfbec533 100644 --- a/var/spack/repos/builtin/packages/r-png/package.py +++ b/var/spack/repos/builtin/packages/r-png/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-prabclus/package.py b/var/spack/repos/builtin/packages/r-prabclus/package.py index 1dd42ffae4..3ef75d85fc 100644 --- a/var/spack/repos/builtin/packages/r-prabclus/package.py +++ b/var/spack/repos/builtin/packages/r-prabclus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-praise/package.py b/var/spack/repos/builtin/packages/r-praise/package.py index ff23594af9..05650efc47 100644 --- a/var/spack/repos/builtin/packages/r-praise/package.py +++ b/var/spack/repos/builtin/packages/r-praise/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-prodlim/package.py b/var/spack/repos/builtin/packages/r-prodlim/package.py index 44f03e789a..34634839ba 100644 --- a/var/spack/repos/builtin/packages/r-prodlim/package.py +++ b/var/spack/repos/builtin/packages/r-prodlim/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-proto/package.py b/var/spack/repos/builtin/packages/r-proto/package.py index f4b6c2f809..efb90b9914 100644 --- a/var/spack/repos/builtin/packages/r-proto/package.py +++ b/var/spack/repos/builtin/packages/r-proto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-pryr/package.py b/var/spack/repos/builtin/packages/r-pryr/package.py index 673060c779..cae4a8af8e 100644 --- a/var/spack/repos/builtin/packages/r-pryr/package.py +++ b/var/spack/repos/builtin/packages/r-pryr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-quadprog/package.py b/var/spack/repos/builtin/packages/r-quadprog/package.py index b72a7f9260..ff4fa300eb 100644 --- a/var/spack/repos/builtin/packages/r-quadprog/package.py +++ b/var/spack/repos/builtin/packages/r-quadprog/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-quantmod/package.py b/var/spack/repos/builtin/packages/r-quantmod/package.py index 8a9755cc4e..b52bc8a57a 100644 --- a/var/spack/repos/builtin/packages/r-quantmod/package.py +++ b/var/spack/repos/builtin/packages/r-quantmod/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-quantreg/package.py b/var/spack/repos/builtin/packages/r-quantreg/package.py index 011c4a1c4e..3d9a04c290 100644 --- a/var/spack/repos/builtin/packages/r-quantreg/package.py +++ b/var/spack/repos/builtin/packages/r-quantreg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-r6/package.py b/var/spack/repos/builtin/packages/r-r6/package.py index 9930b751b2..01a2feda21 100644 --- a/var/spack/repos/builtin/packages/r-r6/package.py +++ b/var/spack/repos/builtin/packages/r-r6/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-randomforest/package.py b/var/spack/repos/builtin/packages/r-randomforest/package.py index 6df372e6f3..85d7473486 100644 --- a/var/spack/repos/builtin/packages/r-randomforest/package.py +++ b/var/spack/repos/builtin/packages/r-randomforest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-raster/package.py b/var/spack/repos/builtin/packages/r-raster/package.py index 2bcdfe33ec..73a1b38b5a 100644 --- a/var/spack/repos/builtin/packages/r-raster/package.py +++ b/var/spack/repos/builtin/packages/r-raster/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rbokeh/package.py b/var/spack/repos/builtin/packages/r-rbokeh/package.py index f90ea20fbf..12173b3077 100644 --- a/var/spack/repos/builtin/packages/r-rbokeh/package.py +++ b/var/spack/repos/builtin/packages/r-rbokeh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py b/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py index d123f536de..c6b888d6d6 100644 --- a/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py +++ b/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rcpp/package.py b/var/spack/repos/builtin/packages/r-rcpp/package.py index 1f85226975..f89a378524 100644 --- a/var/spack/repos/builtin/packages/r-rcpp/package.py +++ b/var/spack/repos/builtin/packages/r-rcpp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rcppeigen/package.py b/var/spack/repos/builtin/packages/r-rcppeigen/package.py index e5db4ac0f6..de604f8322 100644 --- a/var/spack/repos/builtin/packages/r-rcppeigen/package.py +++ b/var/spack/repos/builtin/packages/r-rcppeigen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-registry/package.py b/var/spack/repos/builtin/packages/r-registry/package.py index 618ab00385..db1a369739 100644 --- a/var/spack/repos/builtin/packages/r-registry/package.py +++ b/var/spack/repos/builtin/packages/r-registry/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-repr/package.py b/var/spack/repos/builtin/packages/r-repr/package.py index 67804a7b4f..c42bea87df 100644 --- a/var/spack/repos/builtin/packages/r-repr/package.py +++ b/var/spack/repos/builtin/packages/r-repr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-reshape2/package.py b/var/spack/repos/builtin/packages/r-reshape2/package.py index 208cc4d576..1b53e94e80 100644 --- a/var/spack/repos/builtin/packages/r-reshape2/package.py +++ b/var/spack/repos/builtin/packages/r-reshape2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rgl/package.py b/var/spack/repos/builtin/packages/r-rgl/package.py index d3b65adbaf..099702e2ed 100644 --- a/var/spack/repos/builtin/packages/r-rgl/package.py +++ b/var/spack/repos/builtin/packages/r-rgl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rgooglemaps/package.py b/var/spack/repos/builtin/packages/r-rgooglemaps/package.py index b505249f59..cfe19257fb 100644 --- a/var/spack/repos/builtin/packages/r-rgooglemaps/package.py +++ b/var/spack/repos/builtin/packages/r-rgooglemaps/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rinside/package.py b/var/spack/repos/builtin/packages/r-rinside/package.py index 11a254a162..759910a859 100644 --- a/var/spack/repos/builtin/packages/r-rinside/package.py +++ b/var/spack/repos/builtin/packages/r-rinside/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rjava/package.py b/var/spack/repos/builtin/packages/r-rjava/package.py index 26502134c1..7baab54baa 100644 --- a/var/spack/repos/builtin/packages/r-rjava/package.py +++ b/var/spack/repos/builtin/packages/r-rjava/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rjson/package.py b/var/spack/repos/builtin/packages/r-rjson/package.py index 5db82ed44a..1fbf94ccbf 100644 --- a/var/spack/repos/builtin/packages/r-rjson/package.py +++ b/var/spack/repos/builtin/packages/r-rjson/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rjsonio/package.py b/var/spack/repos/builtin/packages/r-rjsonio/package.py index 5cf23bc973..c57846395e 100644 --- a/var/spack/repos/builtin/packages/r-rjsonio/package.py +++ b/var/spack/repos/builtin/packages/r-rjsonio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rmarkdown/package.py b/var/spack/repos/builtin/packages/r-rmarkdown/package.py index 09328f7684..6e1c25ef64 100644 --- a/var/spack/repos/builtin/packages/r-rmarkdown/package.py +++ b/var/spack/repos/builtin/packages/r-rmarkdown/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rminer/package.py b/var/spack/repos/builtin/packages/r-rminer/package.py index 4a50994db5..b86948b3bc 100644 --- a/var/spack/repos/builtin/packages/r-rminer/package.py +++ b/var/spack/repos/builtin/packages/r-rminer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rmpfr/package.py b/var/spack/repos/builtin/packages/r-rmpfr/package.py index cda1bdd135..ae419592e3 100644 --- a/var/spack/repos/builtin/packages/r-rmpfr/package.py +++ b/var/spack/repos/builtin/packages/r-rmpfr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rmpi/package.py b/var/spack/repos/builtin/packages/r-rmpi/package.py index d1844776e0..5f8dac889b 100644 --- a/var/spack/repos/builtin/packages/r-rmpi/package.py +++ b/var/spack/repos/builtin/packages/r-rmpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rmysql/package.py b/var/spack/repos/builtin/packages/r-rmysql/package.py index c0248e7349..5d7be1aff8 100644 --- a/var/spack/repos/builtin/packages/r-rmysql/package.py +++ b/var/spack/repos/builtin/packages/r-rmysql/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rngtools/package.py b/var/spack/repos/builtin/packages/r-rngtools/package.py index 4d26350cc4..1f55311e97 100644 --- a/var/spack/repos/builtin/packages/r-rngtools/package.py +++ b/var/spack/repos/builtin/packages/r-rngtools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-robustbase/package.py b/var/spack/repos/builtin/packages/r-robustbase/package.py index 1b7db70fbe..43e6602821 100644 --- a/var/spack/repos/builtin/packages/r-robustbase/package.py +++ b/var/spack/repos/builtin/packages/r-robustbase/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rodbc/package.py b/var/spack/repos/builtin/packages/r-rodbc/package.py index c48455b91c..cfd7470a76 100644 --- a/var/spack/repos/builtin/packages/r-rodbc/package.py +++ b/var/spack/repos/builtin/packages/r-rodbc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-roxygen2/package.py b/var/spack/repos/builtin/packages/r-roxygen2/package.py index 10b876d686..0e23c83522 100644 --- a/var/spack/repos/builtin/packages/r-roxygen2/package.py +++ b/var/spack/repos/builtin/packages/r-roxygen2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rpart-plot/package.py b/var/spack/repos/builtin/packages/r-rpart-plot/package.py index 64559f9303..c17761f764 100644 --- a/var/spack/repos/builtin/packages/r-rpart-plot/package.py +++ b/var/spack/repos/builtin/packages/r-rpart-plot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rpart/package.py b/var/spack/repos/builtin/packages/r-rpart/package.py index df8e33414a..ea857ad926 100644 --- a/var/spack/repos/builtin/packages/r-rpart/package.py +++ b/var/spack/repos/builtin/packages/r-rpart/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rpostgresql/package.py b/var/spack/repos/builtin/packages/r-rpostgresql/package.py index 80331755ac..351b23a16e 100644 --- a/var/spack/repos/builtin/packages/r-rpostgresql/package.py +++ b/var/spack/repos/builtin/packages/r-rpostgresql/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rsnns/package.py b/var/spack/repos/builtin/packages/r-rsnns/package.py index 0359102983..b56bde343f 100644 --- a/var/spack/repos/builtin/packages/r-rsnns/package.py +++ b/var/spack/repos/builtin/packages/r-rsnns/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rsqlite/package.py b/var/spack/repos/builtin/packages/r-rsqlite/package.py index 218d7e589f..ebdc91ba7d 100644 --- a/var/spack/repos/builtin/packages/r-rsqlite/package.py +++ b/var/spack/repos/builtin/packages/r-rsqlite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rstan/package.py b/var/spack/repos/builtin/packages/r-rstan/package.py index 0283c34d32..daea44437e 100644 --- a/var/spack/repos/builtin/packages/r-rstan/package.py +++ b/var/spack/repos/builtin/packages/r-rstan/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rstudioapi/package.py b/var/spack/repos/builtin/packages/r-rstudioapi/package.py index acf391d136..923fe4b716 100644 --- a/var/spack/repos/builtin/packages/r-rstudioapi/package.py +++ b/var/spack/repos/builtin/packages/r-rstudioapi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-rzmq/package.py b/var/spack/repos/builtin/packages/r-rzmq/package.py index 9142c66055..e4c0e95f44 100644 --- a/var/spack/repos/builtin/packages/r-rzmq/package.py +++ b/var/spack/repos/builtin/packages/r-rzmq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-sandwich/package.py b/var/spack/repos/builtin/packages/r-sandwich/package.py index 2b04a2f675..3ab36537c1 100644 --- a/var/spack/repos/builtin/packages/r-sandwich/package.py +++ b/var/spack/repos/builtin/packages/r-sandwich/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-scales/package.py b/var/spack/repos/builtin/packages/r-scales/package.py index ec7f82af37..4e513bc2c0 100644 --- a/var/spack/repos/builtin/packages/r-scales/package.py +++ b/var/spack/repos/builtin/packages/r-scales/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-scatterplot3d/package.py b/var/spack/repos/builtin/packages/r-scatterplot3d/package.py index 51c3b44e1c..ac3a9dc8cc 100644 --- a/var/spack/repos/builtin/packages/r-scatterplot3d/package.py +++ b/var/spack/repos/builtin/packages/r-scatterplot3d/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-segmented/package.py b/var/spack/repos/builtin/packages/r-segmented/package.py index 415e5a4f72..bc3b02e3c0 100644 --- a/var/spack/repos/builtin/packages/r-segmented/package.py +++ b/var/spack/repos/builtin/packages/r-segmented/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-seqinr/package.py b/var/spack/repos/builtin/packages/r-seqinr/package.py index d9157a77fc..3b3dbdf871 100644 --- a/var/spack/repos/builtin/packages/r-seqinr/package.py +++ b/var/spack/repos/builtin/packages/r-seqinr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-shiny/package.py b/var/spack/repos/builtin/packages/r-shiny/package.py index dd0ce0192d..763551049b 100644 --- a/var/spack/repos/builtin/packages/r-shiny/package.py +++ b/var/spack/repos/builtin/packages/r-shiny/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-snow/package.py b/var/spack/repos/builtin/packages/r-snow/package.py index 6070e4a882..d19847a8a1 100644 --- a/var/spack/repos/builtin/packages/r-snow/package.py +++ b/var/spack/repos/builtin/packages/r-snow/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-sp/package.py b/var/spack/repos/builtin/packages/r-sp/package.py index 66a213133c..bbb7752f60 100644 --- a/var/spack/repos/builtin/packages/r-sp/package.py +++ b/var/spack/repos/builtin/packages/r-sp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-sparsem/package.py b/var/spack/repos/builtin/packages/r-sparsem/package.py index 49f4f03f04..7ac268ff8d 100644 --- a/var/spack/repos/builtin/packages/r-sparsem/package.py +++ b/var/spack/repos/builtin/packages/r-sparsem/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-spdep/package.py b/var/spack/repos/builtin/packages/r-spdep/package.py index eb31f64d5d..1362a671c0 100644 --- a/var/spack/repos/builtin/packages/r-spdep/package.py +++ b/var/spack/repos/builtin/packages/r-spdep/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-stanheaders/package.py b/var/spack/repos/builtin/packages/r-stanheaders/package.py index 1f7e59064d..4060a10efd 100644 --- a/var/spack/repos/builtin/packages/r-stanheaders/package.py +++ b/var/spack/repos/builtin/packages/r-stanheaders/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-statnet-common/package.py b/var/spack/repos/builtin/packages/r-statnet-common/package.py index 25c014790a..b3dd2569c8 100644 --- a/var/spack/repos/builtin/packages/r-statnet-common/package.py +++ b/var/spack/repos/builtin/packages/r-statnet-common/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-stringi/package.py b/var/spack/repos/builtin/packages/r-stringi/package.py index 15b89fe64e..a6e52b5690 100644 --- a/var/spack/repos/builtin/packages/r-stringi/package.py +++ b/var/spack/repos/builtin/packages/r-stringi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-stringr/package.py b/var/spack/repos/builtin/packages/r-stringr/package.py index e14616cc20..e3c3f4c7c9 100644 --- a/var/spack/repos/builtin/packages/r-stringr/package.py +++ b/var/spack/repos/builtin/packages/r-stringr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-strucchange/package.py b/var/spack/repos/builtin/packages/r-strucchange/package.py index 651e8aee4e..40f699b022 100644 --- a/var/spack/repos/builtin/packages/r-strucchange/package.py +++ b/var/spack/repos/builtin/packages/r-strucchange/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-survey/package.py b/var/spack/repos/builtin/packages/r-survey/package.py index b13dbe3f7e..816371ff15 100644 --- a/var/spack/repos/builtin/packages/r-survey/package.py +++ b/var/spack/repos/builtin/packages/r-survey/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-survival/package.py b/var/spack/repos/builtin/packages/r-survival/package.py index 62477d5314..0ac191e9ab 100644 --- a/var/spack/repos/builtin/packages/r-survival/package.py +++ b/var/spack/repos/builtin/packages/r-survival/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-tarifx/package.py b/var/spack/repos/builtin/packages/r-tarifx/package.py index f935989a38..401fe48950 100644 --- a/var/spack/repos/builtin/packages/r-tarifx/package.py +++ b/var/spack/repos/builtin/packages/r-tarifx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-testit/package.py b/var/spack/repos/builtin/packages/r-testit/package.py index 39bd69ca38..274f8d265d 100644 --- a/var/spack/repos/builtin/packages/r-testit/package.py +++ b/var/spack/repos/builtin/packages/r-testit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-testthat/package.py b/var/spack/repos/builtin/packages/r-testthat/package.py index 87cdb93ed4..d021e31c6e 100644 --- a/var/spack/repos/builtin/packages/r-testthat/package.py +++ b/var/spack/repos/builtin/packages/r-testthat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-th-data/package.py b/var/spack/repos/builtin/packages/r-th-data/package.py index 39eed23fc7..161024ce36 100644 --- a/var/spack/repos/builtin/packages/r-th-data/package.py +++ b/var/spack/repos/builtin/packages/r-th-data/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-threejs/package.py b/var/spack/repos/builtin/packages/r-threejs/package.py index c318b0c435..f8e3ada3cf 100644 --- a/var/spack/repos/builtin/packages/r-threejs/package.py +++ b/var/spack/repos/builtin/packages/r-threejs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-tibble/package.py b/var/spack/repos/builtin/packages/r-tibble/package.py index 50d75bae96..54b8703c13 100644 --- a/var/spack/repos/builtin/packages/r-tibble/package.py +++ b/var/spack/repos/builtin/packages/r-tibble/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-tidyr/package.py b/var/spack/repos/builtin/packages/r-tidyr/package.py index e4334bac11..45b8f0240e 100644 --- a/var/spack/repos/builtin/packages/r-tidyr/package.py +++ b/var/spack/repos/builtin/packages/r-tidyr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-trimcluster/package.py b/var/spack/repos/builtin/packages/r-trimcluster/package.py index bb64a9c5df..883b229536 100644 --- a/var/spack/repos/builtin/packages/r-trimcluster/package.py +++ b/var/spack/repos/builtin/packages/r-trimcluster/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-trust/package.py b/var/spack/repos/builtin/packages/r-trust/package.py index 1fe6676b8f..99f3ee0c3e 100644 --- a/var/spack/repos/builtin/packages/r-trust/package.py +++ b/var/spack/repos/builtin/packages/r-trust/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-ttr/package.py b/var/spack/repos/builtin/packages/r-ttr/package.py index 1db3f3c10c..bcce612ace 100644 --- a/var/spack/repos/builtin/packages/r-ttr/package.py +++ b/var/spack/repos/builtin/packages/r-ttr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-uuid/package.py b/var/spack/repos/builtin/packages/r-uuid/package.py index 638f493ace..7d42c95e89 100644 --- a/var/spack/repos/builtin/packages/r-uuid/package.py +++ b/var/spack/repos/builtin/packages/r-uuid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-vcd/package.py b/var/spack/repos/builtin/packages/r-vcd/package.py index 7f785f8158..9b65117a41 100644 --- a/var/spack/repos/builtin/packages/r-vcd/package.py +++ b/var/spack/repos/builtin/packages/r-vcd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-vegan/package.py b/var/spack/repos/builtin/packages/r-vegan/package.py index bd1134e8be..6816660ffe 100644 --- a/var/spack/repos/builtin/packages/r-vegan/package.py +++ b/var/spack/repos/builtin/packages/r-vegan/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-viridis/package.py b/var/spack/repos/builtin/packages/r-viridis/package.py index bb0ac670a6..ed9ad5ab6a 100644 --- a/var/spack/repos/builtin/packages/r-viridis/package.py +++ b/var/spack/repos/builtin/packages/r-viridis/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-viridislite/package.py b/var/spack/repos/builtin/packages/r-viridislite/package.py index e1e4f50d1c..885e673d56 100644 --- a/var/spack/repos/builtin/packages/r-viridislite/package.py +++ b/var/spack/repos/builtin/packages/r-viridislite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-visnetwork/package.py b/var/spack/repos/builtin/packages/r-visnetwork/package.py index 6618bf8b07..2b2921df81 100644 --- a/var/spack/repos/builtin/packages/r-visnetwork/package.py +++ b/var/spack/repos/builtin/packages/r-visnetwork/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-whisker/package.py b/var/spack/repos/builtin/packages/r-whisker/package.py index 44b8c6fc08..cff466f287 100644 --- a/var/spack/repos/builtin/packages/r-whisker/package.py +++ b/var/spack/repos/builtin/packages/r-whisker/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-withr/package.py b/var/spack/repos/builtin/packages/r-withr/package.py index f9de7d42cd..4491a8fd36 100644 --- a/var/spack/repos/builtin/packages/r-withr/package.py +++ b/var/spack/repos/builtin/packages/r-withr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xgboost/package.py b/var/spack/repos/builtin/packages/r-xgboost/package.py index eb6dacab34..45504c89b9 100644 --- a/var/spack/repos/builtin/packages/r-xgboost/package.py +++ b/var/spack/repos/builtin/packages/r-xgboost/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xlconnect/package.py b/var/spack/repos/builtin/packages/r-xlconnect/package.py index 5f23a9e275..d580faace7 100644 --- a/var/spack/repos/builtin/packages/r-xlconnect/package.py +++ b/var/spack/repos/builtin/packages/r-xlconnect/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xlconnectjars/package.py b/var/spack/repos/builtin/packages/r-xlconnectjars/package.py index 1e8b0b4f69..a618ad7157 100644 --- a/var/spack/repos/builtin/packages/r-xlconnectjars/package.py +++ b/var/spack/repos/builtin/packages/r-xlconnectjars/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xlsx/package.py b/var/spack/repos/builtin/packages/r-xlsx/package.py index 35c8d35d95..c3506b43d4 100644 --- a/var/spack/repos/builtin/packages/r-xlsx/package.py +++ b/var/spack/repos/builtin/packages/r-xlsx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xlsxjars/package.py b/var/spack/repos/builtin/packages/r-xlsxjars/package.py index 8d351d69b6..b0b6b91868 100644 --- a/var/spack/repos/builtin/packages/r-xlsxjars/package.py +++ b/var/spack/repos/builtin/packages/r-xlsxjars/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xml/package.py b/var/spack/repos/builtin/packages/r-xml/package.py index 9ec3d8cf1e..5704a64aed 100644 --- a/var/spack/repos/builtin/packages/r-xml/package.py +++ b/var/spack/repos/builtin/packages/r-xml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xtable/package.py b/var/spack/repos/builtin/packages/r-xtable/package.py index 462a97b451..1ec138c14c 100644 --- a/var/spack/repos/builtin/packages/r-xtable/package.py +++ b/var/spack/repos/builtin/packages/r-xtable/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-xts/package.py b/var/spack/repos/builtin/packages/r-xts/package.py index a3a4ce7f58..b0ab027206 100644 --- a/var/spack/repos/builtin/packages/r-xts/package.py +++ b/var/spack/repos/builtin/packages/r-xts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-yaml/package.py b/var/spack/repos/builtin/packages/r-yaml/package.py index 79cc0b392f..d4f096109f 100644 --- a/var/spack/repos/builtin/packages/r-yaml/package.py +++ b/var/spack/repos/builtin/packages/r-yaml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r-zoo/package.py b/var/spack/repos/builtin/packages/r-zoo/package.py index 0012a2d29a..bda4fd6cf9 100644 --- a/var/spack/repos/builtin/packages/r-zoo/package.py +++ b/var/spack/repos/builtin/packages/r-zoo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py index 5c092e30e5..a5e89cdfc1 100644 --- a/var/spack/repos/builtin/packages/r/package.py +++ b/var/spack/repos/builtin/packages/r/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/raja/package.py b/var/spack/repos/builtin/packages/raja/package.py index dccf9a581c..b01f9570fe 100644 --- a/var/spack/repos/builtin/packages/raja/package.py +++ b/var/spack/repos/builtin/packages/raja/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/random123/package.py b/var/spack/repos/builtin/packages/random123/package.py index 1ee51bb107..2aedf9aa63 100644 --- a/var/spack/repos/builtin/packages/random123/package.py +++ b/var/spack/repos/builtin/packages/random123/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/randrproto/package.py b/var/spack/repos/builtin/packages/randrproto/package.py index ff33620448..87c6d1ad81 100644 --- a/var/spack/repos/builtin/packages/randrproto/package.py +++ b/var/spack/repos/builtin/packages/randrproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ravel/package.py b/var/spack/repos/builtin/packages/ravel/package.py index 4f4f2b2e10..5875312a7b 100644 --- a/var/spack/repos/builtin/packages/ravel/package.py +++ b/var/spack/repos/builtin/packages/ravel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/readline/package.py b/var/spack/repos/builtin/packages/readline/package.py index e6476d39c3..31320bf666 100644 --- a/var/spack/repos/builtin/packages/readline/package.py +++ b/var/spack/repos/builtin/packages/readline/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/recordproto/package.py b/var/spack/repos/builtin/packages/recordproto/package.py index b38eeae079..27042e7b03 100644 --- a/var/spack/repos/builtin/packages/recordproto/package.py +++ b/var/spack/repos/builtin/packages/recordproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/relion/package.py b/var/spack/repos/builtin/packages/relion/package.py index cd45a14890..dfb93cd943 100644 --- a/var/spack/repos/builtin/packages/relion/package.py +++ b/var/spack/repos/builtin/packages/relion/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rempi/package.py b/var/spack/repos/builtin/packages/rempi/package.py index d93dbfa722..48ff14468a 100644 --- a/var/spack/repos/builtin/packages/rempi/package.py +++ b/var/spack/repos/builtin/packages/rempi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rename/package.py b/var/spack/repos/builtin/packages/rename/package.py index 3538fd21cc..9970a1a51c 100644 --- a/var/spack/repos/builtin/packages/rename/package.py +++ b/var/spack/repos/builtin/packages/rename/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rendercheck/package.py b/var/spack/repos/builtin/packages/rendercheck/package.py index f53925fe28..894329dbe9 100644 --- a/var/spack/repos/builtin/packages/rendercheck/package.py +++ b/var/spack/repos/builtin/packages/rendercheck/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/renderproto/package.py b/var/spack/repos/builtin/packages/renderproto/package.py index 81348d7347..687acf1675 100644 --- a/var/spack/repos/builtin/packages/renderproto/package.py +++ b/var/spack/repos/builtin/packages/renderproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/resourceproto/package.py b/var/spack/repos/builtin/packages/resourceproto/package.py index 11e143b5fc..67e0bad922 100644 --- a/var/spack/repos/builtin/packages/resourceproto/package.py +++ b/var/spack/repos/builtin/packages/resourceproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rgb/package.py b/var/spack/repos/builtin/packages/rgb/package.py index 985b90449d..75d483172d 100644 --- a/var/spack/repos/builtin/packages/rgb/package.py +++ b/var/spack/repos/builtin/packages/rgb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rockstar/package.py b/var/spack/repos/builtin/packages/rockstar/package.py index 5903b2c18b..9cb92d0f8d 100644 --- a/var/spack/repos/builtin/packages/rockstar/package.py +++ b/var/spack/repos/builtin/packages/rockstar/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/root/package.py b/var/spack/repos/builtin/packages/root/package.py index ca77b8fba5..b5f6ce89fe 100644 --- a/var/spack/repos/builtin/packages/root/package.py +++ b/var/spack/repos/builtin/packages/root/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rose/package.py b/var/spack/repos/builtin/packages/rose/package.py index ed8cca40ad..0e2265f571 100644 --- a/var/spack/repos/builtin/packages/rose/package.py +++ b/var/spack/repos/builtin/packages/rose/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rstart/package.py b/var/spack/repos/builtin/packages/rstart/package.py index 198c9c8be5..ff43120daf 100644 --- a/var/spack/repos/builtin/packages/rstart/package.py +++ b/var/spack/repos/builtin/packages/rstart/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rsync/package.py b/var/spack/repos/builtin/packages/rsync/package.py index 2c21262b39..de51073287 100644 --- a/var/spack/repos/builtin/packages/rsync/package.py +++ b/var/spack/repos/builtin/packages/rsync/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/ruby/package.py b/var/spack/repos/builtin/packages/ruby/package.py index 728362a18c..d3cc4db319 100644 --- a/var/spack/repos/builtin/packages/ruby/package.py +++ b/var/spack/repos/builtin/packages/ruby/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rust-bindgen/package.py b/var/spack/repos/builtin/packages/rust-bindgen/package.py index 00ccbb71cf..9db050425e 100644 --- a/var/spack/repos/builtin/packages/rust-bindgen/package.py +++ b/var/spack/repos/builtin/packages/rust-bindgen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/rust/package.py b/var/spack/repos/builtin/packages/rust/package.py index 4d0e7f52cf..44e7218ab4 100644 --- a/var/spack/repos/builtin/packages/rust/package.py +++ b/var/spack/repos/builtin/packages/rust/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/samrai/package.py b/var/spack/repos/builtin/packages/samrai/package.py index 5100d71583..c624a75a47 100644 --- a/var/spack/repos/builtin/packages/samrai/package.py +++ b/var/spack/repos/builtin/packages/samrai/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/samtools/package.py b/var/spack/repos/builtin/packages/samtools/package.py index 915b25b61b..173fd7e772 100644 --- a/var/spack/repos/builtin/packages/samtools/package.py +++ b/var/spack/repos/builtin/packages/samtools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sas/package.py b/var/spack/repos/builtin/packages/sas/package.py index 685e4202bf..5a7f1de1d5 100644 --- a/var/spack/repos/builtin/packages/sas/package.py +++ b/var/spack/repos/builtin/packages/sas/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/saws/package.py b/var/spack/repos/builtin/packages/saws/package.py index 7549a94b91..047f24f447 100644 --- a/var/spack/repos/builtin/packages/saws/package.py +++ b/var/spack/repos/builtin/packages/saws/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,9 +26,9 @@ from spack import * class Saws(AutotoolsPackage): - """The Scientific Application Web server (SAWs) turns any C or C++ - scientific or engineering application code into a webserver, - allowing one to examine (and even modify) the state of the + """The Scientific Application Web server (SAWs) turns any C or C++ + scientific or engineering application code into a webserver, + allowing one to examine (and even modify) the state of the simulation with any browser from anywhere.""" homepage = "https://bitbucket.org/saws/saws/wiki/Home" diff --git a/var/spack/repos/builtin/packages/sbt/package.py b/var/spack/repos/builtin/packages/sbt/package.py index 977939c9df..27be7cc54c 100644 --- a/var/spack/repos/builtin/packages/sbt/package.py +++ b/var/spack/repos/builtin/packages/sbt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scala/package.py b/var/spack/repos/builtin/packages/scala/package.py index 3f83cc44e2..dd1ab78f6b 100644 --- a/var/spack/repos/builtin/packages/scala/package.py +++ b/var/spack/repos/builtin/packages/scala/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scalasca/package.py b/var/spack/repos/builtin/packages/scalasca/package.py index 5b1ca12665..276cdf05a5 100644 --- a/var/spack/repos/builtin/packages/scalasca/package.py +++ b/var/spack/repos/builtin/packages/scalasca/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scons/package.py b/var/spack/repos/builtin/packages/scons/package.py index 54f894da6f..5bf35c071c 100644 --- a/var/spack/repos/builtin/packages/scons/package.py +++ b/var/spack/repos/builtin/packages/scons/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scorec-core/package.py b/var/spack/repos/builtin/packages/scorec-core/package.py index f8605e9859..dd143fc118 100644 --- a/var/spack/repos/builtin/packages/scorec-core/package.py +++ b/var/spack/repos/builtin/packages/scorec-core/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scorep/package.py b/var/spack/repos/builtin/packages/scorep/package.py index 288a0a0cd1..d164c38f54 100644 --- a/var/spack/repos/builtin/packages/scorep/package.py +++ b/var/spack/repos/builtin/packages/scorep/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py index 6129db104a..ab768767f9 100644 --- a/var/spack/repos/builtin/packages/scotch/package.py +++ b/var/spack/repos/builtin/packages/scotch/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scr/package.py b/var/spack/repos/builtin/packages/scr/package.py index 2b01c60b3e..f8fe72f110 100644 --- a/var/spack/repos/builtin/packages/scr/package.py +++ b/var/spack/repos/builtin/packages/scr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/screen/package.py b/var/spack/repos/builtin/packages/screen/package.py index 542612f207..997220eb37 100644 --- a/var/spack/repos/builtin/packages/screen/package.py +++ b/var/spack/repos/builtin/packages/screen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scripts/package.py b/var/spack/repos/builtin/packages/scripts/package.py index 4bdf63e70a..2f12bf217c 100644 --- a/var/spack/repos/builtin/packages/scripts/package.py +++ b/var/spack/repos/builtin/packages/scripts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/scrnsaverproto/package.py b/var/spack/repos/builtin/packages/scrnsaverproto/package.py index c849d12713..767566cc03 100644 --- a/var/spack/repos/builtin/packages/scrnsaverproto/package.py +++ b/var/spack/repos/builtin/packages/scrnsaverproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sctk/package.py b/var/spack/repos/builtin/packages/sctk/package.py index 680a202d7b..8c3734f623 100644 --- a/var/spack/repos/builtin/packages/sctk/package.py +++ b/var/spack/repos/builtin/packages/sctk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -27,10 +27,10 @@ from distutils.dir_util import copy_tree class Sctk(Package): - """The NIST Scoring Toolkit (SCTK) is a collection of software tools - designed to score benchmark test evaluations of Automatic Speech - Recognition (ASR) Systems. The toolkit is currently used by NIST, - benchmark test participants, and reserchers worldwide to as a + """The NIST Scoring Toolkit (SCTK) is a collection of software tools + designed to score benchmark test evaluations of Automatic Speech + Recognition (ASR) Systems. The toolkit is currently used by NIST, + benchmark test participants, and reserchers worldwide to as a common scoring engine.""" homepage = "https://www.nist.gov/itl/iad/mig/tools" diff --git a/var/spack/repos/builtin/packages/sdl2-image/package.py b/var/spack/repos/builtin/packages/sdl2-image/package.py index 6e953a1451..5caba819b2 100644 --- a/var/spack/repos/builtin/packages/sdl2-image/package.py +++ b/var/spack/repos/builtin/packages/sdl2-image/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sdl2/package.py b/var/spack/repos/builtin/packages/sdl2/package.py index 98f8861fed..e841cd4da4 100644 --- a/var/spack/repos/builtin/packages/sdl2/package.py +++ b/var/spack/repos/builtin/packages/sdl2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sed/package.py b/var/spack/repos/builtin/packages/sed/package.py index 57e00f4e77..3e59841579 100644 --- a/var/spack/repos/builtin/packages/sed/package.py +++ b/var/spack/repos/builtin/packages/sed/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/seqtk/package.py b/var/spack/repos/builtin/packages/seqtk/package.py index ca168c176c..466ec80535 100644 --- a/var/spack/repos/builtin/packages/seqtk/package.py +++ b/var/spack/repos/builtin/packages/seqtk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/serf/package.py b/var/spack/repos/builtin/packages/serf/package.py index ebca74a3ab..3d8e228548 100644 --- a/var/spack/repos/builtin/packages/serf/package.py +++ b/var/spack/repos/builtin/packages/serf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sessreg/package.py b/var/spack/repos/builtin/packages/sessreg/package.py index d50e65f4b0..a5bfd177c9 100644 --- a/var/spack/repos/builtin/packages/sessreg/package.py +++ b/var/spack/repos/builtin/packages/sessreg/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/setxkbmap/package.py b/var/spack/repos/builtin/packages/setxkbmap/package.py index 2c0f4380e3..7b28d55f1b 100644 --- a/var/spack/repos/builtin/packages/setxkbmap/package.py +++ b/var/spack/repos/builtin/packages/setxkbmap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sga/package.py b/var/spack/repos/builtin/packages/sga/package.py index 41e1830de1..e8581781ff 100644 --- a/var/spack/repos/builtin/packages/sga/package.py +++ b/var/spack/repos/builtin/packages/sga/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -27,7 +27,7 @@ from spack import * class Sga(AutotoolsPackage): """SGA is a de novo genome assembler based on the concept of string graphs. - The major goal of SGA is to be very memory efficient, which is achieved + The major goal of SGA is to be very memory efficient, which is achieved by using a compressed representation of DNA sequence reads.""" homepage = "https://www.msi.umn.edu/sw/sga" diff --git a/var/spack/repos/builtin/packages/shiny-server/package.py b/var/spack/repos/builtin/packages/shiny-server/package.py index a3a2b2b160..90b297327e 100644 --- a/var/spack/repos/builtin/packages/shiny-server/package.py +++ b/var/spack/repos/builtin/packages/shiny-server/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/showfont/package.py b/var/spack/repos/builtin/packages/showfont/package.py index 2dd8360311..7f75ef8c53 100644 --- a/var/spack/repos/builtin/packages/showfont/package.py +++ b/var/spack/repos/builtin/packages/showfont/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/silo/package.py b/var/spack/repos/builtin/packages/silo/package.py index eca5d1a605..75060d488e 100644 --- a/var/spack/repos/builtin/packages/silo/package.py +++ b/var/spack/repos/builtin/packages/silo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/simul/package.py b/var/spack/repos/builtin/packages/simul/package.py index 67ee61e416..2fb8f1b70d 100644 --- a/var/spack/repos/builtin/packages/simul/package.py +++ b/var/spack/repos/builtin/packages/simul/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,7 +26,7 @@ from spack import * class Simul(Package): - """simul is an MPI coordinated test of parallel + """simul is an MPI coordinated test of parallel filesystem system calls and library functions. """ homepage = "https://github.com/LLNL/simul" diff --git a/var/spack/repos/builtin/packages/simulationio/package.py b/var/spack/repos/builtin/packages/simulationio/package.py index 7e97c1e4ba..46ec5e5abb 100644 --- a/var/spack/repos/builtin/packages/simulationio/package.py +++ b/var/spack/repos/builtin/packages/simulationio/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/slepc/package.py b/var/spack/repos/builtin/packages/slepc/package.py index 2e5bd08692..934b173b2d 100644 --- a/var/spack/repos/builtin/packages/slepc/package.py +++ b/var/spack/repos/builtin/packages/slepc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/smproxy/package.py b/var/spack/repos/builtin/packages/smproxy/package.py index f7c7ebfe99..bead0b37de 100644 --- a/var/spack/repos/builtin/packages/smproxy/package.py +++ b/var/spack/repos/builtin/packages/smproxy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/snakemake/package.py b/var/spack/repos/builtin/packages/snakemake/package.py index 0970b88f9c..ed79e6002c 100644 --- a/var/spack/repos/builtin/packages/snakemake/package.py +++ b/var/spack/repos/builtin/packages/snakemake/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/snappy/package.py b/var/spack/repos/builtin/packages/snappy/package.py index c7b8118a24..bba05844e9 100644 --- a/var/spack/repos/builtin/packages/snappy/package.py +++ b/var/spack/repos/builtin/packages/snappy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sowing/package.py b/var/spack/repos/builtin/packages/sowing/package.py index 5dc23579b8..3f0b76078c 100644 --- a/var/spack/repos/builtin/packages/sowing/package.py +++ b/var/spack/repos/builtin/packages/sowing/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sox/package.py b/var/spack/repos/builtin/packages/sox/package.py index fc36a767ae..21e755c196 100644 --- a/var/spack/repos/builtin/packages/sox/package.py +++ b/var/spack/repos/builtin/packages/sox/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/spark/package.py b/var/spack/repos/builtin/packages/spark/package.py index 52eb5d7289..c625f6b82a 100644 --- a/var/spack/repos/builtin/packages/spark/package.py +++ b/var/spack/repos/builtin/packages/spark/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sparsehash/package.py b/var/spack/repos/builtin/packages/sparsehash/package.py index 6216987bce..864c5ffce8 100644 --- a/var/spack/repos/builtin/packages/sparsehash/package.py +++ b/var/spack/repos/builtin/packages/sparsehash/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/spdlog/package.py b/var/spack/repos/builtin/packages/spdlog/package.py index f9520219a3..a5a5612ae9 100644 --- a/var/spack/repos/builtin/packages/spdlog/package.py +++ b/var/spack/repos/builtin/packages/spdlog/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/spectrum-mpi/package.py b/var/spack/repos/builtin/packages/spectrum-mpi/package.py index d743f4874a..1daa4b917a 100644 --- a/var/spack/repos/builtin/packages/spectrum-mpi/package.py +++ b/var/spack/repos/builtin/packages/spectrum-mpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/speex/package.py b/var/spack/repos/builtin/packages/speex/package.py index b8850e801f..6cac86f20d 100644 --- a/var/spack/repos/builtin/packages/speex/package.py +++ b/var/spack/repos/builtin/packages/speex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,7 +26,7 @@ from spack import * class Speex(AutotoolsPackage): - """Speex is an Open Source/Free Software patent-free + """Speex is an Open Source/Free Software patent-free audio compression format designed for speech.""" homepage = "https://speex.org" diff --git a/var/spack/repos/builtin/packages/sph2pipe/package.py b/var/spack/repos/builtin/packages/sph2pipe/package.py index 445f284902..c89a16c902 100644 --- a/var/spack/repos/builtin/packages/sph2pipe/package.py +++ b/var/spack/repos/builtin/packages/sph2pipe/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/spherepack/package.py b/var/spack/repos/builtin/packages/spherepack/package.py index d85b8dc612..12c274774c 100644 --- a/var/spack/repos/builtin/packages/spherepack/package.py +++ b/var/spack/repos/builtin/packages/spherepack/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/spindle/package.py b/var/spack/repos/builtin/packages/spindle/package.py index ec996140b1..673cc5ebbe 100644 --- a/var/spack/repos/builtin/packages/spindle/package.py +++ b/var/spack/repos/builtin/packages/spindle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/spot/package.py b/var/spack/repos/builtin/packages/spot/package.py index 24787e3adc..1dc26a4e7c 100644 --- a/var/spack/repos/builtin/packages/spot/package.py +++ b/var/spack/repos/builtin/packages/spot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sqlite/package.py b/var/spack/repos/builtin/packages/sqlite/package.py index c12e937af9..56062c1472 100644 --- a/var/spack/repos/builtin/packages/sqlite/package.py +++ b/var/spack/repos/builtin/packages/sqlite/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sst-dumpi/package.py b/var/spack/repos/builtin/packages/sst-dumpi/package.py index edb1858809..537d0f5e14 100644 --- a/var/spack/repos/builtin/packages/sst-dumpi/package.py +++ b/var/spack/repos/builtin/packages/sst-dumpi/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sst-macro/package.py b/var/spack/repos/builtin/packages/sst-macro/package.py index 1fb927b599..3fd1a7489d 100644 --- a/var/spack/repos/builtin/packages/sst-macro/package.py +++ b/var/spack/repos/builtin/packages/sst-macro/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/staden-io-lib/package.py b/var/spack/repos/builtin/packages/staden-io-lib/package.py index 31f9693e28..c69b319252 100644 --- a/var/spack/repos/builtin/packages/staden-io-lib/package.py +++ b/var/spack/repos/builtin/packages/staden-io-lib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as @@ -26,7 +26,7 @@ from spack import * class StadenIoLib(AutotoolsPackage): - """Io_lib is a library for reading/writing various bioinformatics + """Io_lib is a library for reading/writing various bioinformatics file formats.""" homepage = "http://staden.sourceforge.net/" diff --git a/var/spack/repos/builtin/packages/star-ccm-plus/package.py b/var/spack/repos/builtin/packages/star-ccm-plus/package.py index 4197aec339..35fa9629c4 100644 --- a/var/spack/repos/builtin/packages/star-ccm-plus/package.py +++ b/var/spack/repos/builtin/packages/star-ccm-plus/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/star/package.py b/var/spack/repos/builtin/packages/star/package.py index a70dfb00bb..e06ed646df 100644 --- a/var/spack/repos/builtin/packages/star/package.py +++ b/var/spack/repos/builtin/packages/star/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py index 59d110330a..eedb2fe314 100644 --- a/var/spack/repos/builtin/packages/stat/package.py +++ b/var/spack/repos/builtin/packages/stat/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/stc/package.py b/var/spack/repos/builtin/packages/stc/package.py index d8daa4e20e..7365943a14 100644 --- a/var/spack/repos/builtin/packages/stc/package.py +++ b/var/spack/repos/builtin/packages/stc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/stream/package.py b/var/spack/repos/builtin/packages/stream/package.py index 7e24071356..c98ecc9c39 100644 --- a/var/spack/repos/builtin/packages/stream/package.py +++ b/var/spack/repos/builtin/packages/stream/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/stress/package.py b/var/spack/repos/builtin/packages/stress/package.py index 81bf2bd9a4..acdcf262d1 100644 --- a/var/spack/repos/builtin/packages/stress/package.py +++ b/var/spack/repos/builtin/packages/stress/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sublime-text/package.py b/var/spack/repos/builtin/packages/sublime-text/package.py index 1cfb117a05..3d7fb65005 100644 --- a/var/spack/repos/builtin/packages/sublime-text/package.py +++ b/var/spack/repos/builtin/packages/sublime-text/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/subversion/package.py b/var/spack/repos/builtin/packages/subversion/package.py index 628dd26d24..eb39c8299d 100644 --- a/var/spack/repos/builtin/packages/subversion/package.py +++ b/var/spack/repos/builtin/packages/subversion/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py index 74b8c53bec..e64be9730b 100644 --- a/var/spack/repos/builtin/packages/suite-sparse/package.py +++ b/var/spack/repos/builtin/packages/suite-sparse/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py index cb12a410f4..98e2f8f009 100644 --- a/var/spack/repos/builtin/packages/sundials/package.py +++ b/var/spack/repos/builtin/packages/sundials/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/superlu-dist/package.py b/var/spack/repos/builtin/packages/superlu-dist/package.py index 7f7a0f4db0..f535252b8a 100644 --- a/var/spack/repos/builtin/packages/superlu-dist/package.py +++ b/var/spack/repos/builtin/packages/superlu-dist/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/superlu-mt/package.py b/var/spack/repos/builtin/packages/superlu-mt/package.py index fd6091a0f0..a4adff7c30 100644 --- a/var/spack/repos/builtin/packages/superlu-mt/package.py +++ b/var/spack/repos/builtin/packages/superlu-mt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/superlu/package.py b/var/spack/repos/builtin/packages/superlu/package.py index 8e7303d6c8..7cdf4315fc 100644 --- a/var/spack/repos/builtin/packages/superlu/package.py +++ b/var/spack/repos/builtin/packages/superlu/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/swiftsim/package.py b/var/spack/repos/builtin/packages/swiftsim/package.py index 2ebdc1fdcb..19860d1ec0 100644 --- a/var/spack/repos/builtin/packages/swiftsim/package.py +++ b/var/spack/repos/builtin/packages/swiftsim/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/swig/package.py b/var/spack/repos/builtin/packages/swig/package.py index 4d3a872483..4f197a838e 100644 --- a/var/spack/repos/builtin/packages/swig/package.py +++ b/var/spack/repos/builtin/packages/swig/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/symengine/package.py b/var/spack/repos/builtin/packages/symengine/package.py index 0462528320..50dd335ac7 100644 --- a/var/spack/repos/builtin/packages/symengine/package.py +++ b/var/spack/repos/builtin/packages/symengine/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sympol/package.py b/var/spack/repos/builtin/packages/sympol/package.py index 7ce4995f03..6385bd09da 100644 --- a/var/spack/repos/builtin/packages/sympol/package.py +++ b/var/spack/repos/builtin/packages/sympol/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/sz/package.py b/var/spack/repos/builtin/packages/sz/package.py index 5ac870c8ba..36bcdf1cfc 100644 --- a/var/spack/repos/builtin/packages/sz/package.py +++ b/var/spack/repos/builtin/packages/sz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/szip/package.py b/var/spack/repos/builtin/packages/szip/package.py index 91934f7d03..176006e70f 100644 --- a/var/spack/repos/builtin/packages/szip/package.py +++ b/var/spack/repos/builtin/packages/szip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/talloc/package.py b/var/spack/repos/builtin/packages/talloc/package.py index 502057b3e9..bd3d066ada 100644 --- a/var/spack/repos/builtin/packages/talloc/package.py +++ b/var/spack/repos/builtin/packages/talloc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tar/package.py b/var/spack/repos/builtin/packages/tar/package.py index cabd422c0d..16e7920d54 100644 --- a/var/spack/repos/builtin/packages/tar/package.py +++ b/var/spack/repos/builtin/packages/tar/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/task/package.py b/var/spack/repos/builtin/packages/task/package.py index 785023fd03..ac34bedd93 100644 --- a/var/spack/repos/builtin/packages/task/package.py +++ b/var/spack/repos/builtin/packages/task/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/taskd/package.py b/var/spack/repos/builtin/packages/taskd/package.py index bfe77aaa5c..b14a507424 100644 --- a/var/spack/repos/builtin/packages/taskd/package.py +++ b/var/spack/repos/builtin/packages/taskd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tau/package.py b/var/spack/repos/builtin/packages/tau/package.py index 991841f137..f9e2dea56e 100644 --- a/var/spack/repos/builtin/packages/tau/package.py +++ b/var/spack/repos/builtin/packages/tau/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tbb/package.py b/var/spack/repos/builtin/packages/tbb/package.py index 518d7a86bd..a23ac23983 100644 --- a/var/spack/repos/builtin/packages/tbb/package.py +++ b/var/spack/repos/builtin/packages/tbb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index 8ddfc903b3..ea2b55573c 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tetgen/package.py b/var/spack/repos/builtin/packages/tetgen/package.py index 2ccc9504e2..c887c7c8f5 100644 --- a/var/spack/repos/builtin/packages/tetgen/package.py +++ b/var/spack/repos/builtin/packages/tetgen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tethex/package.py b/var/spack/repos/builtin/packages/tethex/package.py index 624942498e..d5d4ba891b 100644 --- a/var/spack/repos/builtin/packages/tethex/package.py +++ b/var/spack/repos/builtin/packages/tethex/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/texinfo/package.py b/var/spack/repos/builtin/packages/texinfo/package.py index e4fbc37235..e633cd6ac3 100644 --- a/var/spack/repos/builtin/packages/texinfo/package.py +++ b/var/spack/repos/builtin/packages/texinfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/texlive/package.py b/var/spack/repos/builtin/packages/texlive/package.py index 3cfab6304d..58859d5ebb 100644 --- a/var/spack/repos/builtin/packages/texlive/package.py +++ b/var/spack/repos/builtin/packages/texlive/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/the-platinum-searcher/package.py b/var/spack/repos/builtin/packages/the-platinum-searcher/package.py index eeddf194ea..b8d99fcf77 100644 --- a/var/spack/repos/builtin/packages/the-platinum-searcher/package.py +++ b/var/spack/repos/builtin/packages/the-platinum-searcher/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/the-silver-searcher/package.py b/var/spack/repos/builtin/packages/the-silver-searcher/package.py index 9721554663..236d1f88f4 100644 --- a/var/spack/repos/builtin/packages/the-silver-searcher/package.py +++ b/var/spack/repos/builtin/packages/the-silver-searcher/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/thrift/package.py b/var/spack/repos/builtin/packages/thrift/package.py index 755f7a80b9..306f8d9de5 100644 --- a/var/spack/repos/builtin/packages/thrift/package.py +++ b/var/spack/repos/builtin/packages/thrift/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tinyxml/package.py b/var/spack/repos/builtin/packages/tinyxml/package.py index 45970ca4f8..70dfb552f9 100644 --- a/var/spack/repos/builtin/packages/tinyxml/package.py +++ b/var/spack/repos/builtin/packages/tinyxml/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tinyxml2/package.py b/var/spack/repos/builtin/packages/tinyxml2/package.py index d36bb5fa9b..f39ca8b7af 100644 --- a/var/spack/repos/builtin/packages/tinyxml2/package.py +++ b/var/spack/repos/builtin/packages/tinyxml2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py index fdcb29a785..69ea8a6a00 100644 --- a/var/spack/repos/builtin/packages/tk/package.py +++ b/var/spack/repos/builtin/packages/tk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tmux/package.py b/var/spack/repos/builtin/packages/tmux/package.py index 76778d1f5e..63d6c943b8 100644 --- a/var/spack/repos/builtin/packages/tmux/package.py +++ b/var/spack/repos/builtin/packages/tmux/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tmuxinator/package.py b/var/spack/repos/builtin/packages/tmuxinator/package.py index 66da4006f2..2078187189 100644 --- a/var/spack/repos/builtin/packages/tmuxinator/package.py +++ b/var/spack/repos/builtin/packages/tmuxinator/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/transset/package.py b/var/spack/repos/builtin/packages/transset/package.py index 27f3a2f882..7f93754263 100644 --- a/var/spack/repos/builtin/packages/transset/package.py +++ b/var/spack/repos/builtin/packages/transset/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/trapproto/package.py b/var/spack/repos/builtin/packages/trapproto/package.py index 879ac569df..5433fc97f7 100644 --- a/var/spack/repos/builtin/packages/trapproto/package.py +++ b/var/spack/repos/builtin/packages/trapproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tree/package.py b/var/spack/repos/builtin/packages/tree/package.py index 795f8c997e..19979124ba 100644 --- a/var/spack/repos/builtin/packages/tree/package.py +++ b/var/spack/repos/builtin/packages/tree/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/triangle/package.py b/var/spack/repos/builtin/packages/triangle/package.py index f4ee9ca1c9..c7cfa3a60e 100644 --- a/var/spack/repos/builtin/packages/triangle/package.py +++ b/var/spack/repos/builtin/packages/triangle/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index f28eb36a50..5012683879 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/trimmomatic/package.py b/var/spack/repos/builtin/packages/trimmomatic/package.py index 1694dbad70..54c80d2ba0 100644 --- a/var/spack/repos/builtin/packages/trimmomatic/package.py +++ b/var/spack/repos/builtin/packages/trimmomatic/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/turbine/package.py b/var/spack/repos/builtin/packages/turbine/package.py index ed5c4d1000..6de98eef16 100644 --- a/var/spack/repos/builtin/packages/turbine/package.py +++ b/var/spack/repos/builtin/packages/turbine/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/turbomole/package.py b/var/spack/repos/builtin/packages/turbomole/package.py index cf14259da4..9eb9af6ff1 100644 --- a/var/spack/repos/builtin/packages/turbomole/package.py +++ b/var/spack/repos/builtin/packages/turbomole/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/tut/package.py b/var/spack/repos/builtin/packages/tut/package.py index 6c6c6bdb27..72ca2e1ff4 100644 --- a/var/spack/repos/builtin/packages/tut/package.py +++ b/var/spack/repos/builtin/packages/tut/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/twm/package.py b/var/spack/repos/builtin/packages/twm/package.py index a1a221b969..22ef578750 100644 --- a/var/spack/repos/builtin/packages/twm/package.py +++ b/var/spack/repos/builtin/packages/twm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/uberftp/package.py b/var/spack/repos/builtin/packages/uberftp/package.py index f9d0174b78..6cb17c417a 100644 --- a/var/spack/repos/builtin/packages/uberftp/package.py +++ b/var/spack/repos/builtin/packages/uberftp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/udunits2/package.py b/var/spack/repos/builtin/packages/udunits2/package.py index 6df1f1e8d2..ad16fb04fb 100644 --- a/var/spack/repos/builtin/packages/udunits2/package.py +++ b/var/spack/repos/builtin/packages/udunits2/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/uncrustify/package.py b/var/spack/repos/builtin/packages/uncrustify/package.py index 7e4b3bd24d..20c26ed29f 100644 --- a/var/spack/repos/builtin/packages/uncrustify/package.py +++ b/var/spack/repos/builtin/packages/uncrustify/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/unibilium/package.py b/var/spack/repos/builtin/packages/unibilium/package.py index 943e4737e1..2a5ce7f267 100644 --- a/var/spack/repos/builtin/packages/unibilium/package.py +++ b/var/spack/repos/builtin/packages/unibilium/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/unison/package.py b/var/spack/repos/builtin/packages/unison/package.py index aa890ea869..70420a38d4 100644 --- a/var/spack/repos/builtin/packages/unison/package.py +++ b/var/spack/repos/builtin/packages/unison/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/units/package.py b/var/spack/repos/builtin/packages/units/package.py index 2c62d48b94..e2a12bf57c 100644 --- a/var/spack/repos/builtin/packages/units/package.py +++ b/var/spack/repos/builtin/packages/units/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/unixodbc/package.py b/var/spack/repos/builtin/packages/unixodbc/package.py index 8ce11d27dd..df7c80b2bd 100644 --- a/var/spack/repos/builtin/packages/unixodbc/package.py +++ b/var/spack/repos/builtin/packages/unixodbc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/util-linux/package.py b/var/spack/repos/builtin/packages/util-linux/package.py index 7ca694c5da..018ce1993d 100644 --- a/var/spack/repos/builtin/packages/util-linux/package.py +++ b/var/spack/repos/builtin/packages/util-linux/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/util-macros/package.py b/var/spack/repos/builtin/packages/util-macros/package.py index 1d7515b4cf..10decd35f6 100644 --- a/var/spack/repos/builtin/packages/util-macros/package.py +++ b/var/spack/repos/builtin/packages/util-macros/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/uuid/package.py b/var/spack/repos/builtin/packages/uuid/package.py index 5bcf59d9bf..2d92e257e8 100644 --- a/var/spack/repos/builtin/packages/uuid/package.py +++ b/var/spack/repos/builtin/packages/uuid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/valgrind/package.py b/var/spack/repos/builtin/packages/valgrind/package.py index ccc5c74a59..05efd67a3c 100644 --- a/var/spack/repos/builtin/packages/valgrind/package.py +++ b/var/spack/repos/builtin/packages/valgrind/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vampirtrace/package.py b/var/spack/repos/builtin/packages/vampirtrace/package.py index b4e86a82cc..dc4841f2ba 100644 --- a/var/spack/repos/builtin/packages/vampirtrace/package.py +++ b/var/spack/repos/builtin/packages/vampirtrace/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vc/package.py b/var/spack/repos/builtin/packages/vc/package.py index ee64cc1696..e41a385947 100644 --- a/var/spack/repos/builtin/packages/vc/package.py +++ b/var/spack/repos/builtin/packages/vc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vcftools/package.py b/var/spack/repos/builtin/packages/vcftools/package.py index 3f2f01dbff..f84ea1ed7c 100644 --- a/var/spack/repos/builtin/packages/vcftools/package.py +++ b/var/spack/repos/builtin/packages/vcftools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vcsh/package.py b/var/spack/repos/builtin/packages/vcsh/package.py index 8b067582e6..e09833d5e1 100644 --- a/var/spack/repos/builtin/packages/vcsh/package.py +++ b/var/spack/repos/builtin/packages/vcsh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vdt/package.py b/var/spack/repos/builtin/packages/vdt/package.py index d90b1abdf0..df21465506 100644 --- a/var/spack/repos/builtin/packages/vdt/package.py +++ b/var/spack/repos/builtin/packages/vdt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vecgeom/package.py b/var/spack/repos/builtin/packages/vecgeom/package.py index 988542e4d4..d514f13c17 100644 --- a/var/spack/repos/builtin/packages/vecgeom/package.py +++ b/var/spack/repos/builtin/packages/vecgeom/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/veclibfort/package.py b/var/spack/repos/builtin/packages/veclibfort/package.py index c02299d97c..ed11439b9f 100644 --- a/var/spack/repos/builtin/packages/veclibfort/package.py +++ b/var/spack/repos/builtin/packages/veclibfort/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/videoproto/package.py b/var/spack/repos/builtin/packages/videoproto/package.py index d1495fe33d..c63d0e3291 100644 --- a/var/spack/repos/builtin/packages/videoproto/package.py +++ b/var/spack/repos/builtin/packages/videoproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/viewres/package.py b/var/spack/repos/builtin/packages/viewres/package.py index 9e6daafc8b..2ab28c832a 100644 --- a/var/spack/repos/builtin/packages/viewres/package.py +++ b/var/spack/repos/builtin/packages/viewres/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vim/package.py b/var/spack/repos/builtin/packages/vim/package.py index 5a854c144c..623f54b5d3 100644 --- a/var/spack/repos/builtin/packages/vim/package.py +++ b/var/spack/repos/builtin/packages/vim/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/virtualgl/package.py b/var/spack/repos/builtin/packages/virtualgl/package.py index 744c6da56f..d2ea587fb0 100644 --- a/var/spack/repos/builtin/packages/virtualgl/package.py +++ b/var/spack/repos/builtin/packages/virtualgl/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/visit/package.py b/var/spack/repos/builtin/packages/visit/package.py index 2a735404a7..17efe0eb80 100644 --- a/var/spack/repos/builtin/packages/visit/package.py +++ b/var/spack/repos/builtin/packages/visit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vizglow/package.py b/var/spack/repos/builtin/packages/vizglow/package.py index 42e3e23ace..d153edcc9a 100644 --- a/var/spack/repos/builtin/packages/vizglow/package.py +++ b/var/spack/repos/builtin/packages/vizglow/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/voropp/package.py b/var/spack/repos/builtin/packages/voropp/package.py index 0fc84ef252..d44347b87f 100644 --- a/var/spack/repos/builtin/packages/voropp/package.py +++ b/var/spack/repos/builtin/packages/voropp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/votca-csg/package.py b/var/spack/repos/builtin/packages/votca-csg/package.py index 4c3d992cfb..6756d0427b 100644 --- a/var/spack/repos/builtin/packages/votca-csg/package.py +++ b/var/spack/repos/builtin/packages/votca-csg/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/votca-ctp/package.py b/var/spack/repos/builtin/packages/votca-ctp/package.py index 41735b6071..81586b18e6 100644 --- a/var/spack/repos/builtin/packages/votca-ctp/package.py +++ b/var/spack/repos/builtin/packages/votca-ctp/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/votca-moo/package.py b/var/spack/repos/builtin/packages/votca-moo/package.py index 788fc1ad94..a596ba1c9c 100644 --- a/var/spack/repos/builtin/packages/votca-moo/package.py +++ b/var/spack/repos/builtin/packages/votca-moo/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/votca-tools/package.py b/var/spack/repos/builtin/packages/votca-tools/package.py index 736ab0fa4e..39055c45a3 100644 --- a/var/spack/repos/builtin/packages/votca-tools/package.py +++ b/var/spack/repos/builtin/packages/votca-tools/package.py @@ -6,7 +6,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/vtk/package.py b/var/spack/repos/builtin/packages/vtk/package.py index dafeae6dbb..fed631efe9 100644 --- a/var/spack/repos/builtin/packages/vtk/package.py +++ b/var/spack/repos/builtin/packages/vtk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/wannier90/package.py b/var/spack/repos/builtin/packages/wannier90/package.py index 25d238dd64..d7d2a929cb 100644 --- a/var/spack/repos/builtin/packages/wannier90/package.py +++ b/var/spack/repos/builtin/packages/wannier90/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/wget/package.py b/var/spack/repos/builtin/packages/wget/package.py index 276e51c388..f852f4e9f0 100644 --- a/var/spack/repos/builtin/packages/wget/package.py +++ b/var/spack/repos/builtin/packages/wget/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/windowswmproto/package.py b/var/spack/repos/builtin/packages/windowswmproto/package.py index 9341cbd22c..d5045f16ab 100644 --- a/var/spack/repos/builtin/packages/windowswmproto/package.py +++ b/var/spack/repos/builtin/packages/windowswmproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/wt/package.py b/var/spack/repos/builtin/packages/wt/package.py index 91e80394f5..7e422ff267 100644 --- a/var/spack/repos/builtin/packages/wt/package.py +++ b/var/spack/repos/builtin/packages/wt/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/wx/package.py b/var/spack/repos/builtin/packages/wx/package.py index 3111a8c4b4..c343908778 100644 --- a/var/spack/repos/builtin/packages/wx/package.py +++ b/var/spack/repos/builtin/packages/wx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/wxpropgrid/package.py b/var/spack/repos/builtin/packages/wxpropgrid/package.py index cc9ff445d6..989c3ef002 100644 --- a/var/spack/repos/builtin/packages/wxpropgrid/package.py +++ b/var/spack/repos/builtin/packages/wxpropgrid/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/x11perf/package.py b/var/spack/repos/builtin/packages/x11perf/package.py index 89936e77f5..944acab645 100644 --- a/var/spack/repos/builtin/packages/x11perf/package.py +++ b/var/spack/repos/builtin/packages/x11perf/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xapian-core/package.py b/var/spack/repos/builtin/packages/xapian-core/package.py index 9c2e4a55ee..82a8fac8ab 100644 --- a/var/spack/repos/builtin/packages/xapian-core/package.py +++ b/var/spack/repos/builtin/packages/xapian-core/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xauth/package.py b/var/spack/repos/builtin/packages/xauth/package.py index fa172b5dc0..85256a2245 100644 --- a/var/spack/repos/builtin/packages/xauth/package.py +++ b/var/spack/repos/builtin/packages/xauth/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xbacklight/package.py b/var/spack/repos/builtin/packages/xbacklight/package.py index da9ab8f3bd..1695ebdfe8 100644 --- a/var/spack/repos/builtin/packages/xbacklight/package.py +++ b/var/spack/repos/builtin/packages/xbacklight/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xbiff/package.py b/var/spack/repos/builtin/packages/xbiff/package.py index 29bd9086d8..5b1a05afb4 100644 --- a/var/spack/repos/builtin/packages/xbiff/package.py +++ b/var/spack/repos/builtin/packages/xbiff/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xbitmaps/package.py b/var/spack/repos/builtin/packages/xbitmaps/package.py index 6fcaf1240d..15cfbadc4b 100644 --- a/var/spack/repos/builtin/packages/xbitmaps/package.py +++ b/var/spack/repos/builtin/packages/xbitmaps/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcalc/package.py b/var/spack/repos/builtin/packages/xcalc/package.py index 7b4717db65..10c472f86c 100644 --- a/var/spack/repos/builtin/packages/xcalc/package.py +++ b/var/spack/repos/builtin/packages/xcalc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-demo/package.py b/var/spack/repos/builtin/packages/xcb-demo/package.py index 6c3ccfa8aa..95f7eecdc2 100644 --- a/var/spack/repos/builtin/packages/xcb-demo/package.py +++ b/var/spack/repos/builtin/packages/xcb-demo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-proto/package.py b/var/spack/repos/builtin/packages/xcb-proto/package.py index 11e99c1d28..314a07af3f 100644 --- a/var/spack/repos/builtin/packages/xcb-proto/package.py +++ b/var/spack/repos/builtin/packages/xcb-proto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util-cursor/package.py b/var/spack/repos/builtin/packages/xcb-util-cursor/package.py index 83ae52ae93..5d9cb5db95 100644 --- a/var/spack/repos/builtin/packages/xcb-util-cursor/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-cursor/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util-errors/package.py b/var/spack/repos/builtin/packages/xcb-util-errors/package.py index f7c950841d..f3b1c21ce2 100644 --- a/var/spack/repos/builtin/packages/xcb-util-errors/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-errors/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util-image/package.py b/var/spack/repos/builtin/packages/xcb-util-image/package.py index 58a5f82d18..76cb6074d7 100644 --- a/var/spack/repos/builtin/packages/xcb-util-image/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-image/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py b/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py index 026ac2a129..525e5e3427 100644 --- a/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py b/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py index aa4db33112..4b97eb1312 100644 --- a/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util-wm/package.py b/var/spack/repos/builtin/packages/xcb-util-wm/package.py index c5dfe65423..b55457b703 100644 --- a/var/spack/repos/builtin/packages/xcb-util-wm/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-wm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcb-util/package.py b/var/spack/repos/builtin/packages/xcb-util/package.py index 6dcfbb6447..0096e226b5 100644 --- a/var/spack/repos/builtin/packages/xcb-util/package.py +++ b/var/spack/repos/builtin/packages/xcb-util/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xclipboard/package.py b/var/spack/repos/builtin/packages/xclipboard/package.py index 309a09bd76..6e3173078a 100644 --- a/var/spack/repos/builtin/packages/xclipboard/package.py +++ b/var/spack/repos/builtin/packages/xclipboard/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xclock/package.py b/var/spack/repos/builtin/packages/xclock/package.py index 0ec33e78de..45d12d169c 100644 --- a/var/spack/repos/builtin/packages/xclock/package.py +++ b/var/spack/repos/builtin/packages/xclock/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcmiscproto/package.py b/var/spack/repos/builtin/packages/xcmiscproto/package.py index c31b19f04b..050a02fe42 100644 --- a/var/spack/repos/builtin/packages/xcmiscproto/package.py +++ b/var/spack/repos/builtin/packages/xcmiscproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcmsdb/package.py b/var/spack/repos/builtin/packages/xcmsdb/package.py index 74e1f6267f..cfa6cf9b12 100644 --- a/var/spack/repos/builtin/packages/xcmsdb/package.py +++ b/var/spack/repos/builtin/packages/xcmsdb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcompmgr/package.py b/var/spack/repos/builtin/packages/xcompmgr/package.py index 1c0771e38d..e0fb129692 100644 --- a/var/spack/repos/builtin/packages/xcompmgr/package.py +++ b/var/spack/repos/builtin/packages/xcompmgr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xconsole/package.py b/var/spack/repos/builtin/packages/xconsole/package.py index eabd5a48ed..3261df3e2a 100644 --- a/var/spack/repos/builtin/packages/xconsole/package.py +++ b/var/spack/repos/builtin/packages/xconsole/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcursor-themes/package.py b/var/spack/repos/builtin/packages/xcursor-themes/package.py index 7c38c9999c..046b217de5 100644 --- a/var/spack/repos/builtin/packages/xcursor-themes/package.py +++ b/var/spack/repos/builtin/packages/xcursor-themes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xcursorgen/package.py b/var/spack/repos/builtin/packages/xcursorgen/package.py index 8098723fc8..d9229aba77 100644 --- a/var/spack/repos/builtin/packages/xcursorgen/package.py +++ b/var/spack/repos/builtin/packages/xcursorgen/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xdbedizzy/package.py b/var/spack/repos/builtin/packages/xdbedizzy/package.py index 61ad98dc61..ee77adad2e 100644 --- a/var/spack/repos/builtin/packages/xdbedizzy/package.py +++ b/var/spack/repos/builtin/packages/xdbedizzy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xditview/package.py b/var/spack/repos/builtin/packages/xditview/package.py index 4f5384b81c..81566abdc9 100644 --- a/var/spack/repos/builtin/packages/xditview/package.py +++ b/var/spack/repos/builtin/packages/xditview/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xdm/package.py b/var/spack/repos/builtin/packages/xdm/package.py index 384077e556..07e31c000b 100644 --- a/var/spack/repos/builtin/packages/xdm/package.py +++ b/var/spack/repos/builtin/packages/xdm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xdpyinfo/package.py b/var/spack/repos/builtin/packages/xdpyinfo/package.py index f3838999eb..cd5b32a689 100644 --- a/var/spack/repos/builtin/packages/xdpyinfo/package.py +++ b/var/spack/repos/builtin/packages/xdpyinfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xdriinfo/package.py b/var/spack/repos/builtin/packages/xdriinfo/package.py index 9545f7707d..79f693dc4b 100644 --- a/var/spack/repos/builtin/packages/xdriinfo/package.py +++ b/var/spack/repos/builtin/packages/xdriinfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xedit/package.py b/var/spack/repos/builtin/packages/xedit/package.py index 73aca40a3b..acb44faf74 100644 --- a/var/spack/repos/builtin/packages/xedit/package.py +++ b/var/spack/repos/builtin/packages/xedit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xerces-c/package.py b/var/spack/repos/builtin/packages/xerces-c/package.py index bd28a9eec6..3b8e512c17 100644 --- a/var/spack/repos/builtin/packages/xerces-c/package.py +++ b/var/spack/repos/builtin/packages/xerces-c/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xev/package.py b/var/spack/repos/builtin/packages/xev/package.py index 79ff7b08a7..ddfd72e4c7 100644 --- a/var/spack/repos/builtin/packages/xev/package.py +++ b/var/spack/repos/builtin/packages/xev/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xextproto/package.py b/var/spack/repos/builtin/packages/xextproto/package.py index 012a023e72..a6de568f61 100644 --- a/var/spack/repos/builtin/packages/xextproto/package.py +++ b/var/spack/repos/builtin/packages/xextproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xeyes/package.py b/var/spack/repos/builtin/packages/xeyes/package.py index 599b08544b..28b3e1d624 100644 --- a/var/spack/repos/builtin/packages/xeyes/package.py +++ b/var/spack/repos/builtin/packages/xeyes/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86bigfontproto/package.py b/var/spack/repos/builtin/packages/xf86bigfontproto/package.py index 5a2e10a7ba..620d7f014c 100644 --- a/var/spack/repos/builtin/packages/xf86bigfontproto/package.py +++ b/var/spack/repos/builtin/packages/xf86bigfontproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86dga/package.py b/var/spack/repos/builtin/packages/xf86dga/package.py index 1bd2feaaa3..84c194e236 100644 --- a/var/spack/repos/builtin/packages/xf86dga/package.py +++ b/var/spack/repos/builtin/packages/xf86dga/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86dgaproto/package.py b/var/spack/repos/builtin/packages/xf86dgaproto/package.py index 3c92582a3a..e07da8cd2d 100644 --- a/var/spack/repos/builtin/packages/xf86dgaproto/package.py +++ b/var/spack/repos/builtin/packages/xf86dgaproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86driproto/package.py b/var/spack/repos/builtin/packages/xf86driproto/package.py index 8378eb9e5e..5c10143e43 100644 --- a/var/spack/repos/builtin/packages/xf86driproto/package.py +++ b/var/spack/repos/builtin/packages/xf86driproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86miscproto/package.py b/var/spack/repos/builtin/packages/xf86miscproto/package.py index 4368eed326..9e6231b344 100644 --- a/var/spack/repos/builtin/packages/xf86miscproto/package.py +++ b/var/spack/repos/builtin/packages/xf86miscproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86rushproto/package.py b/var/spack/repos/builtin/packages/xf86rushproto/package.py index 05b9afa40a..0e5d8d935a 100644 --- a/var/spack/repos/builtin/packages/xf86rushproto/package.py +++ b/var/spack/repos/builtin/packages/xf86rushproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py b/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py index aaf1db4472..20238e3c27 100644 --- a/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py +++ b/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xfd/package.py b/var/spack/repos/builtin/packages/xfd/package.py index b7d1282b27..b55b90752a 100644 --- a/var/spack/repos/builtin/packages/xfd/package.py +++ b/var/spack/repos/builtin/packages/xfd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xfindproxy/package.py b/var/spack/repos/builtin/packages/xfindproxy/package.py index af767be8a1..3cdcd5069a 100644 --- a/var/spack/repos/builtin/packages/xfindproxy/package.py +++ b/var/spack/repos/builtin/packages/xfindproxy/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xfontsel/package.py b/var/spack/repos/builtin/packages/xfontsel/package.py index ca14f1460c..c8fa0ef95b 100644 --- a/var/spack/repos/builtin/packages/xfontsel/package.py +++ b/var/spack/repos/builtin/packages/xfontsel/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xfs/package.py b/var/spack/repos/builtin/packages/xfs/package.py index e5a71e4a27..ecc94d4835 100644 --- a/var/spack/repos/builtin/packages/xfs/package.py +++ b/var/spack/repos/builtin/packages/xfs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xfsinfo/package.py b/var/spack/repos/builtin/packages/xfsinfo/package.py index 9913537995..8f6bdae9cc 100644 --- a/var/spack/repos/builtin/packages/xfsinfo/package.py +++ b/var/spack/repos/builtin/packages/xfsinfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xfwp/package.py b/var/spack/repos/builtin/packages/xfwp/package.py index c199b50f6c..38bbf8342b 100644 --- a/var/spack/repos/builtin/packages/xfwp/package.py +++ b/var/spack/repos/builtin/packages/xfwp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xgamma/package.py b/var/spack/repos/builtin/packages/xgamma/package.py index 845f2a54e3..9ec7118608 100644 --- a/var/spack/repos/builtin/packages/xgamma/package.py +++ b/var/spack/repos/builtin/packages/xgamma/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xgc/package.py b/var/spack/repos/builtin/packages/xgc/package.py index 23ba36809e..3592bc923f 100644 --- a/var/spack/repos/builtin/packages/xgc/package.py +++ b/var/spack/repos/builtin/packages/xgc/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xhost/package.py b/var/spack/repos/builtin/packages/xhost/package.py index 3928593611..21accc5284 100644 --- a/var/spack/repos/builtin/packages/xhost/package.py +++ b/var/spack/repos/builtin/packages/xhost/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xineramaproto/package.py b/var/spack/repos/builtin/packages/xineramaproto/package.py index 0a3374b1b6..003e365a90 100644 --- a/var/spack/repos/builtin/packages/xineramaproto/package.py +++ b/var/spack/repos/builtin/packages/xineramaproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xinit/package.py b/var/spack/repos/builtin/packages/xinit/package.py index 8bf7227cc8..376978683f 100644 --- a/var/spack/repos/builtin/packages/xinit/package.py +++ b/var/spack/repos/builtin/packages/xinit/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xinput/package.py b/var/spack/repos/builtin/packages/xinput/package.py index b512d86495..7c6f82afdf 100644 --- a/var/spack/repos/builtin/packages/xinput/package.py +++ b/var/spack/repos/builtin/packages/xinput/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkbcomp/package.py b/var/spack/repos/builtin/packages/xkbcomp/package.py index 315c49a22d..398742d7e5 100644 --- a/var/spack/repos/builtin/packages/xkbcomp/package.py +++ b/var/spack/repos/builtin/packages/xkbcomp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkbdata/package.py b/var/spack/repos/builtin/packages/xkbdata/package.py index c67e047d71..96cf29b500 100644 --- a/var/spack/repos/builtin/packages/xkbdata/package.py +++ b/var/spack/repos/builtin/packages/xkbdata/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkbevd/package.py b/var/spack/repos/builtin/packages/xkbevd/package.py index 8793a3a38b..66c8f3b811 100644 --- a/var/spack/repos/builtin/packages/xkbevd/package.py +++ b/var/spack/repos/builtin/packages/xkbevd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkbprint/package.py b/var/spack/repos/builtin/packages/xkbprint/package.py index 100d4e4436..2b93582d3e 100644 --- a/var/spack/repos/builtin/packages/xkbprint/package.py +++ b/var/spack/repos/builtin/packages/xkbprint/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkbutils/package.py b/var/spack/repos/builtin/packages/xkbutils/package.py index eef24a0145..45d966f26e 100644 --- a/var/spack/repos/builtin/packages/xkbutils/package.py +++ b/var/spack/repos/builtin/packages/xkbutils/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkeyboard-config/package.py b/var/spack/repos/builtin/packages/xkeyboard-config/package.py index d7ae34e1e6..e1f2753275 100644 --- a/var/spack/repos/builtin/packages/xkeyboard-config/package.py +++ b/var/spack/repos/builtin/packages/xkeyboard-config/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xkill/package.py b/var/spack/repos/builtin/packages/xkill/package.py index e73fa3b9a2..6afbf5a680 100644 --- a/var/spack/repos/builtin/packages/xkill/package.py +++ b/var/spack/repos/builtin/packages/xkill/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xload/package.py b/var/spack/repos/builtin/packages/xload/package.py index 412c0aa0c4..b71986db1a 100644 --- a/var/spack/repos/builtin/packages/xload/package.py +++ b/var/spack/repos/builtin/packages/xload/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xlogo/package.py b/var/spack/repos/builtin/packages/xlogo/package.py index 8e1250cc69..6522d4f514 100644 --- a/var/spack/repos/builtin/packages/xlogo/package.py +++ b/var/spack/repos/builtin/packages/xlogo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xlsatoms/package.py b/var/spack/repos/builtin/packages/xlsatoms/package.py index 5f0dc8adc7..a1a8257dc1 100644 --- a/var/spack/repos/builtin/packages/xlsatoms/package.py +++ b/var/spack/repos/builtin/packages/xlsatoms/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xlsclients/package.py b/var/spack/repos/builtin/packages/xlsclients/package.py index fb232a1d0f..124c876a0a 100644 --- a/var/spack/repos/builtin/packages/xlsclients/package.py +++ b/var/spack/repos/builtin/packages/xlsclients/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xlsfonts/package.py b/var/spack/repos/builtin/packages/xlsfonts/package.py index 61696a5010..7267692b98 100644 --- a/var/spack/repos/builtin/packages/xlsfonts/package.py +++ b/var/spack/repos/builtin/packages/xlsfonts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xmag/package.py b/var/spack/repos/builtin/packages/xmag/package.py index 65eb9e636b..c2d135eec0 100644 --- a/var/spack/repos/builtin/packages/xmag/package.py +++ b/var/spack/repos/builtin/packages/xmag/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xman/package.py b/var/spack/repos/builtin/packages/xman/package.py index 0a3bf893ee..c59ced19a6 100644 --- a/var/spack/repos/builtin/packages/xman/package.py +++ b/var/spack/repos/builtin/packages/xman/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xmessage/package.py b/var/spack/repos/builtin/packages/xmessage/package.py index 7481713c1b..55461933bc 100644 --- a/var/spack/repos/builtin/packages/xmessage/package.py +++ b/var/spack/repos/builtin/packages/xmessage/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xmh/package.py b/var/spack/repos/builtin/packages/xmh/package.py index 1c7bc8a346..35798f8846 100644 --- a/var/spack/repos/builtin/packages/xmh/package.py +++ b/var/spack/repos/builtin/packages/xmh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xmlto/package.py b/var/spack/repos/builtin/packages/xmlto/package.py index 35f41d72e9..de4a8985b0 100644 --- a/var/spack/repos/builtin/packages/xmlto/package.py +++ b/var/spack/repos/builtin/packages/xmlto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xmodmap/package.py b/var/spack/repos/builtin/packages/xmodmap/package.py index 323a16cbe8..727cebc563 100644 --- a/var/spack/repos/builtin/packages/xmodmap/package.py +++ b/var/spack/repos/builtin/packages/xmodmap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xmore/package.py b/var/spack/repos/builtin/packages/xmore/package.py index bb1f0ada27..e1da468d3e 100644 --- a/var/spack/repos/builtin/packages/xmore/package.py +++ b/var/spack/repos/builtin/packages/xmore/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xorg-cf-files/package.py b/var/spack/repos/builtin/packages/xorg-cf-files/package.py index a203911d0e..3fd9cb45b9 100644 --- a/var/spack/repos/builtin/packages/xorg-cf-files/package.py +++ b/var/spack/repos/builtin/packages/xorg-cf-files/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xorg-docs/package.py b/var/spack/repos/builtin/packages/xorg-docs/package.py index 7bee98859d..1f81642c8b 100644 --- a/var/spack/repos/builtin/packages/xorg-docs/package.py +++ b/var/spack/repos/builtin/packages/xorg-docs/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xorg-gtest/package.py b/var/spack/repos/builtin/packages/xorg-gtest/package.py index ede26149e1..2774027e3f 100644 --- a/var/spack/repos/builtin/packages/xorg-gtest/package.py +++ b/var/spack/repos/builtin/packages/xorg-gtest/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xorg-server/package.py b/var/spack/repos/builtin/packages/xorg-server/package.py index fcc4918a02..8c5f1473e9 100644 --- a/var/spack/repos/builtin/packages/xorg-server/package.py +++ b/var/spack/repos/builtin/packages/xorg-server/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py b/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py index c9a5d4fd80..4c8f4d0ec1 100644 --- a/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py +++ b/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xphelloworld/package.py b/var/spack/repos/builtin/packages/xphelloworld/package.py index ce593e746b..61a158cc41 100644 --- a/var/spack/repos/builtin/packages/xphelloworld/package.py +++ b/var/spack/repos/builtin/packages/xphelloworld/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xplsprinters/package.py b/var/spack/repos/builtin/packages/xplsprinters/package.py index b8fdb08472..02bddf0877 100644 --- a/var/spack/repos/builtin/packages/xplsprinters/package.py +++ b/var/spack/repos/builtin/packages/xplsprinters/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xpr/package.py b/var/spack/repos/builtin/packages/xpr/package.py index 6e933e0994..4960647670 100644 --- a/var/spack/repos/builtin/packages/xpr/package.py +++ b/var/spack/repos/builtin/packages/xpr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xprehashprinterlist/package.py b/var/spack/repos/builtin/packages/xprehashprinterlist/package.py index 3f7de96c12..3a0efd00c4 100644 --- a/var/spack/repos/builtin/packages/xprehashprinterlist/package.py +++ b/var/spack/repos/builtin/packages/xprehashprinterlist/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xprop/package.py b/var/spack/repos/builtin/packages/xprop/package.py index ece50c9205..0cd9b92040 100644 --- a/var/spack/repos/builtin/packages/xprop/package.py +++ b/var/spack/repos/builtin/packages/xprop/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xproto/package.py b/var/spack/repos/builtin/packages/xproto/package.py index 31e2baffac..de91cf0c95 100644 --- a/var/spack/repos/builtin/packages/xproto/package.py +++ b/var/spack/repos/builtin/packages/xproto/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py b/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py index cec6a13f5f..f4eb75ca28 100644 --- a/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py +++ b/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xqilla/package.py b/var/spack/repos/builtin/packages/xqilla/package.py index b9790e33f0..5cb346cc1d 100644 --- a/var/spack/repos/builtin/packages/xqilla/package.py +++ b/var/spack/repos/builtin/packages/xqilla/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xrandr/package.py b/var/spack/repos/builtin/packages/xrandr/package.py index 6fdc4da4fe..c33f0a227f 100644 --- a/var/spack/repos/builtin/packages/xrandr/package.py +++ b/var/spack/repos/builtin/packages/xrandr/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xrdb/package.py b/var/spack/repos/builtin/packages/xrdb/package.py index c0374e7056..3c6452476f 100644 --- a/var/spack/repos/builtin/packages/xrdb/package.py +++ b/var/spack/repos/builtin/packages/xrdb/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xrefresh/package.py b/var/spack/repos/builtin/packages/xrefresh/package.py index 3a2c47b086..ef929f325f 100644 --- a/var/spack/repos/builtin/packages/xrefresh/package.py +++ b/var/spack/repos/builtin/packages/xrefresh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xrootd/package.py b/var/spack/repos/builtin/packages/xrootd/package.py index 47e5afba26..d377c68968 100644 --- a/var/spack/repos/builtin/packages/xrootd/package.py +++ b/var/spack/repos/builtin/packages/xrootd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xrx/package.py b/var/spack/repos/builtin/packages/xrx/package.py index eae7b76768..af832f80a0 100644 --- a/var/spack/repos/builtin/packages/xrx/package.py +++ b/var/spack/repos/builtin/packages/xrx/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xscope/package.py b/var/spack/repos/builtin/packages/xscope/package.py index 04f00a5f5d..7b3b910415 100644 --- a/var/spack/repos/builtin/packages/xscope/package.py +++ b/var/spack/repos/builtin/packages/xscope/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xsdk/package.py b/var/spack/repos/builtin/packages/xsdk/package.py index 735aedbe45..583de80f3a 100644 --- a/var/spack/repos/builtin/packages/xsdk/package.py +++ b/var/spack/repos/builtin/packages/xsdk/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xsdktrilinos/package.py b/var/spack/repos/builtin/packages/xsdktrilinos/package.py index 7af6cd73a7..0d70baabcd 100644 --- a/var/spack/repos/builtin/packages/xsdktrilinos/package.py +++ b/var/spack/repos/builtin/packages/xsdktrilinos/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xset/package.py b/var/spack/repos/builtin/packages/xset/package.py index 5ca84431fd..e0d8b9fdee 100644 --- a/var/spack/repos/builtin/packages/xset/package.py +++ b/var/spack/repos/builtin/packages/xset/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xsetmode/package.py b/var/spack/repos/builtin/packages/xsetmode/package.py index 8d39de26a4..36e4c52021 100644 --- a/var/spack/repos/builtin/packages/xsetmode/package.py +++ b/var/spack/repos/builtin/packages/xsetmode/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xsetpointer/package.py b/var/spack/repos/builtin/packages/xsetpointer/package.py index 194ef186ae..d2e27810a5 100644 --- a/var/spack/repos/builtin/packages/xsetpointer/package.py +++ b/var/spack/repos/builtin/packages/xsetpointer/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xsetroot/package.py b/var/spack/repos/builtin/packages/xsetroot/package.py index 8be0625ff1..1a9bcd141e 100644 --- a/var/spack/repos/builtin/packages/xsetroot/package.py +++ b/var/spack/repos/builtin/packages/xsetroot/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xsm/package.py b/var/spack/repos/builtin/packages/xsm/package.py index 4d91dae142..eb22f4ff64 100644 --- a/var/spack/repos/builtin/packages/xsm/package.py +++ b/var/spack/repos/builtin/packages/xsm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xstdcmap/package.py b/var/spack/repos/builtin/packages/xstdcmap/package.py index 8c3a081ae7..b2b1592b84 100644 --- a/var/spack/repos/builtin/packages/xstdcmap/package.py +++ b/var/spack/repos/builtin/packages/xstdcmap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xterm/package.py b/var/spack/repos/builtin/packages/xterm/package.py index f4212021e9..70208d05c8 100644 --- a/var/spack/repos/builtin/packages/xterm/package.py +++ b/var/spack/repos/builtin/packages/xterm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xtrans/package.py b/var/spack/repos/builtin/packages/xtrans/package.py index 62f74b8cec..c2b032564a 100644 --- a/var/spack/repos/builtin/packages/xtrans/package.py +++ b/var/spack/repos/builtin/packages/xtrans/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xtrap/package.py b/var/spack/repos/builtin/packages/xtrap/package.py index 4a899b5111..499d56f48e 100644 --- a/var/spack/repos/builtin/packages/xtrap/package.py +++ b/var/spack/repos/builtin/packages/xtrap/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xts/package.py b/var/spack/repos/builtin/packages/xts/package.py index 9dd3e4a05c..727991b78d 100644 --- a/var/spack/repos/builtin/packages/xts/package.py +++ b/var/spack/repos/builtin/packages/xts/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xvidtune/package.py b/var/spack/repos/builtin/packages/xvidtune/package.py index 42dbc23aa0..fd3cdb7f8c 100644 --- a/var/spack/repos/builtin/packages/xvidtune/package.py +++ b/var/spack/repos/builtin/packages/xvidtune/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xvinfo/package.py b/var/spack/repos/builtin/packages/xvinfo/package.py index f7a275f452..04efb4549c 100644 --- a/var/spack/repos/builtin/packages/xvinfo/package.py +++ b/var/spack/repos/builtin/packages/xvinfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xwd/package.py b/var/spack/repos/builtin/packages/xwd/package.py index 9016e17915..a93e54fb93 100644 --- a/var/spack/repos/builtin/packages/xwd/package.py +++ b/var/spack/repos/builtin/packages/xwd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xwininfo/package.py b/var/spack/repos/builtin/packages/xwininfo/package.py index 61aa86bf46..4fe2e5b8c3 100644 --- a/var/spack/repos/builtin/packages/xwininfo/package.py +++ b/var/spack/repos/builtin/packages/xwininfo/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xwud/package.py b/var/spack/repos/builtin/packages/xwud/package.py index 9294156e16..2635f9d171 100644 --- a/var/spack/repos/builtin/packages/xwud/package.py +++ b/var/spack/repos/builtin/packages/xwud/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/xz/package.py b/var/spack/repos/builtin/packages/xz/package.py index 839f513058..9da2eac201 100644 --- a/var/spack/repos/builtin/packages/xz/package.py +++ b/var/spack/repos/builtin/packages/xz/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/yaml-cpp/package.py b/var/spack/repos/builtin/packages/yaml-cpp/package.py index 21400c2cfd..e537af6b41 100644 --- a/var/spack/repos/builtin/packages/yaml-cpp/package.py +++ b/var/spack/repos/builtin/packages/yaml-cpp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/yasm/package.py b/var/spack/repos/builtin/packages/yasm/package.py index e42ea6a5a7..07173cc0fb 100644 --- a/var/spack/repos/builtin/packages/yasm/package.py +++ b/var/spack/repos/builtin/packages/yasm/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/yorick/package.py b/var/spack/repos/builtin/packages/yorick/package.py index 9cbd417e4e..3052730985 100644 --- a/var/spack/repos/builtin/packages/yorick/package.py +++ b/var/spack/repos/builtin/packages/yorick/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/z3/package.py b/var/spack/repos/builtin/packages/z3/package.py index d2f8fb9d7a..d6cd94a53a 100644 --- a/var/spack/repos/builtin/packages/z3/package.py +++ b/var/spack/repos/builtin/packages/z3/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zeromq/package.py b/var/spack/repos/builtin/packages/zeromq/package.py index 938bb857fb..680d67c7b0 100644 --- a/var/spack/repos/builtin/packages/zeromq/package.py +++ b/var/spack/repos/builtin/packages/zeromq/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zfp/package.py b/var/spack/repos/builtin/packages/zfp/package.py index 93d71bd470..b51426347f 100644 --- a/var/spack/repos/builtin/packages/zfp/package.py +++ b/var/spack/repos/builtin/packages/zfp/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zip/package.py b/var/spack/repos/builtin/packages/zip/package.py index a84d4ed27c..3787df320a 100644 --- a/var/spack/repos/builtin/packages/zip/package.py +++ b/var/spack/repos/builtin/packages/zip/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zlib/package.py b/var/spack/repos/builtin/packages/zlib/package.py index 8971cc0b1b..0d9822f287 100644 --- a/var/spack/repos/builtin/packages/zlib/package.py +++ b/var/spack/repos/builtin/packages/zlib/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zoltan/package.py b/var/spack/repos/builtin/packages/zoltan/package.py index b6720b7b1e..008bea9c27 100644 --- a/var/spack/repos/builtin/packages/zoltan/package.py +++ b/var/spack/repos/builtin/packages/zoltan/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zsh/package.py b/var/spack/repos/builtin/packages/zsh/package.py index 5c73b224c7..24bb9ec896 100644 --- a/var/spack/repos/builtin/packages/zsh/package.py +++ b/var/spack/repos/builtin/packages/zsh/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as diff --git a/var/spack/repos/builtin/packages/zstd/package.py b/var/spack/repos/builtin/packages/zstd/package.py index e5e34591f7..7cd5d6785d 100644 --- a/var/spack/repos/builtin/packages/zstd/package.py +++ b/var/spack/repos/builtin/packages/zstd/package.py @@ -7,7 +7,7 @@ # LLNL-CODE-647188 # # For details, see https://github.com/llnl/spack -# Please also see the LICENSE file for our notice and the LGPL. +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as -- cgit v1.2.3-70-g09d2 From e5ce7b163954843cf7247e2902535ab837aea320 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sun, 25 Jun 2017 00:39:31 -0500 Subject: Allow arbitrary Prefix attributes (#4591) * Allow arbitrary Prefix attributes * Test attribute type as well * Flake8 fixes * Remove __new__ method * Fewer uses of join_path in the docs --- lib/spack/docs/packaging_guide.rst | 88 +++++++++++----------- lib/spack/spack/package.py | 2 +- lib/spack/spack/test/util/prefix.py | 66 ++++++++++++++++ lib/spack/spack/util/prefix.py | 81 ++++++-------------- var/spack/repos/builtin/packages/bwa/package.py | 4 +- var/spack/repos/builtin/packages/git/package.py | 6 +- .../repos/builtin/packages/libdwarf/package.py | 4 +- .../repos/builtin/packages/mercurial/package.py | 14 ++-- var/spack/repos/builtin/packages/pigz/package.py | 4 +- var/spack/repos/builtin/packages/scotch/package.py | 2 +- 10 files changed, 151 insertions(+), 120 deletions(-) create mode 100644 lib/spack/spack/test/util/prefix.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index bf6f3f3cf9..ecc3f58830 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2408,15 +2408,21 @@ is handy when a package supports additional variants like Blas and Lapack libraries ^^^^^^^^^^^^^^^^^^^^^^^^^ -Different packages provide implementation of ``Blas`` and ``Lapack`` +Multiple packages provide implementations of ``Blas`` and ``Lapack`` routines. The names of the resulting static and/or shared libraries differ from package to package. In order to make the ``install()`` method independent of the choice of ``Blas`` implementation, each package which provides it sets up ``self.spec.blas_libs`` to point to the correct ``Blas`` libraries. The same applies to packages which provide ``Lapack``. Package developers are advised to use these variables, for -example ``spec['blas'].blas_libs.joined()`` instead of hard-coding -``join_path(spec['blas'].prefix.lib, 'libopenblas.so')``. +example ``spec['blas'].blas_libs.joined()`` instead of hard-coding them: + +.. code-block:: python + + if 'openblas' in spec: + libs = join_path(spec['blas'].prefix.lib, 'libopenblas.so') + elif 'intel-mkl' in spec: + ... .. _prefix-objects: @@ -2430,7 +2436,7 @@ e.g.: .. code-block:: python - configure('--prefix=' + prefix) + configure('--prefix={0}'.format(prefix)) For the most part, prefix objects behave exactly like strings. For packages that do not have their own install target, or for those that @@ -2451,29 +2457,27 @@ yourself, e.g.: mkdirp(prefix.lib) install('libfoo.a', prefix.lib) -Most of the standard UNIX directory names are attributes on the -``prefix`` object. Here is a full list: - - ========================= ================================================ - Prefix Attribute Location - ========================= ================================================ - ``prefix.bin`` ``$prefix/bin`` - ``prefix.sbin`` ``$prefix/sbin`` - ``prefix.etc`` ``$prefix/etc`` - ``prefix.include`` ``$prefix/include`` - ``prefix.lib`` ``$prefix/lib`` - ``prefix.lib64`` ``$prefix/lib64`` - ``prefix.libexec`` ``$prefix/libexec`` - ``prefix.share`` ``$prefix/share`` - ``prefix.doc`` ``$prefix/doc`` - ``prefix.info`` ``$prefix/info`` - - ``prefix.man`` ``$prefix/man`` - ``prefix.man[1-8]`` ``$prefix/man/man[1-8]`` - - ``prefix.share_man`` ``$prefix/share/man`` - ``prefix.share_man[1-8]`` ``$prefix/share/man[1-8]`` - ========================= ================================================ + +Attributes of this object are created on the fly when you request them, +so any of the following will work: + +====================== ======================= +Prefix Attribute Location +====================== ======================= +``prefix.bin`` ``$prefix/bin`` +``prefix.lib64`` ``$prefix/lib64`` +``prefix.share.man`` ``$prefix/share/man`` +``prefix.foo.bar.baz`` ``$prefix/foo/bar/baz`` +====================== ======================= + +Of course, this only works if your file or directory is a valid Python +variable name. If your file or directory contains dashes or dots, use +``join_path`` instead: + +.. code-block:: python + + join_path(prefix.lib, 'libz.a') + .. _spec-objects: @@ -2572,23 +2576,25 @@ of its dependencies satisfy the provided spec. Accessing Dependencies ^^^^^^^^^^^^^^^^^^^^^^ -You may need to get at some file or binary that's in the prefix of one -of your dependencies. You can do that by sub-scripting the spec: +You may need to get at some file or binary that's in the installation +prefix of one of your dependencies. You can do that by sub-scripting +the spec: .. code-block:: python - my_mpi = spec['mpi'] + spec['mpi'] The value in the brackets needs to be some package name, and spec needs to depend on that package, or the operation will fail. For example, the above code will fail if the ``spec`` doesn't depend on -``mpi``. The value returned and assigned to ``my_mpi``, is itself -just another ``Spec`` object, so you can do all the same things you -would do with the package's own spec: +``mpi``. The value returned is itself just another ``Spec`` object, +so you can do all the same things you would do with the package's +own spec: .. code-block:: python - mpicc = join_path(my_mpi.prefix.bin, 'mpicc') + spec['mpi'].prefix.bin + spec['mpi'].version .. _multimethods: @@ -3086,7 +3092,7 @@ Filtering functions .. code-block:: python filter_file(r'#!/usr/bin/perl', - '#!/usr/bin/env perl', join_path(prefix.bin, 'bib2xhtml')) + '#!/usr/bin/env perl', prefix.bin.bib2xhtml) #. Switching the compilers used by ``mpich``'s MPI wrapper scripts from ``cc``, etc. to the compilers used by the Spack build: @@ -3094,10 +3100,10 @@ Filtering functions .. code-block:: python filter_file('CC="cc"', 'CC="%s"' % self.compiler.cc, - join_path(prefix.bin, 'mpicc')) + prefix.bin.mpicc) filter_file('CXX="c++"', 'CXX="%s"' % self.compiler.cxx, - join_path(prefix.bin, 'mpicxx')) + prefix.bin.mpicxx) :py:func:`change_sed_delimiter(old_delim, new_delim, *filenames) ` Some packages, like TAU, have a build system that can't install @@ -3134,12 +3140,10 @@ File functions .. code-block:: python - install('my-header.h', join_path(prefix.include)) + install('my-header.h', prefix.include) -:py:func:`join_path(prefix, *args) ` - Like ``os.path.join``, this joins paths using the OS path separator. - However, this version allows an arbitrary number of arguments, so - you can string together many path components. +:py:func:`join_path(*paths) ` + An alias for ``os.path.join``. This joins paths using the OS path separator. :py:func:`mkdirp(*paths) ` Create each of the directories in ``paths``, creating any parent diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index d6029d46b1..dc23f6351f 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1045,7 +1045,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): touch(join_path(self.prefix.lib, library_name + dso_suffix)) touch(join_path(self.prefix.lib, library_name + '.a')) - mkdirp(self.prefix.man1) + mkdirp(self.prefix.man.man1) packages_dir = spack.store.layout.build_packages_path(self.spec) dump_packages(self.spec, packages_dir) diff --git a/lib/spack/spack/test/util/prefix.py b/lib/spack/spack/test/util/prefix.py new file mode 100644 index 0000000000..8e8f7c84f9 --- /dev/null +++ b/lib/spack/spack/test/util/prefix.py @@ -0,0 +1,66 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## +"""Tests various features of :py:class:`spack.util.prefix.Prefix`""" + +from spack.util.prefix import Prefix + + +def test_prefix_attributes(): + """Test normal prefix attributes like ``prefix.bin``""" + prefix = Prefix('/usr') + + assert prefix.bin == '/usr/bin' + assert prefix.lib == '/usr/lib' + assert prefix.include == '/usr/include' + + +def test_multilevel_attributes(): + """Test attributes of attributes, like ``prefix.share.man``""" + prefix = Prefix('/usr/') + + assert prefix.share.man == '/usr/share/man' + assert prefix.man.man8 == '/usr/man/man8' + assert prefix.foo.bar.baz == '/usr/foo/bar/baz' + + share = prefix.share + + assert isinstance(share, Prefix) + assert share.man == '/usr/share/man' + + +def test_string_like_behavior(): + """Test string-like behavior of the prefix object""" + prefix = Prefix('/usr') + + assert prefix == '/usr' + assert isinstance(prefix, str) + + assert prefix + '/bin' == '/usr/bin' + assert '--prefix=%s' % prefix == '--prefix=/usr' + assert '--prefix={0}'.format(prefix) == '--prefix=/usr' + + assert prefix.find('u', 1) + assert prefix.upper() == '/USR' + assert prefix.lstrip('/') == 'usr' diff --git a/lib/spack/spack/util/prefix.py b/lib/spack/spack/util/prefix.py index 8ce9836c66..479956b1c5 100644 --- a/lib/spack/spack/util/prefix.py +++ b/lib/spack/spack/util/prefix.py @@ -23,74 +23,35 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """ -This file contains utilities to help with installing packages. +This file contains utilities for managing the installation prefix of a package. """ -from llnl.util.filesystem import join_path +import os class Prefix(str): """This class represents an installation prefix, but provides useful - attributes for referring to directories inside the prefix. + attributes for referring to directories inside the prefix. - For example, you can do something like this:: + Attributes of this object are created on the fly when you request them, + so any of the following is valid: - prefix = Prefix('/usr') - print(prefix.lib) - print(prefix.lib64) - print(prefix.bin) - print(prefix.share) - print(prefix.man4) + >>> prefix = Prefix('/usr') + >>> prefix.bin + /usr/bin + >>> prefix.lib64 + /usr/lib64 + >>> prefix.share.man + /usr/share/man + >>> prefix.foo.bar.baz + /usr/foo/bar/baz - This program would print: + Prefix objects behave identically to strings. In fact, they + subclass ``str``. So operators like ``+`` are legal:: - /usr/lib - /usr/lib64 - /usr/bin - /usr/share - /usr/share/man/man4 + print('foobar ' + prefix) - Prefix objects behave identically to strings. In fact, they - subclass str. So operators like + are legal: - - print("foobar " + prefix) - - This prints 'foobar /usr". All of this is meant to make custom - installs easy. + This prints ``foobar /usr``. All of this is meant to make custom + installs easy. """ - - def __new__(cls, path): - s = super(Prefix, cls).__new__(cls, path) - s.bin = join_path(s, 'bin') - s.bin64 = join_path(s, 'bin64') - s.sbin = join_path(s, 'sbin') - s.etc = join_path(s, 'etc') - s.include = join_path(s, 'include') - s.include64 = join_path(s, 'include64') - s.lib = join_path(s, 'lib') - s.lib64 = join_path(s, 'lib64') - s.libexec = join_path(s, 'libexec') - s.share = join_path(s, 'share') - s.doc = join_path(s.share, 'doc') - s.info = join_path(s.share, 'info') - - s.man = join_path(s, 'man') - s.man1 = join_path(s.man, 'man1') - s.man2 = join_path(s.man, 'man2') - s.man3 = join_path(s.man, 'man3') - s.man4 = join_path(s.man, 'man4') - s.man5 = join_path(s.man, 'man5') - s.man6 = join_path(s.man, 'man6') - s.man7 = join_path(s.man, 'man7') - s.man8 = join_path(s.man, 'man8') - - s.share_man = join_path(s.share, 'man') - s.share_man1 = join_path(s.share_man, 'man1') - s.share_man2 = join_path(s.share_man, 'man2') - s.share_man3 = join_path(s.share_man, 'man3') - s.share_man4 = join_path(s.share_man, 'man4') - s.share_man5 = join_path(s.share_man, 'man5') - s.share_man6 = join_path(s.share_man, 'man6') - s.share_man7 = join_path(s.share_man, 'man7') - s.share_man8 = join_path(s.share_man, 'man8') - - return s + def __getattr__(self, attr): + return Prefix(os.path.join(self, attr)) diff --git a/var/spack/repos/builtin/packages/bwa/package.py b/var/spack/repos/builtin/packages/bwa/package.py index 0b3ac66b3e..c4cd0d6665 100644 --- a/var/spack/repos/builtin/packages/bwa/package.py +++ b/var/spack/repos/builtin/packages/bwa/package.py @@ -51,5 +51,5 @@ class Bwa(Package): mkdirp(prefix.doc) install('README.md', prefix.doc) install('NEWS.md', prefix.doc) - mkdirp(prefix.man1) - install('bwa.1', prefix.man1) + mkdirp(prefix.man.man1) + install('bwa.1', prefix.man.man1) diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py index 847eff62f3..f01cc37d7b 100644 --- a/var/spack/repos/builtin/packages/git/package.py +++ b/var/spack/repos/builtin/packages/git/package.py @@ -186,6 +186,6 @@ class Git(AutotoolsPackage): prefix = self.prefix with working_dir('git-manpages'): - install_tree('man1', prefix.share_man1) - install_tree('man5', prefix.share_man5) - install_tree('man7', prefix.share_man7) + install_tree('man1', prefix.share.man.man1) + install_tree('man5', prefix.share.man.man5) + install_tree('man7', prefix.share.man.man7) diff --git a/var/spack/repos/builtin/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py index 32144e96ba..cb672dddc4 100644 --- a/var/spack/repos/builtin/packages/libdwarf/package.py +++ b/var/spack/repos/builtin/packages/libdwarf/package.py @@ -68,7 +68,7 @@ class Libdwarf(Package): make.add_default_arg('ARFLAGS=rcs') # Dwarf doesn't provide an install, so we have to do it. - mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man1) + mkdirp(prefix.bin, prefix.include, prefix.lib, prefix.man.man1) with working_dir('libdwarf'): extra_config_args = [] @@ -101,4 +101,4 @@ class Libdwarf(Package): install('dwarfdump', prefix.bin) install('dwarfdump.conf', prefix.lib) - install('dwarfdump.1', prefix.man1) + install('dwarfdump.1', prefix.man.man1) diff --git a/var/spack/repos/builtin/packages/mercurial/package.py b/var/spack/repos/builtin/packages/mercurial/package.py index 1cfb4f59c9..b6da9e6ea9 100644 --- a/var/spack/repos/builtin/packages/mercurial/package.py +++ b/var/spack/repos/builtin/packages/mercurial/package.py @@ -57,14 +57,14 @@ class Mercurial(PythonPackage): prefix = self.prefix # Install man pages - mkdirp(prefix.man1) - mkdirp(prefix.man5) - mkdirp(prefix.man8) + mkdirp(prefix.man.man1) + mkdirp(prefix.man.man5) + mkdirp(prefix.man.man8) with working_dir('doc'): - install('hg.1', prefix.man1) - install('hgignore.5', prefix.man5) - install('hgrc.5', prefix.man5) - install('hg-ssh.8', prefix.man8) + install('hg.1', prefix.man.man1) + install('hgignore.5', prefix.man.man5) + install('hgrc.5', prefix.man.man5) + install('hg-ssh.8', prefix.man.man8) # Install completion scripts contrib = join_path(prefix, 'contrib') diff --git a/var/spack/repos/builtin/packages/pigz/package.py b/var/spack/repos/builtin/packages/pigz/package.py index e9fe482c51..36afbaa9bf 100644 --- a/var/spack/repos/builtin/packages/pigz/package.py +++ b/var/spack/repos/builtin/packages/pigz/package.py @@ -41,6 +41,6 @@ class Pigz(MakefilePackage): def install(self, spec, prefix): mkdirp(prefix.bin) - mkdirp(prefix.man1) + mkdirp(prefix.man.man1) install('pigz', "%s/pigz" % prefix.bin) - install('pigz.1', "%s/pigz.1" % prefix.man1) + install('pigz.1', "%s/pigz.1" % prefix.man.man1) diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py index ab768767f9..b1aaad0eb6 100644 --- a/var/spack/repos/builtin/packages/scotch/package.py +++ b/var/spack/repos/builtin/packages/scotch/package.py @@ -249,4 +249,4 @@ class Scotch(Package): install_tree('bin', prefix.bin) install_tree('lib', prefix.lib) install_tree('include', prefix.include) - install_tree('man/man1', prefix.share_man1) + install_tree('man/man1', prefix.share.man.man1) -- cgit v1.2.3-70-g09d2 From ad1382e66491a1e9340e506c85a5f195c9c30a5b Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sun, 25 Jun 2017 22:42:38 -0500 Subject: Don't immediately raise an error when an editor is not found (#4587) * Don't immediately raise an error when an editor is not found * If no editor is found, raise an error only if we try to use it. --- lib/spack/spack/__init__.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 1f583fff61..e77a0c75cd 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -223,12 +223,13 @@ if editor is not None: else: editor = which('vim', 'vi', 'emacs', 'nano') +# If there is no editor, only raise an error if we actually try to use it. if not editor: - default = default_editors[0] - msg = 'Default text editor, {0}, not found.\n'.format(default) - msg += 'Please set the EDITOR environment variable to your preferred ' - msg += 'text editor, or install {0}.'.format(default) - raise EnvironmentError(msg) + def editor_not_found(*args, **kwargs): + raise EnvironmentError( + 'No text editor found! Please set the EDITOR environment variable ' + 'to your preferred text editor.') + editor = editor_not_found from spack.package import \ install_dependency_symlinks, flatten_dependencies, \ -- cgit v1.2.3-70-g09d2 From b1861b29efe929c81aacbf8848ddd7d309c00e18 Mon Sep 17 00:00:00 2001 From: becker33 Date: Tue, 27 Jun 2017 12:27:16 -0700 Subject: Added install option to read spec from file (#4611) --- lib/spack/spack/cmd/install.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index ec24ed9c62..9f35837220 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -77,6 +77,9 @@ the dependencies""" subparser.add_argument( '--fake', action='store_true', dest='fake', help="fake install. just remove prefix and create a fake file") + subparser.add_argument( + '-f', '--file', action='store_true', dest='file', + help="install from file. Read specs to install from .yaml files") cd_group = subparser.add_mutually_exclusive_group() arguments.add_common_arguments(cd_group, ['clean', 'dirty']) @@ -320,7 +323,13 @@ def install(parser, args, **kwargs): }) # Spec from cli - specs = spack.cmd.parse_specs(args.package, concretize=True) + specs = [] + if args.file: + for file in args.package: + with open(file, 'r') as f: + specs.append(spack.spec.Spec.from_yaml(f)) + else: + specs = spack.cmd.parse_specs(args.package, concretize=True) if len(specs) == 0: tty.error('The `spack install` command requires a spec to install.') -- cgit v1.2.3-70-g09d2 From 898c7f8838bc78b8d9679dfd9ff32eb575766e91 Mon Sep 17 00:00:00 2001 From: EmreAtes Date: Wed, 28 Jun 2017 19:24:29 +0200 Subject: add mpi to providers to remove virtual package error (#4608) --- lib/spack/docs/getting_started.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index eaa92db694..ef0f25cb04 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -1149,10 +1149,13 @@ Here's an example of an external configuration for cray modules: .. code-block:: yaml packages: - mpi: + mpich: modules: mpich@7.3.1%gcc@5.2.0 arch=cray_xc-haswell-CNL10: cray-mpich mpich@7.3.1%intel@16.0.0.109 arch=cray_xc-haswell-CNL10: cray-mpich + all: + providers: + mpi: [mpich] This tells Spack that for whatever package that depends on mpi, load the cray-mpich module into the environment. You can then be able to use whatever @@ -1169,7 +1172,7 @@ Here is an example of a full packages.yaml used at NERSC .. code-block:: yaml packages: - mpi: + mpich: modules: mpich@7.3.1%gcc@5.2.0 arch=cray_xc-CNL10-ivybridge: cray-mpich mpich@7.3.1%intel@16.0.0.109 arch=cray_xc-SuSE11-ivybridge: cray-mpich @@ -1186,6 +1189,8 @@ Here is an example of a full packages.yaml used at NERSC buildable: False all: compiler: [gcc@5.2.0, intel@16.0.0.109] + providers: + mpi: [mpich] Here we tell spack that whenever we want to build with gcc use version 5.2.0 or if we want to build with intel compilers, use version 16.0.0.109. We add a spec -- cgit v1.2.3-70-g09d2 From 9933d759ac2c2d68235b52c02416750dacb9d5e1 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 29 Jun 2017 21:38:47 -0500 Subject: Update hdfgroup packages to new URL structure (#4643) * Update hdfgroup packages to new URL structure * Update docs now that HDF5 URL isn't that complicated --- lib/spack/docs/packaging_guide.rst | 30 ++++++++-------- var/spack/repos/builtin/packages/hdf/package.py | 25 ++++++-------- var/spack/repos/builtin/packages/hdf5/package.py | 40 +++++----------------- .../repos/builtin/packages/openmpi/package.py | 4 +-- var/spack/repos/builtin/packages/szip/package.py | 19 ++++++---- 5 files changed, 49 insertions(+), 69 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index ecc3f58830..cdf4cc7e3b 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -443,26 +443,31 @@ Version URLs By default, each version's URL is extrapolated from the ``url`` field in the package. For example, Spack is smart enough to download version ``8.2.1.`` of the ``Foo`` package above from -``http://example.com/foo-8.2.1.tar.gz``. +http://example.com/foo-8.2.1.tar.gz. If the URL is particularly complicated or changes based on the release, you can override the default URL generation algorithm by defining your -own ``url_for_version()`` function. For example, the developers of HDF5 -keep changing the archive layout, so the ``url_for_version()`` function -looks like: +own ``url_for_version()`` function. For example, the download URL for +OpenMPI contains the major.minor version in one spot and the +major.minor.patch version in another: -.. literalinclude:: ../../../var/spack/repos/builtin/packages/hdf5/package.py - :pyobject: Hdf5.url_for_version +https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.1.tar.bz2 -With the use of this ``url_for_version()``, Spack knows to download HDF5 ``1.8.16`` -from ``http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.16/src/hdf5-1.8.16.tar.gz`` -but download HDF5 ``1.10.0`` from ``http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.0/src/hdf5-1.10.0.tar.gz``. +In order to handle this, you can define a ``url_for_version()`` function +like so: -You'll notice that HDF5's ``url_for_version()`` function makes use of a special +.. literalinclude:: ../../../var/spack/repos/builtin/packages/openmpi/package.py + :pyobject: Openmpi.url_for_version + +With the use of this ``url_for_version()``, Spack knows to download OpenMPI ``2.1.1`` +from http://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.1.tar.bz2 +but download OpenMPI ``1.10.7`` from http://www.open-mpi.org/software/ompi/v1.10/downloads/openmpi-1.10.7.tar.bz2. + +You'll notice that OpenMPI's ``url_for_version()`` function makes use of a special ``Version`` function called ``up_to()``. When you call ``version.up_to(2)`` on a version like ``1.10.0``, it returns ``1.10``. ``version.up_to(1)`` would return ``1``. This can be very useful for packages that place all ``X.Y.*`` versions in -a single directory and then places all ``X.Y.Z`` versions in a subdirectory. +a single directory and then places all ``X.Y.Z`` versions in a sub-directory. There are a few ``Version`` properties you should be aware of. We generally prefer numeric versions to be separated by dots for uniformity, but not all @@ -493,9 +498,6 @@ of its versions, you can add an explicit URL for a particular version: version('8.2.1', '4136d7b4c04df68b686570afa26988ac', url='http://example.com/foo-8.2.1-special-version.tar.gz') -This is common for Python packages that download from PyPi. Since newer -download URLs often contain a unique hash for each version, there is no -way to guess the URL systematically. When you supply a custom URL for a version, Spack uses that URL *verbatim* and does not perform extrapolation. diff --git a/var/spack/repos/builtin/packages/hdf/package.py b/var/spack/repos/builtin/packages/hdf/package.py index 3944f91124..6c0974994b 100644 --- a/var/spack/repos/builtin/packages/hdf/package.py +++ b/var/spack/repos/builtin/packages/hdf/package.py @@ -25,15 +25,16 @@ from spack import * -class Hdf(Package): +class Hdf(AutotoolsPackage): """HDF4 (also known as HDF) is a library and multi-object file format for storing and managing data between machines.""" - homepage = "https://www.hdfgroup.org/products/hdf4/" - url = "https://www.hdfgroup.org/ftp/HDF/releases/HDF4.2.11/src/hdf-4.2.11.tar.gz" - list_url = "https://www.hdfgroup.org/ftp/HDF/releases/" - list_depth = 3 + homepage = "https://support.hdfgroup.org/products/hdf4/" + url = "https://support.hdfgroup.org/ftp/HDF/releases/HDF4.2.13/src/hdf-4.2.13.tar.gz" + list_url = "https://support.hdfgroup.org/ftp/HDF/releases" + list_depth = 2 + version('4.2.13', 'a6aa950b3fce5162b96496d8ea0b82bf') version('4.2.12', '79fd1454c899c05e34a3da0456ab0c1c') version('4.2.11', '063f9928f3a19cc21367b71c3b8bbf19') @@ -46,10 +47,11 @@ class Hdf(Package): depends_on('bison', type='build') depends_on('flex', type='build') - def install(self, spec, prefix): + def configure_args(self): + spec = self.spec + config_args = [ 'CFLAGS=-fPIC', - '--prefix={0}'.format(prefix), '--with-jpeg={0}'.format(spec['jpeg'].prefix), '--with-zlib={0}'.format(spec['zlib'].prefix), '--disable-netcdf', # must be disabled to build NetCDF with HDF4 @@ -65,11 +67,4 @@ class Hdf(Package): else: config_args.append('--without-szlib') - configure(*config_args) - - make() - - if self.run_tests: - make('check') - - make('install') + return config_args diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 782b7c32cf..cf8f00d797 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -32,19 +32,16 @@ class Hdf5(AutotoolsPackage): flexible and efficient I/O and for high volume and complex data. """ - homepage = "http://www.hdfgroup.org/HDF5/" - url = "http://www.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8.13/src/hdf5-1.8.13.tar.gz" - list_url = "http://www.hdfgroup.org/ftp/HDF5/releases" + homepage = "https://support.hdfgroup.org/HDF5/" + url = "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.1/src/hdf5-1.10.1.tar.gz" + list_url = "https://support.hdfgroup.org/ftp/HDF5/releases" list_depth = 3 version('1.10.1', '43a2f9466702fb1db31df98ae6677f15') version('1.10.0-patch1', '9180ff0ef8dc2ef3f61bd37a7404f295') version('1.10.0', 'bdc935337ee8282579cd6bc4270ad199') - version('1.8.18', 'dd2148b740713ca0295442ec683d7b1c', - # The link for the latest version differs from the links for - # the previous releases. Do not forget to remove this once - # the version 1.8.18 is not the latest one for the 1.8.* branch. - url='http://hdfgroup.org/ftp/HDF5/current18/src/hdf5-1.8.18.tar.gz') + version('1.8.19', '7f568e2464d4ab0a74d16b23956d900b') + version('1.8.18', 'dd2148b740713ca0295442ec683d7b1c') version('1.8.17', '7d572f8f3b798a628b8245af0391a0ca') version('1.8.16', 'b8ed9a36ae142317f88b0c7ef4b9c618') version('1.8.15', '03cccb5b33dbe975fdcd8ae9dc021f24') @@ -77,6 +74,10 @@ class Hdf5(AutotoolsPackage): conflicts('+threadsafe', when='+cxx') conflicts('+threadsafe', when='+fortran') + def url_for_version(self, version): + url = "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-{0}/hdf5-{1}/src/hdf5-{1}.tar.gz" + return url.format(version.up_to(2), version) + @property def libs(self): """HDF5 can be queried for the following parameters: @@ -279,26 +280,3 @@ HDF5 version {version} {version} print('-' * 80) raise RuntimeError("HDF5 install check failed") shutil.rmtree(checkdir) - - def url_for_version(self, version): - # If we have a specific URL for this version, return it. - version_urls = self.version_urls() - if version in version_urls: - return version_urls[version] - - base_url = "http://www.hdfgroup.org/ftp/HDF5/releases" - - if version == Version("1.2.2"): - return "{0}/hdf5-{1}.tar.gz".format(base_url, version) - elif version < Version("1.6.6"): - return "{0}/hdf5-{1}/hdf5-{2}.tar.gz".format( - base_url, version.up_to(2), version) - elif version < Version("1.7"): - return "{0}/hdf5-{1}/hdf5-{2}/src/hdf5-{2}.tar.gz".format( - base_url, version.up_to(2), version) - elif version < Version("1.10"): - return "{0}/hdf5-{1}/src/hdf5-{1}.tar.gz".format( - base_url, version) - else: - return "{0}/hdf5-{1}/hdf5-{2}/src/hdf5-{2}.tar.gz".format( - base_url, version.up_to(2), version) diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index e685cfce88..85c99889da 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -198,8 +198,8 @@ class Openmpi(AutotoolsPackage): conflicts('fabrics=mxm', when='@:1.5.3') # MXM support was added in 1.5.4 def url_for_version(self, version): - return "http://www.open-mpi.org/software/ompi/v%s/downloads/openmpi-%s.tar.bz2" % ( - version.up_to(2), version) + url = "http://www.open-mpi.org/software/ompi/v{0}/downloads/openmpi-{1}.tar.bz2" + return url.format(version.up_to(2), version) @property def libs(self): diff --git a/var/spack/repos/builtin/packages/szip/package.py b/var/spack/repos/builtin/packages/szip/package.py index 176006e70f..28cc005f0c 100644 --- a/var/spack/repos/builtin/packages/szip/package.py +++ b/var/spack/repos/builtin/packages/szip/package.py @@ -33,13 +33,18 @@ class Szip(AutotoolsPackage): provided with HDF software products. """ - homepage = "https://www.hdfgroup.org/doc_resource/SZIP/" - url = "http://www.hdfgroup.org/ftp/lib-external/szip/2.1/src/szip-2.1.tar.gz" + homepage = "https://support.hdfgroup.org/doc_resource/SZIP/" + url = "https://support.hdfgroup.org/ftp/lib-external/szip/2.1.1/src/szip-2.1.1.tar.gz" + list_url = "https://support.hdfgroup.org/ftp/lib-external/szip" + list_depth = 2 - version('2.1', '902f831bcefb69c6b635374424acbead') + version('2.1.1', 'dd579cf0f26d44afd10a0ad7291fc282') + version('2.1', '902f831bcefb69c6b635374424acbead') def configure_args(self): - return ['--enable-production', - '--enable-shared', - '--enable-static', - '--enable-encoding'] + return [ + '--enable-production', + '--enable-shared', + '--enable-static', + '--enable-encoding', + ] -- cgit v1.2.3-70-g09d2 From 326e2f7f667f81c296de95a39bf72e1cadbe997a Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 2 Jul 2017 17:47:36 -0700 Subject: Ported lock test to pytest. --- lib/spack/spack/test/lock.py | 1149 +++++++++++++++++++++++------------------- 1 file changed, 630 insertions(+), 519 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/lock.py b/lib/spack/spack/test/lock.py index 5a4c3073f5..7cf4571016 100644 --- a/lib/spack/spack/test/lock.py +++ b/lib/spack/spack/test/lock.py @@ -27,561 +27,672 @@ These tests ensure that our lock works correctly. """ import os import shutil +import functools import tempfile -import unittest +import traceback from multiprocessing import Process -from llnl.util.filesystem import join_path, touch +import pytest + +from llnl.util.filesystem import join_path, touch, mkdirp from llnl.util.lock import * from spack.util.multiproc import Barrier + # This is the longest a failed test will take, as the barriers will # time out and raise an exception. barrier_timeout = 5 -class LockTest(unittest.TestCase): - - def setUp(self): - self.tempdir = tempfile.mkdtemp() - self.lock_path = join_path(self.tempdir, 'lockfile') - - def tearDown(self): - shutil.rmtree(self.tempdir, ignore_errors=True) - - def multiproc_test(self, *functions): - """Order some processes using simple barrier synchronization.""" - b = Barrier(len(functions), timeout=barrier_timeout) - procs = [Process(target=f, args=(b,)) for f in functions] - - for p in procs: - p.start() - - for p in procs: - p.join() - self.assertEqual(p.exitcode, 0) - - # - # Process snippets below can be composed into tests. - # - def acquire_write(self, start=0, length=0): - def fn(barrier): - lock = Lock(self.lock_path, start, length) - lock.acquire_write() # grab exclusive lock - barrier.wait() - barrier.wait() # hold the lock until timeout in other procs. - return fn - - def acquire_read(self, start=0, length=0): - def fn(barrier): - lock = Lock(self.lock_path, start, length) - lock.acquire_read() # grab shared lock - barrier.wait() - barrier.wait() # hold the lock until timeout in other procs. - return fn - - def timeout_write(self, start=0, length=0): - def fn(barrier): - lock = Lock(self.lock_path, start, length) - barrier.wait() # wait for lock acquire in first process - self.assertRaises(LockError, lock.acquire_write, 0.1) - barrier.wait() - return fn - - def timeout_read(self, start=0, length=0): - def fn(barrier): - lock = Lock(self.lock_path, start, length) - barrier.wait() # wait for lock acquire in first process - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() - return fn - - # - # Test that exclusive locks on other processes time out when an - # exclusive lock is held. - # - def test_write_lock_timeout_on_write(self): - self.multiproc_test(self.acquire_write(), self.timeout_write()) - - def test_write_lock_timeout_on_write_2(self): - self.multiproc_test( - self.acquire_write(), self.timeout_write(), self.timeout_write()) - - def test_write_lock_timeout_on_write_3(self): - self.multiproc_test( - self.acquire_write(), self.timeout_write(), self.timeout_write(), - self.timeout_write()) - - def test_write_lock_timeout_on_write_ranges(self): - self.multiproc_test( - self.acquire_write(0, 1), self.timeout_write(0, 1)) - - def test_write_lock_timeout_on_write_ranges_2(self): - self.multiproc_test( - self.acquire_write(0, 64), self.acquire_write(65, 1), - self.timeout_write(0, 1), self.timeout_write(63, 1)) - - def test_write_lock_timeout_on_write_ranges_3(self): - self.multiproc_test( - self.acquire_write(0, 1), self.acquire_write(1, 1), - self.timeout_write(), self.timeout_write(), self.timeout_write()) - - def test_write_lock_timeout_on_write_ranges_4(self): - self.multiproc_test( - self.acquire_write(0, 1), self.acquire_write(1, 1), - self.acquire_write(2, 456), self.acquire_write(500, 64), - self.timeout_write(), self.timeout_write(), self.timeout_write()) - - # - # Test that shared locks on other processes time out when an - # exclusive lock is held. - # - def test_read_lock_timeout_on_write(self): - self.multiproc_test(self.acquire_write(), self.timeout_read()) - - def test_read_lock_timeout_on_write_2(self): - self.multiproc_test( - self.acquire_write(), self.timeout_read(), self.timeout_read()) - - def test_read_lock_timeout_on_write_3(self): - self.multiproc_test( - self.acquire_write(), self.timeout_read(), self.timeout_read(), - self.timeout_read()) - - def test_read_lock_timeout_on_write_ranges(self): - """small write lock, read whole file.""" - self.multiproc_test(self.acquire_write(0, 1), self.timeout_read()) - - def test_read_lock_timeout_on_write_ranges_2(self): - """small write lock, small read lock""" - self.multiproc_test(self.acquire_write(0, 1), self.timeout_read(0, 1)) - - def test_read_lock_timeout_on_write_ranges_3(self): - """two write locks, overlapping read locks""" - self.multiproc_test( - self.acquire_write(0, 1), self.acquire_write(64, 128), - self.timeout_read(0, 1), self.timeout_read(128, 256)) - - # - # Test that exclusive locks time out when shared locks are held. - # - def test_write_lock_timeout_on_read(self): - self.multiproc_test(self.acquire_read(), self.timeout_write()) - - def test_write_lock_timeout_on_read_2(self): - self.multiproc_test( - self.acquire_read(), self.timeout_write(), self.timeout_write()) - - def test_write_lock_timeout_on_read_3(self): - self.multiproc_test( - self.acquire_read(), self.timeout_write(), self.timeout_write(), - self.timeout_write()) - - def test_write_lock_timeout_on_read_ranges(self): - self.multiproc_test(self.acquire_read(0, 1), self.timeout_write()) - - def test_write_lock_timeout_on_read_ranges_2(self): - self.multiproc_test(self.acquire_read(0, 1), self.timeout_write(0, 1)) - - def test_write_lock_timeout_on_read_ranges_3(self): - self.multiproc_test( - self.acquire_read(0, 1), self.acquire_read(10, 1), - self.timeout_write(0, 1), self.timeout_write(10, 1)) - - def test_write_lock_timeout_on_read_ranges_4(self): - self.multiproc_test( - self.acquire_read(0, 64), - self.timeout_write(10, 1), self.timeout_write(32, 1)) - - def test_write_lock_timeout_on_read_ranges_5(self): - self.multiproc_test( - self.acquire_read(64, 128), - self.timeout_write(65, 1), self.timeout_write(127, 1), - self.timeout_write(90, 10)) - - # - # Test that exclusive locks time while lots of shared locks are held. - # - def test_write_lock_timeout_with_multiple_readers_2_1(self): - self.multiproc_test( - self.acquire_read(), self.acquire_read(), self.timeout_write()) - - def test_write_lock_timeout_with_multiple_readers_2_2(self): - self.multiproc_test( - self.acquire_read(), self.acquire_read(), self.timeout_write(), - self.timeout_write()) - - def test_write_lock_timeout_with_multiple_readers_3_1(self): - self.multiproc_test( - self.acquire_read(), self.acquire_read(), self.acquire_read(), - self.timeout_write()) - - def test_write_lock_timeout_with_multiple_readers_3_2(self): - self.multiproc_test( - self.acquire_read(), self.acquire_read(), self.acquire_read(), - self.timeout_write(), self.timeout_write()) - - def test_write_lock_timeout_with_multiple_readers_2_1_ranges(self): - self.multiproc_test( - self.acquire_read(0, 10), self.acquire_read(5, 10), - self.timeout_write(5, 5)) - - def test_write_lock_timeout_with_multiple_readers_2_3_ranges(self): - self.multiproc_test( - self.acquire_read(0, 10), self.acquire_read(5, 15), - self.timeout_write(0, 1), self.timeout_write(11, 3), - self.timeout_write(7, 1)) - - def test_write_lock_timeout_with_multiple_readers_3_1_ranges(self): - self.multiproc_test( - self.acquire_read(0, 5), self.acquire_read(5, 5), - self.acquire_read(10, 5), - self.timeout_write(0, 15)) - - def test_write_lock_timeout_with_multiple_readers_3_2_ranges(self): - self.multiproc_test( - self.acquire_read(0, 5), self.acquire_read(5, 5), - self.acquire_read(10, 5), - self.timeout_write(3, 10), self.timeout_write(5, 1)) - - # - # Test that read can be upgraded to write. - # - def test_upgrade_read_to_write(self): - # ensure lock file exists the first time, so we open it read-only - # to begin wtih. - touch(self.lock_path) - - lock = Lock(self.lock_path) - self.assertTrue(lock._reads == 0) - self.assertTrue(lock._writes == 0) +@pytest.fixture() +def lock_path(): + tempdir = tempfile.mkdtemp() + lock_file = join_path(tempdir, 'lockfile') + yield lock_file + shutil.rmtree(tempdir) - lock.acquire_read() - self.assertTrue(lock._reads == 1) - self.assertTrue(lock._writes == 0) - self.assertTrue(lock._file.mode == 'r+') +def multiproc_test(*functions): + """Order some processes using simple barrier synchronization.""" + b = Barrier(len(functions), timeout=barrier_timeout) + procs = [Process(target=f, args=(b,)) for f in functions] + + for p in procs: + p.start() + + for p in procs: + p.join() + assert p.exitcode == 0 + + +# +# Process snippets below can be composed into tests. +# +def acquire_write(lock_path, start=0, length=0): + def fn(barrier): + lock = Lock(lock_path, start, length) + lock.acquire_write() # grab exclusive lock + barrier.wait() + barrier.wait() # hold the lock until timeout in other procs. + return fn + + +def acquire_read(lock_path, start=0, length=0): + def fn(barrier): + lock = Lock(lock_path, start, length) + lock.acquire_read() # grab shared lock + barrier.wait() + barrier.wait() # hold the lock until timeout in other procs. + return fn + + +def timeout_write(lock_path, start=0, length=0): + def fn(barrier): + lock = Lock(lock_path, start, length) + barrier.wait() # wait for lock acquire in first process + with pytest.raises(LockError): + lock.acquire_write(0.1) + barrier.wait() + return fn + + +def timeout_read(lock_path, start=0, length=0): + def fn(barrier): + lock = Lock(lock_path, start, length) + barrier.wait() # wait for lock acquire in first process + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() + return fn + + +# +# Test that exclusive locks on other processes time out when an +# exclusive lock is held. +# +def test_write_lock_timeout_on_write(lock_path): + multiproc_test(acquire_write(lock_path), timeout_write(lock_path)) + + +def test_write_lock_timeout_on_write_2(lock_path): + multiproc_test( + acquire_write(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_write_3(lock_path): + multiproc_test( + acquire_write(lock_path), + timeout_write(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_write_ranges(lock_path): + multiproc_test( + acquire_write(lock_path, 0, 1), + timeout_write(lock_path, 0, 1)) + + +def test_write_lock_timeout_on_write_ranges_2(lock_path): + multiproc_test( + acquire_write(lock_path, 0, 64), + acquire_write(lock_path, 65, 1), + timeout_write(lock_path, 0, 1), + timeout_write(lock_path, 63, 1)) + + +def test_write_lock_timeout_on_write_ranges_3(lock_path): + multiproc_test( + acquire_write(lock_path, 0, 1), + acquire_write(lock_path, 1, 1), + timeout_write(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_write_ranges_4(lock_path): + multiproc_test( + acquire_write(lock_path, 0, 1), + acquire_write(lock_path, 1, 1), + acquire_write(lock_path, 2, 456), + acquire_write(lock_path, 500, 64), + timeout_write(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +# +# Test that shared locks on other processes time out when an +# exclusive lock is held. +# +def test_read_lock_timeout_on_write(lock_path): + multiproc_test( + acquire_write(lock_path), + timeout_read(lock_path)) + + +def test_read_lock_timeout_on_write_2(lock_path): + multiproc_test( + acquire_write(lock_path), + timeout_read(lock_path), + timeout_read(lock_path)) + + +def test_read_lock_timeout_on_write_3(lock_path): + multiproc_test( + acquire_write(lock_path), + timeout_read(lock_path), + timeout_read(lock_path), + timeout_read(lock_path)) + + +def test_read_lock_timeout_on_write_ranges(lock_path): + """small write lock, read whole file.""" + multiproc_test( + acquire_write(lock_path, 0, 1), + timeout_read(lock_path)) + + +def test_read_lock_timeout_on_write_ranges_2(lock_path): + """small write lock, small read lock""" + multiproc_test( + acquire_write(lock_path, 0, 1), + timeout_read(lock_path, 0, 1)) + + +def test_read_lock_timeout_on_write_ranges_3(lock_path): + """two write locks, overlapping read locks""" + multiproc_test( + acquire_write(lock_path, 0, 1), + acquire_write(lock_path, 64, 128), + timeout_read(lock_path, 0, 1), + timeout_read(lock_path, 128, 256)) + + +# +# Test that exclusive locks time out when shared locks are held. +# +def test_write_lock_timeout_on_read(lock_path): + multiproc_test( + acquire_read(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_read_2(lock_path): + multiproc_test( + acquire_read(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_read_3(lock_path): + multiproc_test( + acquire_read(lock_path), + timeout_write(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_read_ranges(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 1), + timeout_write(lock_path)) + + +def test_write_lock_timeout_on_read_ranges_2(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 1), + timeout_write(lock_path, 0, 1)) + + +def test_write_lock_timeout_on_read_ranges_3(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 1), + acquire_read(lock_path, 10, 1), + timeout_write(lock_path, 0, 1), + timeout_write(lock_path, 10, 1)) + + +def test_write_lock_timeout_on_read_ranges_4(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 64), + timeout_write(lock_path, 10, 1), timeout_write(lock_path, 32, 1)) + + +def test_write_lock_timeout_on_read_ranges_5(lock_path): + multiproc_test( + acquire_read(lock_path, 64, 128), + timeout_write(lock_path, 65, 1), + timeout_write(lock_path, 127, 1), + timeout_write(lock_path, 90, 10)) + +# +# Test that exclusive locks time while lots of shared locks are held. +# +def test_write_lock_timeout_with_multiple_readers_2_1(lock_path): + multiproc_test( + acquire_read(lock_path), + acquire_read(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_with_multiple_readers_2_2(lock_path): + multiproc_test( + acquire_read(lock_path), + acquire_read(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_with_multiple_readers_3_1(lock_path): + multiproc_test( + acquire_read(lock_path), + acquire_read(lock_path), + acquire_read(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_with_multiple_readers_3_2(lock_path): + multiproc_test( + acquire_read(lock_path), + acquire_read(lock_path), + acquire_read(lock_path), + timeout_write(lock_path), + timeout_write(lock_path)) + + +def test_write_lock_timeout_with_multiple_readers_2_1_ranges(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 10), + acquire_read(lock_path, 0.5, 10), + timeout_write(lock_path, 5, 5)) + + +def test_write_lock_timeout_with_multiple_readers_2_3_ranges(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 10), + acquire_read(lock_path, 5, 15), + timeout_write(lock_path, 0, 1), + timeout_write(lock_path, 11, 3), + timeout_write(lock_path, 7, 1)) + + +def test_write_lock_timeout_with_multiple_readers_3_1_ranges(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 5), + acquire_read(lock_path, 5, 5), + acquire_read(lock_path, 10, 5), + timeout_write(lock_path, 0, 15)) + + +def test_write_lock_timeout_with_multiple_readers_3_2_ranges(lock_path): + multiproc_test( + acquire_read(lock_path, 0, 5), + acquire_read(lock_path, 5, 5), + acquire_read(lock_path, 10, 5), + timeout_write(lock_path, 3, 10), + timeout_write(lock_path, 5, 1)) + + +# +# Test that read can be upgraded to write. +# +def test_upgrade_read_to_write(lock_path): + # ensure lock file exists the first time, so we open it read-only + # to begin wtih. + touch(lock_path) + + lock = Lock(lock_path) + assert lock._reads == 0 + assert lock._writes == 0 + + lock.acquire_read() + assert lock._reads == 1 + assert lock._writes == 0 + assert lock._file.mode == 'r+' + + lock.acquire_write() + assert lock._reads == 1 + assert lock._writes == 1 + assert lock._file.mode == 'r+' + + lock.release_write() + assert lock._reads == 1 + assert lock._writes == 0 + assert lock._file.mode == 'r+' + + lock.release_read() + assert lock._reads == 0 + assert lock._writes == 0 + assert lock._file is None + +# +# Test that read-only file can be read-locked but not write-locked. +# +def test_upgrade_read_to_write_fails_with_readonly_file(lock_path): + # ensure lock file exists the first time, so we open it read-only + # to begin wtih. + touch(lock_path) + os.chmod(lock_path, 0o444) + + lock = Lock(lock_path) + assert lock._reads == 0 + assert lock._writes == 0 + + lock.acquire_read() + assert lock._reads == 1 + assert lock._writes == 0 + assert lock._file.mode == 'r' + + with pytest.raises(LockError): lock.acquire_write() - self.assertTrue(lock._reads == 1) - self.assertTrue(lock._writes == 1) - self.assertTrue(lock._file.mode == 'r+') - lock.release_write() - self.assertTrue(lock._reads == 1) - self.assertTrue(lock._writes == 0) - self.assertTrue(lock._file.mode == 'r+') +# +# Longer test case that ensures locks are reusable. Ordering is +# enforced by barriers throughout -- steps are shown with numbers. +# +def test_complex_acquire_and_release_chain(lock_path): + def p1(barrier): + lock = Lock(lock_path) + + lock.acquire_write() + barrier.wait() # ---------------------------------------- 1 + # others test timeout + barrier.wait() # ---------------------------------------- 2 + lock.release_write() # release and others acquire read + barrier.wait() # ---------------------------------------- 3 + with pytest.raises(LockError): + lock.acquire_write(0.1) + lock.acquire_read() + barrier.wait() # ---------------------------------------- 4 + lock.release_read() + barrier.wait() # ---------------------------------------- 5 + + # p2 upgrades read to write + barrier.wait() # ---------------------------------------- 6 + with pytest.raises(LockError): + lock.acquire_write(0.1) + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() # ---------------------------------------- 7 + # p2 releases write and read + barrier.wait() # ---------------------------------------- 8 + + # p3 acquires read + barrier.wait() # ---------------------------------------- 9 + # p3 upgrades read to write + barrier.wait() # ---------------------------------------- 10 + with pytest.raises(LockError): + lock.acquire_write(0.1) + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() # ---------------------------------------- 11 + # p3 releases locks + barrier.wait() # ---------------------------------------- 12 + lock.acquire_read() + barrier.wait() # ---------------------------------------- 13 + lock.release_read() + + def p2(barrier): + lock = Lock(lock_path) + # p1 acquires write + barrier.wait() # ---------------------------------------- 1 + with pytest.raises(LockError): + lock.acquire_write(0.1) + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() # ---------------------------------------- 2 + lock.acquire_read() + barrier.wait() # ---------------------------------------- 3 + # p1 tests shared read + barrier.wait() # ---------------------------------------- 4 + # others release reads + barrier.wait() # ---------------------------------------- 5 + + lock.acquire_write() # upgrade read to write + barrier.wait() # ---------------------------------------- 6 + # others test timeout + barrier.wait() # ---------------------------------------- 7 + lock.release_write() # release read AND write (need both) + lock.release_read() + barrier.wait() # ---------------------------------------- 8 + + # p3 acquires read + barrier.wait() # ---------------------------------------- 9 + # p3 upgrades read to write + barrier.wait() # ---------------------------------------- 10 + with pytest.raises(LockError): + lock.acquire_write(0.1) + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() # ---------------------------------------- 11 + # p3 releases locks + barrier.wait() # ---------------------------------------- 12 + lock.acquire_read() + barrier.wait() # ---------------------------------------- 13 lock.release_read() - self.assertTrue(lock._reads == 0) - self.assertTrue(lock._writes == 0) - self.assertTrue(lock._file is None) - - # - # Test that read-only file can be read-locked but not write-locked. - # - def test_upgrade_read_to_write_fails_with_readonly_file(self): - # ensure lock file exists the first time, so we open it read-only - # to begin wtih. - touch(self.lock_path) - os.chmod(self.lock_path, 0o444) - - lock = Lock(self.lock_path) - self.assertTrue(lock._reads == 0) - self.assertTrue(lock._writes == 0) + def p3(barrier): + lock = Lock(lock_path) + + # p1 acquires write + barrier.wait() # ---------------------------------------- 1 + with pytest.raises(LockError): + lock.acquire_write(0.1) + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() # ---------------------------------------- 2 lock.acquire_read() - self.assertTrue(lock._reads == 1) - self.assertTrue(lock._writes == 0) - self.assertTrue(lock._file.mode == 'r') - - self.assertRaises(LockError, lock.acquire_write) - - # - # Longer test case that ensures locks are reusable. Ordering is - # enforced by barriers throughout -- steps are shown with numbers. - # - def test_complex_acquire_and_release_chain(self): - def p1(barrier): - lock = Lock(self.lock_path) - - lock.acquire_write() - barrier.wait() # ---------------------------------------- 1 - # others test timeout - barrier.wait() # ---------------------------------------- 2 - lock.release_write() # release and others acquire read - barrier.wait() # ---------------------------------------- 3 - self.assertRaises(LockError, lock.acquire_write, 0.1) - lock.acquire_read() - barrier.wait() # ---------------------------------------- 4 - lock.release_read() - barrier.wait() # ---------------------------------------- 5 - - # p2 upgrades read to write - barrier.wait() # ---------------------------------------- 6 - self.assertRaises(LockError, lock.acquire_write, 0.1) - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() # ---------------------------------------- 7 - # p2 releases write and read - barrier.wait() # ---------------------------------------- 8 - - # p3 acquires read - barrier.wait() # ---------------------------------------- 9 - # p3 upgrades read to write - barrier.wait() # ---------------------------------------- 10 - self.assertRaises(LockError, lock.acquire_write, 0.1) - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() # ---------------------------------------- 11 - # p3 releases locks - barrier.wait() # ---------------------------------------- 12 - lock.acquire_read() - barrier.wait() # ---------------------------------------- 13 - lock.release_read() - - def p2(barrier): - lock = Lock(self.lock_path) - - # p1 acquires write - barrier.wait() # ---------------------------------------- 1 - self.assertRaises(LockError, lock.acquire_write, 0.1) - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() # ---------------------------------------- 2 - lock.acquire_read() - barrier.wait() # ---------------------------------------- 3 - # p1 tests shared read - barrier.wait() # ---------------------------------------- 4 - # others release reads - barrier.wait() # ---------------------------------------- 5 - - lock.acquire_write() # upgrade read to write - barrier.wait() # ---------------------------------------- 6 - # others test timeout - barrier.wait() # ---------------------------------------- 7 - lock.release_write() # release read AND write (need both) - lock.release_read() - barrier.wait() # ---------------------------------------- 8 - - # p3 acquires read - barrier.wait() # ---------------------------------------- 9 - # p3 upgrades read to write - barrier.wait() # ---------------------------------------- 10 - self.assertRaises(LockError, lock.acquire_write, 0.1) - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() # ---------------------------------------- 11 - # p3 releases locks - barrier.wait() # ---------------------------------------- 12 - lock.acquire_read() - barrier.wait() # ---------------------------------------- 13 - lock.release_read() - - def p3(barrier): - lock = Lock(self.lock_path) - - # p1 acquires write - barrier.wait() # ---------------------------------------- 1 - self.assertRaises(LockError, lock.acquire_write, 0.1) - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() # ---------------------------------------- 2 - lock.acquire_read() - barrier.wait() # ---------------------------------------- 3 - # p1 tests shared read - barrier.wait() # ---------------------------------------- 4 - lock.release_read() - barrier.wait() # ---------------------------------------- 5 - - # p2 upgrades read to write - barrier.wait() # ---------------------------------------- 6 - self.assertRaises(LockError, lock.acquire_write, 0.1) - self.assertRaises(LockError, lock.acquire_read, 0.1) - barrier.wait() # ---------------------------------------- 7 - # p2 releases write & read - barrier.wait() # ---------------------------------------- 8 - - lock.acquire_read() - barrier.wait() # ---------------------------------------- 9 - lock.acquire_write() - barrier.wait() # ---------------------------------------- 10 - # others test timeout - barrier.wait() # ---------------------------------------- 11 - lock.release_read() # release read AND write in opposite - lock.release_write() # order from before on p2 - barrier.wait() # ---------------------------------------- 12 - lock.acquire_read() - barrier.wait() # ---------------------------------------- 13 - lock.release_read() - - self.multiproc_test(p1, p2, p3) - - def test_transaction(self): - def enter_fn(): - vals['entered'] = True + barrier.wait() # ---------------------------------------- 3 + # p1 tests shared read + barrier.wait() # ---------------------------------------- 4 + lock.release_read() + barrier.wait() # ---------------------------------------- 5 + + # p2 upgrades read to write + barrier.wait() # ---------------------------------------- 6 + with pytest.raises(LockError): + lock.acquire_write(0.1) + with pytest.raises(LockError): + lock.acquire_read(0.1) + barrier.wait() # ---------------------------------------- 7 + # p2 releases write & read + barrier.wait() # ---------------------------------------- 8 - def exit_fn(t, v, tb): - vals['exited'] = True - vals['exception'] = (t or v or tb) + lock.acquire_read() + barrier.wait() # ---------------------------------------- 9 + lock.acquire_write() + barrier.wait() # ---------------------------------------- 10 + # others test timeout + barrier.wait() # ---------------------------------------- 11 + lock.release_read() # release read AND write in opposite + lock.release_write() # order from before on p2 + barrier.wait() # ---------------------------------------- 12 + lock.acquire_read() + barrier.wait() # ---------------------------------------- 13 + lock.release_read() - lock = Lock(self.lock_path) - vals = {'entered': False, 'exited': False, 'exception': False} - with ReadTransaction(lock, enter_fn, exit_fn): - pass + multiproc_test(p1, p2, p3) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertFalse(vals['exception']) +def test_transaction(lock_path): + def enter_fn(): + vals['entered'] = True - vals = {'entered': False, 'exited': False, 'exception': False} - with WriteTransaction(lock, enter_fn, exit_fn): - pass + def exit_fn(t, v, tb): + vals['exited'] = True + vals['exception'] = (t or v or tb) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertFalse(vals['exception']) + lock = Lock(lock_path) + vals = {'entered': False, 'exited': False, 'exception': False} + with ReadTransaction(lock, enter_fn, exit_fn): + pass - def test_transaction_with_exception(self): - def enter_fn(): - vals['entered'] = True + assert vals['entered'] + assert vals['exited'] + assert not vals['exception'] - def exit_fn(t, v, tb): - vals['exited'] = True - vals['exception'] = (t or v or tb) + vals = {'entered': False, 'exited': False, 'exception': False} + with WriteTransaction(lock, enter_fn, exit_fn): + pass - lock = Lock(self.lock_path) + assert vals['entered'] + assert vals['exited'] + assert not vals['exception'] - def do_read_with_exception(): - with ReadTransaction(lock, enter_fn, exit_fn): - raise Exception() +def test_transaction_with_exception(lock_path): + def enter_fn(): + vals['entered'] = True - def do_write_with_exception(): - with WriteTransaction(lock, enter_fn, exit_fn): - raise Exception() + def exit_fn(t, v, tb): + vals['exited'] = True + vals['exception'] = (t or v or tb) - vals = {'entered': False, 'exited': False, 'exception': False} - self.assertRaises(Exception, do_read_with_exception) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertTrue(vals['exception']) + lock = Lock(lock_path) - vals = {'entered': False, 'exited': False, 'exception': False} - self.assertRaises(Exception, do_write_with_exception) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertTrue(vals['exception']) + def do_read_with_exception(): + with ReadTransaction(lock, enter_fn, exit_fn): + raise Exception() + + def do_write_with_exception(): + with WriteTransaction(lock, enter_fn, exit_fn): + raise Exception() + + vals = {'entered': False, 'exited': False, 'exception': False} + with pytest.raises(Exception): + do_read_with_exception() + assert vals['entered'] + assert vals['exited'] + assert vals['exception'] + + vals = {'entered': False, 'exited': False, 'exception': False} + with pytest.raises(Exception): + do_write_with_exception() + assert vals['entered'] + assert vals['exited'] + assert vals['exception'] + +def test_transaction_with_context_manager(lock_path): + class TestContextManager(object): + + def __enter__(self): + vals['entered'] = True - def test_transaction_with_context_manager(self): - class TestContextManager(object): + def __exit__(self, t, v, tb): + vals['exited'] = True + vals['exception'] = (t or v or tb) - def __enter__(self): - vals['entered'] = True + def exit_fn(t, v, tb): + vals['exited_fn'] = True + vals['exception_fn'] = (t or v or tb) + + lock = Lock(lock_path) + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with ReadTransaction(lock, TestContextManager, exit_fn): + pass + + assert vals['entered'] + assert vals['exited'] + assert not vals['exception'] + assert vals['exited_fn'] + assert not vals['exception_fn'] + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with ReadTransaction(lock, TestContextManager): + pass + + assert vals['entered'] + assert vals['exited'] + assert not vals['exception'] + assert not vals['exited_fn'] + assert not vals['exception_fn'] + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with WriteTransaction(lock, TestContextManager, exit_fn): + pass + + assert vals['entered'] + assert vals['exited'] + assert not vals['exception'] + assert vals['exited_fn'] + assert not vals['exception_fn'] + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with WriteTransaction(lock, TestContextManager): + pass + + assert vals['entered'] + assert vals['exited'] + assert not vals['exception'] + assert not vals['exited_fn'] + assert not vals['exception_fn'] + +def test_transaction_with_context_manager_and_exception(lock_path): + class TestContextManager(object): + def __enter__(self): + vals['entered'] = True - def __exit__(self, t, v, tb): - vals['exited'] = True - vals['exception'] = (t or v or tb) + def __exit__(self, t, v, tb): + vals['exited'] = True + vals['exception'] = (t or v or tb) - def exit_fn(t, v, tb): - vals['exited_fn'] = True - vals['exception_fn'] = (t or v or tb) + def exit_fn(t, v, tb): + vals['exited_fn'] = True + vals['exception_fn'] = (t or v or tb) - lock = Lock(self.lock_path) + lock = Lock(lock_path) - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} + def do_read_with_exception(exit_fn): with ReadTransaction(lock, TestContextManager, exit_fn): - pass - - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertFalse(vals['exception']) - self.assertTrue(vals['exited_fn']) - self.assertFalse(vals['exception_fn']) - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} - with ReadTransaction(lock, TestContextManager): - pass - - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertFalse(vals['exception']) - self.assertFalse(vals['exited_fn']) - self.assertFalse(vals['exception_fn']) - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} + raise Exception() + + def do_write_with_exception(exit_fn): with WriteTransaction(lock, TestContextManager, exit_fn): - pass - - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertFalse(vals['exception']) - self.assertTrue(vals['exited_fn']) - self.assertFalse(vals['exception_fn']) - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} - with WriteTransaction(lock, TestContextManager): - pass - - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertFalse(vals['exception']) - self.assertFalse(vals['exited_fn']) - self.assertFalse(vals['exception_fn']) - - def test_transaction_with_context_manager_and_exception(self): - class TestContextManager(object): - - def __enter__(self): - vals['entered'] = True - - def __exit__(self, t, v, tb): - vals['exited'] = True - vals['exception'] = (t or v or tb) - - def exit_fn(t, v, tb): - vals['exited_fn'] = True - vals['exception_fn'] = (t or v or tb) - - lock = Lock(self.lock_path) - - def do_read_with_exception(exit_fn): - with ReadTransaction(lock, TestContextManager, exit_fn): - raise Exception() - - def do_write_with_exception(exit_fn): - with WriteTransaction(lock, TestContextManager, exit_fn): - raise Exception() - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} - self.assertRaises(Exception, do_read_with_exception, exit_fn) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertTrue(vals['exception']) - self.assertTrue(vals['exited_fn']) - self.assertTrue(vals['exception_fn']) - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} - self.assertRaises(Exception, do_read_with_exception, None) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertTrue(vals['exception']) - self.assertFalse(vals['exited_fn']) - self.assertFalse(vals['exception_fn']) - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} - self.assertRaises(Exception, do_write_with_exception, exit_fn) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertTrue(vals['exception']) - self.assertTrue(vals['exited_fn']) - self.assertTrue(vals['exception_fn']) - - vals = {'entered': False, 'exited': False, 'exited_fn': False, - 'exception': False, 'exception_fn': False} - self.assertRaises(Exception, do_write_with_exception, None) - self.assertTrue(vals['entered']) - self.assertTrue(vals['exited']) - self.assertTrue(vals['exception']) - self.assertFalse(vals['exited_fn']) - self.assertFalse(vals['exception_fn']) + raise Exception() + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with pytest.raises(Exception): + do_read_with_exception(exit_fn) + assert vals['entered'] + assert vals['exited'] + assert vals['exception'] + assert vals['exited_fn'] + assert vals['exception_fn'] + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with pytest.raises(Exception): + do_read_with_exception(None) + assert vals['entered'] + assert vals['exited'] + assert vals['exception'] + assert not vals['exited_fn'] + assert not vals['exception_fn'] + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with pytest.raises(Exception): + do_write_with_exception(exit_fn) + assert vals['entered'] + assert vals['exited'] + assert vals['exception'] + assert vals['exited_fn'] + assert vals['exception_fn'] + + vals = {'entered': False, 'exited': False, 'exited_fn': False, + 'exception': False, 'exception_fn': False} + with pytest.raises(Exception): + do_write_with_exception(None) + assert vals['entered'] + assert vals['exited'] + assert vals['exception'] + assert not vals['exited_fn'] + assert not vals['exception_fn'] -- cgit v1.2.3-70-g09d2 From bd7a591df17c38d6ce9f51e092364a98ed4c1d7b Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 2 Jul 2017 17:49:08 -0700 Subject: Make filesytem more resilient to concurrent updates. - Uses O_CREAT for touch (for guaranteed atomic open on NFS, multi-node) - Ignore concurrent create errors in mkdirp --- lib/spack/llnl/util/filesystem.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 88e000b6d3..7a9fb7b8ac 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -251,7 +251,11 @@ def mkdirp(*paths): """Creates a directory, as well as parent directories if needed.""" for path in paths: if not os.path.exists(path): - os.makedirs(path) + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST or not os.path.isdir(path): + raise e elif not os.path.isdir(path): raise OSError(errno.EEXIST, "File already exists", path) @@ -291,8 +295,14 @@ def hide_files(*file_list): def touch(path): """Creates an empty file at the specified path.""" - with open(path, 'a'): + perms = (os.O_WRONLY | os.O_CREAT | os.O_NONBLOCK | os.O_NOCTTY) + fd = None + try: + fd = os.open(path, perms) os.utime(path, None) + finally: + if fd is not None: + os.close(fd) def touchp(path): -- cgit v1.2.3-70-g09d2 From b4d1654e68880a6c917f8c8e07e6ac2edb6d70ea Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 3 Jul 2017 17:30:18 -0700 Subject: Parametrized lock test and make it work with MPI - Lock test can be run either as a node-local test or as an MPI test. - Lock test is now parametrized by filesystem, so you can test the locking capabilities of your NFS, Lustre, or GPFS filesystem. See docs for details. --- lib/spack/llnl/util/lock.py | 9 +- lib/spack/spack/test/lock.py | 292 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 255 insertions(+), 46 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/lock.py b/lib/spack/llnl/util/lock.py index 2cab436e2d..55837c371e 100644 --- a/lib/spack/llnl/util/lock.py +++ b/lib/spack/llnl/util/lock.py @@ -127,8 +127,9 @@ class Lock(object): return - except IOError as error: - if error.errno == errno.EAGAIN or error.errno == errno.EACCES: + except IOError as e: + if e.errno in (errno.EAGAIN, errno.EACCES): + # EAGAIN and EACCES == locked by another process pass else: raise @@ -197,6 +198,8 @@ class Lock(object): tty.debug('READ LOCK: {0.path}[{0._start}:{0._length}] [Acquiring]' .format(self)) self._lock(fcntl.LOCK_SH, timeout=timeout) # can raise LockError. + tty.debug('READ LOCK: {0.path}[{0._start}:{0._length}] [Acquired]' + .format(self)) self._reads += 1 return True else: @@ -219,6 +222,8 @@ class Lock(object): 'WRITE LOCK: {0.path}[{0._start}:{0._length}] [Acquiring]' .format(self)) self._lock(fcntl.LOCK_EX, timeout=timeout) # can raise LockError. + tty.debug('WRITE LOCK: {0.path}[{0._start}:{0._length}] [Acquired]' + .format(self)) self._writes += 1 return True else: diff --git a/lib/spack/spack/test/lock.py b/lib/spack/spack/test/lock.py index 7cf4571016..347b72b575 100644 --- a/lib/spack/spack/test/lock.py +++ b/lib/spack/spack/test/lock.py @@ -22,37 +22,178 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -""" -These tests ensure that our lock works correctly. +"""These tests ensure that our lock works correctly. + +This can be run in two ways. + +First, it can be run as a node-local test, with a typical invocation like +this:: + + spack test lock + +You can *also* run it as an MPI program, which allows you to test locks +across nodes. So, e.g., you can run the test like this:: + + mpirun -n 7 spack test lock + +And it will test locking correctness among MPI processes. Ideally, you +want the MPI processes to span across multiple nodes, so, e.g., for SLURM +you might do this:: + + srun -N 7 -n 7 -m cyclic spack test lock + +You can use this to test whether your shared filesystem properly supports +POSIX reader-writer locking with byte ranges through fcntl. + +If you want to test on multiple filesystems, you can modify the +``locations`` list below. By default it looks like this:: + + locations = [ + tempfile.gettempdir(), # standard tmp directory (potentially local) + '/nfs/tmp2/%u', # NFS tmp mount + '/p/lscratch*/%u' # Lustre scratch mount + ] + +Add names and paths for your preferred filesystem mounts to test on them; +the tests are parametrized to run on all the filesystems listed in this +dict. Note that 'tmp' will be skipped for MPI testing, as it is often a +node-local filesystem, and multi-node tests will fail if the locks aren't +actually on a shared filesystem. + """ import os import shutil -import functools import tempfile import traceback +import glob +import getpass +from contextlib import contextmanager from multiprocessing import Process import pytest -from llnl.util.filesystem import join_path, touch, mkdirp +from llnl.util.filesystem import join_path, touch from llnl.util.lock import * from spack.util.multiproc import Barrier -# This is the longest a failed test will take, as the barriers will -# time out and raise an exception. +# +# This test can be run with MPI. MPI is "enabled" if we can import +# mpi4py and the number of total MPI processes is greater than 1. +# Otherwise it just runs as a node-local test. +# +# NOTE: MPI mode is different from node-local mode in that node-local +# mode will spawn its own test processes, while MPI mode assumes you've +# run this script as a SPMD application. In MPI mode, no additional +# processes are spawned, and you need to ensure that you mpirun the +# script with enough processes for all the multiproc_test cases below. +# +# If you don't run with enough processes, tests that require more +# processes than you currently have will be skipped. +# +mpi = False +comm = None +try: + from mpi4py import MPI + comm = MPI.COMM_WORLD + if comm.size > 1: + mpi = True +except: + pass + + +"""This is a list of filesystem locations to test locks in. Paths are +expanded so that %u is replaced with the current username. '~' is also +legal and will be expanded to the user's home directory. + +Tests are skipped for directories that don't exist, so you'll need to +update this with the locations of NFS, Lustre, and other mounts on your +system. +""" +locations = [ + tempfile.gettempdir(), + os.path.join('/nfs/tmp2/', getpass.getuser()), + os.path.join('/p/lscratch*/', getpass.getuser()), +] + +"""This is the longest a failed multiproc test will take. +Barriers will time out and raise an exception after this interval. +In MPI mode, barriers don't time out (they hang). See mpi_multiproc_test. +""" barrier_timeout = 5 +"""This is the lock timeout for expected failures. +This may need to be higher for some filesystems.""" +lock_fail_timeout = 0.1 + + +@contextmanager +def read_only(path): + orginal_mode = os.stat(path).st_mode + os.chmod(path, 0o444) + yield + os.chmod(path, orginal_mode) + + +@pytest.fixture(scope='session', params=locations) +def lock_test_directory(request): + """This fixture causes tests to be executed for many different mounts. + + See the ``locations`` dict above for details. + """ + return request.param + + +@pytest.fixture(scope='session') +def lock_dir(lock_test_directory): + parent = next((p for p in glob.glob(lock_test_directory) + if os.path.exists(p) and os.access(p, os.W_OK)), None) + if not parent: + # Skip filesystems that don't exist or aren't writable + pytest.skip("requires filesystem: '%s'" % lock_test_directory) + elif mpi and parent == tempfile.gettempdir(): + # Skip local tmp test for MPI runs + pytest.skip("skipping local tmp directory for MPI test.") + + tempdir = None + if not mpi or comm.rank == 0: + tempdir = tempfile.mkdtemp(dir=parent) + if mpi: + tempdir = comm.bcast(tempdir) + + yield tempdir + + if mpi: + # rank 0 may get here before others, in which case it'll try to + # remove the directory while other processes try to re-create the + # lock. This will give errno 39: directory not empty. Use a + # barrier to ensure everyone is done first. + comm.barrier() + + if not mpi or comm.rank == 0: + shutil.rmtree(tempdir) + + +@pytest.fixture +def private_lock_path(lock_dir): + """In MPI mode, this is a private lock for each rank in a multiproc test. + + For other modes, it is the same as a shared lock. + """ + lock_file = join_path(lock_dir, 'lockfile') + if mpi: + lock_file += '.%s' % comm.rank + yield lock_file + -@pytest.fixture() -def lock_path(): - tempdir = tempfile.mkdtemp() - lock_file = join_path(tempdir, 'lockfile') +@pytest.fixture +def lock_path(lock_dir): + """This lock is shared among all processes in a multiproc test.""" + lock_file = join_path(lock_dir, 'lockfile') yield lock_file - shutil.rmtree(tempdir) -def multiproc_test(*functions): +def local_multiproc_test(*functions): """Order some processes using simple barrier synchronization.""" b = Barrier(len(functions), timeout=barrier_timeout) procs = [Process(target=f, args=(b,)) for f in functions] @@ -65,6 +206,52 @@ def multiproc_test(*functions): assert p.exitcode == 0 +def mpi_multiproc_test(*functions): + """SPMD version of multiproc test. + + This needs to be run like so: + + srun spack test lock + + Each process executes its corresponding function. This is different + from ``multiproc_test`` above, which spawns the processes. This will + skip tests if there are too few processes to run them. + """ + procs = len(functions) + if procs > comm.size: + pytest.skip("requires at least %d MPI processes" % procs) + + comm.Barrier() # barrier before each MPI test + + include = comm.rank < len(functions) + subcomm = comm.Split(include) + + class subcomm_barrier(object): + """Stand-in for multiproc barrier for MPI-parallel jobs.""" + def wait(self): + subcomm.Barrier() + + if include: + try: + functions[subcomm.rank](subcomm_barrier()) + except: + # aborting is the best we can do for MPI tests without + # hanging, since we're using MPI barriers. This will fail + # early and it loses the nice pytest output, but at least it + # gets use a stacktrace on the processes that failed. + traceback.print_exc() + comm.Abort() + subcomm.Free() + + comm.Barrier() # barrier after each MPI test. + + +"""``multiproc_test()`` should be called by tests below. +``multiproc_test()`` will work for either MPI runs or for local runs. +""" +multiproc_test = mpi_multiproc_test if mpi else local_multiproc_test + + # # Process snippets below can be composed into tests. # @@ -91,7 +278,7 @@ def timeout_write(lock_path, start=0, length=0): lock = Lock(lock_path, start, length) barrier.wait() # wait for lock acquire in first process with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) barrier.wait() return fn @@ -101,7 +288,7 @@ def timeout_read(lock_path, start=0, length=0): lock = Lock(lock_path, start, length) barrier.wait() # wait for lock acquire in first process with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() return fn @@ -111,7 +298,9 @@ def timeout_read(lock_path, start=0, length=0): # exclusive lock is held. # def test_write_lock_timeout_on_write(lock_path): - multiproc_test(acquire_write(lock_path), timeout_write(lock_path)) + multiproc_test( + acquire_write(lock_path), + timeout_write(lock_path)) def test_write_lock_timeout_on_write_2(lock_path): @@ -258,7 +447,8 @@ def test_write_lock_timeout_on_read_ranges_3(lock_path): def test_write_lock_timeout_on_read_ranges_4(lock_path): multiproc_test( acquire_read(lock_path, 0, 64), - timeout_write(lock_path, 10, 1), timeout_write(lock_path, 32, 1)) + timeout_write(lock_path, 10, 1), + timeout_write(lock_path, 32, 1)) def test_write_lock_timeout_on_read_ranges_5(lock_path): @@ -268,6 +458,7 @@ def test_write_lock_timeout_on_read_ranges_5(lock_path): timeout_write(lock_path, 127, 1), timeout_write(lock_path, 90, 10)) + # # Test that exclusive locks time while lots of shared locks are held. # @@ -339,12 +530,19 @@ def test_write_lock_timeout_with_multiple_readers_3_2_ranges(lock_path): # # Test that read can be upgraded to write. # -def test_upgrade_read_to_write(lock_path): +def test_upgrade_read_to_write(private_lock_path): + """Test that a read lock can be upgraded to a write lock. + + Note that to upgrade a read lock to a write lock, you have the be the + only holder of a read lock. Client code needs to coordinate that for + shared locks. For this test, we use a private lock just to test that an + upgrade is possible. + """ # ensure lock file exists the first time, so we open it read-only # to begin wtih. - touch(lock_path) + touch(private_lock_path) - lock = Lock(lock_path) + lock = Lock(private_lock_path) assert lock._reads == 0 assert lock._writes == 0 @@ -368,26 +566,28 @@ def test_upgrade_read_to_write(lock_path): assert lock._writes == 0 assert lock._file is None + # # Test that read-only file can be read-locked but not write-locked. # -def test_upgrade_read_to_write_fails_with_readonly_file(lock_path): +def test_upgrade_read_to_write_fails_with_readonly_file(private_lock_path): # ensure lock file exists the first time, so we open it read-only # to begin wtih. - touch(lock_path) - os.chmod(lock_path, 0o444) + touch(private_lock_path) - lock = Lock(lock_path) - assert lock._reads == 0 - assert lock._writes == 0 + with read_only(private_lock_path): + lock = Lock(private_lock_path) + assert lock._reads == 0 + assert lock._writes == 0 - lock.acquire_read() - assert lock._reads == 1 - assert lock._writes == 0 - assert lock._file.mode == 'r' + lock.acquire_read() + assert lock._reads == 1 + assert lock._writes == 0 + assert lock._file.mode == 'r' + + with pytest.raises(LockError): + lock.acquire_write() - with pytest.raises(LockError): - lock.acquire_write() # # Longer test case that ensures locks are reusable. Ordering is @@ -404,7 +604,7 @@ def test_complex_acquire_and_release_chain(lock_path): lock.release_write() # release and others acquire read barrier.wait() # ---------------------------------------- 3 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) lock.acquire_read() barrier.wait() # ---------------------------------------- 4 lock.release_read() @@ -413,9 +613,9 @@ def test_complex_acquire_and_release_chain(lock_path): # p2 upgrades read to write barrier.wait() # ---------------------------------------- 6 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() # ---------------------------------------- 7 # p2 releases write and read barrier.wait() # ---------------------------------------- 8 @@ -425,9 +625,9 @@ def test_complex_acquire_and_release_chain(lock_path): # p3 upgrades read to write barrier.wait() # ---------------------------------------- 10 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() # ---------------------------------------- 11 # p3 releases locks barrier.wait() # ---------------------------------------- 12 @@ -441,9 +641,9 @@ def test_complex_acquire_and_release_chain(lock_path): # p1 acquires write barrier.wait() # ---------------------------------------- 1 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() # ---------------------------------------- 2 lock.acquire_read() barrier.wait() # ---------------------------------------- 3 @@ -465,9 +665,9 @@ def test_complex_acquire_and_release_chain(lock_path): # p3 upgrades read to write barrier.wait() # ---------------------------------------- 10 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() # ---------------------------------------- 11 # p3 releases locks barrier.wait() # ---------------------------------------- 12 @@ -481,9 +681,9 @@ def test_complex_acquire_and_release_chain(lock_path): # p1 acquires write barrier.wait() # ---------------------------------------- 1 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() # ---------------------------------------- 2 lock.acquire_read() barrier.wait() # ---------------------------------------- 3 @@ -495,9 +695,9 @@ def test_complex_acquire_and_release_chain(lock_path): # p2 upgrades read to write barrier.wait() # ---------------------------------------- 6 with pytest.raises(LockError): - lock.acquire_write(0.1) + lock.acquire_write(lock_fail_timeout) with pytest.raises(LockError): - lock.acquire_read(0.1) + lock.acquire_read(lock_fail_timeout) barrier.wait() # ---------------------------------------- 7 # p2 releases write & read barrier.wait() # ---------------------------------------- 8 @@ -517,6 +717,7 @@ def test_complex_acquire_and_release_chain(lock_path): multiproc_test(p1, p2, p3) + def test_transaction(lock_path): def enter_fn(): vals['entered'] = True @@ -542,6 +743,7 @@ def test_transaction(lock_path): assert vals['exited'] assert not vals['exception'] + def test_transaction_with_exception(lock_path): def enter_fn(): vals['entered'] = True @@ -574,6 +776,7 @@ def test_transaction_with_exception(lock_path): assert vals['exited'] assert vals['exception'] + def test_transaction_with_context_manager(lock_path): class TestContextManager(object): @@ -634,6 +837,7 @@ def test_transaction_with_context_manager(lock_path): assert not vals['exited_fn'] assert not vals['exception_fn'] + def test_transaction_with_context_manager_and_exception(lock_path): class TestContextManager(object): def __enter__(self): -- cgit v1.2.3-70-g09d2 From 28cb1e43790ab1d7103e9a7705dfafa923c8977b Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 6 Jul 2017 21:07:54 -0700 Subject: patch config.guess after autoreconf step (#4604) --- lib/spack/spack/build_systems/autotools.py | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 4378d7aa58..84f019f1b3 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -95,10 +95,15 @@ class AutotoolsPackage(PackageBase): #: Options to be passed to autoreconf when using the default implementation autoreconf_extra_args = [] + @run_after('autoreconf') def _do_patch_config_guess(self): """Some packages ship with an older config.guess and need to have this updated when installed on a newer architecture.""" + if not self.patch_config_guess or not self.spec.satisfies( + 'arch=linux-rhel7-ppc64le' + ): + return my_config_guess = None config_guess = None if os.path.exists('config.guess'): @@ -120,11 +125,11 @@ class AutotoolsPackage(PackageBase): try: check_call([my_config_guess], stdout=PIPE, stderr=PIPE) # The package's config.guess already runs OK, so just use it - return True + return except Exception: pass else: - return True + return # Look for a spack-installed automake package if 'automake' in self.spec: @@ -149,11 +154,11 @@ class AutotoolsPackage(PackageBase): mod = stat(my_config_guess).st_mode & 0o777 | S_IWUSR os.chmod(my_config_guess, mod) shutil.copyfile(config_guess, my_config_guess) - return True + return except Exception: pass - return False + raise RuntimeError('Failed to find suitable config.guess') @property def configure_directory(self): @@ -176,20 +181,6 @@ class AutotoolsPackage(PackageBase): """Override to provide another place to build the package""" return self.configure_directory - def patch(self): - """Patches config.guess if - :py:attr:``~.AutotoolsPackage.patch_config_guess`` is True - - :raise RuntimeError: if something goes wrong when patching - ``config.guess`` - """ - - if self.patch_config_guess and self.spec.satisfies( - 'arch=linux-rhel7-ppc64le' - ): - if not self._do_patch_config_guess(): - raise RuntimeError('Failed to find suitable config.guess') - @run_before('autoreconf') def delete_configure_to_force_update(self): if self.force_autoreconf: -- cgit v1.2.3-70-g09d2 From ff906faf9a67d33a5d15be829988ebd5de189ba4 Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Tue, 11 Jul 2017 22:48:31 -0700 Subject: Typo: submdoules -> submodules (#4716) --- lib/spack/docs/packaging_guide.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index cdf4cc7e3b..540d2a9e4e 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -925,7 +925,7 @@ Submodules .. code-block:: python version('1.0.1', git='https://github.com/example-project/example.git', - tag='v1.0.1', submdoules=True) + tag='v1.0.1', submodules=True) .. _github-fetch: -- cgit v1.2.3-70-g09d2 From 5a1ee2257534497e7e436fa72f94da6e4e0e03e7 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 18 Jul 2017 18:53:35 +0200 Subject: package: removed default no-op patch (#4103) * package: removed default no-op patch fixes #4085 * do_patch: handles NoSuchMethodError nicely --- lib/spack/spack/package.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index dc23f6351f..1223fce178 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -58,6 +58,7 @@ import spack.mirror import spack.repository import spack.url import spack.util.web +import spack.multimethod from llnl.util.filesystem import * from llnl.util.lang import * @@ -939,10 +940,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.stage.expand_archive() self.stage.chdir_to_source() - def patch(self): - """Default patch implementation is a no-op.""" - pass - def do_patch(self): """Calls do_stage(), then applied patches to the expanded tarball if they haven't been applied already.""" @@ -1003,6 +1000,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.patch() tty.msg("Ran patch() for %s" % self.name) patched = True + except spack.multimethod.NoSuchMethodError: + # We are running a multimethod without a default case. + # If there's no default it means we don't need to patch. + tty.msg("No patches needed for %s" % self.name) except: tty.msg("patch() function failed for %s" % self.name) touch(bad_file) -- cgit v1.2.3-70-g09d2 From 1215c3b20c28edfb8bcb21ad764b0940fa78e268 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 18 Jul 2017 11:58:19 -0500 Subject: Change path to CMakeLists.txt to be relative to root, not pwd (#4420) * Change path to CMakeLists.txt to be relative to root, not pwd * Changes requested during code review * Revert back to old naming of root_cmakelists_dir * Make relative directory more clear in docs * Revert change causing build_type AttributeError * Fix forgotten abs_path var * Update CLHEP with new relative path * Update more packages with new root_cmakelists_dir syntax --- lib/spack/spack/build_systems/cmake.py | 13 +++++++++---- var/spack/repos/builtin/packages/bcl2fastq2/package.py | 2 +- var/spack/repos/builtin/packages/clfft/package.py | 6 ++---- var/spack/repos/builtin/packages/clhep/package.py | 2 +- var/spack/repos/builtin/packages/cpprestsdk/package.py | 2 +- var/spack/repos/builtin/packages/isaac-server/package.py | 6 ++---- var/spack/repos/builtin/packages/isaac/package.py | 6 ++---- var/spack/repos/builtin/packages/quinoa/package.py | 2 +- var/spack/repos/builtin/packages/spades/package.py | 4 +--- 9 files changed, 20 insertions(+), 23 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 4435a995fc..240c8a8b18 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -24,6 +24,7 @@ ############################################################################## import inspect +import os import platform import spack.build_environment @@ -84,9 +85,12 @@ class CMakePackage(PackageBase): @property def root_cmakelists_dir(self): - """Returns the location of the root CMakeLists.txt + """The relative path to the directory containing CMakeLists.txt - :return: directory containing the root CMakeLists.txt + This path is relative to the root of the extracted tarball, + not to the ``build_directory``. Defaults to the current directory. + + :return: directory containing CMakeLists.txt """ return self.stage.source_path @@ -143,8 +147,9 @@ class CMakePackage(PackageBase): def cmake(self, spec, prefix): """Runs ``cmake`` in the build directory""" - options = [self.root_cmakelists_dir] + self.std_cmake_args + \ - self.cmake_args() + options = [os.path.abspath(self.root_cmakelists_dir)] + options += self.std_cmake_args + options += self.cmake_args() with working_dir(self.build_directory, create=True): inspect.getmodule(self).cmake(*options) diff --git a/var/spack/repos/builtin/packages/bcl2fastq2/package.py b/var/spack/repos/builtin/packages/bcl2fastq2/package.py index 1a7fff360c..7af1815757 100644 --- a/var/spack/repos/builtin/packages/bcl2fastq2/package.py +++ b/var/spack/repos/builtin/packages/bcl2fastq2/package.py @@ -59,7 +59,7 @@ class Bcl2fastq2(Package): # libexslt bits. patch('cxxConfigure-cmake.patch') - root_cmakelists_dir = '../src' + root_cmakelists_dir = 'src' def url_for_version(self, version): url = "https://support.illumina.com/content/dam/illumina-support/documents/downloads/software/bcl2fastq/bcl2fastq2-v{0}-tar.zip" diff --git a/var/spack/repos/builtin/packages/clfft/package.py b/var/spack/repos/builtin/packages/clfft/package.py index 271d5c389a..5a03a3b07f 100644 --- a/var/spack/repos/builtin/packages/clfft/package.py +++ b/var/spack/repos/builtin/packages/clfft/package.py @@ -31,10 +31,6 @@ class Clfft(CMakePackage): homepage = "https://github.com/clMathLibraries/clFFT" url = "https://github.com/clMathLibraries/clFFT/archive/v2.12.2.tar.gz" - @property - def root_cmakelists_dir(self): - return join_path(self.stage.source_path, 'src') - version('2.12.2', '9104d85f9f2f3c58dd8efc0e4b06496f') variant('client', default=True, @@ -43,6 +39,8 @@ class Clfft(CMakePackage): depends_on('opencl@1.2:') depends_on('boost@1.33.0:', when='+client') + root_cmakelists_dir = 'src' + def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/clhep/package.py b/var/spack/repos/builtin/packages/clhep/package.py index 4d8fd14f3b..e9bf85c97f 100644 --- a/var/spack/repos/builtin/packages/clhep/package.py +++ b/var/spack/repos/builtin/packages/clhep/package.py @@ -63,7 +63,7 @@ class Clhep(CMakePackage): '%s/%s/CLHEP/CMakeLists.txt' % (self.stage.path, self.spec.version)) - root_cmakelists_dir = '../CLHEP' + root_cmakelists_dir = 'CLHEP' def build_type(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/cpprestsdk/package.py b/var/spack/repos/builtin/packages/cpprestsdk/package.py index 6cb378a2f3..b5d96ff480 100644 --- a/var/spack/repos/builtin/packages/cpprestsdk/package.py +++ b/var/spack/repos/builtin/packages/cpprestsdk/package.py @@ -38,4 +38,4 @@ class Cpprestsdk(CMakePackage): depends_on('boost') - root_cmakelists_dir = '../Release' + root_cmakelists_dir = 'Release' diff --git a/var/spack/repos/builtin/packages/isaac-server/package.py b/var/spack/repos/builtin/packages/isaac-server/package.py index c13a1d8aec..baa79cf673 100644 --- a/var/spack/repos/builtin/packages/isaac-server/package.py +++ b/var/spack/repos/builtin/packages/isaac-server/package.py @@ -31,10 +31,6 @@ class IsaacServer(CMakePackage): homepage = "http://computationalradiationphysics.github.io/isaac/" url = "https://github.com/ComputationalRadiationPhysics/isaac/archive/v1.3.0.tar.gz" - @property - def root_cmakelists_dir(self): - return join_path(self.stage.source_path, 'server') - version('develop', branch='dev', git='https://github.com/ComputationalRadiationPhysics/isaac.git') version('master', branch='master', @@ -51,3 +47,5 @@ class IsaacServer(CMakePackage): depends_on('boost@1.56:', type='link') depends_on('libwebsockets@2.1.1:', type='link') # depends_on('gstreamer@1.0', when='+gstreamer') + + root_cmakelists_dir = 'server' diff --git a/var/spack/repos/builtin/packages/isaac/package.py b/var/spack/repos/builtin/packages/isaac/package.py index 33546d19b0..a06a782e46 100644 --- a/var/spack/repos/builtin/packages/isaac/package.py +++ b/var/spack/repos/builtin/packages/isaac/package.py @@ -31,10 +31,6 @@ class Isaac(CMakePackage): homepage = "http://computationalradiationphysics.github.io/isaac/" url = "https://github.com/ComputationalRadiationPhysics/isaac/archive/v1.3.0.tar.gz" - @property - def root_cmakelists_dir(self): - return join_path(self.stage.source_path, 'lib') - version('develop', branch='dev', git='https://github.com/ComputationalRadiationPhysics/isaac.git') version('master', branch='master', @@ -55,3 +51,5 @@ class Isaac(CMakePackage): # depends_on('alpaka', when='+alpaka') depends_on('icet', type='link') depends_on('mpi', type='link') + + root_cmakelists_dir = 'lib' diff --git a/var/spack/repos/builtin/packages/quinoa/package.py b/var/spack/repos/builtin/packages/quinoa/package.py index e65d347759..eb41bb8b37 100644 --- a/var/spack/repos/builtin/packages/quinoa/package.py +++ b/var/spack/repos/builtin/packages/quinoa/package.py @@ -55,7 +55,7 @@ class Quinoa(CMakePackage): depends_on("pstreams") depends_on("pegtl") - root_cmakelists_dir = '../src' + root_cmakelists_dir = 'src' def build_type(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/spades/package.py b/var/spack/repos/builtin/packages/spades/package.py index c7e4469f5e..443436d3ae 100644 --- a/var/spack/repos/builtin/packages/spades/package.py +++ b/var/spack/repos/builtin/packages/spades/package.py @@ -40,6 +40,4 @@ class Spades(CMakePackage): conflicts('%gcc@7.1.0:') - @property - def root_cmakelists_dir(self): - return join_path(self.stage.source_path, 'src') + root_cmakelists_dir = 'src' -- cgit v1.2.3-70-g09d2 From d2a63d55fa714588360936f54bcf9cf7cd1d75c7 Mon Sep 17 00:00:00 2001 From: becker33 Date: Tue, 18 Jul 2017 10:03:15 -0700 Subject: Open ended variants (#4746) * Change directives to allow open-ended variants more easily * make None default to open-ended --- lib/spack/spack/directives.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 2b160bc8a3..52e4b83dce 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -372,7 +372,7 @@ def variant( name, default=None, description='', - values=(True, False), + values=None, multi=False, validator=None ): @@ -394,6 +394,12 @@ def variant( logic. It receives a tuple of values and should raise an instance of SpackError if the group doesn't meet the additional constraints """ + if values is None: + if default in (True, False) or (type(default) is str and + default.upper() in ('TRUE', 'FALSE')): + values = (True, False) + else: + values = lambda x: True if default is None: default = False if values == (True, False) else '' -- cgit v1.2.3-70-g09d2 From 5fc0243d3598f6e0f6b3206ccfb91012675c8c41 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 18 Jul 2017 22:48:39 -0500 Subject: Improve version detection of release versions (#4816) --- lib/spack/spack/test/url_parse.py | 2 ++ lib/spack/spack/url.py | 1 + 2 files changed, 3 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 5b24821a28..6789bc0aa3 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -57,6 +57,8 @@ from spack.url import * ('gromacs-4.6.1-tar', 'gromacs-4.6.1'), # Download type - sh ('Miniconda2-4.3.11-Linux-x86_64.sh', 'Miniconda2-4.3.11'), + # Download version - release + ('v1.0.4-release', 'v1.0.4'), # Download version - stable ('libevent-2.0.21-stable', 'libevent-2.0.21'), # Download version - final diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 88557596fd..d29ce3d07f 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -183,6 +183,7 @@ def strip_version_suffixes(path): 'sh', # Download version + 'release', 'stable', '[Ff]inal', 'rel', -- cgit v1.2.3-70-g09d2 From f962aba6ce85ba001bbe20f6f849478fdb9370c5 Mon Sep 17 00:00:00 2001 From: becker33 Date: Wed, 19 Jul 2017 20:12:00 -0700 Subject: Allow packages to control handling of compiler flags (#4421) * Initial work on flag trapping using functions called _handler and default_flag_handler * Update packages so they do not obliterate flags * Added append to EnvironmentModifications class * changed EnvironmentModifications to have append_flags method * changed flag_val to be a tuple * Increased test coverage * added documentation of flag handling --- lib/spack/docs/packaging_guide.rst | 88 ++++++++++++++++++++++ lib/spack/spack/build_environment.py | 13 ++++ lib/spack/spack/build_systems/autotools.py | 23 ++++++ lib/spack/spack/build_systems/cmake.py | 9 +++ lib/spack/spack/environment.py | 23 ++++++ lib/spack/spack/test/environment.py | 13 ++++ var/spack/repos/builtin/packages/clhep/package.py | 10 ++- var/spack/repos/builtin/packages/elpa/package.py | 4 +- var/spack/repos/builtin/packages/ferret/package.py | 7 +- var/spack/repos/builtin/packages/git/package.py | 2 +- var/spack/repos/builtin/packages/libint/package.py | 1 + var/spack/repos/builtin/packages/libxc/package.py | 11 ++- var/spack/repos/builtin/packages/libxpm/package.py | 2 +- .../repos/builtin/packages/llvm-lld/package.py | 5 +- var/spack/repos/builtin/packages/llvm/package.py | 2 +- var/spack/repos/builtin/packages/zlib/package.py | 2 +- 16 files changed, 203 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 540d2a9e4e..b90a0eea17 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2390,6 +2390,94 @@ build system. Compiler flags ^^^^^^^^^^^^^^ +Compiler flags set by the user through the Spec object can be passed to +the build in one of two ways. For packages inheriting from the +``CmakePackage`` or ``AutotoolsPackage`` classes, the build environment +passes those flags to the relevant environment variables (``CFLAGS``, +``CXXFLAGS``, etc) that are respected by the build system. For all other +packages, the default behavior is to inject the flags directly into the +compiler commands using Spack's compiler wrappers. + +Individual packages can override the default behavior for the flag +handling. Packages can define a ``default_flag_handler`` method that +applies to all sets of flags handled by Spack, or may define +individual methods ``cflags_handler``, ``cxxflags_handler``, +etc. Spack will apply the individual method for a flag set if it +exists, otherwise the ``default_flag_handler`` method if it exists, +and fall back on the default for that package class if neither exists. + +These methods are defined on the package class, and take two +parameters in addition to the packages itself. The ``env`` parameter +is an ``EnvironmentModifications`` object that can be used to change +the build environment. The ``flag_val`` parameter is a tuple. Its +first entry is the name of the flag (``cflags``, ``cxxflags``, etc.) +and its second entry is a list of the values for that flag. + +There are three primary idioms that can be combined to create whatever +behavior the package requires. + +1. The default behavior for packages inheriting from +``AutotoolsPackage`` or ``CmakePackage``. + +.. code-block:: python + + def default_flag_handler(self, env, flag_val): + env.append_flags(flag_val[0].upper(), ' '.join(flag_val[1])) + return [] + +2. The default behavior for other packages + +.. code-block:: python + + def default_flag_handler(self, env, flag_val): + return flag_val[1] + + +3. Packages may have additional flags to add to the build. These flags +can be added to either idiom above. For example: + +.. code-block:: python + + def default_flag_handler(self, env, flag_val): + flags = flag_val[1] + flags.append('-flag') + return flags + +or + +.. code-block:: python + + def default_flag_handler(self, env, flag_val): + env.append_flags(flag_val[0].upper(), ' '.join(flag_val[1])) + env.append_flags(flag_val[0].upper(), '-flag') + return [] + +Packages may also opt for methods that include aspects of any of the +idioms above. E.g. + +.. code-block:: python + + def default_flag_handler(self, env, flag_val): + flags = [] + if len(flag_val[1]) > 3: + env.append_flags(flag_val[0].upper(), ' '.join(flag_val[1][3:])) + flags = flag_val[1][:3] + else: + flags = flag_val[1] + flags.append('-flag') + return flags + +Because these methods can pass values through environment variables, +it is important not to override these variables unnecessarily in other +package methods. In the ``setup_environment`` and +``setup_dependent_environment`` methods, use the ``append_flags`` +method of the ``EnvironmentModifications`` class to append values to a +list of flags whenever there is no good reason to override the +existing value. In the ``install`` method and other methods that can +operate on the build environment directly through the ``env`` +variable, test for environment variable existance before overriding +values to add compiler flags. + In rare circumstances such as compiling and running small unit tests, a package developer may need to know what are the appropriate compiler flags to enable features like ``OpenMP``, ``c++11``, ``c++14`` and diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 49fecdb59c..571f0f8c49 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -467,6 +467,19 @@ def setup_package(pkg, dirty=False): for s in pkg.spec.traverse(): s.package.spec = s + # Trap spack-tracked compiler flags as appropriate. + # Must be before set_compiler_environment_variables + # Current implementation of default flag handler relies on this being + # the first thing to affect the spack_env (so there is no appending), or + # on no other build_environment methods trying to affect these variables + # (CFLAGS, CXXFLAGS, etc). Currently both are true, either is sufficient. + for flag in spack.spec.FlagMap.valid_compiler_flags(): + trap_func = getattr(pkg, flag + '_handler', + getattr(pkg, 'default_flag_handler', + lambda x, y: y[1])) + flag_val = pkg.spec.compiler_flags[flag] + pkg.spec.compiler_flags[flag] = trap_func(spack_env, (flag, flag_val)) + set_compiler_environment_variables(pkg, spack_env) set_build_environment_variables(pkg, spack_env, dirty) pkg.architecture.platform.setup_platform_environment(pkg, spack_env) diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 84f019f1b3..1ef38ddc2d 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -181,6 +181,29 @@ class AutotoolsPackage(PackageBase): """Override to provide another place to build the package""" return self.configure_directory + def default_flag_handler(self, spack_env, flag_val): + # Relies on being the first thing that can affect the spack_env + # EnvironmentModification after it is instantiated or no other + # method trying to affect these variables. Currently both are true + # flag_val is a tuple (flag, value_list). + spack_env.set(flag_val[0].upper(), + ' '.join(flag_val[1])) + return [] + + def patch(self): + """Patches config.guess if + :py:attr:``~.AutotoolsPackage.patch_config_guess`` is True + + :raise RuntimeError: if something goes wrong when patching + ``config.guess`` + """ + + if self.patch_config_guess and self.spec.satisfies( + 'arch=linux-rhel7-ppc64le' + ): + if not self._do_patch_config_guess(): + raise RuntimeError('Failed to find suitable config.guess') + @run_before('autoreconf') def delete_configure_to_force_update(self): if self.force_autoreconf: diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 240c8a8b18..b339858348 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -132,6 +132,15 @@ class CMakePackage(PackageBase): """ return join_path(self.stage.source_path, 'spack-build') + def default_flag_handler(self, spack_env, flag_val): + # Relies on being the first thing that can affect the spack_env + # EnvironmentModification after it is instantiated or no other + # method trying to affect these variables. Currently both are true + # flag_val is a tuple (flag, value_list) + spack_env.set(flag_val[0].upper(), + ' '.join(flag_val[1])) + return [] + def cmake_args(self): """Produces a list containing all the arguments that must be passed to cmake, except: diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index bb760bfd2f..ff278dd6b6 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -63,6 +63,15 @@ class SetEnv(NameValueModifier): os.environ[self.name] = str(self.value) +class AppendFlagsEnv(NameValueModifier): + + def execute(self): + if self.name in os.environ and os.environ[self.name]: + os.environ[self.name] += self.separator + str(self.value) + else: + os.environ[self.name] = str(self.value) + + class UnsetEnv(NameModifier): def execute(self): @@ -171,6 +180,20 @@ class EnvironmentModifications(object): item = SetEnv(name, value, **kwargs) self.env_modifications.append(item) + def append_flags(self, name, value, sep=' ', **kwargs): + """ + Stores in the current object a request to append to an env variable + + Args: + name: name of the environment variable to be appended to + value: value to append to the environment variable + Appends with spaces separating different additions to the variable + """ + kwargs.update(self._get_outside_caller_attributes()) + kwargs.update({'separator': sep}) + item = AppendFlagsEnv(name, value, **kwargs) + self.env_modifications.append(item) + def unset(self, name, **kwargs): """ Stores in the current object a request to unset an environment variable diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index 671d6ee6c9..7f3b7bf2bd 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -110,6 +110,19 @@ def test_set(env): assert str(3) == os.environ['B'] +def test_append_flags(env): + """Tests appending to a value in the environment.""" + + # Store a couple of commands + env.append_flags('APPEND_TO_ME', 'flag1') + env.append_flags('APPEND_TO_ME', 'flag2') + + # ... execute the commands + env.apply_modifications() + + assert 'flag1 flag2' == os.environ['APPEND_TO_ME'] + + def test_unset(env): """Tests unsetting values in the environment.""" diff --git a/var/spack/repos/builtin/packages/clhep/package.py b/var/spack/repos/builtin/packages/clhep/package.py index e9bf85c97f..7120fffac6 100644 --- a/var/spack/repos/builtin/packages/clhep/package.py +++ b/var/spack/repos/builtin/packages/clhep/package.py @@ -78,12 +78,18 @@ class Clhep(CMakePackage): cmake_args = [] if '+cxx11' in spec: - env['CXXFLAGS'] = self.compiler.cxx11_flag + if 'CXXFLAGS' in env and env['CXXFLAGS']: + env['CXXFLAGS'] += ' ' + self.compiler.cxx11_flag + else: + env['CXXFLAGS'] = self.compiler.cxx11_flag cmake_args.append('-DCLHEP_BUILD_CXXSTD=' + self.compiler.cxx11_flag) if '+cxx14' in spec: - env['CXXFLAGS'] = self.compiler.cxx14_flag + if 'CXXFLAGS' in env and env['CXXFLAGS']: + env['CXXFLAGS'] += ' ' + self.compiler.cxx14_flag + else: + env['CXXFLAGS'] = self.compiler.cxx14_flag cmake_args.append('-DCLHEP_BUILD_CXXSTD=' + self.compiler.cxx14_flag) diff --git a/var/spack/repos/builtin/packages/elpa/package.py b/var/spack/repos/builtin/packages/elpa/package.py index 85d1706b2b..61e957c0c9 100644 --- a/var/spack/repos/builtin/packages/elpa/package.py +++ b/var/spack/repos/builtin/packages/elpa/package.py @@ -71,8 +71,8 @@ class Elpa(AutotoolsPackage): spack_env.set('FC', spec['mpi'].mpifc) spack_env.set('CXX', spec['mpi'].mpicxx) - spack_env.set('LDFLAGS', spec['lapack'].libs.search_flags) - spack_env.set('LIBS', spec['lapack'].libs.link_flags) + spack_env.append_flags('LDFLAGS', spec['lapack'].libs.search_flags) + spack_env.append_flags('LIBS', spec['lapack'].libs.link_flags) spack_env.set('SCALAPACK_LDFLAGS', spec['scalapack'].libs.joined()) def configure_args(self): diff --git a/var/spack/repos/builtin/packages/ferret/package.py b/var/spack/repos/builtin/packages/ferret/package.py index f2a32fdd70..6a4c0902f6 100644 --- a/var/spack/repos/builtin/packages/ferret/package.py +++ b/var/spack/repos/builtin/packages/ferret/package.py @@ -98,7 +98,12 @@ class Ferret(Package): ln('-sf', libz_prefix + '/lib', libz_prefix + '/lib64') - os.environ['LDFLAGS'] = '-lquadmath' + + if 'LDFLAGS' in env and env['LDFLAGS']: + env['LDFLAGS'] += ' ' + '-lquadmath' + else: + env['LDFLAGS'] = '-lquadmath' + with working_dir('FERRET', create=False): os.environ['LD_X11'] = '-L/usr/lib/X11 -lX11' os.environ['HOSTTYPE'] = 'x86_64-linux' diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py index f01cc37d7b..9dc9e460af 100644 --- a/var/spack/repos/builtin/packages/git/package.py +++ b/var/spack/repos/builtin/packages/git/package.py @@ -155,7 +155,7 @@ class Git(AutotoolsPackage): depends_on('m4', type='build') def setup_environment(self, spack_env, run_env): - spack_env.set('LDFLAGS', '-L{0} -lintl'.format( + spack_env.append_flags('LDFLAGS', '-L{0} -lintl'.format( self.spec['gettext'].prefix.lib)) def configure_args(self): diff --git a/var/spack/repos/builtin/packages/libint/package.py b/var/spack/repos/builtin/packages/libint/package.py index d267a8ea88..34600e742a 100644 --- a/var/spack/repos/builtin/packages/libint/package.py +++ b/var/spack/repos/builtin/packages/libint/package.py @@ -85,6 +85,7 @@ class Libint(AutotoolsPackage): def configure_args(self): config_args = ['--enable-shared'] + optflags = self.optflags # Optimization flag names have changed in libint 2 diff --git a/var/spack/repos/builtin/packages/libxc/package.py b/var/spack/repos/builtin/packages/libxc/package.py index f018bacfa3..e2fe25c455 100644 --- a/var/spack/repos/builtin/packages/libxc/package.py +++ b/var/spack/repos/builtin/packages/libxc/package.py @@ -71,8 +71,15 @@ class Libxc(Package): if which('xiar'): env['AR'] = 'xiar' - env['CFLAGS'] = optflags - env['FCFLAGS'] = optflags + if 'CFLAGS' in env and env['CFLAGS']: + env['CFLAGS'] += ' ' + optflags + else: + env['CFLAGS'] = optflags + + if 'FCFLAGS' in env and env['FCFLAGS']: + env['FCFLAGS'] += ' ' + optflags + else: + env['FCFLAGS'] = optflags configure('--prefix={0}'.format(prefix), '--enable-shared') diff --git a/var/spack/repos/builtin/packages/libxpm/package.py b/var/spack/repos/builtin/packages/libxpm/package.py index 09d0b0ec61..40234b1b2d 100644 --- a/var/spack/repos/builtin/packages/libxpm/package.py +++ b/var/spack/repos/builtin/packages/libxpm/package.py @@ -46,5 +46,5 @@ class Libxpm(AutotoolsPackage): depends_on('util-macros', type='build') def setup_environment(self, spack_env, run_env): - spack_env.set('LDFLAGS', '-L{0} -lintl'.format( + spack_env.append_flags('LDFLAGS', '-L{0} -lintl'.format( self.spec['gettext'].prefix.lib)) diff --git a/var/spack/repos/builtin/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py index 4624451e69..0ebe2e6b89 100644 --- a/var/spack/repos/builtin/packages/llvm-lld/package.py +++ b/var/spack/repos/builtin/packages/llvm-lld/package.py @@ -38,7 +38,10 @@ class LlvmLld(Package): depends_on('cmake', type='build') def install(self, spec, prefix): - env['CXXFLAGS'] = self.compiler.cxx11_flag + if 'CXXFLAGS' in env and env['CXXFLAGS']: + env['CXXFLAGS'] += ' ' + self.compiler.cxx11_flag + else: + env['CXXFLAGS'] = self.compiler.cxx11_flag with working_dir('spack-build', create=True): cmake('..', diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index 1f88d94882..fc8823f1a8 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -325,7 +325,7 @@ class Llvm(CMakePackage): conflicts('+lldb', when='~clang') def setup_environment(self, spack_env, run_env): - spack_env.set('CXXFLAGS', self.compiler.cxx11_flag) + spack_env.append_flags('CXXFLAGS', self.compiler.cxx11_flag) def build_type(self): if '+debug' in self.spec: diff --git a/var/spack/repos/builtin/packages/zlib/package.py b/var/spack/repos/builtin/packages/zlib/package.py index 0d9822f287..30fcef95e1 100644 --- a/var/spack/repos/builtin/packages/zlib/package.py +++ b/var/spack/repos/builtin/packages/zlib/package.py @@ -57,7 +57,7 @@ class Zlib(Package): def setup_environment(self, spack_env, run_env): if '+pic' in self.spec: - spack_env.set('CFLAGS', self.compiler.pic_flag) + spack_env.append_flags('CFLAGS', self.compiler.pic_flag) def install(self, spec, prefix): config_args = [] -- cgit v1.2.3-70-g09d2 From f159246d1d073ae7230b5412a4a2a20eac7f49c2 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 22 Jul 2017 21:27:54 -0700 Subject: Make testing spack commands simpler (#4868) Adds SpackCommand class allowing Spack commands to be easily in Python Example usage: from spack.main import SpackCommand info = SpackCommand('info') out, err = info('mpich') print(info.returncode) This allows easier testing of Spack commands. Also: * Simplify command tests * Simplify mocking in command tests. * Simplify module command test * Simplify python command test * Simplify uninstall command test * Simplify url command test * SpackCommand uses more compatible output redirection --- lib/spack/spack/cmd/__init__.py | 8 +- lib/spack/spack/main.py | 107 +++++++++-- lib/spack/spack/test/cmd/gpg.py | 113 +++++------ lib/spack/spack/test/cmd/install.py | 207 +++------------------ lib/spack/spack/test/cmd/module.py | 5 + lib/spack/spack/test/cmd/python.py | 22 +-- lib/spack/spack/test/cmd/uninstall.py | 33 ++-- lib/spack/spack/test/cmd/url.py | 72 +++---- lib/spack/spack/test/conftest.py | 47 ++++- lib/spack/spack/test/install.py | 70 +------ var/spack/repos/builtin.mock/packages/a/package.py | 2 +- .../builtin.mock/packages/libdwarf/package.py | 2 +- .../repos/builtin.mock/packages/libelf/package.py | 9 +- 13 files changed, 299 insertions(+), 398 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index f691038734..edeaa677de 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -75,7 +75,8 @@ def remove_options(parser, *options): break -def get_cmd_function_name(name): +def get_python_name(name): + """Commands can have '-' in their names, unlike Python identifiers.""" return name.replace("-", "_") @@ -89,7 +90,7 @@ def get_module(name): attr_setdefault(module, SETUP_PARSER, lambda *args: None) # null-op attr_setdefault(module, DESCRIPTION, "") - fn_name = get_cmd_function_name(name) + fn_name = get_python_name(name) if not hasattr(module, fn_name): tty.die("Command module %s (%s) must define function '%s'." % (module.__name__, module.__file__, fn_name)) @@ -99,7 +100,8 @@ def get_module(name): def get_command(name): """Imports the command's function from a module and returns it.""" - return getattr(get_module(name), get_cmd_function_name(name)) + python_name = get_python_name(name) + return getattr(get_module(python_name), python_name) def parse_specs(args, **kwargs): diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index 3ae8403bcf..2d5648f13e 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -34,6 +34,7 @@ import os import inspect import pstats import argparse +import tempfile import llnl.util.tty as tty from llnl.util.tty.color import * @@ -236,10 +237,14 @@ class SpackArgumentParser(argparse.ArgumentParser): def add_command(self, name): """Add one subcommand to this parser.""" + # convert CLI command name to python module name + name = spack.cmd.get_python_name(name) + # lazily initialize any subparsers if not hasattr(self, 'subparsers'): # remove the dummy "command" argument. - self._remove_action(self._actions[-1]) + if self._actions[-1].dest == 'command': + self._remove_action(self._actions[-1]) self.subparsers = self.add_subparsers(metavar='COMMAND', dest="command") @@ -322,7 +327,7 @@ def setup_main_options(args): def allows_unknown_args(command): - """This is a basic argument injection test. + """Implements really simple argument injection for unknown arguments. Commands may add an optional argument called "unknown args" to indicate they can handle unknonwn args, and we'll pass the unknown @@ -334,7 +339,89 @@ def allows_unknown_args(command): return (argcount == 3 and varnames[2] == 'unknown_args') +def _invoke_spack_command(command, parser, args, unknown_args): + """Run a spack command *without* setting spack global options.""" + if allows_unknown_args(command): + return_val = command(parser, args, unknown_args) + else: + if unknown_args: + tty.die('unrecognized arguments: %s' % ' '.join(unknown_args)) + return_val = command(parser, args) + + # Allow commands to return and error code if they want + return 0 if return_val is None else return_val + + +class SpackCommand(object): + """Callable object that invokes a spack command (for testing). + + Example usage:: + + install = SpackCommand('install') + install('-v', 'mpich') + + Use this to invoke Spack commands directly from Python and check + their stdout and stderr. + """ + def __init__(self, command, fail_on_error=True): + """Create a new SpackCommand that invokes ``command`` when called.""" + self.parser = make_argument_parser() + self.parser.add_command(command) + self.command_name = command + self.command = spack.cmd.get_command(command) + self.fail_on_error = fail_on_error + + def __call__(self, *argv): + """Invoke this SpackCommand. + + Args: + argv (list of str): command line arguments. + + Returns: + (str, str): output and error as a strings + + On return, if ``fail_on_error`` is False, return value of comman + is set in ``returncode`` property. Otherwise, raise an error. + """ + args, unknown = self.parser.parse_known_args( + [self.command_name] + list(argv)) + + out, err = sys.stdout, sys.stderr + ofd, ofn = tempfile.mkstemp() + efd, efn = tempfile.mkstemp() + + try: + sys.stdout = open(ofn, 'w') + sys.stderr = open(efn, 'w') + self.returncode = _invoke_spack_command( + self.command, self.parser, args, unknown) + + except SystemExit as e: + self.returncode = e.code + + finally: + sys.stdout.flush() + sys.stdout.close() + sys.stderr.flush() + sys.stderr.close() + sys.stdout, sys.stderr = out, err + + return_out = open(ofn).read() + return_err = open(efn).read() + os.unlink(ofn) + os.unlink(efn) + + if self.fail_on_error and self.returncode != 0: + raise SpackCommandError( + "Command exited with code %d: %s(%s)" % ( + self.returncode, self.command_name, + ', '.join("'%s'" % a for a in argv))) + + return return_out, return_err + + def _main(command, parser, args, unknown_args): + """Run a spack command *and* set spack globaloptions.""" # many operations will fail without a working directory. set_working_dir() @@ -345,12 +432,7 @@ def _main(command, parser, args, unknown_args): # Now actually execute the command try: - if allows_unknown_args(command): - return_val = command(parser, args, unknown_args) - else: - if unknown_args: - tty.die('unrecognized arguments: %s' % ' '.join(unknown_args)) - return_val = command(parser, args) + return _invoke_spack_command(command, parser, args, unknown_args) except SpackError as e: e.die() # gracefully die on any SpackErrors except Exception as e: @@ -361,9 +443,6 @@ def _main(command, parser, args, unknown_args): sys.stderr.write('\n') tty.die("Keyboard interrupt.") - # Allow commands to return and error code if they want - return 0 if return_val is None else return_val - def _profile_wrapper(command, parser, args, unknown_args): import cProfile @@ -431,7 +510,7 @@ def main(argv=None): # Try to load the particular command the caller asked for. If there # is no module for it, just die. - command_name = args.command[0].replace('-', '_') + command_name = spack.cmd.get_python_name(args.command[0]) try: parser.add_command(command_name) except ImportError: @@ -465,3 +544,7 @@ def main(argv=None): except SystemExit as e: return e.code + + +class SpackCommandError(Exception): + """Raised when SpackCommand execution fails.""" diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py index 189c827d05..97f7accd60 100644 --- a/lib/spack/spack/test/cmd/gpg.py +++ b/lib/spack/spack/test/cmd/gpg.py @@ -22,13 +22,12 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse import os import pytest import spack -import spack.cmd.gpg as gpg import spack.util.gpg as gpg_util +from spack.main import SpackCommand from spack.util.executable import ProcessError @@ -40,6 +39,19 @@ def testing_gpg_directory(tmpdir): gpg_util.GNUPGHOME = old_gpg_path +@pytest.fixture(scope='function') +def mock_gpg_config(): + orig_gpg_keys_path = spack.gpg_keys_path + spack.gpg_keys_path = spack.mock_gpg_keys_path + yield + spack.gpg_keys_path = orig_gpg_keys_path + + +@pytest.fixture(scope='function') +def gpg(): + return SpackCommand('gpg') + + def has_gnupg2(): try: gpg_util.Gpg.gpg()('--version', output=os.devnull) @@ -48,45 +60,31 @@ def has_gnupg2(): return False -@pytest.mark.usefixtures('testing_gpg_directory') +@pytest.mark.xfail # TODO: fix failing tests. @pytest.mark.skipif(not has_gnupg2(), reason='These tests require gnupg2') -def test_gpg(tmpdir): - parser = argparse.ArgumentParser() - gpg.setup_parser(parser) - +def test_gpg(gpg, tmpdir, testing_gpg_directory, mock_gpg_config): # Verify a file with an empty keyring. - args = parser.parse_args(['verify', os.path.join( - spack.mock_gpg_data_path, 'content.txt')]) with pytest.raises(ProcessError): - gpg.gpg(parser, args) + gpg('verify', os.path.join(spack.mock_gpg_data_path, 'content.txt')) # Import the default key. - args = parser.parse_args(['init']) - args.import_dir = spack.mock_gpg_keys_path - gpg.gpg(parser, args) + gpg('init') # List the keys. # TODO: Test the output here. - args = parser.parse_args(['list', '--trusted']) - gpg.gpg(parser, args) - args = parser.parse_args(['list', '--signing']) - gpg.gpg(parser, args) + gpg('list', '--trusted') + gpg('list', '--signing') # Verify the file now that the key has been trusted. - args = parser.parse_args(['verify', os.path.join( - spack.mock_gpg_data_path, 'content.txt')]) - gpg.gpg(parser, args) + gpg('verify', os.path.join(spack.mock_gpg_data_path, 'content.txt')) # Untrust the default key. - args = parser.parse_args(['untrust', 'Spack testing']) - gpg.gpg(parser, args) + gpg('untrust', 'Spack testing') # Now that the key is untrusted, verification should fail. - args = parser.parse_args(['verify', os.path.join( - spack.mock_gpg_data_path, 'content.txt')]) with pytest.raises(ProcessError): - gpg.gpg(parser, args) + gpg('verify', os.path.join(spack.mock_gpg_data_path, 'content.txt')) # Create a file to test signing. test_path = tmpdir.join('to-sign.txt') @@ -94,88 +92,71 @@ def test_gpg(tmpdir): fout.write('Test content for signing.\n') # Signing without a private key should fail. - args = parser.parse_args(['sign', str(test_path)]) with pytest.raises(RuntimeError) as exc_info: - gpg.gpg(parser, args) + gpg('sign', str(test_path)) assert exc_info.value.args[0] == 'no signing keys are available' # Create a key for use in the tests. keypath = tmpdir.join('testing-1.key') - args = parser.parse_args(['create', - '--comment', 'Spack testing key', - '--export', str(keypath), - 'Spack testing 1', - 'spack@googlegroups.com']) - gpg.gpg(parser, args) + gpg('create', + '--comment', 'Spack testing key', + '--export', str(keypath), + 'Spack testing 1', + 'spack@googlegroups.com') keyfp = gpg_util.Gpg.signing_keys()[0] # List the keys. # TODO: Test the output here. - args = parser.parse_args(['list', '--trusted']) - gpg.gpg(parser, args) - args = parser.parse_args(['list', '--signing']) - gpg.gpg(parser, args) + gpg('list', '--trusted') + gpg('list', '--signing') # Signing with the default (only) key. - args = parser.parse_args(['sign', str(test_path)]) - gpg.gpg(parser, args) + gpg('sign', str(test_path)) # Verify the file we just verified. - args = parser.parse_args(['verify', str(test_path)]) - gpg.gpg(parser, args) + gpg('verify', str(test_path)) # Export the key for future use. export_path = tmpdir.join('export.testing.key') - args = parser.parse_args(['export', str(export_path)]) - gpg.gpg(parser, args) + gpg('export', str(export_path)) # Create a second key for use in the tests. - args = parser.parse_args(['create', - '--comment', 'Spack testing key', - 'Spack testing 2', - 'spack@googlegroups.com']) - gpg.gpg(parser, args) + gpg('create', + '--comment', 'Spack testing key', + 'Spack testing 2', + 'spack@googlegroups.com') # List the keys. # TODO: Test the output here. - args = parser.parse_args(['list', '--trusted']) - gpg.gpg(parser, args) - args = parser.parse_args(['list', '--signing']) - gpg.gpg(parser, args) + gpg('list', '--trusted') + gpg('list', '--signing') test_path = tmpdir.join('to-sign-2.txt') with open(str(test_path), 'w+') as fout: fout.write('Test content for signing.\n') # Signing with multiple signing keys is ambiguous. - args = parser.parse_args(['sign', str(test_path)]) with pytest.raises(RuntimeError) as exc_info: - gpg.gpg(parser, args) + gpg('sign', str(test_path)) assert exc_info.value.args[0] == \ 'multiple signing keys are available; please choose one' # Signing with a specified key. - args = parser.parse_args(['sign', '--key', keyfp, str(test_path)]) - gpg.gpg(parser, args) + gpg('sign', '--key', keyfp, str(test_path)) # Untrusting signing keys needs a flag. - args = parser.parse_args(['untrust', 'Spack testing 1']) with pytest.raises(ProcessError): - gpg.gpg(parser, args) + gpg('untrust', 'Spack testing 1') # Untrust the key we created. - args = parser.parse_args(['untrust', '--signing', keyfp]) - gpg.gpg(parser, args) + gpg('untrust', '--signing', keyfp) # Verification should now fail. - args = parser.parse_args(['verify', str(test_path)]) with pytest.raises(ProcessError): - gpg.gpg(parser, args) + gpg('verify', str(test_path)) # Trust the exported key. - args = parser.parse_args(['trust', str(export_path)]) - gpg.gpg(parser, args) + gpg('trust', str(export_path)) # Verification should now succeed again. - args = parser.parse_args(['verify', str(test_path)]) - gpg.gpg(parser, args) + gpg('verify', str(test_path)) diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 7f9db1baa2..951d9d85d7 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -22,194 +22,45 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse -import codecs -import collections -import contextlib -import unittest -from six import StringIO +from spack.main import SpackCommand -import llnl.util.filesystem -import spack -import spack.cmd -import spack.cmd.install as install -FILE_REGISTRY = collections.defaultdict(StringIO) +install = SpackCommand('install') -# Monkey-patch open to write module files to a StringIO instance -@contextlib.contextmanager -def mock_open(filename, mode, *args): - if not mode == 'wb': - message = 'test.test_install : unexpected opening mode for mock_open' - raise RuntimeError(message) +def _install_package_and_dependency( + tmpdir, builtin_mock, mock_archive, mock_fetch, config, + install_mockery): - FILE_REGISTRY[filename] = StringIO() + tmpdir.chdir() + install('--log-format=junit', '--log-file=test.xml', 'libdwarf') - try: - yield FILE_REGISTRY[filename] - finally: - handle = FILE_REGISTRY[filename] - FILE_REGISTRY[filename] = handle.getvalue() - handle.close() + files = tmpdir.listdir() + filename = tmpdir.join('test.xml') + assert filename in files + content = filename.open().read() + assert 'tests="2"' in content + assert 'failures="0"' in content + assert 'errors="0"' in content -class MockSpec(object): - def __init__(self, name, version, hashStr=None): - self._dependencies = {} - self.name = name - self.version = version - self.hash = hashStr if hashStr else hash((name, version)) +def test_install_package_already_installed( + tmpdir, builtin_mock, mock_archive, mock_fetch, config, + install_mockery): - def _deptype_norm(self, deptype): - if deptype is None: - return spack.alldeps - # Force deptype to be a tuple so that we can do set intersections. - if isinstance(deptype, str): - return (deptype,) - return deptype + tmpdir.chdir() + install('libdwarf') + install('--log-format=junit', '--log-file=test.xml', 'libdwarf') - def _find_deps(self, where, deptype): - deptype = self._deptype_norm(deptype) + files = tmpdir.listdir() + filename = tmpdir.join('test.xml') + assert filename in files - return [dep.spec - for dep in where.values() - if deptype and any(d in deptype for d in dep.deptypes)] + content = filename.open().read() + assert 'tests="2"' in content + assert 'failures="0"' in content + assert 'errors="0"' in content - def dependencies(self, deptype=None): - return self._find_deps(self._dependencies, deptype) - - def dependents(self, deptype=None): - return self._find_deps(self._dependents, deptype) - - def traverse(self, order=None): - for _, spec in self._dependencies.items(): - yield spec.spec - yield self - - def dag_hash(self): - return self.hash - - @property - def short_spec(self): - return '-'.join([self.name, str(self.version), str(self.hash)]) - - -class MockPackage(object): - - def __init__(self, spec, buildLogPath): - self.name = spec.name - self.spec = spec - self.installed = False - self.build_log_path = buildLogPath - - def do_install(self, *args, **kwargs): - for x in self.spec.dependencies(): - x.package.do_install(*args, **kwargs) - self.installed = True - - -class MockPackageDb(object): - - def __init__(self, init=None): - self.specToPkg = {} - if init: - self.specToPkg.update(init) - - def get(self, spec): - return self.specToPkg[spec] - - -def mock_fetch_log(path): - return [] - - -specX = MockSpec('X', '1.2.0') -specY = MockSpec('Y', '2.3.8') -specX._dependencies['Y'] = spack.spec.DependencySpec( - specX, specY, spack.alldeps) -pkgX = MockPackage(specX, 'logX') -pkgY = MockPackage(specY, 'logY') -specX.package = pkgX -specY.package = pkgY - - -# TODO: add test(s) where Y fails to install -class InstallTestJunitLog(unittest.TestCase): - """Tests test-install where X->Y""" - - def setUp(self): - super(InstallTestJunitLog, self).setUp() - install.PackageBase = MockPackage - # Monkey patch parse specs - - def monkey_parse_specs(x, concretize): - if x == ['X']: - return [specX] - elif x == ['Y']: - return [specY] - return [] - - self.parse_specs = spack.cmd.parse_specs - spack.cmd.parse_specs = monkey_parse_specs - - # Monkey patch os.mkdirp - self.mkdirp = llnl.util.filesystem.mkdirp - llnl.util.filesystem.mkdirp = lambda x: True - - # Monkey patch open - self.codecs_open = codecs.open - codecs.open = mock_open - - # Clean FILE_REGISTRY - FILE_REGISTRY.clear() - - pkgX.installed = False - pkgY.installed = False - - # Monkey patch pkgDb - self.saved_db = spack.repo - pkgDb = MockPackageDb({specX: pkgX, specY: pkgY}) - spack.repo = pkgDb - - def tearDown(self): - # Remove the monkey patched test_install.open - codecs.open = self.codecs_open - - # Remove the monkey patched os.mkdir - llnl.util.filesystem.mkdirp = self.mkdirp - del self.mkdirp - - # Remove the monkey patched parse_specs - spack.cmd.parse_specs = self.parse_specs - del self.parse_specs - super(InstallTestJunitLog, self).tearDown() - - spack.repo = self.saved_db - - def test_installing_both(self): - parser = argparse.ArgumentParser() - install.setup_parser(parser) - args = parser.parse_args(['--log-format=junit', 'X']) - install.install(parser, args) - self.assertEqual(len(FILE_REGISTRY), 1) - for _, content in FILE_REGISTRY.items(): - self.assertTrue('tests="2"' in content) - self.assertTrue('failures="0"' in content) - self.assertTrue('errors="0"' in content) - - def test_dependency_already_installed(self): - pkgX.installed = True - pkgY.installed = True - parser = argparse.ArgumentParser() - install.setup_parser(parser) - args = parser.parse_args(['--log-format=junit', 'X']) - install.install(parser, args) - self.assertEqual(len(FILE_REGISTRY), 1) - for _, content in FILE_REGISTRY.items(): - self.assertTrue('tests="2"' in content) - self.assertTrue('failures="0"' in content) - self.assertTrue('errors="0"' in content) - self.assertEqual( - sum('skipped' in line for line in content.split('\n')), 2) + skipped = [line for line in content.split('\n') if 'skipped' in line] + assert len(skipped) == 2 diff --git a/lib/spack/spack/test/cmd/module.py b/lib/spack/spack/test/cmd/module.py index 8d15afdd0c..b8f24856be 100644 --- a/lib/spack/spack/test/cmd/module.py +++ b/lib/spack/spack/test/cmd/module.py @@ -70,15 +70,20 @@ def test_remove_and_add_tcl(database, parser): # Remove existing modules [tcl] args = parser.parse_args(['rm', '-y', 'mpileaks']) module_files = _get_module_files(args) + for item in module_files: assert os.path.exists(item) + module.module(parser, args) + for item in module_files: assert not os.path.exists(item) # Add them back [tcl] args = parser.parse_args(['refresh', '-y', 'mpileaks']) + module.module(parser, args) + for item in module_files: assert os.path.exists(item) diff --git a/lib/spack/spack/test/cmd/python.py b/lib/spack/spack/test/cmd/python.py index 5ad8456e49..5e3ea83053 100644 --- a/lib/spack/spack/test/cmd/python.py +++ b/lib/spack/spack/test/cmd/python.py @@ -22,22 +22,12 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse -import pytest +import spack +from spack.main import SpackCommand -from spack.cmd.python import * +python = SpackCommand('python') -@pytest.fixture(scope='module') -def parser(): - """Returns the parser for the ``python`` command""" - parser = argparse.ArgumentParser() - setup_parser(parser) - return parser - - -def test_python(parser): - args = parser.parse_args([ - '-c', 'import spack; print(spack.spack_version)' - ]) - python(parser, args) +def test_python(): + out, err = python('-c', 'import spack; print(spack.spack_version)') + assert out.strip() == str(spack.spack_version) diff --git a/lib/spack/spack/test/cmd/uninstall.py b/lib/spack/spack/test/cmd/uninstall.py index a47c76715b..72dda23f93 100644 --- a/lib/spack/spack/test/cmd/uninstall.py +++ b/lib/spack/spack/test/cmd/uninstall.py @@ -24,7 +24,9 @@ ############################################################################## import pytest import spack.store -import spack.cmd.uninstall +from spack.main import SpackCommand, SpackCommandError + +uninstall = SpackCommand('uninstall') class MockArgs(object): @@ -37,20 +39,21 @@ class MockArgs(object): self.yes_to_all = True -def test_uninstall(database): - parser = None - uninstall = spack.cmd.uninstall.uninstall - # Multiple matches - args = MockArgs(['mpileaks']) - with pytest.raises(SystemExit): - uninstall(parser, args) - # Installed dependents - args = MockArgs(['libelf']) - with pytest.raises(SystemExit): - uninstall(parser, args) - # Recursive uninstall - args = MockArgs(['callpath'], all=True, dependents=True) - uninstall(parser, args) +def test_multiple_matches(database): + """Test unable to uninstall when multiple matches.""" + with pytest.raises(SpackCommandError): + uninstall('-y', 'mpileaks') + + +def test_installed_dependents(database): + """Test can't uninstall when ther are installed dependents.""" + with pytest.raises(SpackCommandError): + uninstall('-y', 'libelf') + + +def test_recursive_uninstall(database): + """Test recursive uninstall.""" + uninstall('-y', '-a', '--dependents', 'callpath') all_specs = spack.store.layout.all_specs() assert len(all_specs) == 8 diff --git a/lib/spack/spack/test/cmd/url.py b/lib/spack/spack/test/cmd/url.py index ae585b328f..21f88e928b 100644 --- a/lib/spack/spack/test/cmd/url.py +++ b/lib/spack/spack/test/cmd/url.py @@ -22,18 +22,13 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import argparse +import re import pytest - +from spack.url import UndetectableVersionError +from spack.main import SpackCommand from spack.cmd.url import * - -@pytest.fixture(scope='module') -def parser(): - """Returns the parser for the ``url`` command""" - parser = argparse.ArgumentParser() - setup_parser(parser) - return parser +url = SpackCommand('url') class MyPackage: @@ -77,51 +72,64 @@ def test_version_parsed_correctly(): assert not version_parsed_correctly(MyPackage('', ['0.18.0']), 'oce-0.18.0') # noqa -def test_url_parse(parser): - args = parser.parse_args(['parse', 'http://zlib.net/fossils/zlib-1.2.10.tar.gz']) - url(parser, args) +def test_url_parse(): + url('parse', 'http://zlib.net/fossils/zlib-1.2.10.tar.gz') -@pytest.mark.xfail -def test_url_parse_xfail(parser): +def test_url_with_no_version_fails(): # No version in URL - args = parser.parse_args(['parse', 'http://www.netlib.org/voronoi/triangle.zip']) - url(parser, args) + with pytest.raises(UndetectableVersionError): + url('parse', 'http://www.netlib.org/voronoi/triangle.zip') -def test_url_list(parser): - args = parser.parse_args(['list']) - total_urls = url_list(args) +def test_url_list(): + out, err = url('list') + total_urls = len(out.split('\n')) # The following two options should not change the number of URLs printed. - args = parser.parse_args(['list', '--color', '--extrapolation']) - colored_urls = url_list(args) + out, err = url('list', '--color', '--extrapolation') + colored_urls = len(out.split('\n')) assert colored_urls == total_urls # The following options should print fewer URLs than the default. # If they print the same number of URLs, something is horribly broken. # If they say we missed 0 URLs, something is probably broken too. - args = parser.parse_args(['list', '--incorrect-name']) - incorrect_name_urls = url_list(args) + out, err = url('list', '--incorrect-name') + incorrect_name_urls = len(out.split('\n')) assert 0 < incorrect_name_urls < total_urls - args = parser.parse_args(['list', '--incorrect-version']) - incorrect_version_urls = url_list(args) + out, err = url('list', '--incorrect-version') + incorrect_version_urls = len(out.split('\n')) assert 0 < incorrect_version_urls < total_urls - args = parser.parse_args(['list', '--correct-name']) - correct_name_urls = url_list(args) + out, err = url('list', '--correct-name') + correct_name_urls = len(out.split('\n')) assert 0 < correct_name_urls < total_urls - args = parser.parse_args(['list', '--correct-version']) - correct_version_urls = url_list(args) + out, err = url('list', '--correct-version') + correct_version_urls = len(out.split('\n')) assert 0 < correct_version_urls < total_urls -def test_url_summary(parser): - args = parser.parse_args(['summary']) +def test_url_summary(): + """Test the URL summary command.""" + # test url_summary, the internal function that does the work (total_urls, correct_names, correct_versions, - name_count_dict, version_count_dict) = url_summary(args) + name_count_dict, version_count_dict) = url_summary(None) assert 0 < correct_names <= sum(name_count_dict.values()) <= total_urls # noqa assert 0 < correct_versions <= sum(version_count_dict.values()) <= total_urls # noqa + + # make sure it agrees with the actual command. + out, err = url('summary') + out_total_urls = int( + re.search(r'Total URLs found:\s*(\d+)', out).group(1)) + assert out_total_urls == total_urls + + out_correct_names = int( + re.search(r'Names correctly parsed:\s*(\d+)', out).group(1)) + assert out_correct_names == correct_names + + out_correct_versions = int( + re.search(r'Versions correctly parsed:\s*(\d+)', out).group(1)) + assert out_correct_versions == correct_versions diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index c23fb466a5..e0a745c7e9 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -35,16 +35,18 @@ import ordereddict_backport import py import pytest + import spack import spack.architecture import spack.database import spack.directory_layout -import spack.fetch_strategy import spack.platforms.test import spack.repository import spack.stage import spack.util.executable import spack.util.pattern +from spack.package import PackageBase +from spack.fetch_strategy import * ########## @@ -78,12 +80,10 @@ def mock_fetch_cache(monkeypatch): pass def fetch(self): - raise spack.fetch_strategy.FetchError( - 'Mock cache always fails for tests' - ) + raise FetchError('Mock cache always fails for tests') def __str__(self): - return "[mock fetcher]" + return "[mock fetch cache]" monkeypatch.setattr(spack, 'fetch_cache', MockCache()) @@ -287,6 +287,43 @@ def refresh_db_on_exit(database): yield database.refresh() + +@pytest.fixture() +def install_mockery(tmpdir, config, builtin_mock): + """Hooks a fake install directory and a fake db into Spack.""" + layout = spack.store.layout + db = spack.store.db + # Use a fake install directory to avoid conflicts bt/w + # installed pkgs and mock packages. + spack.store.layout = spack.directory_layout.YamlDirectoryLayout( + str(tmpdir)) + spack.store.db = spack.database.Database(str(tmpdir)) + # We use a fake package, so skip the checksum. + spack.do_checksum = False + yield + # Turn checksumming back on + spack.do_checksum = True + # Restore Spack's layout. + spack.store.layout = layout + spack.store.db = db + + +@pytest.fixture() +def mock_fetch(mock_archive): + """Fake the URL for a package so it downloads from a file.""" + fetcher = FetchStrategyComposite() + fetcher.append(URLFetchStrategy(mock_archive.url)) + + @property + def fake_fn(self): + return fetcher + + orig_fn = PackageBase.fetcher + PackageBase.fetcher = fake_fn + yield + PackageBase.fetcher = orig_fn + + ########## # Fake archives and repositories ########## diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index 3a934d5ea2..278b2efb70 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -22,45 +22,15 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import os import pytest + import spack import spack.store -from spack.database import Database -from spack.directory_layout import YamlDirectoryLayout -from spack.fetch_strategy import URLFetchStrategy, FetchStrategyComposite from spack.spec import Spec -import os - -@pytest.fixture() -def install_mockery(tmpdir, config, builtin_mock): - """Hooks a fake install directory and a fake db into Spack.""" - layout = spack.store.layout - db = spack.store.db - # Use a fake install directory to avoid conflicts bt/w - # installed pkgs and mock packages. - spack.store.layout = YamlDirectoryLayout(str(tmpdir)) - spack.store.db = Database(str(tmpdir)) - # We use a fake package, so skip the checksum. - spack.do_checksum = False - yield - # Turn checksumming back on - spack.do_checksum = True - # Restore Spack's layout. - spack.store.layout = layout - spack.store.db = db - - -def fake_fetchify(url, pkg): - """Fake the URL for a package so it downloads from a file.""" - fetcher = FetchStrategyComposite() - fetcher.append(URLFetchStrategy(url)) - pkg.fetcher = fetcher - - -@pytest.mark.usefixtures('install_mockery') -def test_install_and_uninstall(mock_archive): +def test_install_and_uninstall(install_mockery, mock_fetch): # Get a basic concrete spec for the trivial install package. spec = Spec('trivial-install-test-package') spec.concretize() @@ -69,8 +39,6 @@ def test_install_and_uninstall(mock_archive): # Get the package pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) - try: pkg.do_install() pkg.do_uninstall() @@ -114,12 +82,10 @@ class MockStage(object): return getattr(self.wrapped_stage, attr) -@pytest.mark.usefixtures('install_mockery') -def test_partial_install_delete_prefix_and_stage(mock_archive): +def test_partial_install_delete_prefix_and_stage(install_mockery, mock_fetch): spec = Spec('canfail') spec.concretize() pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) remove_prefix = spack.package.Package.remove_prefix instance_rm_prefix = pkg.remove_prefix @@ -145,14 +111,12 @@ def test_partial_install_delete_prefix_and_stage(mock_archive): pass -@pytest.mark.usefixtures('install_mockery') -def test_partial_install_keep_prefix(mock_archive): +def test_partial_install_keep_prefix(install_mockery, mock_fetch): spec = Spec('canfail') spec.concretize() pkg = spack.repo.get(spec) # Normally the stage should start unset, but other tests set it pkg._stage = None - fake_fetchify(mock_archive.url, pkg) remove_prefix = spack.package.Package.remove_prefix try: # If remove_prefix is called at any point in this test, that is an @@ -175,12 +139,10 @@ def test_partial_install_keep_prefix(mock_archive): pass -@pytest.mark.usefixtures('install_mockery') -def test_second_install_no_overwrite_first(mock_archive): +def test_second_install_no_overwrite_first(install_mockery, mock_fetch): spec = Spec('canfail') spec.concretize() pkg = spack.repo.get(spec) - fake_fetchify(mock_archive.url, pkg) remove_prefix = spack.package.Package.remove_prefix try: spack.package.Package.remove_prefix = mock_remove_prefix @@ -198,28 +160,14 @@ def test_second_install_no_overwrite_first(mock_archive): pass -@pytest.mark.usefixtures('install_mockery') -def test_store(mock_archive): +def test_store(install_mockery, mock_fetch): spec = Spec('cmake-client').concretized() - - for s in spec.traverse(): - fake_fetchify(mock_archive.url, s.package) - pkg = spec.package - try: - pkg.do_install() - except Exception: - pkg.remove_prefix() - raise + pkg.do_install() -@pytest.mark.usefixtures('install_mockery') -def test_failing_build(mock_archive): +def test_failing_build(install_mockery, mock_fetch): spec = Spec('failing-build').concretized() - - for s in spec.traverse(): - fake_fetchify(mock_archive.url, s.package) - pkg = spec.package with pytest.raises(spack.build_environment.ChildError): pkg.do_install() diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index 59d8b9e330..e2fa6c35b0 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -26,7 +26,7 @@ from spack import * class A(AutotoolsPackage): - """Simple package with no dependencies""" + """Simple package with one optional dependency""" homepage = "http://www.example.com" url = "http://www.example.com/a-1.0.tar.gz" diff --git a/var/spack/repos/builtin.mock/packages/libdwarf/package.py b/var/spack/repos/builtin.mock/packages/libdwarf/package.py index 10d6fa8e88..0cdbaf2a33 100644 --- a/var/spack/repos/builtin.mock/packages/libdwarf/package.py +++ b/var/spack/repos/builtin.mock/packages/libdwarf/package.py @@ -41,4 +41,4 @@ class Libdwarf(Package): depends_on("libelf") def install(self, spec, prefix): - pass + touch(prefix.libdwarf) diff --git a/var/spack/repos/builtin.mock/packages/libelf/package.py b/var/spack/repos/builtin.mock/packages/libelf/package.py index 3a2fe603ef..0390963081 100644 --- a/var/spack/repos/builtin.mock/packages/libelf/package.py +++ b/var/spack/repos/builtin.mock/packages/libelf/package.py @@ -34,11 +34,4 @@ class Libelf(Package): version('0.8.10', '9db4d36c283d9790d8fa7df1f4d7b4d9') def install(self, spec, prefix): - configure("--prefix=%s" % prefix, - "--enable-shared", - "--disable-dependency-tracking", - "--disable-debug") - make() - - # The mkdir commands in libelf's intsall can fail in parallel - make("install", parallel=False) + touch(prefix.libelf) -- cgit v1.2.3-70-g09d2 From 250ee413e9f37e36e91ccc5ffec8fb294faf1620 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 24 Jul 2017 15:02:13 -0500 Subject: Change Version formatting properties and functions to return Version objects (#4834) * Change version.up_to() to return Version() object * Add unit tests for Version.up_to() * Fix packages that expected up_to() to return a string * Ensure that up_to() preserves separator characters * Use version indexing instead of up_to * Make all Version formatting properties return Version objects * Update docs * Tests need to test string representation --- lib/spack/docs/packaging_guide.rst | 15 ++++ lib/spack/spack/test/versions.py | 56 ++++++++++++--- lib/spack/spack/version.py | 82 ++++++++++++++++++---- var/spack/repos/builtin/packages/lua/package.py | 4 +- var/spack/repos/builtin/packages/magics/package.py | 2 +- var/spack/repos/builtin/packages/qt/package.py | 4 +- .../repos/builtin/packages/sublime-text/package.py | 2 +- 7 files changed, 138 insertions(+), 27 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index b90a0eea17..e4b10cdf53 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -490,6 +490,21 @@ version.joined 123 Python properties don't need parentheses. ``version.dashed`` is correct. ``version.dashed()`` is incorrect. +In addition, these version properties can be combined with ``up_to()``. +For example: + +.. code-block:: python + + >>> version = Version('1.2.3') + >>> version.up_to(2).dashed + Version('1-2') + >>> version.underscored.up_to(2) + Version('1_2') + + +As you can see, order is not important. Just keep in mind that ``up_to()`` and +the other version properties return ``Version`` objects, not strings. + If a URL cannot be derived systematically, or there is a special URL for one of its versions, you can add an explicit URL for a particular version: diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index 3b04e1d4aa..72292e4dcd 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -204,6 +204,8 @@ def test_underscores(): assert_ver_eq('2_0', '2_0') assert_ver_eq('2.0', '2_0') assert_ver_eq('2_0', '2.0') + assert_ver_eq('2-0', '2_0') + assert_ver_eq('2_0', '2-0') def test_rpm_oddities(): @@ -426,20 +428,56 @@ def test_satisfaction_with_lists(): def test_formatted_strings(): - versions = '1.2.3', '1_2_3', '1-2-3' + versions = ( + '1.2.3b', '1_2_3b', '1-2-3b', + '1.2-3b', '1.2_3b', '1-2.3b', + '1-2_3b', '1_2.3b', '1_2-3b' + ) for item in versions: v = Version(item) - assert v.dotted == '1.2.3' - assert v.dashed == '1-2-3' - assert v.underscored == '1_2_3' - assert v.joined == '123' + assert v.dotted.string == '1.2.3b' + assert v.dashed.string == '1-2-3b' + assert v.underscored.string == '1_2_3b' + assert v.joined.string == '123b' + + assert v.dotted.dashed.string == '1-2-3b' + assert v.dotted.underscored.string == '1_2_3b' + assert v.dotted.dotted.string == '1.2.3b' + assert v.dotted.joined.string == '123b' + + +def test_up_to(): + v = Version('1.23-4_5b') + + assert v.up_to(1).string == '1' + assert v.up_to(2).string == '1.23' + assert v.up_to(3).string == '1.23-4' + assert v.up_to(4).string == '1.23-4_5' + assert v.up_to(5).string == '1.23-4_5b' + + assert v.up_to(-1).string == '1.23-4_5' + assert v.up_to(-2).string == '1.23-4' + assert v.up_to(-3).string == '1.23' + assert v.up_to(-4).string == '1' + + assert v.up_to(2).dotted.string == '1.23' + assert v.up_to(2).dashed.string == '1-23' + assert v.up_to(2).underscored.string == '1_23' + assert v.up_to(2).joined.string == '123' + + assert v.dotted.up_to(2).string == '1.23' == v.up_to(2).dotted.string + assert v.dashed.up_to(2).string == '1-23' == v.up_to(2).dashed.string + assert v.underscored.up_to(2).string == '1_23' + assert v.up_to(2).underscored.string == '1_23' + + assert v.up_to(2).up_to(1).string == '1' def test_repr_and_str(): def check_repr_and_str(vrs): a = Version(vrs) - assert repr(a) == 'Version(\'' + vrs + '\')' + assert repr(a) == "Version('" + vrs + "')" b = eval(repr(a)) assert a == b assert str(a) == vrs @@ -457,17 +495,17 @@ def test_get_item(): b = a[0:2] assert isinstance(b, Version) assert b == Version('0.1') - assert repr(b) == 'Version(\'0.1\')' + assert repr(b) == "Version('0.1')" assert str(b) == '0.1' b = a[0:3] assert isinstance(b, Version) assert b == Version('0.1_2') - assert repr(b) == 'Version(\'0.1_2\')' + assert repr(b) == "Version('0.1_2')" assert str(b) == '0.1_2' b = a[1:] assert isinstance(b, Version) assert b == Version('1_2-3') - assert repr(b) == 'Version(\'1_2-3\')' + assert repr(b) == "Version('1_2-3')" assert str(b) == '1_2-3' # Raise TypeError on tuples with pytest.raises(TypeError): diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 10fac49e9d..0d8520a0e0 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -130,30 +130,90 @@ class Version(object): self.version = tuple(int_if_int(seg) for seg in segments) # Store the separators from the original version string as well. - # last element of separators is '' - self.separators = tuple(re.split(segment_regex, string)[1:-1]) + self.separators = tuple(re.split(segment_regex, string)[1:]) @property def dotted(self): - return '.'.join(str(x) for x in self.version) + """The dotted representation of the version. + + Example: + >>> version = Version('1-2-3b') + >>> version.dotted + Version('1.2.3b') + + Returns: + Version: The version with separator characters replaced by dots + """ + return Version(self.string.replace('-', '.').replace('_', '.')) @property def underscored(self): - return '_'.join(str(x) for x in self.version) + """The underscored representation of the version. + + Example: + >>> version = Version('1.2.3b') + >>> version.underscored + Version('1_2_3b') + + Returns: + Version: The version with separator characters replaced by + underscores + """ + return Version(self.string.replace('.', '_').replace('-', '_')) @property def dashed(self): - return '-'.join(str(x) for x in self.version) + """The dashed representation of the version. + + Example: + >>> version = Version('1.2.3b') + >>> version.dashed + Version('1-2-3b') + + Returns: + Version: The version with separator characters replaced by dashes + """ + return Version(self.string.replace('.', '-').replace('_', '-')) @property def joined(self): - return ''.join(str(x) for x in self.version) + """The joined representation of the version. + + Example: + >>> version = Version('1.2.3b') + >>> version.joined + Version('123b') + + Returns: + Version: The version with separator characters removed + """ + return Version( + self.string.replace('.', '').replace('-', '').replace('_', '')) def up_to(self, index): - """Return a version string up to the specified component, exclusive. - e.g., if this is 10.8.2, self.up_to(2) will return '10.8'. + """The version up to the specified component. + + Examples: + >>> version = Version('1.23-4b') + >>> version.up_to(1) + Version('1') + >>> version.up_to(2) + Version('1.23') + >>> version.up_to(3) + Version('1.23-4') + >>> version.up_to(4) + Version('1.23-4b') + >>> version.up_to(-1) + Version('1.23-4') + >>> version.up_to(-2) + Version('1.23') + >>> version.up_to(-3) + Version('1') + + Returns: + Version: The first index components of the version """ - return '.'.join(str(x) for x in self[:index]) + return self[:index] def lowest(self): return self @@ -204,11 +264,9 @@ class Version(object): return self.version[idx] elif isinstance(idx, slice): - # Currently len(self.separators) == len(self.version) - 1 - extendend_separators = self.separators + ('',) string_arg = [] - pairs = zip(self.version[idx], extendend_separators[idx]) + pairs = zip(self.version[idx], self.separators[idx]) for token, sep in pairs: string_arg.append(str(token)) string_arg.append(str(sep)) diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py index 0680e1a3b5..ecb2a8b543 100644 --- a/var/spack/repos/builtin/packages/lua/package.py +++ b/var/spack/repos/builtin/packages/lua/package.py @@ -145,11 +145,11 @@ class Lua(Package): @property def lua_lib_dir(self): - return os.path.join('lib', 'lua', self.version.up_to(2)) + return os.path.join('lib', 'lua', str(self.version.up_to(2))) @property def lua_share_dir(self): - return os.path.join('share', 'lua', self.version.up_to(2)) + return os.path.join('share', 'lua', str(self.version.up_to(2))) def setup_dependent_package(self, module, dependent_spec): """ diff --git a/var/spack/repos/builtin/packages/magics/package.py b/var/spack/repos/builtin/packages/magics/package.py index d69dedf3ea..33a6bb5640 100644 --- a/var/spack/repos/builtin/packages/magics/package.py +++ b/var/spack/repos/builtin/packages/magics/package.py @@ -109,7 +109,7 @@ class Magics(Package): if '+metview' in spec: if '+qt' in spec: options.append('-DENABLE_METVIEW=ON') - if spec['qt'].version.up_to(1) == '5': + if spec['qt'].version[0] == 5: options.append('-DENABLE_QT5=ON') else: options.append('-DENABLE_METVIEW_NO_QT=ON') diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index 551f87b5d7..89e821b68f 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -131,9 +131,9 @@ class Qt(Package): url = self.list_url if version >= Version('4.0'): - url += version.up_to(2) + '/' + url += str(version.up_to(2)) + '/' else: - url += version.up_to(1) + '/' + url += str(version.up_to(1)) + '/' if version >= Version('4.8'): url += str(version) + '/' diff --git a/var/spack/repos/builtin/packages/sublime-text/package.py b/var/spack/repos/builtin/packages/sublime-text/package.py index 3d7fb65005..e7605b40be 100644 --- a/var/spack/repos/builtin/packages/sublime-text/package.py +++ b/var/spack/repos/builtin/packages/sublime-text/package.py @@ -49,7 +49,7 @@ class SublimeText(Package): depends_on('libxau', type='run') def url_for_version(self, version): - if version.up_to(1) == '2': + if version[0] == 2: return "https://download.sublimetext.com/Sublime%20Text%20{0}%20x64.tar.bz2".format(version) else: return "https://download.sublimetext.com/sublime_text_3_build_{0}_x64.tar.bz2".format(version) -- cgit v1.2.3-70-g09d2 From 42717bd8e844cc3dbde651cdda99827cf643a45f Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Tue, 25 Jul 2017 13:44:51 -0700 Subject: fix config.guess patch for ppc64le (#4858) * fix config.guess patch for ppc64le * explicit patch for config.guess not required --- lib/spack/spack/build_systems/autotools.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 1ef38ddc2d..230e12e1f8 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -98,7 +98,9 @@ class AutotoolsPackage(PackageBase): @run_after('autoreconf') def _do_patch_config_guess(self): """Some packages ship with an older config.guess and need to have - this updated when installed on a newer architecture.""" + this updated when installed on a newer architecture. In particular, + config.guess fails for PPC64LE for version prior to a 2013-06-10 + build date (automake 1.13.4).""" if not self.patch_config_guess or not self.spec.satisfies( 'arch=linux-rhel7-ppc64le' @@ -190,20 +192,6 @@ class AutotoolsPackage(PackageBase): ' '.join(flag_val[1])) return [] - def patch(self): - """Patches config.guess if - :py:attr:``~.AutotoolsPackage.patch_config_guess`` is True - - :raise RuntimeError: if something goes wrong when patching - ``config.guess`` - """ - - if self.patch_config_guess and self.spec.satisfies( - 'arch=linux-rhel7-ppc64le' - ): - if not self._do_patch_config_guess(): - raise RuntimeError('Failed to find suitable config.guess') - @run_before('autoreconf') def delete_configure_to_force_update(self): if self.force_autoreconf: -- cgit v1.2.3-70-g09d2 From 07aec4366fa8926ee896fdb2f0c5a68dad3267b5 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Tue, 25 Jul 2017 18:34:43 -0500 Subject: Add universal build_type variant to CMakePackage (#4797) * Add universal build_type variant to CMakePackage * Override build_type in some packages with different possible values * Remove reference to no longer existent debug variant * Update CBTF packages with new build_type variant * Keep note on build size of LLVM --- lib/spack/spack/build_systems/cmake.py | 23 ++++++++-------------- .../repos/builtin/packages/alquimia/package.py | 6 ------ .../repos/builtin/packages/benchmark/package.py | 5 +++++ var/spack/repos/builtin/packages/bml/package.py | 9 --------- .../builtin/packages/cbtf-argonavis/package.py | 6 +++--- .../repos/builtin/packages/cbtf-krell/package.py | 5 ++--- .../repos/builtin/packages/cbtf-lanl/package.py | 6 +++--- var/spack/repos/builtin/packages/cbtf/package.py | 5 ++--- var/spack/repos/builtin/packages/clamr/package.py | 13 ------------ var/spack/repos/builtin/packages/clhep/package.py | 9 --------- var/spack/repos/builtin/packages/dealii/package.py | 7 +++---- .../repos/builtin/packages/eccodes/package.py | 3 +++ var/spack/repos/builtin/packages/eigen/package.py | 12 +++-------- .../repos/builtin/packages/elemental/package.py | 14 +++---------- .../repos/builtin/packages/espressopp/package.py | 8 -------- var/spack/repos/builtin/packages/fenics/package.py | 10 ++++------ .../repos/builtin/packages/flecsale/package.py | 8 -------- var/spack/repos/builtin/packages/flecsi/package.py | 8 -------- var/spack/repos/builtin/packages/geant4/package.py | 8 -------- var/spack/repos/builtin/packages/gmsh/package.py | 5 ----- .../repos/builtin/packages/gromacs/package.py | 10 ++++------ var/spack/repos/builtin/packages/hpx/package.py | 7 ------- var/spack/repos/builtin/packages/lbann/package.py | 8 -------- var/spack/repos/builtin/packages/legion/package.py | 8 -------- var/spack/repos/builtin/packages/llvm/package.py | 14 ++++--------- .../repos/builtin/packages/mad-numdiff/package.py | 9 --------- var/spack/repos/builtin/packages/nalu/package.py | 9 --------- .../repos/builtin/packages/opencoarrays/package.py | 5 +++++ .../builtin/packages/openspeedshop/package.py | 5 ++--- var/spack/repos/builtin/packages/pegtl/package.py | 9 --------- .../repos/builtin/packages/portage/package.py | 8 -------- var/spack/repos/builtin/packages/quinoa/package.py | 9 --------- var/spack/repos/builtin/packages/relion/package.py | 4 ++++ var/spack/repos/builtin/packages/root/package.py | 6 ------ var/spack/repos/builtin/packages/sas/package.py | 9 --------- .../repos/builtin/packages/symengine/package.py | 8 +++----- .../repos/builtin/packages/trilinos/package.py | 4 ---- var/spack/repos/builtin/packages/vc/package.py | 12 ++++------- .../repos/builtin/packages/vecgeom/package.py | 9 --------- .../repos/builtin/packages/votca-csg/package.py | 9 --------- .../repos/builtin/packages/votca-ctp/package.py | 9 --------- .../repos/builtin/packages/votca-moo/package.py | 9 --------- .../repos/builtin/packages/votca-tools/package.py | 9 --------- .../repos/builtin/packages/votca-xtp/package.py | 9 --------- var/spack/repos/builtin/packages/vpic/package.py | 9 --------- .../repos/builtin/packages/xsdktrilinos/package.py | 10 +++------- 46 files changed, 68 insertions(+), 319 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index b339858348..db3240e8a5 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -29,7 +29,7 @@ import platform import spack.build_environment from llnl.util.filesystem import working_dir, join_path -from spack.directives import depends_on +from spack.directives import depends_on, variant from spack.package import PackageBase, run_after @@ -49,11 +49,6 @@ class CMakePackage(PackageBase): +-----------------------------------------------+--------------------+ | **Method** | **Purpose** | +===============================================+====================+ - | :py:meth:`~.CMakePackage.build_type` | Specify the value | - | | for the | - | | CMAKE_BUILD_TYPE | - | | variable | - +-----------------------------------------------+--------------------+ | :py:meth:`~.CMakePackage.root_cmakelists_dir` | Location of the | | | root CMakeLists.txt| +-----------------------------------------------+--------------------+ @@ -74,14 +69,12 @@ class CMakePackage(PackageBase): build_time_test_callbacks = ['check'] - depends_on('cmake', type='build') - - def build_type(self): - """Returns the correct value for the ``CMAKE_BUILD_TYPE`` variable + # https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel')) - :return: value for ``CMAKE_BUILD_TYPE`` - """ - return 'RelWithDebInfo' + depends_on('cmake', type='build') @property def root_cmakelists_dir(self): @@ -108,8 +101,8 @@ class CMakePackage(PackageBase): def _std_args(pkg): """Computes the standard cmake arguments for a generic package""" try: - build_type = pkg.build_type() - except AttributeError: + build_type = pkg.spec.variants['build_type'].value + except KeyError: build_type = 'RelWithDebInfo' args = ['-DCMAKE_INSTALL_PREFIX:PATH={0}'.format(pkg.prefix), diff --git a/var/spack/repos/builtin/packages/alquimia/package.py b/var/spack/repos/builtin/packages/alquimia/package.py index b8d3f60840..cadea3cb3c 100644 --- a/var/spack/repos/builtin/packages/alquimia/package.py +++ b/var/spack/repos/builtin/packages/alquimia/package.py @@ -36,8 +36,6 @@ class Alquimia(CMakePackage): variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, - description='Builds a debug version of the libraries') depends_on('mpi') depends_on('hdf5') @@ -52,10 +50,6 @@ class Alquimia(CMakePackage): options = ['-DCMAKE_C_COMPILER=%s' % spec['mpi'].mpicc, '-DCMAKE_Fortran_COMPILER=%s' % spec['mpi'].mpifc, '-DUSE_XSDK_DEFAULTS=YES', - '-DCMAKE_BUILD_TYPE:STRING=%s' % ( - 'DEBUG' if '+debug' in spec else 'RELEASE'), - '-DXSDK_ENABLE_DEBUG:STRING=%s' % ( - 'YES' if '+debug' in spec else 'NO'), '-DBUILD_SHARED_LIBS:BOOL=%s' % ( 'ON' if '+shared' in spec else 'OFF'), '-DTPL_ENABLE_MPI:BOOL=ON', diff --git a/var/spack/repos/builtin/packages/benchmark/package.py b/var/spack/repos/builtin/packages/benchmark/package.py index eecb9341d9..4101b0e9e0 100644 --- a/var/spack/repos/builtin/packages/benchmark/package.py +++ b/var/spack/repos/builtin/packages/benchmark/package.py @@ -37,6 +37,11 @@ class Benchmark(CMakePackage): version('1.1.0', '66b2a23076cf70739525be0092fc3ae3') version('1.0.0', '1474ff826f8cd68067258db75a0835b8') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', + 'MinSizeRel', 'Coverage')) + def patch(self): filter_file( r'add_cxx_compiler_flag..fstrict.aliasing.', diff --git a/var/spack/repos/builtin/packages/bml/package.py b/var/spack/repos/builtin/packages/bml/package.py index 87dc1c9e80..fe1e21a8de 100644 --- a/var/spack/repos/builtin/packages/bml/package.py +++ b/var/spack/repos/builtin/packages/bml/package.py @@ -36,14 +36,5 @@ class Bml(CMakePackage): version('develop', git='https://github.com/qmmd/bml', branch='master') version('1.1.0', git='https://github.com/qmmd/bml', tag='v1.1.0') - variant('debug', default=False, description='Build debug version') - depends_on("blas") depends_on("lapack") - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py index 2c1c663639..a13d79c953 100644 --- a/var/spack/repos/builtin/packages/cbtf-argonavis/package.py +++ b/var/spack/repos/builtin/packages/cbtf-argonavis/package.py @@ -53,6 +53,9 @@ class CbtfArgonavis(CMakePackage): version('1.8', branch='master', git='https://github.com/OpenSpeedShop/cbtf-argonavis.git') + variant('build_type', default='None', values=('None'), + description='CMake build type') + depends_on("cmake@3.0.2:", type='build') depends_on("boost@1.50.0:1.59.0") depends_on("papi") @@ -65,9 +68,6 @@ class CbtfArgonavis(CMakePackage): build_directory = 'build_cbtf_argonavis' - def build_type(self): - return 'None' - def cmake_args(self): spec = self.spec compile_flags = "-O2 -g" diff --git a/var/spack/repos/builtin/packages/cbtf-krell/package.py b/var/spack/repos/builtin/packages/cbtf-krell/package.py index a90ea74f9d..40fc932e8f 100644 --- a/var/spack/repos/builtin/packages/cbtf-krell/package.py +++ b/var/spack/repos/builtin/packages/cbtf-krell/package.py @@ -68,6 +68,8 @@ class CbtfKrell(CMakePackage): description="Build mpi experiment collector for mpich2 MPI.") variant('mpich', default=False, description="Build mpi experiment collector for mpich MPI.") + variant('build_type', default='None', values=('None'), + description='CMake build type') # Dependencies for cbtf-krell depends_on("cmake@3.0.2:", type='build') @@ -129,9 +131,6 @@ class CbtfKrell(CMakePackage): cmakeOptions.extend(MPIOptions) - def build_type(self): - return 'None' - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/cbtf-lanl/package.py b/var/spack/repos/builtin/packages/cbtf-lanl/package.py index 6ffca1f8b1..b56265154c 100644 --- a/var/spack/repos/builtin/packages/cbtf-lanl/package.py +++ b/var/spack/repos/builtin/packages/cbtf-lanl/package.py @@ -51,6 +51,9 @@ class CbtfLanl(CMakePackage): version('1.8', branch='master', git='http://git.code.sf.net/p/cbtf-lanl/cbtf-lanl') + variant('build_type', default='None', values=('None'), + description='CMake build type') + depends_on("cmake@3.0.2:", type='build') # Dependencies for cbtf-krell depends_on("mrnet@5.0.1:+lwthreads") @@ -62,9 +65,6 @@ class CbtfLanl(CMakePackage): build_directory = 'build_cbtf_lanl' - def build_type(self): - return 'None' - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/cbtf/package.py b/var/spack/repos/builtin/packages/cbtf/package.py index 68e2b7d0a2..d972544f5f 100644 --- a/var/spack/repos/builtin/packages/cbtf/package.py +++ b/var/spack/repos/builtin/packages/cbtf/package.py @@ -58,6 +58,8 @@ class Cbtf(CMakePackage): variant('runtime', default=False, description="build only the runtime libraries and collectors.") + variant('build_type', default='None', values=('None'), + description='CMake build type') depends_on("cmake@3.0.2:", type='build') depends_on("boost@1.50.0:1.59.0") @@ -70,9 +72,6 @@ class Cbtf(CMakePackage): build_directory = 'build_cbtf' - def build_type(self): - return 'None' - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/clamr/package.py b/var/spack/repos/builtin/packages/clamr/package.py index c45069d39f..d1eee12d1c 100644 --- a/var/spack/repos/builtin/packages/clamr/package.py +++ b/var/spack/repos/builtin/packages/clamr/package.py @@ -41,10 +41,6 @@ class Clamr(CMakePackage): 'graphics', default='opengl', values=('opengl', 'mpe', 'none'), description='Build with specified graphics support') - variant( - 'build', default='relwithdebinfo', - values=('debug', 'release', 'relwithdebinfo'), - description='Build type') variant( 'precision', default='mixed', values=('single', 'mixed', 'full'), @@ -53,15 +49,6 @@ class Clamr(CMakePackage): depends_on('mpi') depends_on('mpe', when='graphics=mpe') - def build_type(self): - spec = self.spec - if 'build=debug' in spec: - return 'Debug' - elif 'build=release' in spec: - return 'Release' - else: - return 'RelWithDebInfo' - def cmake_args(self): spec = self.spec cmake_args = [] diff --git a/var/spack/repos/builtin/packages/clhep/package.py b/var/spack/repos/builtin/packages/clhep/package.py index 7120fffac6..2f4f5b1579 100644 --- a/var/spack/repos/builtin/packages/clhep/package.py +++ b/var/spack/repos/builtin/packages/clhep/package.py @@ -50,7 +50,6 @@ class Clhep(CMakePackage): version('2.2.0.5', '1584e8ce6ebf395821aed377df315c7c') version('2.2.0.4', '71d2c7c2e39d86a0262e555148de01c1') - variant('debug', default=False, description="Switch to the debug version of CLHEP.") variant('cxx11', default=True, description="Compile using c++11 dialect.") variant('cxx14', default=False, description="Compile using c++14 dialect.") @@ -65,14 +64,6 @@ class Clhep(CMakePackage): root_cmakelists_dir = 'CLHEP' - def build_type(self): - spec = self.spec - - if '+debug' in spec: - return 'Debug' - else: - return 'MinSizeRel' - def cmake_args(self): spec = self.spec cmake_args = [] diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index ba1f896010..aa6a2be0b4 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -71,6 +71,9 @@ class Dealii(CMakePackage): description='Compile with 64 bit indices support') variant('optflags', default=False, description='Compile using additional optimization flags') + variant('build_type', default='DebugRelease', + description='The build type to build', + values=('Debug', 'Release', 'DebugRelease')) # required dependencies, light version depends_on("blas") @@ -136,10 +139,6 @@ class Dealii(CMakePackage): '+slepc', '+trilinos']: conflicts(p, when='~mpi') - def build_type(self): - # CMAKE_BUILD_TYPE should be DebugRelease | Debug | Release - return 'DebugRelease' - def cmake_args(self): spec = self.spec options = [] diff --git a/var/spack/repos/builtin/packages/eccodes/package.py b/var/spack/repos/builtin/packages/eccodes/package.py index 137f445c69..40539e19c9 100644 --- a/var/spack/repos/builtin/packages/eccodes/package.py +++ b/var/spack/repos/builtin/packages/eccodes/package.py @@ -50,6 +50,9 @@ class Eccodes(CMakePackage): description="Enable OpenMP threads") variant('memfs', default=False, description="Memory based access to definitions/samples") + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', 'Production')) depends_on('netcdf', when='+netcdf') depends_on('openjpeg', when='+jpeg') diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py index 0aefe416e3..569af17c61 100644 --- a/var/spack/repos/builtin/packages/eigen/package.py +++ b/var/spack/repos/builtin/packages/eigen/package.py @@ -40,9 +40,6 @@ class Eigen(CMakePackage): version('3.2.8', '64f4aef8012a424c7e079eaf0be71793ab9bc6e0') version('3.2.7', 'cc1bacbad97558b97da6b77c9644f184') - variant('debug', default=False, - description='Builds the library in debug mode') - variant('metis', default=True, description='Enables metis backend') variant('scotch', default=True, description='Enables scotch backend') variant('fftw', default=True, description='Enables FFTW backend') @@ -50,6 +47,9 @@ class Eigen(CMakePackage): description='Enables SuiteSparse support') variant('mpfr', default=True, description='Enables support for multi-precisions FP via mpfr') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo')) # TODO : dependency on googlehash, superlu, adolc missing depends_on('metis@5:', when='+metis') @@ -58,9 +58,3 @@ class Eigen(CMakePackage): depends_on('suite-sparse', when='+suitesparse') depends_on('mpfr@2.3.0:', when='+mpfr') depends_on('gmp', when='+mpfr') - - def build_type(self): - if '+debug' in self.spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/elemental/package.py b/var/spack/repos/builtin/packages/elemental/package.py index d86ee985f7..e118bcbd44 100644 --- a/var/spack/repos/builtin/packages/elemental/package.py +++ b/var/spack/repos/builtin/packages/elemental/package.py @@ -36,8 +36,6 @@ class Elemental(CMakePackage): version('0.87.7', '6c1e7442021c59a36049e37ea69b8075') version('0.87.6', '9fd29783d45b0a0e27c0df85f548abe9') - variant('debug', default=False, - description='Builds a debug version of the libraries') variant('shared', default=True, description='Enables the build of shared libraries') variant('hybrid', default=True, @@ -61,6 +59,9 @@ class Elemental(CMakePackage): ' Requires local build of BLAS library.') variant('scalapack', default=False, description='Build with ScaLAPACK library') + variant('build_type', default='Release', + description='The build type to build', + values=('Debug', 'Release')) # Note that this forces us to use OpenBLAS until #1712 is fixed depends_on('blas', when='~openmp_blas ~int64_blas') @@ -85,15 +86,6 @@ class Elemental(CMakePackage): 'libEl', root=self.prefix, shared=shared, recurse=True ) - def build_type(self): - """Returns the correct value for the ``CMAKE_BUILD_TYPE`` variable - :return: value for ``CMAKE_BUILD_TYPE`` - """ - if '+debug' in self.spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/espressopp/package.py b/var/spack/repos/builtin/packages/espressopp/package.py index e71291bec8..f1752b3b5e 100644 --- a/var/spack/repos/builtin/packages/espressopp/package.py +++ b/var/spack/repos/builtin/packages/espressopp/package.py @@ -39,7 +39,6 @@ class Espressopp(CMakePackage): version('1.9.4.1', '0da74a6d4e1bfa6a2a24fca354245a4f') version('1.9.4', 'f2a27993a83547ad014335006eea74ea') - variant('debug', default=False, description='Build debug version') variant('ug', default=False, description='Build user guide') variant('pdf', default=False, description='Build user guide in pdf format') variant('dg', default=False, description='Build developer guide') @@ -60,13 +59,6 @@ class Espressopp(CMakePackage): depends_on("texlive", when="+pdf", type='build') depends_on("doxygen", when="+dg", type='build') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): return ['-DEXTERNAL_MPI4PY=ON', '-DEXTERNAL_BOOST=ON'] diff --git a/var/spack/repos/builtin/packages/fenics/package.py b/var/spack/repos/builtin/packages/fenics/package.py index 34afa0d609..5aa3b17d73 100644 --- a/var/spack/repos/builtin/packages/fenics/package.py +++ b/var/spack/repos/builtin/packages/fenics/package.py @@ -55,10 +55,12 @@ class Fenics(CMakePackage): description='Enables the shared memory support') variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, - description='Builds a debug version of the libraries') variant('doc', default=False, description='Builds the documentation') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', + 'MinSizeRel', 'Developer')) # not part of spack list for now # variant('petsc4py', default=True, description='Uses PETSc4py') @@ -144,11 +146,7 @@ class Fenics(CMakePackage): return 'ON' if option in self.spec else 'OFF' def cmake_args(self): - spec = self.spec - return [ - '-DCMAKE_BUILD_TYPE:STRING={0}'.format( - 'Debug' if '+debug' in spec else 'RelWithDebInfo'), '-DDOLFIN_ENABLE_DOCS:BOOL={0}'.format( self.cmake_is_on('+doc')), '-DBUILD_SHARED_LIBS:BOOL={0}'.format( diff --git a/var/spack/repos/builtin/packages/flecsale/package.py b/var/spack/repos/builtin/packages/flecsale/package.py index b22c553d2a..828ff47d2f 100644 --- a/var/spack/repos/builtin/packages/flecsale/package.py +++ b/var/spack/repos/builtin/packages/flecsale/package.py @@ -33,7 +33,6 @@ class Flecsale(CMakePackage): version('develop', git='https://github.com/laristra/flecsale', branch='master', submodules=True) - variant('debug', default=False, description='Build debug version') variant('mpi', default=True, description='Build on top of mpi conduit for mpi inoperability') @@ -43,13 +42,6 @@ class Flecsale(CMakePackage): depends_on("python") depends_on("openssl") - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): options = [ '-DENABLE_UNIT_TESTS=ON' diff --git a/var/spack/repos/builtin/packages/flecsi/package.py b/var/spack/repos/builtin/packages/flecsi/package.py index 5c0f51b2d1..3b079565cb 100644 --- a/var/spack/repos/builtin/packages/flecsi/package.py +++ b/var/spack/repos/builtin/packages/flecsi/package.py @@ -41,7 +41,6 @@ class Flecsi(CMakePackage): version('develop', git='https://github.com/laristra/flecsi', branch='master', submodules=True) - variant('debug', default=False, description='Build debug version') variant('mpi', default=True, description='Build on top of mpi conduit for mpi inoperability') @@ -49,13 +48,6 @@ class Flecsi(CMakePackage): depends_on("legion+shared", when='~mpi') depends_on("legion+shared+mpi", when='+mpi') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): options = ['-DENABLE_UNIT_TESTS=ON'] diff --git a/var/spack/repos/builtin/packages/geant4/package.py b/var/spack/repos/builtin/packages/geant4/package.py index cb04d67481..95d3eb9d55 100644 --- a/var/spack/repos/builtin/packages/geant4/package.py +++ b/var/spack/repos/builtin/packages/geant4/package.py @@ -41,7 +41,6 @@ class Geant4(CMakePackage): version('10.01.p03', '4fb4175cc0dabcd517443fbdccd97439') variant('qt', default=True, description='Enable Qt support') - variant('debug', default=False, description='Build debug version') depends_on('cmake@3.5:', type='build') @@ -54,13 +53,6 @@ class Geant4(CMakePackage): depends_on("xerces-c") depends_on("qt@4.8:", when="+qt") - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py index 3c9eff5619..977bf6c3d6 100644 --- a/var/spack/repos/builtin/packages/gmsh/package.py +++ b/var/spack/repos/builtin/packages/gmsh/package.py @@ -46,8 +46,6 @@ class Gmsh(CMakePackage): variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, - description='Builds the library in debug mode') variant('mpi', default=True, description='Builds MPI support for parser and solver') variant('fltk', default=False, @@ -128,9 +126,6 @@ class Gmsh(CMakePackage): # Builds and installs static library options.append('-DENABLE_BUILD_LIB:BOOL=ON') - if '+debug' in spec: - options.append('-DCMAKE_BUILD_TYPE:STRING=Debug') - if '+mpi' in spec: options.append('-DENABLE_MPI:BOOL=ON') diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py index 97fd569d1f..ae17193139 100644 --- a/var/spack/repos/builtin/packages/gromacs/package.py +++ b/var/spack/repos/builtin/packages/gromacs/package.py @@ -48,12 +48,15 @@ class Gromacs(CMakePackage): variant('mpi', default=True, description='Activate MPI support') variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, description='Enables debug mode') variant( 'double', default=False, description='Produces a double precision version of the executables') variant('plumed', default=False, description='Enable PLUMED support') variant('cuda', default=False, description='Enable CUDA support') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel', + 'Reference', 'RelWithAssert', 'Profile')) depends_on('mpi', when='+mpi') depends_on('plumed+mpi', when='+plumed+mpi') @@ -79,11 +82,6 @@ class Gromacs(CMakePackage): if '~shared' in self.spec: options.append('-DBUILD_SHARED_LIBS:BOOL=OFF') - if '+debug' in self.spec: - options.append('-DCMAKE_BUILD_TYPE:STRING=Debug') - else: - options.append('-DCMAKE_BUILD_TYPE:STRING=Release') - if '+cuda' in self.spec: options.append('-DGMX_GPU:BOOL=ON') options.append('-DCUDA_TOOLKIT_ROOT_DIR:STRING=' + diff --git a/var/spack/repos/builtin/packages/hpx/package.py b/var/spack/repos/builtin/packages/hpx/package.py index ef7b347426..58644db11e 100644 --- a/var/spack/repos/builtin/packages/hpx/package.py +++ b/var/spack/repos/builtin/packages/hpx/package.py @@ -40,10 +40,3 @@ class Hpx(CMakePackage): def cmake_args(self): args = ['-DHPX_BUILD_EXAMPLES=OFF', '-DHPX_MALLOC=system'] return args - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/lbann/package.py b/var/spack/repos/builtin/packages/lbann/package.py index b79f9244c9..fea1924550 100644 --- a/var/spack/repos/builtin/packages/lbann/package.py +++ b/var/spack/repos/builtin/packages/lbann/package.py @@ -36,24 +36,16 @@ class Lbann(CMakePackage): version('develop', git='https://github.com/LLNL/lbann.git', branch="develop") version('0.91', '83b0ec9cd0b7625d41dfb06d2abd4134') - variant('debug', default=False, description='Builds a debug version of the libraries') variant('gpu', default=False, description='Builds with support for GPUs via CUDA and cuDNN') variant('opencv', default=True, description='Builds with support for image processing routines with OpenCV') variant('seq_init', default=False, description='Force serial initialization of weight matrices.') depends_on('elemental +openmp_blas +scalapack +shared +int64') - depends_on('elemental +openmp_blas +scalapack +shared +int64 +debug', when='+debug') depends_on('cuda', when='+gpu') depends_on('mpi') depends_on('opencv@3.2.0', when='+opencv') depends_on('protobuf@3.0.2:') - def build_type(self): - if '+debug' in self.spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): spec = self.spec # Environment variables diff --git a/var/spack/repos/builtin/packages/legion/package.py b/var/spack/repos/builtin/packages/legion/package.py index 79a1ee533d..3bcd37e306 100644 --- a/var/spack/repos/builtin/packages/legion/package.py +++ b/var/spack/repos/builtin/packages/legion/package.py @@ -46,7 +46,6 @@ class Legion(CMakePackage): version('develop', git='https://github.com/StanfordLegion/legion', branch='master') version('17.02.0', '31ac3004e2fb0996764362d2b6f6844a') - variant('debug', default=False, description='Build debug version') variant('mpi', default=True, description='Build on top of mpi conduit for mpi inoperability') variant('shared', default=True, description='Build shared libraries') @@ -55,13 +54,6 @@ class Legion(CMakePackage): depends_on("gasnet", when='~mpi') depends_on("gasnet+mpi", when='+mpi') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): options = [ '-DLegion_USE_GASNet=ON', diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index fc8823f1a8..64e50f0cfb 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -43,10 +43,10 @@ class Llvm(CMakePackage): version('3.0', 'a8e5f5f1c1adebae7b4a654c376a6005', url='http://llvm.org/releases/3.0/llvm-3.0.tar.gz') - variant('debug', default=False, - description="Build a debug version of LLVM, this increases " - "binary size by an order of magnitude, make sure you have " - "20-30gb of space available to build this") + # NOTE: The debug version of LLVM is an order of magnitude larger than + # the release version, and may take up 20-30 GB of space. If you want + # to save space, build with `build_type=Release`. + variant('clang', default=True, description="Build the LLVM C/C++/Objective-C compiler frontend") variant('lldb', default=True, description="Build the LLVM debugger") @@ -327,12 +327,6 @@ class Llvm(CMakePackage): def setup_environment(self, spack_env, run_env): spack_env.append_flags('CXXFLAGS', self.compiler.cxx11_flag) - def build_type(self): - if '+debug' in self.spec: - return 'RelWithDebInfo' - else: - return 'Release' - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/mad-numdiff/package.py b/var/spack/repos/builtin/packages/mad-numdiff/package.py index 4d0c9c1ef7..574ddf2be3 100644 --- a/var/spack/repos/builtin/packages/mad-numdiff/package.py +++ b/var/spack/repos/builtin/packages/mad-numdiff/package.py @@ -34,12 +34,3 @@ class MadNumdiff(CMakePackage): version('develop', git='https://github.com/quinoacomputing/ndiff', branch='master') version('20150724', '7723c0f2499aea8fd960377c5bed28d8') - - variant('debug', default=False, description='Build debug version') - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/nalu/package.py b/var/spack/repos/builtin/packages/nalu/package.py index fc6d79e9ea..040144ff16 100644 --- a/var/spack/repos/builtin/packages/nalu/package.py +++ b/var/spack/repos/builtin/packages/nalu/package.py @@ -38,19 +38,10 @@ class Nalu(CMakePackage): version('master', git='https://github.com/NaluCFD/Nalu.git', branch='master') - variant('debug', default=False, - description='Builds a debug version') - # Currently Nalu only builds static libraries; To be fixed soon depends_on('yaml-cpp+fpic~shared') depends_on('trilinos~shared+exodus+tpetra+muelu+belos+ifpack2+amesos2+zoltan+stk+boost~superlu-dist+superlu+hdf5+zlib+pnetcdf@master') - def build_type(self): - if '+debug' in self.spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): spec = self.spec options = [] diff --git a/var/spack/repos/builtin/packages/opencoarrays/package.py b/var/spack/repos/builtin/packages/opencoarrays/package.py index 0449155bc7..37ae236c0a 100644 --- a/var/spack/repos/builtin/packages/opencoarrays/package.py +++ b/var/spack/repos/builtin/packages/opencoarrays/package.py @@ -42,6 +42,11 @@ class Opencoarrays(CMakePackage): version('1.7.4', '85ba87def461e3ff5a164de2e6482930') version('1.6.2', '5a4da993794f3e04ea7855a6678981ba') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', + 'MinSizeRel', 'CodeCoverage')) + depends_on('mpi') def cmake_args(self): diff --git a/var/spack/repos/builtin/packages/openspeedshop/package.py b/var/spack/repos/builtin/packages/openspeedshop/package.py index 2acb44ad02..f4c0029d72 100644 --- a/var/spack/repos/builtin/packages/openspeedshop/package.py +++ b/var/spack/repos/builtin/packages/openspeedshop/package.py @@ -83,6 +83,8 @@ class Openspeedshop(CMakePackage): variant('rtfe', default=False, description="build for clusters heterogeneous processors \ on fe/be nodes.") + variant('build_type', default='None', values=('None'), + description='CMake build type') # MPI variants variant('openmpi', default=False, @@ -144,9 +146,6 @@ class Openspeedshop(CMakePackage): build_directory = 'build_openspeedshop' - def build_type(self): - return 'None' - def cmake_args(self): spec = self.spec compile_flags = "-O2 -g" diff --git a/var/spack/repos/builtin/packages/pegtl/package.py b/var/spack/repos/builtin/packages/pegtl/package.py index 85a008a119..f6848be725 100644 --- a/var/spack/repos/builtin/packages/pegtl/package.py +++ b/var/spack/repos/builtin/packages/pegtl/package.py @@ -39,12 +39,3 @@ class Pegtl(CMakePackage): version('develop', git='https://github.com/taocpp/PEGTL', branch='master') version('2.1.4', 'e5288b6968e6e910287fce93dc5557bf') version('2.0.0', 'c772828e7188459338a920c21f9896db') - - variant('debug', default=False, description='Build debug version') - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/portage/package.py b/var/spack/repos/builtin/packages/portage/package.py index 92e4266552..0934076ab9 100644 --- a/var/spack/repos/builtin/packages/portage/package.py +++ b/var/spack/repos/builtin/packages/portage/package.py @@ -36,19 +36,11 @@ class Portage(CMakePackage): version('develop', git='https://github.com/laristra/portage', branch='master', submodules=True) - variant('debug', default=False, description='Build debug version') variant('mpi', default=True, description='Support MPI') depends_on("cmake@3.1:", type='build') depends_on('mpi', when='+mpi') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): options = ['-DENABLE_UNIT_TESTS=ON', '-DENABLE_APP_TESTS=ON'] diff --git a/var/spack/repos/builtin/packages/quinoa/package.py b/var/spack/repos/builtin/packages/quinoa/package.py index eb41bb8b37..de04e6407c 100644 --- a/var/spack/repos/builtin/packages/quinoa/package.py +++ b/var/spack/repos/builtin/packages/quinoa/package.py @@ -38,8 +38,6 @@ class Quinoa(CMakePackage): version('develop', git='https://github.com/quinoacomputing/quinoa', branch='master') - variant('debug', default=False, description='Build debug version') - depends_on('hdf5+mpi') depends_on("charm backend=mpi") depends_on("trilinos+exodus") @@ -56,10 +54,3 @@ class Quinoa(CMakePackage): depends_on("pegtl") root_cmakelists_dir = 'src' - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/relion/package.py b/var/spack/repos/builtin/packages/relion/package.py index dfb93cd943..23b1834fbc 100644 --- a/var/spack/repos/builtin/packages/relion/package.py +++ b/var/spack/repos/builtin/packages/relion/package.py @@ -40,6 +40,10 @@ class Relion(CMakePackage): variant('cuda', default=False, description="enable compute on gpu") variant('double', default=False, description="double precision (cpu) code") variant('double-gpu', default=False, description="double precision (gpu) code") + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', + 'Profiling', 'Benchmarking')) depends_on('mpi') depends_on('fftw+float+double') diff --git a/var/spack/repos/builtin/packages/root/package.py b/var/spack/repos/builtin/packages/root/package.py index b5f6ce89fe..dfd7ba3e25 100644 --- a/var/spack/repos/builtin/packages/root/package.py +++ b/var/spack/repos/builtin/packages/root/package.py @@ -99,12 +99,6 @@ class Root(CMakePackage): # See https://sft.its.cern.ch/jira/browse/ROOT-7517 conflicts('%intel') - def build_type(self): - if '+debug' in self.spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): args = [ '-Dcocoa=OFF', diff --git a/var/spack/repos/builtin/packages/sas/package.py b/var/spack/repos/builtin/packages/sas/package.py index 5a7f1de1d5..050d6172d6 100644 --- a/var/spack/repos/builtin/packages/sas/package.py +++ b/var/spack/repos/builtin/packages/sas/package.py @@ -36,19 +36,10 @@ class Sas(CMakePackage): version('0.1.4', '20d7311258f2a59c9367ae1576c392b6') version('0.1.3', '1e6572afcc03318d16d7321d40eec0fd') - variant('debug', default=False, description='Build debug version') - depends_on('python@2.7:') depends_on('llvm@3.5:') depends_on('cmake@2.8:', type='build') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): args = [ '-DLLVM_DEV_DIR=%s' % self.spec['llvm'].prefix diff --git a/var/spack/repos/builtin/packages/symengine/package.py b/var/spack/repos/builtin/packages/symengine/package.py index 50dd335ac7..a36cfc70b2 100644 --- a/var/spack/repos/builtin/packages/symengine/package.py +++ b/var/spack/repos/builtin/packages/symengine/package.py @@ -55,6 +55,9 @@ class Symengine(CMakePackage): description='Enable thread safety option') variant('shared', default=True, description='Enables the build of shared libraries') + variant('build_type', default='Release', + description='The build type to build', + values=('Debug', 'Release')) # NOTE: mpir is a drop-in replacement for gmp # NOTE: [mpc,mpfr,flint,piranha] could also be built against mpir @@ -66,10 +69,6 @@ class Symengine(CMakePackage): depends_on('flint', when='+flint~boostmp') depends_on('piranha', when='+piranha~flint~boostmp') - def build_type(self): - # CMAKE_BUILD_TYPE should be Debug | Release - return 'Release' - def cmake_args(self): spec = self.spec options = [] @@ -77,7 +76,6 @@ class Symengine(CMakePackage): # See https://github.com/symengine/symengine/blob/master/README.md # for build options options.extend([ - '-DCMAKE_BUILD_TYPE=Release', '-DWITH_SYMENGINE_RCP:BOOL=ON', '-DWITH_SYMENGINE_THREAD_SAFE:BOOL=%s' % ( 'ON' if ('+thread_safe' or '+openmp') in spec else 'OFF'), diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index 74022f0833..8566adc649 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -93,8 +93,6 @@ class Trilinos(CMakePackage): 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') variant('boost', default=True, description='Compile with Boost') variant('tpetra', default=True, @@ -241,8 +239,6 @@ class Trilinos(CMakePackage): '-DTrilinos_ENABLE_TESTS:BOOL=OFF', '-DTrilinos_ENABLE_EXAMPLES:BOOL=OFF', '-DTrilinos_ENABLE_CXX11:BOOL=ON', - '-DCMAKE_BUILD_TYPE:STRING=%s' % ( - 'DEBUG' if '+debug' in spec else 'RELEASE'), '-DBUILD_SHARED_LIBS:BOOL=%s' % ( 'ON' if '+shared' in spec else 'OFF'), diff --git a/var/spack/repos/builtin/packages/vc/package.py b/var/spack/repos/builtin/packages/vc/package.py index e41a385947..67ced036b2 100644 --- a/var/spack/repos/builtin/packages/vc/package.py +++ b/var/spack/repos/builtin/packages/vc/package.py @@ -35,11 +35,7 @@ class Vc(CMakePackage): version('1.2.0', 'a5236df286b845d2fee5ef1e4d27549f') version('1.1.0', 'e354c1e3ea1d674b6f2af9c6fd230d81') - variant('debug', default=False) - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebug', + 'RelWithDebInfo', 'MinSizeRel')) diff --git a/var/spack/repos/builtin/packages/vecgeom/package.py b/var/spack/repos/builtin/packages/vecgeom/package.py index d514f13c17..9843840e5b 100644 --- a/var/spack/repos/builtin/packages/vecgeom/package.py +++ b/var/spack/repos/builtin/packages/vecgeom/package.py @@ -36,17 +36,8 @@ class Vecgeom(CMakePackage): version('0.3.rc', git='https://gitlab.cern.ch/VecGeom/VecGeom.git', tag='v0.3.rc') - variant('debug', default=False, description='Build debug version') - depends_on('cmake@3.5:', type='build') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): options = [ '-DBACKEND=Scalar', diff --git a/var/spack/repos/builtin/packages/votca-csg/package.py b/var/spack/repos/builtin/packages/votca-csg/package.py index 6756d0427b..bd5879e68a 100644 --- a/var/spack/repos/builtin/packages/votca-csg/package.py +++ b/var/spack/repos/builtin/packages/votca-csg/package.py @@ -39,16 +39,7 @@ class VotcaCsg(CMakePackage): version('develop', git='https://github.com/votca/csg', branch='master') version('1.4', 'd009e761e5e3afd51eed89c420610a67') - variant('debug', default=False, description='Build debug version') - depends_on("cmake@2.8:", type='build') depends_on("votca-tools@1.4:1.4.999", when='@1.4:1.4.999') depends_on("votca-tools@develop", when='@develop') depends_on("gromacs~mpi@5.1:") - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/votca-ctp/package.py b/var/spack/repos/builtin/packages/votca-ctp/package.py index 81586b18e6..8ace180487 100644 --- a/var/spack/repos/builtin/packages/votca-ctp/package.py +++ b/var/spack/repos/builtin/packages/votca-ctp/package.py @@ -39,16 +39,7 @@ class VotcaCtp(CMakePackage): version('develop', git='https://github.com/votca/ctp', branch='master') - variant('debug', default=False, description='Build debug version') - depends_on("cmake@2.8:", type='build') depends_on("votca-tools@develop", when='@develop') depends_on("votca-csg@develop", when='@develop') depends_on("votca-moo@develop", when='@develop') - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/votca-moo/package.py b/var/spack/repos/builtin/packages/votca-moo/package.py index a596ba1c9c..dfbef140eb 100644 --- a/var/spack/repos/builtin/packages/votca-moo/package.py +++ b/var/spack/repos/builtin/packages/votca-moo/package.py @@ -39,14 +39,5 @@ class VotcaMoo(CMakePackage): version('develop', git='https://github.com/votca/moo', branch='master') - variant('debug', default=False, description='Build debug version') - depends_on("cmake@2.8:", type='build') depends_on("votca-tools@develop", when='@develop') - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/votca-tools/package.py b/var/spack/repos/builtin/packages/votca-tools/package.py index 39055c45a3..d2acac8736 100644 --- a/var/spack/repos/builtin/packages/votca-tools/package.py +++ b/var/spack/repos/builtin/packages/votca-tools/package.py @@ -39,18 +39,9 @@ class VotcaTools(CMakePackage): version('develop', git='https://github.com/votca/tools', branch='master') version('1.4', 'cd47868e9f28e2c7b9d01f95aa0185ca') - variant('debug', default=False, description='Build debug version') - depends_on("cmake@2.8:", type='build') depends_on("expat") depends_on("fftw") depends_on("gsl") depends_on("boost") depends_on("sqlite") - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/votca-xtp/package.py b/var/spack/repos/builtin/packages/votca-xtp/package.py index 951df7b8c6..80cd4802e3 100644 --- a/var/spack/repos/builtin/packages/votca-xtp/package.py +++ b/var/spack/repos/builtin/packages/votca-xtp/package.py @@ -39,17 +39,8 @@ class VotcaXtp(CMakePackage): version('develop', git='https://github.com/votca/xtp', branch='master') - variant('debug', default=False, description='Build debug version') - depends_on("cmake@2.8:", type='build') depends_on("votca-tools@develop", when='@develop') depends_on("votca-csg@develop", when='@develop') depends_on("votca-ctp@develop", when='@develop') depends_on("votca-moo@develop", when='@develop') - - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' diff --git a/var/spack/repos/builtin/packages/vpic/package.py b/var/spack/repos/builtin/packages/vpic/package.py index e24aa9e530..43083d813e 100644 --- a/var/spack/repos/builtin/packages/vpic/package.py +++ b/var/spack/repos/builtin/packages/vpic/package.py @@ -40,18 +40,9 @@ class Vpic(CMakePackage): version('develop', git='https://github.com/lanl/vpic', branch='master', submodules=True) - variant('debug', default=False, description='Build debug version') - depends_on("cmake@3.1:", type='build') depends_on('mpi') - def build_type(self): - spec = self.spec - if '+debug' in spec: - return 'Debug' - else: - return 'Release' - def cmake_args(self): options = ['-DENABLE_INTEGRATED_TESTS=ON', '-DENABLE_UNIT_TESTS=ON'] diff --git a/var/spack/repos/builtin/packages/xsdktrilinos/package.py b/var/spack/repos/builtin/packages/xsdktrilinos/package.py index 0d70baabcd..cf3d425313 100644 --- a/var/spack/repos/builtin/packages/xsdktrilinos/package.py +++ b/var/spack/repos/builtin/packages/xsdktrilinos/package.py @@ -45,20 +45,18 @@ class Xsdktrilinos(CMakePackage): description='Compile with PETSc solvers') variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, - description='Builds a debug version of the libraries') # MPI related dependencies depends_on('mpi') depends_on('hypre~internal-superlu', when='+hypre') depends_on('hypre@xsdk-0.2.0~internal-superlu', when='@xsdk-0.2.0+hypre') - depends_on('hypre@develop~internal-superlu', when='@develop+hypre') + depends_on('hypre@develop~internal-superlu', when='@develop+hypre') depends_on('petsc@xsdk-0.2.0+mpi~complex', when='@xsdk-0.2.0+petsc') - depends_on('petsc@develop+mpi~complex', when='@develop+petsc') + depends_on('petsc@develop+mpi~complex', when='@develop+petsc') depends_on('trilinos@12.6.4', when='@12.6.4') depends_on('trilinos@12.8.1', when='@12.8.1') depends_on('trilinos@xsdk-0.2.0', when='@xsdk-0.2.0') - depends_on('trilinos@develop', when='@develop') + depends_on('trilinos@develop', when='@develop') def url_for_version(self, version): url = "https://github.com/trilinos/xSDKTrilinos/archive/trilinos-release-{0}.tar.gz" @@ -75,8 +73,6 @@ class Xsdktrilinos(CMakePackage): '-DxSDKTrilinos_ENABLE_TESTS:BOOL=ON', '-DxSDKTrilinos_ENABLE_EXAMPLES:BOOL=ON', '-DTrilinos_INSTALL_DIR=%s' % spec['trilinos'].prefix, - '-DCMAKE_BUILD_TYPE:STRING=%s' % ( - 'DEBUG' if '+debug' in spec else 'RELEASE'), '-DBUILD_SHARED_LIBS:BOOL=%s' % ( 'ON' if '+shared' in spec else 'OFF'), '-DTPL_ENABLE_MPI:BOOL=ON', -- cgit v1.2.3-70-g09d2 From b33f92da34ba122d24111a5d531e10e4d576d9ac Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 26 Jul 2017 17:43:54 -0500 Subject: Improve version detection for URLs with dynamic after version (#4902) --- lib/spack/spack/test/url_parse.py | 4 +++- lib/spack/spack/url.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 6789bc0aa3..41a2fda649 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -107,7 +107,9 @@ from spack.url import * # Combinations of multiple patterns - public ('dakota-6.3-public.src', 'dakota-6.3'), # Combinations of multiple patterns - universal - ('synergy-1.3.6p2-MacOSX-Universal', 'synergy-1.3.6p2') + ('synergy-1.3.6p2-MacOSX-Universal', 'synergy-1.3.6p2'), + # Combinations of multiple patterns - dynamic + ('snptest_v2.5.2_linux_x86_64_dynamic', 'snptest_v2.5.2'), ]) def test_url_strip_version_suffixes(url, expected): stripped = strip_version_suffixes(url) diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index d29ce3d07f..e3da753a76 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -177,6 +177,7 @@ def strip_version_suffixes(path): '[Uu]niversal', 'jar', 'complete', + 'dynamic', 'oss', 'gem', 'tar', -- cgit v1.2.3-70-g09d2 From 1c7e5724d9ff90b27f31faffd712867520e400c6 Mon Sep 17 00:00:00 2001 From: paulhopkins Date: Mon, 31 Jul 2017 20:57:47 +0100 Subject: Add --color=[always|never|auto] argument; fix color when piping (#3013) * Disable spec colorization when redirecting stdout and add command line flag to re-enable * Add command line `--color` flag to control output colorization * Add options to `llnl.util.tty.color` to allow color to be auto/always/never * Add `Spec.cformat()` function to be used when `format()` should have auto-coloring --- lib/spack/llnl/util/tty/color.py | 60 +++++++++++++++++++++++++++++++++---- lib/spack/spack/cmd/__init__.py | 12 ++++---- lib/spack/spack/cmd/dependents.py | 2 +- lib/spack/spack/cmd/mirror.py | 2 +- lib/spack/spack/cmd/module.py | 5 ++-- lib/spack/spack/cmd/spec.py | 3 +- lib/spack/spack/cmd/uninstall.py | 3 +- lib/spack/spack/database.py | 8 ++--- lib/spack/spack/directory_layout.py | 4 ++- lib/spack/spack/main.py | 8 ++++- lib/spack/spack/mirror.py | 8 ++--- lib/spack/spack/package.py | 12 ++++---- lib/spack/spack/spec.py | 20 ++++++++----- share/spack/spack-completion.bash | 3 +- 14 files changed, 105 insertions(+), 45 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/tty/color.py b/lib/spack/llnl/util/tty/color.py index fc3b697827..a39b5b95f8 100644 --- a/lib/spack/llnl/util/tty/color.py +++ b/lib/spack/llnl/util/tty/color.py @@ -80,6 +80,7 @@ To output an @, use '@@'. To output a } inside braces, use '}}'. """ import re import sys +from contextlib import contextmanager class ColorParseError(Exception): @@ -107,15 +108,62 @@ colors = {'k': 30, 'K': 90, # black # Regex to be used for color formatting color_re = r'@(?:@|\.|([*_])?([a-zA-Z])?(?:{((?:[^}]|}})*)})?)' +# Mapping from color arguments to values for tty.set_color +color_when_values = { + 'always': True, + 'auto': None, + 'never': False +} -# Force color even if stdout is not a tty. -_force_color = False +# Force color; None: Only color if stdout is a tty +# True: Always colorize output, False: Never colorize output +_force_color = None + + +def _color_when_value(when): + """Raise a ValueError for an invalid color setting. + + Valid values are 'always', 'never', and 'auto', or equivalently, + True, False, and None. + """ + if when in color_when_values: + return color_when_values[when] + elif when not in color_when_values.values(): + raise ValueError('Invalid color setting: %s' % when) + return when + + +def get_color_when(): + """Return whether commands should print color or not.""" + if _force_color is not None: + return _force_color + return sys.stdout.isatty() + + +def set_color_when(when): + """Set when color should be applied. Options are: + + * True or 'always': always print color + * False or 'never': never print color + * None or 'auto': only print color if sys.stdout is a tty. + """ + global _force_color + _force_color = _color_when_value(when) + + +@contextmanager +def color_when(value): + """Context manager to temporarily use a particular color setting.""" + old_value = value + set_color(value) + yield + set_color(old_value) class match_to_ansi(object): def __init__(self, color=True): - self.color = color + self.color = _color_when_value(color) def escape(self, s): """Returns a TTY escape sequence for a color""" @@ -166,7 +214,7 @@ def colorize(string, **kwargs): color (bool): If False, output will be plain text without control codes, for output to non-console devices. """ - color = kwargs.get('color', True) + color = _color_when_value(kwargs.get('color', get_color_when())) return re.sub(color_re, match_to_ansi(color), string) @@ -188,7 +236,7 @@ def cwrite(string, stream=sys.stdout, color=None): then it will be set based on stream.isatty(). """ if color is None: - color = stream.isatty() or _force_color + color = get_color_when() stream.write(colorize(string, color=color)) @@ -217,7 +265,7 @@ class ColorStream(object): if raw: color = True else: - color = self._stream.isatty() or _force_color + color = get_color_when() raw_write(colorize(string, color=color)) def writelines(self, sequence, **kwargs): diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index edeaa677de..b9b145d0b5 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -154,9 +154,8 @@ def disambiguate_spec(spec): elif len(matching_specs) > 1: args = ["%s matches multiple packages." % spec, "Matching packages:"] - color = sys.stdout.isatty() - args += [colorize(" @K{%s} " % s.dag_hash(7), color=color) + - s.format('$_$@$%@$=', color=color) for s in matching_specs] + args += [colorize(" @K{%s} " % s.dag_hash(7)) + + s.cformat('$_$@$%@$=') for s in matching_specs] args += ["Use a more specific spec."] tty.die(*args) @@ -200,7 +199,7 @@ def display_specs(specs, **kwargs): specs = index[(architecture, compiler)] specs.sort() - abbreviated = [s.format(format_string, color=True) for s in specs] + abbreviated = [s.cformat(format_string) for s in specs] if mode == 'paths': # Print one spec per line along with prefix path width = max(len(s) for s in abbreviated) @@ -215,7 +214,6 @@ def display_specs(specs, **kwargs): for spec in specs: print(spec.tree( format=format_string, - color=True, indent=4, prefix=(lambda s: gray_hash(s, hlen)) if hashes else None)) @@ -227,7 +225,7 @@ def display_specs(specs, **kwargs): string = "" if hashes: string += gray_hash(s, hlen) + ' ' - string += s.format('$-%s$@%s' % (nfmt, vfmt), color=True) + string += s.cformat('$-%s$@%s' % (nfmt, vfmt)) return string @@ -237,7 +235,7 @@ def display_specs(specs, **kwargs): for spec in specs: # Print the hash if necessary hsh = gray_hash(spec, hlen) + ' ' if hashes else '' - print(hsh + spec.format(format_string, color=True) + '\n') + print(hsh + spec.cformat(format_string) + '\n') else: raise ValueError( diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index c983dd79ce..e8f8fc0d0b 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -47,7 +47,7 @@ def dependents(parser, args): tty.die("spack dependents takes only one spec.") spec = spack.cmd.disambiguate_spec(specs[0]) - tty.msg("Dependents of %s" % spec.format('$_$@$%@$/', color=True)) + tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/')) deps = spack.store.db.installed_dependents(spec) if deps: spack.cmd.display_specs(deps) diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index bfc36c4107..b89ac4121d 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -213,7 +213,7 @@ def mirror_create(args): " %-4d failed to fetch." % e) if error: tty.error("Failed downloads:") - colify(s.format("$_$@") for s in error) + colify(s.cformat("$_$@") for s in error) def mirror(parser, args): diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py index ed20ad4029..d59d4433b7 100644 --- a/lib/spack/spack/cmd/module.py +++ b/lib/spack/spack/cmd/module.py @@ -236,7 +236,8 @@ def refresh(mtype, specs, args): if len(writer_list) > 1: message += '\nfile: {0}\n'.format(filename) for x in writer_list: - message += 'spec: {0}\n'.format(x.spec.format(color=True)) + message += 'spec: {0}\n'.format(x.spec.format()) + tty.error(message) tty.error('Operation aborted') raise SystemExit(1) @@ -269,7 +270,7 @@ def module(parser, args): "and this is not allowed in this context") tty.error(message.format(query=constraint)) for s in specs: - sys.stderr.write(s.format(color=True) + '\n') + sys.stderr.write(s.cformat() + '\n') raise SystemExit(1) except NoMatch: message = ("the constraint '{query}' matches no package, " diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index ee1ec882e2..b4740b4ece 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -60,8 +60,7 @@ def setup_parser(subparser): def spec(parser, args): name_fmt = '$.' if args.namespaces else '$_' - kwargs = {'color': True, - 'cover': args.cover, + kwargs = {'cover': args.cover, 'format': name_fmt + '$@$%@+$+$=', 'hashes': args.long or args.very_long, 'hashlen': None if args.very_long else 7, diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index 499521ede0..d4e88288d2 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -180,8 +180,7 @@ def get_uninstall_list(args): has_error = False if dependent_list and not args.dependents and not args.force: for spec, lst in dependent_list.items(): - tty.error('Will not uninstall {0}'.format( - spec.format("$_$@$%@$/", color=True))) + tty.error("Will not uninstall %s" % spec.cformat("$_$@$%@$/")) print('') print('The following packages depend on it:') spack.cmd.display_specs(lst, **display_args) diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 75862ff87c..569de40a94 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -288,7 +288,7 @@ class Database(object): if dhash not in data: tty.warn("Missing dependency not in database: ", "%s needs %s-%s" % ( - spec.format('$_$/'), dname, dhash[:7])) + spec.cformat('$_$/'), dname, dhash[:7])) continue child = data[dhash].spec @@ -440,8 +440,7 @@ class Database(object): # just to be conservative in case a command like # "autoremove" is run by the user after a reindex. tty.debug( - 'RECONSTRUCTING FROM SPEC.YAML: {0}'.format(spec) - ) + 'RECONSTRUCTING FROM SPEC.YAML: {0}'.format(spec)) explicit = True if old_data is not None: old_info = old_data.get(spec.dag_hash()) @@ -467,8 +466,7 @@ class Database(object): # installed compilers or externally installed # applications. tty.debug( - 'RECONSTRUCTING FROM OLD DB: {0}'.format(entry.spec) - ) + 'RECONSTRUCTING FROM OLD DB: {0}'.format(entry.spec)) try: layout = spack.store.layout if entry.spec.external: diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 5e9341ced9..5b430224d6 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -168,7 +168,9 @@ class YamlDirectoryLayout(DirectoryLayout): self.metadata_dir = kwargs.get('metadata_dir', '.spack') self.hash_len = kwargs.get('hash_len') self.path_scheme = kwargs.get('path_scheme') or ( - "${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}") # NOQA: E501 + "${ARCHITECTURE}/" + "${COMPILERNAME}-${COMPILERVER}/" + "${PACKAGE}-${VERSION}-${HASH}") if self.hash_len is not None: if re.search('\${HASH:\d+}', self.path_scheme): raise InvalidDirectoryLayoutParametersError( diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index 2d5648f13e..ee74c915df 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -58,7 +58,7 @@ intro_by_level = { # control top-level spack options shown in basic vs. advanced help options_by_level = { - 'short': 'hkV', + 'short': ['h', 'k', 'V', 'color'], 'long': 'all' } @@ -280,6 +280,9 @@ def make_argument_parser(): parser.add_argument('-h', '--help', action='store_true', help="show this help message and exit") + parser.add_argument('--color', action='store', default='auto', + choices=('always', 'never', 'auto'), + help="when to colorize output; default is auto") parser.add_argument('-d', '--debug', action='store_true', help="write out debug logs during compile") parser.add_argument('-D', '--pdb', action='store_true', @@ -325,6 +328,9 @@ def setup_main_options(args): tty.warn("You asked for --insecure. Will NOT check SSL certificates.") spack.insecure = True + # when to use color (takes always, auto, or never) + tty.color.set_color_when(args.color) + def allows_unknown_args(command): """Implements really simple argument injection for unknown arguments. diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py index 9b9f816db4..bfa7b858d2 100644 --- a/lib/spack/spack/mirror.py +++ b/lib/spack/spack/mirror.py @@ -224,14 +224,14 @@ def add_single_spec(spec, mirror_root, categories, **kwargs): # create a subdirectory for the current package@version archive_path = os.path.abspath(join_path( mirror_root, mirror_archive_path(spec, fetcher))) - name = spec.format("$_$@") + name = spec.cformat("$_$@") else: resource = stage.resource archive_path = os.path.abspath(join_path( mirror_root, mirror_archive_path(spec, fetcher, resource.name))) name = "{resource} ({pkg}).".format( - resource=resource.name, pkg=spec.format("$_$@")) + resource=resource.name, pkg=spec.cformat("$_$@")) subdir = os.path.dirname(archive_path) mkdirp(subdir) @@ -258,8 +258,8 @@ def add_single_spec(spec, mirror_root, categories, **kwargs): if spack.debug: sys.excepthook(*sys.exc_info()) else: - tty.warn("Error while fetching %s" - % spec.format('$_$@'), e.message) + tty.warn( + "Error while fetching %s" % spec.cformat('$_$@'), e.message) categories['error'].append(spec) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 1223fce178..5729836873 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -905,7 +905,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): start_time = time.time() if spack.do_checksum and self.version not in self.versions: tty.warn("There is no checksum on file to fetch %s safely." % - self.spec.format('$_$@')) + self.spec.cformat('$_$@')) # Ask the user whether to skip the checksum if we're # interactive, but just fail if non-interactive. @@ -1649,8 +1649,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.extendee_spec.package.activate(self, **self.extendee_args) spack.store.layout.add_extension(self.extendee_spec, self.spec) - tty.msg("Activated extension %s for %s" % - (self.spec.short_spec, self.extendee_spec.format("$_$@$+$%@"))) + tty.msg( + "Activated extension %s for %s" % + (self.spec.short_spec, self.extendee_spec.cformat("$_$@$+$%@"))) def dependency_activations(self): return (spec for spec in self.spec.traverse(root=False, deptype='run') @@ -1708,8 +1709,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): spack.store.layout.remove_extension( self.extendee_spec, self.spec) - tty.msg("Deactivated extension %s for %s" % - (self.spec.short_spec, self.extendee_spec.format("$_$@$+$%@"))) + tty.msg( + "Deactivated extension %s for %s" % + (self.spec.short_spec, self.extendee_spec.cformat("$_$@$+$%@"))) def deactivate(self, extension, **kwargs): """Unlinks all files from extension out of this package's install dir. diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index db8dcf61a8..992930da65 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -108,6 +108,10 @@ from six import StringIO from six import string_types from six import iteritems +from llnl.util.filesystem import find_headers, find_libraries, is_exe +from llnl.util.lang import * +from llnl.util.tty.color import * + import spack import spack.architecture import spack.compilers as compilers @@ -117,9 +121,6 @@ import spack.store import spack.util.spack_json as sjson import spack.util.spack_yaml as syaml -from llnl.util.filesystem import find_headers, find_libraries, is_exe -from llnl.util.lang import * -from llnl.util.tty.color import * from spack.util.module_cmd import get_path_from_module, load_module from spack.error import SpecError, UnsatisfiableSpecError from spack.provider_index import ProviderIndex @@ -1363,9 +1364,8 @@ class Spec(object): @property def cshort_spec(self): - """Returns a version of the spec with the dependencies hashed - instead of completely enumerated.""" - return self.format('$_$@$%@$+$=$/', color=True) + """Returns an auto-colorized version of ``self.short_spec``.""" + return self.cformat('$_$@$%@$+$=$/') @property def prefix(self): @@ -2852,6 +2852,12 @@ class Spec(object): result = out.getvalue() return result + def cformat(self, *args, **kwargs): + """Same as format, but color defaults to auto instead of False.""" + kwargs = kwargs.copy() + kwargs.setdefault('color', None) + return self.format(*args, **kwargs) + def dep_string(self): return ''.join("^" + dep.format() for dep in self.sorted_deps()) @@ -2882,7 +2888,7 @@ class Spec(object): def tree(self, **kwargs): """Prints out this spec and its dependencies, tree-formatted with indentation.""" - color = kwargs.pop('color', False) + color = kwargs.pop('color', get_color_when()) depth = kwargs.pop('depth', False) hashes = kwargs.pop('hashes', False) hlen = kwargs.pop('hashlen', None) diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index d9ae65b8b5..e60d587c18 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -115,7 +115,8 @@ function _spack { if $list_options then compgen -W "-h --help -d --debug -D --pdb -k --insecure -m --mock -p - --profile -v --verbose -s --stacktrace -V --version" -- "$cur" + --profile -v --verbose -s --stacktrace -V --version + --color --color=always --color=auto --color=never" -- "$cur" else compgen -W "$(_subcommands)" -- "$cur" fi -- cgit v1.2.3-70-g09d2 From 69a6c8ef7880a12cf3300af45317fac94b374df1 Mon Sep 17 00:00:00 2001 From: scheibelp Date: Mon, 31 Jul 2017 13:11:08 -0700 Subject: Fix preference for X.Y version when mixed with X.Y.Z versions (#4922) For packages which contain a mix of versions with formats X.Y and X.Y.Z, if the user entered an X.Y version as a preference in packages.yaml, Spack would get confused and favor any version A.B.Z where X=A and Y=B. In the case where there is a mix of these version types, this commit updates preferences so Spack will favor an exact match. --- lib/spack/spack/package_prefs.py | 10 +++++- lib/spack/spack/test/concretize_preferences.py | 5 +++ .../builtin.mock/packages/mixedversions/package.py | 36 ++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 var/spack/repos/builtin.mock/packages/mixedversions/package.py (limited to 'lib') diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 2e70a3b7dc..56efb604b1 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -112,9 +112,17 @@ class PackagePrefs(object): # integer is the index of the first spec in order that satisfies # spec, or it's a number larger than any position in the order. - return next( + match_index = next( (i for i, s in enumerate(spec_order) if spec.satisfies(s)), len(spec_order)) + if match_index < len(spec_order) and spec_order[match_index] == spec: + # If this is called with multiple specs that all satisfy the same + # minimum index in spec_order, the one which matches that element + # of spec_order exactly is considered slightly better. Note + # that because this decreases the value by less than 1, it is not + # better than a match which occurs at an earlier index. + match_index -= 0.5 + return match_index @classproperty @classmethod diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index 5e880bc4d6..45c037eec7 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -102,6 +102,11 @@ class TestConcretizePreferences(object): spec = concretize('mpileaks') assert spec.version == spack.spec.Version('2.2') + def test_preferred_versions_mixed_version_types(self): + update_packages('mixedversions', 'version', ['2.0']) + spec = concretize('mixedversions') + assert spec.version == spack.spec.Version('2.0') + def test_preferred_providers(self): """Test preferred providers of virtual packages are applied correctly diff --git a/var/spack/repos/builtin.mock/packages/mixedversions/package.py b/var/spack/repos/builtin.mock/packages/mixedversions/package.py new file mode 100644 index 0000000000..5b56eb004d --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/mixedversions/package.py @@ -0,0 +1,36 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Mixedversions(Package): + url = "http://www.fake-mixedversions.org/downloads/mixedversions-1.0.tar.gz" + + version('2.0.1', 'hashc') + version('2.0', 'hashb') + version('1.0.1', 'hasha') + + def install(self, spec, prefix): + pass -- cgit v1.2.3-70-g09d2 From 82735deafd8baff0a7e2fd086c5c9fa601992447 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 31 Jul 2017 15:13:39 -0500 Subject: Clarify docs on using a hash in a spec (#4908) --- lib/spack/docs/basic_usage.rst | 43 +++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst index f25247579b..bb426b4378 100644 --- a/lib/spack/docs/basic_usage.rst +++ b/lib/spack/docs/basic_usage.rst @@ -808,17 +808,46 @@ Specifying Specs by Hash ^^^^^^^^^^^^^^^^^^^^^^^^ Complicated specs can become cumbersome to enter on the command line, -especially when many of the qualifications are necessary to -distinguish between similar installs, for example when using the -``uninstall`` command. To avoid this, when referencing an existing spec, +especially when many of the qualifications are necessary to distinguish +between similar installs. To avoid this, when referencing an existing spec, Spack allows you to reference specs by their hash. We previously discussed the spec hash that Spack computes. In place of a spec in any command, substitute ``/`` where ```` is any amount from -the beginning of a spec hash. If the given spec hash is sufficient -to be unique, Spack will replace the reference with the spec to which -it refers. Otherwise, it will prompt for a more qualified hash. +the beginning of a spec hash. -Note that this will not work to reinstall a depencency uninstalled by +For example, lets say that you accidentally installed two different +``mvapich2`` installations. If you want to uninstall one of them but don't +know what the difference is, you can run: + +.. code-block:: console + + $ spack find --long mvapich2 + ==> 2 installed packages. + -- linux-centos7-x86_64 / gcc@6.3.0 ---------- + qmt35td mvapich2@2.2%gcc + er3die3 mvapich2@2.2%gcc + + +You can then uninstall the latter installation using: + +.. code-block:: console + + $ spack uninstall /er3die3 + + +Or, if you want to build with a specific installation as a dependency, +you can use: + +.. code-block:: console + + $ spack install trilinos ^/er3die3 + + +If the given spec hash is sufficiently long as to be unique, Spack will +replace the reference with the spec to which it refers. Otherwise, it will +prompt for a more qualified hash. + +Note that this will not work to reinstall a dependency uninstalled by ``spack uninstall --force``. .. _cmd-spack-providers: -- cgit v1.2.3-70-g09d2 From f2ddcfac5f526c331185fb92fe9ce6dd85494c74 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 12 Jun 2017 01:07:29 -0700 Subject: Add --all argument to `spack dependents` --all causes spack dependents to list all possible dependents for a package, rather than actual dependents for an installed spec. --- lib/spack/spack/cmd/dependents.py | 62 +++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index e8f8fc0d0b..94b9ffd9c5 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -25,6 +25,7 @@ import argparse import llnl.util.tty as tty +from llnl.util.tty.colify import colify import spack import spack.store @@ -36,20 +37,69 @@ level = "long" def setup_parser(subparser): + subparser.add_argument( + '-a', '--all', action='store_true', default=False, + help="List all potential dependents of the package instead of actual " + "dependents of an installed spec") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, help="specs to list dependencies of") +def inverted_dag(): + """Returns inverted package DAG as adjacency lists.""" + dag = {} + for pkg in spack.repo.all_packages(): + dag.setdefault(pkg.name, set()) + for dep in pkg.dependencies: + deps = [dep] + + # expand virtuals if necessary + if spack.repo.is_virtual(dep): + deps = [s.name for s in spack.repo.providers_for(dep)] + + for d in deps: + dag.setdefault(d, set()).add(pkg.name) + return dag + + +def all_dependents(name, inverted_dag, dependents=None): + if dependents is None: + dependents = set() + + if name in dependents: + return set() + dependents.add(name) + + direct = inverted_dag[name] + for dname in direct: + all_dependents(dname, inverted_dag, dependents) + dependents.update(direct) + return dependents + + def dependents(parser, args): specs = spack.cmd.parse_specs(args.spec) if len(specs) != 1: tty.die("spack dependents takes only one spec.") - spec = spack.cmd.disambiguate_spec(specs[0]) - tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/')) - deps = spack.store.db.installed_dependents(spec) - if deps: - spack.cmd.display_specs(deps) + if args.all: + spec = specs[0] + idag = inverted_dag() + + dependents = all_dependents(spec.name, idag) + dependents.remove(spec.name) + if dependents: + colify(sorted(dependents)) + else: + print("No dependents") + else: - print("No dependents") + spec = spack.cmd.disambiguate_spec(specs[0]) + + tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/')) + deps = spack.store.db.installed_dependents(spec) + if deps: + spack.cmd.display_specs(deps) + else: + print("No dependents") -- cgit v1.2.3-70-g09d2 From 43f576cf19c5fb3af83e39c21db802b2d2f254e8 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 17 Jun 2017 18:14:14 -0700 Subject: Remove unused code. --- lib/spack/spack/version.py | 4 ---- 1 file changed, 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 0d8520a0e0..3414c9c8d9 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -107,10 +107,6 @@ def coerced(method): return coercing_method -def _numeric_lt(self0, other): - """Compares two versions, knowing they're both numeric""" - - class Version(object): """Class to represent versions""" -- cgit v1.2.3-70-g09d2 From bd94a1706684e135af6b2d5bb62d35e8b8263e79 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 17 Jun 2017 15:47:59 +0200 Subject: Remove last vestiges of "special" deptypes. - Remove `special_types` dict in spec.py, as only 'all' is still used - Still allow 'all' to be used as a deptype - Simplify `canonical_deptype` function - Clean up args in spack graph - Add tests --- lib/spack/spack/cmd/graph.py | 3 ++- lib/spack/spack/directives.py | 3 +-- lib/spack/spack/spec.py | 41 +++++++------------------------ lib/spack/spack/test/spec_dag.py | 53 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 64 insertions(+), 36 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py index e42e355f8f..e750e5a959 100644 --- a/lib/spack/spack/cmd/graph.py +++ b/lib/spack/spack/cmd/graph.py @@ -90,7 +90,8 @@ def graph(parser, args): deptype = alldeps if args.deptype: deptype = tuple(args.deptype.split(',')) - validate_deptype(deptype) + if deptype == ('all',): + deptype = 'all' deptype = canonical_deptype(deptype) if args.dot: # Dot graph only if asked for. diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 52e4b83dce..2e8b32e5af 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -241,8 +241,7 @@ def _depends_on(pkg, spec, when=None, type=None): # but is most backwards-compatible. type = ('build', 'link') - if isinstance(type, str): - type = spack.spec.special_types.get(type, (type,)) + type = spack.spec.canonical_deptype(type) for deptype in type: if deptype not in spack.spec.alldeps: diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 992930da65..71d9f4aac1 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -137,7 +137,6 @@ __all__ = [ 'Spec', 'alldeps', 'canonical_deptype', - 'validate_deptype', 'parse', 'parse_anonymous_spec', 'SpecError', @@ -150,7 +149,6 @@ __all__ = [ 'DuplicateArchitectureError', 'InconsistentSpecError', 'InvalidDependencyError', - 'InvalidDependencyTypeError', 'NoProviderError', 'MultipleProviderError', 'UnsatisfiableSpecError', @@ -197,44 +195,27 @@ _separators = '[%s]' % ''.join(color_formats.keys()) every time we call str()""" _any_version = VersionList([':']) -# Special types of dependencies. +"""Types of dependencies that Spack understands.""" alldeps = ('build', 'link', 'run') -norun = ('link', 'build') -special_types = { - 'alldeps': alldeps, - 'all': alldeps, # allow "all" as string but not symbol. - 'norun': norun, -} - -legal_deps = tuple(special_types) + alldeps """Max integer helps avoid passing too large a value to cyaml.""" maxint = 2 ** (ctypes.sizeof(ctypes.c_int) * 8 - 1) - 1 -def validate_deptype(deptype): - if isinstance(deptype, str): - if deptype not in legal_deps: - raise InvalidDependencyTypeError( - "Invalid dependency type: %s" % deptype) - - elif isinstance(deptype, (list, tuple)): - for t in deptype: - validate_deptype(t) - - elif deptype is None: - raise InvalidDependencyTypeError("deptype cannot be None!") - - def canonical_deptype(deptype): - if deptype is None: + if deptype in (None, 'all', all): return alldeps elif isinstance(deptype, string_types): - return special_types.get(deptype, (deptype,)) + if deptype not in alldeps: + raise ValueError('Invalid dependency type: %s' % deptype) + return (deptype,) elif isinstance(deptype, (tuple, list)): - return (sum((canonical_deptype(d) for d in deptype), ())) + invalid = next((d for d in deptype if d not in alldeps), None) + if invalid: + raise ValueError('Invalid dependency type: %s' % invalid) + return tuple(sorted(deptype)) return deptype @@ -3338,10 +3319,6 @@ class InvalidDependencyError(SpecError): of the package.""" -class InvalidDependencyTypeError(SpecError): - """Raised when a dependency type is not a legal Spack dep type.""" - - class NoProviderError(SpecError): """Raised when there is no package that provides a particular virtual dependency. diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index 07a9b72e09..c82365ad11 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -30,7 +30,7 @@ import spack import spack.architecture import spack.package -from spack.spec import Spec +from spack.spec import Spec, canonical_deptype, alldeps def check_links(spec_to_check): @@ -737,3 +737,54 @@ class TestSpecDag(object): with pytest.raises(AttributeError): q.libs + + def test_canonical_deptype(self): + # special values + assert canonical_deptype(all) == alldeps + assert canonical_deptype('all') == alldeps + assert canonical_deptype(None) == alldeps + + # everything in alldeps is canonical + for v in alldeps: + assert canonical_deptype(v) == (v,) + + # tuples + assert canonical_deptype(('build',)) == ('build',) + assert canonical_deptype( + ('build', 'link', 'run')) == ('build', 'link', 'run') + assert canonical_deptype( + ('build', 'link')) == ('build', 'link') + assert canonical_deptype( + ('build', 'run')) == ('build', 'run') + + # lists + assert canonical_deptype( + ['build', 'link', 'run']) == ('build', 'link', 'run') + assert canonical_deptype( + ['build', 'link']) == ('build', 'link') + assert canonical_deptype( + ['build', 'run']) == ('build', 'run') + + # sorting + assert canonical_deptype( + ('run', 'build', 'link')) == ('build', 'link', 'run') + assert canonical_deptype( + ('run', 'link', 'build')) == ('build', 'link', 'run') + assert canonical_deptype( + ('run', 'link')) == ('link', 'run') + assert canonical_deptype( + ('link', 'build')) == ('build', 'link') + + # can't put 'all' in tuple or list + with pytest.raises(ValueError): + canonical_deptype(['all']) + with pytest.raises(ValueError): + canonical_deptype(('all',)) + + # invalid values + with pytest.raises(ValueError): + canonical_deptype('foo') + with pytest.raises(ValueError): + canonical_deptype(('foo', 'bar')) + with pytest.raises(ValueError): + canonical_deptype(('foo',)) -- cgit v1.2.3-70-g09d2 From 6928cf7a68c72d01472a766669790b12425092ad Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 17 Jun 2017 16:05:12 +0200 Subject: spack dependents lists possible dependencies by default. --- lib/spack/spack/cmd/dependents.py | 62 +++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 25 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 94b9ffd9c5..0d470e7a89 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -38,16 +38,22 @@ level = "long" def setup_parser(subparser): subparser.add_argument( - '-a', '--all', action='store_true', default=False, - help="List all potential dependents of the package instead of actual " - "dependents of an installed spec") + '-i', '--installed', action='store_true', default=False, + help="List installed dependents of an installed spec, " + "instead of possible dependents of a package.") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="specs to list dependencies of") + help="spec to list dependents for") -def inverted_dag(): - """Returns inverted package DAG as adjacency lists.""" +def inverted_dependencies(): + """Iterate through all packages and return a dictionary mapping package + names to possible dependnecies. + + Virtual packages are included as sources, so that you can query + dependents of, e.g., `mpi`, but virtuals are not included as + actual dependents. + """ dag = {} for pkg in spack.repo.all_packages(): dag.setdefault(pkg.name, set()) @@ -56,24 +62,30 @@ def inverted_dag(): # expand virtuals if necessary if spack.repo.is_virtual(dep): - deps = [s.name for s in spack.repo.providers_for(dep)] + deps += [s.name for s in spack.repo.providers_for(dep)] for d in deps: dag.setdefault(d, set()).add(pkg.name) return dag -def all_dependents(name, inverted_dag, dependents=None): +def get_dependents(pkg_name, ideps, dependents=None): + """Get all dependents for a package. + + Args: + pkg_name (str): name of the package whose dependents should be returned + ideps (dict): dictionary of dependents, from inverted_dependencies() + """ if dependents is None: dependents = set() - if name in dependents: + if pkg_name in dependents: return set() - dependents.add(name) + dependents.add(pkg_name) - direct = inverted_dag[name] - for dname in direct: - all_dependents(dname, inverted_dag, dependents) + direct = ideps[pkg_name] + for dep_name in direct: + get_dependents(dep_name, ideps, dependents) dependents.update(direct) return dependents @@ -83,18 +95,7 @@ def dependents(parser, args): if len(specs) != 1: tty.die("spack dependents takes only one spec.") - if args.all: - spec = specs[0] - idag = inverted_dag() - - dependents = all_dependents(spec.name, idag) - dependents.remove(spec.name) - if dependents: - colify(sorted(dependents)) - else: - print("No dependents") - - else: + if args.installed: spec = spack.cmd.disambiguate_spec(specs[0]) tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/')) @@ -103,3 +104,14 @@ def dependents(parser, args): spack.cmd.display_specs(deps) else: print("No dependents") + + else: + spec = specs[0] + ideps = inverted_dependencies() + + dependents = get_dependents(spec.name, ideps) + dependents.remove(spec.name) + if dependents: + colify(sorted(dependents)) + else: + print("No dependents") -- cgit v1.2.3-70-g09d2 From b9606e3157652b6fd65868afd44f6fc1fb02d204 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 17 Jun 2017 18:14:44 -0700 Subject: Add --transitive option to `spack dependents` --- lib/spack/spack/cmd/dependents.py | 17 +++++++++++------ lib/spack/spack/database.py | 9 +++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 0d470e7a89..166f9e129c 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -31,7 +31,7 @@ import spack import spack.store import spack.cmd -description = "show installed packages that depend on another" +description = "show packages that depend on another" section = "basic" level = "long" @@ -41,9 +41,12 @@ def setup_parser(subparser): '-i', '--installed', action='store_true', default=False, help="List installed dependents of an installed spec, " "instead of possible dependents of a package.") + subparser.add_argument( + '-t', '--transitive', action='store_true', default=False, + help="Show all transitive dependents.") subparser.add_argument( 'spec', nargs=argparse.REMAINDER, - help="spec to list dependents for") + help="spec or package name") def inverted_dependencies(): @@ -69,12 +72,13 @@ def inverted_dependencies(): return dag -def get_dependents(pkg_name, ideps, dependents=None): +def get_dependents(pkg_name, ideps, transitive=False, dependents=None): """Get all dependents for a package. Args: pkg_name (str): name of the package whose dependents should be returned ideps (dict): dictionary of dependents, from inverted_dependencies() + transitive (bool, optional): return transitive dependents when True """ if dependents is None: dependents = set() @@ -84,8 +88,9 @@ def get_dependents(pkg_name, ideps, dependents=None): dependents.add(pkg_name) direct = ideps[pkg_name] - for dep_name in direct: - get_dependents(dep_name, ideps, dependents) + if transitive: + for dep_name in direct: + get_dependents(dep_name, ideps, transitive, dependents) dependents.update(direct) return dependents @@ -109,7 +114,7 @@ def dependents(parser, args): spec = specs[0] ideps = inverted_dependencies() - dependents = get_dependents(spec.name, ideps) + dependents = get_dependents(spec.name, ideps, args.transitive) dependents.remove(spec.name) if dependents: colify(sorted(dependents)) diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 569de40a94..862eb25e7e 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -711,11 +711,16 @@ class Database(object): return self._remove(spec) @_autospec - def installed_dependents(self, spec): + def installed_dependents(self, spec, transitive=True): """List the installed specs that depend on this one.""" dependents = set() for spec in self.query(spec): - for dependent in spec.traverse(direction='parents', root=False): + if transitive: + to_add = spec.traverse(direction='parents', root=False) + else: + to_add = spec.dependents() + + for dependent in to_add: dependents.add(dependent) return dependents -- cgit v1.2.3-70-g09d2 From 36b3dd8cfe1b932bd60f13606e9bfe23d8d91ffd Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 5 Mar 2017 21:41:18 -0800 Subject: Package.possible_dependencies() descends into virtuals. --- lib/spack/spack/package.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 5729836873..ff8c629ee7 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -601,10 +601,19 @@ class PackageBase(with_metaclass(PackageMeta, object)): visited.add(self.name) for name in self.dependencies: - if name not in visited and not spack.spec.Spec(name).virtual: + if name in visited: + continue + + spec = spack.spec.Spec(name) + if not spec.virtual: pkg = spack.repo.get(name) for name in pkg.possible_dependencies(visited): visited.add(name) + else: + for provider in spack.repo.providers_for(spec): + pkg = spack.repo.get(provider.name) + for name in pkg.possible_dependencies(visited): + visited.add(name) return visited -- cgit v1.2.3-70-g09d2 From c8b2100630698a214f5787a3c51f44debfa23252 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 17 Jun 2017 19:20:05 -0700 Subject: Refactor installed_dependents -> installed_relatives --- lib/spack/spack/cmd/dependents.py | 6 +++--- lib/spack/spack/cmd/uninstall.py | 8 +++++--- lib/spack/spack/database.py | 32 ++++++++++++++++++++++++-------- lib/spack/spack/package.py | 3 ++- 4 files changed, 34 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 166f9e129c..82a85e1180 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -45,8 +45,7 @@ def setup_parser(subparser): '-t', '--transitive', action='store_true', default=False, help="Show all transitive dependents.") subparser.add_argument( - 'spec', nargs=argparse.REMAINDER, - help="spec or package name") + 'spec', nargs=argparse.REMAINDER, help="spec or package name") def inverted_dependencies(): @@ -104,7 +103,8 @@ def dependents(parser, args): spec = spack.cmd.disambiguate_spec(specs[0]) tty.msg("Dependents of %s" % spec.cformat('$_$@$%@$/')) - deps = spack.store.db.installed_dependents(spec) + deps = spack.store.db.installed_relatives( + spec, 'parents', args.transitive) if deps: spack.cmd.display_specs(deps) else: diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index d4e88288d2..e95a5f3430 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -128,8 +128,8 @@ def installed_dependents(specs): """ dependents = {} for item in specs: - lst = [x for x in spack.store.db.installed_dependents(item) - if x not in specs] + installed = spack.store.db.installed_relatives(item, 'parents', True) + lst = [x for x in installed if x not in specs] if lst: lst = list(set(lst)) dependents[item] = lst @@ -157,7 +157,9 @@ def do_uninstall(specs, force): # Sort packages to be uninstalled by the number of installed dependents # This ensures we do things in the right order def num_installed_deps(pkg): - return len(spack.store.db.installed_dependents(pkg.spec)) + dependents = spack.store.db.installed_relatives( + pkg.spec, 'parents', True) + return len(dependents) packages.sort(key=num_installed_deps) for item in packages: diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 862eb25e7e..6b54dc5939 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -711,18 +711,34 @@ class Database(object): return self._remove(spec) @_autospec - def installed_dependents(self, spec, transitive=True): - """List the installed specs that depend on this one.""" - dependents = set() + def installed_relatives(self, spec, direction='children', transitive=True): + """Return installed specs related to this one.""" + if direction not in ('parents', 'children'): + raise ValueError("Invalid direction: %s" % direction) + + relatives = set() for spec in self.query(spec): if transitive: - to_add = spec.traverse(direction='parents', root=False) - else: + to_add = spec.traverse(direction=direction, root=False) + elif direction == 'parents': to_add = spec.dependents() + else: # direction == 'children' + to_add = spec.dependencies() + + for relative in to_add: + hash_key = relative.dag_hash() + if hash_key not in self._data: + reltype = ('Dependent' if direction == 'parents' + else 'Dependency') + tty.warn("Inconsistent state! %s %s of %s not in DB" + % (reltype, hash_key, spec.dag_hash())) + continue + + if not self._data[hash_key].installed: + continue - for dependent in to_add: - dependents.add(dependent) - return dependents + relatives.add(relative) + return relatives @_autospec def installed_extensions_for(self, extendee_spec): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index ff8c629ee7..bdf56af608 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1582,7 +1582,8 @@ class PackageBase(with_metaclass(PackageMeta, object)): raise InstallError(str(spec) + " is not installed.") if not force: - dependents = spack.store.db.installed_dependents(spec) + dependents = spack.store.db.installed_relatives( + spec, 'parents', True) if dependents: raise PackageStillNeededError(spec, dependents) -- cgit v1.2.3-70-g09d2 From b575d008bd56c4a900824109a2952d28c1896563 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 30 Jul 2017 14:09:19 -0700 Subject: Fix issue with case check and `spack -m` --- lib/spack/spack/hooks/case_consistency.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/hooks/case_consistency.py b/lib/spack/spack/hooks/case_consistency.py index fcf9ee2588..f6246f6008 100644 --- a/lib/spack/spack/hooks/case_consistency.py +++ b/lib/spack/spack/hooks/case_consistency.py @@ -39,7 +39,11 @@ def pre_run(): if platform.system() != "Darwin": return - git_case_consistency_check(spack.repo.get_repo('builtin').packages_path) + try: + repo = spack.repo.get_repo('builtin') + git_case_consistency_check(repo.packages_path) + except spack.repository.UnknownNamespaceError: + pass def git_case_consistency_check(path): -- cgit v1.2.3-70-g09d2 From af3c794ab57c76dd995a0ddd5eab34d75c5df494 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 30 Jul 2017 14:10:19 -0700 Subject: document and make `display_specs` more versatile --- lib/spack/spack/cmd/__init__.py | 54 +++++++++++++++++++++++++++++++++++------ lib/spack/spack/cmd/find.py | 8 +----- 2 files changed, 48 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index b9b145d0b5..5e4564b1e8 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -166,15 +166,55 @@ def gray_hash(spec, length): return colorize('@K{%s}' % spec.dag_hash(length)) -def display_specs(specs, **kwargs): - mode = kwargs.get('mode', 'short') - hashes = kwargs.get('long', False) - namespace = kwargs.get('namespace', False) - flags = kwargs.get('show_flags', False) - variants = kwargs.get('variants', False) +def display_specs(specs, args=None, **kwargs): + """Display human readable specs with customizable formatting. + + Prints the supplied specs to the screen, formatted according to the + arguments provided. + + Specs are grouped by architecture and compiler, and columnized if + possible. There are three possible "modes": + + * ``short`` (default): short specs with name and version, columnized + * ``paths``: Two columns: one for specs, one for paths + * ``deps``: Dependency-tree style, like ``spack spec``; can get long + + Options can add more information to the default display. Options can + be provided either as keyword arguments or as an argparse namespace. + Keyword arguments take precedence over settings in the argparse + namespace. + + Args: + specs (list of spack.spec.Spec): the specs to display + args (optional argparse.Namespace): namespace containing + formatting arguments + + Keyword Args: + mode (str): Either 'short', 'paths', or 'deps' + long (bool): Display short hashes with specs + very_long (bool): Display full hashes with specs (supersedes ``long``) + namespace (bool): Print namespaces along with names + show_flags (bool): Show compiler flags with specs + variants (bool): Show variants with specs + + """ + def get_arg(name, default=None): + """Prefer kwargs, then args, then default.""" + if name in kwargs: + return kwargs.get(name) + elif args is not None: + return getattr(args, name, default) + else: + return default + + mode = get_arg('mode', 'short') + hashes = get_arg('long', False) + namespace = get_arg('namespace', False) + flags = get_arg('show_flags', False) + variants = get_arg('variants', False) hlen = 7 - if kwargs.get('very_long', False): + if get_arg('very_long', False): hashes = True hlen = None diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index cbf91e4a8a..bb8e2e5bcf 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -128,10 +128,4 @@ def find(parser, args): if sys.stdout.isatty(): tty.msg("%d installed packages." % len(query_specs)) - display_specs(query_specs, - mode=args.mode, - long=args.long, - very_long=args.very_long, - show_flags=args.show_flags, - namespace=args.namespace, - variants=args.variants) + display_specs(query_specs, args) -- cgit v1.2.3-70-g09d2 From b88f55e523590d33b03b0d90f2a2d0875f4c60cb Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 19 Jun 2017 00:51:34 -0700 Subject: Add `spack dependencies` command and tests for it and dependents. --- lib/spack/llnl/util/tty/color.py | 4 +- lib/spack/spack/cmd/dependencies.py | 87 ++++++++++++++++++++++++++++++++ lib/spack/spack/cmd/dependents.py | 2 +- lib/spack/spack/main.py | 5 +- lib/spack/spack/package.py | 27 ++++++---- lib/spack/spack/test/cmd/dependencies.py | 77 ++++++++++++++++++++++++++++ lib/spack/spack/test/cmd/dependents.py | 74 +++++++++++++++++++++++++++ 7 files changed, 261 insertions(+), 15 deletions(-) create mode 100644 lib/spack/spack/cmd/dependencies.py create mode 100644 lib/spack/spack/test/cmd/dependencies.py create mode 100644 lib/spack/spack/test/cmd/dependents.py (limited to 'lib') diff --git a/lib/spack/llnl/util/tty/color.py b/lib/spack/llnl/util/tty/color.py index a39b5b95f8..1081acd0f1 100644 --- a/lib/spack/llnl/util/tty/color.py +++ b/lib/spack/llnl/util/tty/color.py @@ -155,9 +155,9 @@ def set_color_when(when): def color_when(value): """Context manager to temporarily use a particular color setting.""" old_value = value - set_color(value) + set_color_when(value) yield - set_color(old_value) + set_color_when(old_value) class match_to_ansi(object): diff --git a/lib/spack/spack/cmd/dependencies.py b/lib/spack/spack/cmd/dependencies.py new file mode 100644 index 0000000000..b35c324fc7 --- /dev/null +++ b/lib/spack/spack/cmd/dependencies.py @@ -0,0 +1,87 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import argparse + +import llnl.util.tty as tty +from llnl.util.tty.colify import colify + +import spack +import spack.store +import spack.cmd + +description = "show dependencies of a package" +section = "basic" +level = "long" + + +def setup_parser(subparser): + subparser.add_argument( + '-i', '--installed', action='store_true', default=False, + help="List installed dependencies of an installed spec, " + "instead of possible dependencies of a package.") + subparser.add_argument( + '-t', '--transitive', action='store_true', default=False, + help="Show all transitive dependencies.") + subparser.add_argument( + 'spec', nargs=argparse.REMAINDER, help="spec or package name") + + +def dependencies(parser, args): + specs = spack.cmd.parse_specs(args.spec) + if len(specs) != 1: + tty.die("spack dependencies takes only one spec.") + + if args.installed: + spec = spack.cmd.disambiguate_spec(specs[0]) + + tty.msg("Dependencies of %s" % spec.format('$_$@$%@$/', color=True)) + deps = spack.store.db.installed_relatives( + spec, 'children', args.transitive) + if deps: + spack.cmd.display_specs(deps, long=True) + else: + print("No dependencies") + + else: + spec = specs[0] + + if not spec.virtual: + packages = [spec.package] + else: + packages = [spack.repo.get(s.name) + for s in spack.repo.providers_for(spec)] + + dependencies = set() + for pkg in packages: + dependencies.update( + set(pkg.possible_dependencies(args.transitive))) + + if spec.name in dependencies: + dependencies.remove(spec.name) + + if dependencies: + colify(sorted(dependencies)) + else: + print("No dependencies") diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 82a85e1180..3413ac3227 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -106,7 +106,7 @@ def dependents(parser, args): deps = spack.store.db.installed_relatives( spec, 'parents', args.transitive) if deps: - spack.cmd.display_specs(deps) + spack.cmd.display_specs(deps, long=True) else: print("No dependents") diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index ee74c915df..d10047e325 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -377,12 +377,15 @@ class SpackCommand(object): self.command = spack.cmd.get_command(command) self.fail_on_error = fail_on_error - def __call__(self, *argv): + def __call__(self, *argv, **kwargs): """Invoke this SpackCommand. Args: argv (list of str): command line arguments. + Keyword Args: + color (optional bool): force-disable or force-enable color + Returns: (str, str): output and error as a strings diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index bdf56af608..e8e741fefa 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -594,26 +594,31 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.extra_args = {} - def possible_dependencies(self, visited=None): - """Return set of possible transitive dependencies of this package.""" + def possible_dependencies(self, transitive=True, visited=None): + """Return set of possible transitive dependencies of this package. + + Args: + transitive (bool): include all transitive dependencies if True, + only direct dependencies if False. + """ if visited is None: visited = set() visited.add(self.name) for name in self.dependencies: - if name in visited: - continue - spec = spack.spec.Spec(name) + if not spec.virtual: - pkg = spack.repo.get(name) - for name in pkg.possible_dependencies(visited): - visited.add(name) + visited.add(name) + if transitive: + pkg = spack.repo.get(name) + pkg.possible_dependencies(transitive, visited) else: for provider in spack.repo.providers_for(spec): - pkg = spack.repo.get(provider.name) - for name in pkg.possible_dependencies(visited): - visited.add(name) + visited.add(provider.name) + if transitive: + pkg = spack.repo.get(provider.name) + pkg.possible_dependencies(transitive, visited) return visited diff --git a/lib/spack/spack/test/cmd/dependencies.py b/lib/spack/spack/test/cmd/dependencies.py new file mode 100644 index 0000000000..e024fcc2e6 --- /dev/null +++ b/lib/spack/spack/test/cmd/dependencies.py @@ -0,0 +1,77 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import re + +from llnl.util.tty.color import color_when + +import spack +from spack.main import SpackCommand + +dependencies = SpackCommand('dependencies') + +mpis = ['mpich', 'mpich2', 'multi-provider-mpi', 'zmpi'] +mpi_deps = ['fake'] + + +def test_immediate_dependencies(builtin_mock): + out, err = dependencies('mpileaks') + actual = set(re.split(r'\s+', out.strip())) + expected = set(['callpath'] + mpis) + assert expected == actual + + +def test_transitive_dependencies(builtin_mock): + out, err = dependencies('--transitive', 'mpileaks') + actual = set(re.split(r'\s+', out.strip())) + expected = set( + ['callpath', 'dyninst', 'libdwarf', 'libelf'] + mpis + mpi_deps) + assert expected == actual + + +def test_immediate_installed_dependencies(builtin_mock, database): + with color_when(False): + out, err = dependencies('--installed', 'mpileaks^mpich') + + lines = [l for l in out.strip().split('\n') if not l.startswith('--')] + hashes = set([re.split(r'\s+', l)[0] for l in lines]) + + expected = set([spack.store.db.query_one(s).dag_hash(7) + for s in ['mpich', 'callpath^mpich']]) + + assert expected == hashes + + +def test_transitive_installed_dependencies(builtin_mock, database): + with color_when(False): + out, err = dependencies('--installed', '--transitive', 'mpileaks^zmpi') + + lines = [l for l in out.strip().split('\n') if not l.startswith('--')] + hashes = set([re.split(r'\s+', l)[0] for l in lines]) + + expected = set([spack.store.db.query_one(s).dag_hash(7) + for s in ['zmpi', 'callpath^zmpi', 'fake', + 'dyninst', 'libdwarf', 'libelf']]) + + assert expected == hashes diff --git a/lib/spack/spack/test/cmd/dependents.py b/lib/spack/spack/test/cmd/dependents.py new file mode 100644 index 0000000000..69f57d88a3 --- /dev/null +++ b/lib/spack/spack/test/cmd/dependents.py @@ -0,0 +1,74 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import re + +from llnl.util.tty.color import color_when + +import spack +from spack.main import SpackCommand + +dependents = SpackCommand('dependents') + + +def test_immediate_dependents(builtin_mock): + out, err = dependents('libelf') + actual = set(re.split(r'\s+', out.strip())) + assert actual == set(['dyninst', 'libdwarf']) + + +def test_transitive_dependents(builtin_mock): + out, err = dependents('--transitive', 'libelf') + actual = set(re.split(r'\s+', out.strip())) + assert actual == set( + ['callpath', 'dyninst', 'libdwarf', 'mpileaks', 'multivalue_variant']) + + +def test_immediate_installed_dependents(builtin_mock, database): + with color_when(False): + out, err = dependents('--installed', 'libelf') + + lines = [l for l in out.strip().split('\n') if not l.startswith('--')] + hashes = set([re.split(r'\s+', l)[0] for l in lines]) + + expected = set([spack.store.db.query_one(s).dag_hash(7) + for s in ['dyninst', 'libdwarf']]) + + libelf = spack.store.db.query_one('libelf') + expected = set([d.dag_hash(7) for d in libelf.dependents()]) + + assert expected == hashes + + +def test_transitive_installed_dependents(builtin_mock, database): + with color_when(False): + out, err = dependents('--installed', '--transitive', 'fake') + + lines = [l for l in out.strip().split('\n') if not l.startswith('--')] + hashes = set([re.split(r'\s+', l)[0] for l in lines]) + + expected = set([spack.store.db.query_one(s).dag_hash(7) + for s in ['zmpi', 'callpath^zmpi', 'mpileaks^zmpi']]) + + assert expected == hashes -- cgit v1.2.3-70-g09d2 From 44ce0adbd5b0b0356b4fe0977dc627f589278291 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 31 Jul 2017 17:53:09 -0700 Subject: Fix color bug in Spec.format() introduced by #3013 --- lib/spack/spack/spec.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 71d9f4aac1..54939d7a6b 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2706,11 +2706,8 @@ class Spec(object): named_str = fmt = '' def write(s, c): - if color: - f = color_formats[c] + cescape(s) + '@.' - cwrite(f, stream=out, color=color) - else: - out.write(s) + f = color_formats[c] + cescape(s) + '@.' + cwrite(f, stream=out, color=color) iterator = enumerate(format_string) for i, c in iterator: @@ -2802,7 +2799,7 @@ class Spec(object): write(fmt % str(self.variants), '+') elif named_str == 'ARCHITECTURE': if self.architecture and str(self.architecture): - write(fmt % str(self.architecture), ' arch=') + write(fmt % str(self.architecture), '=') elif named_str == 'SHA1': if self.dependencies: out.write(fmt % str(self.dag_hash(7))) -- cgit v1.2.3-70-g09d2 From 963eb99b7f7306d69a755ddd50bd8b8fca0076c3 Mon Sep 17 00:00:00 2001 From: Sergey Kosukhin Date: Thu, 3 Aug 2017 09:17:07 +0200 Subject: Account for hyphens in package names when searching for libraries. (#4948) --- lib/spack/spack/spec.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 54939d7a6b..cbbd48d9fa 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -802,7 +802,18 @@ def _libs_default_handler(descriptor, spec, cls): Raises: RuntimeError: If no libraries are found """ - name = 'lib' + spec.name + + # Variable 'name' is passed to function 'find_libraries', which supports + # glob characters. For example, we have a package with a name 'abc-abc'. + # Now, we don't know if the original name of the package is 'abc_abc' + # (and it generates a library 'libabc_abc.so') or 'abc-abc' (and it + # generates a library 'libabc-abc.so'). So, we tell the function + # 'find_libraries' to give us anything that matches 'libabc?abc' and it + # gives us either 'libabc-abc.so' or 'libabc_abc.so' (or an error) + # depending on which one exists (there is a possibility, of course, to + # get something like 'libabcXabc.so, but for now we consider this + # unlikely). + name = 'lib' + spec.name.replace('-', '?') if '+shared' in spec: libs = find_libraries( -- cgit v1.2.3-70-g09d2 From 36496b91740b2af0099dce6066722f763b38341f Mon Sep 17 00:00:00 2001 From: George Hartzell Date: Thu, 3 Aug 2017 10:33:16 -0700 Subject: Fix crashes when running spack install under nohup (#4926) * Fix crashes when running spack install under nohup Fixes #4919 For reasons that I do not entire understand, duplicate_stream() throws an '[Errno 22] Invalid argument' exception when it tries to `os.fdopen()` the duplicated file descriptor generated by `os.dup(original.fileno())`. See spack/llnl/util/lang.py, line 394-ish. This happens when run under `nohup`, which supposedly has hooked `stdin` to `/dev/null`. It seems like opening and using `devnull` on the `input_stream` in this situation is a reasonable way to handle the problem. * Be more specific about error being handled. Only catch the specific error that happens when trying to dup the stdin that nohup provides. Catching e as a StandardErorr and then `type(e).__name__` tells me that it's an OSError. Printing e.errno tells me that it's 22 Double checking tells me that 22 is EINVAL. Phew. --- lib/spack/spack/build_environment.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 571f0f8c49..e41edc14f8 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -54,6 +54,7 @@ calls you can make from within the install() function. import inspect import multiprocessing import os +import errno import shutil import sys import traceback @@ -577,8 +578,15 @@ def fork(pkg, function, dirty=False): parent_connection, child_connection = multiprocessing.Pipe() try: # Forward sys.stdin to be able to activate / deactivate - # verbosity pressing a key at run-time - input_stream = lang.duplicate_stream(sys.stdin) + # verbosity pressing a key at run-time. When sys.stdin can't + # be duplicated (e.g. running under nohup, which results in an + # '[Errno 22] Invalid argument') then just use os.devnull + try: + input_stream = lang.duplicate_stream(sys.stdin) + except OSError as e: + if e.errno == errno.EINVAL: + tty.debug("Using devnull as input_stream") + input_stream = open(os.devnull) p = multiprocessing.Process( target=child_execution, args=(child_connection, input_stream) -- cgit v1.2.3-70-g09d2 From 4e269510c565ad7be52bd9c290af19c7115e67af Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Thu, 3 Aug 2017 14:24:51 -0500 Subject: Fix trailing whitespace at the end of headers.cpp_flags (#4957) --- lib/spack/llnl/util/filesystem.py | 93 ++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 16 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 7a9fb7b8ac..bedc7c9de2 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -549,7 +549,7 @@ def find(root, files, recurse=True): if True descends top-down from the root. Defaults to True. Returns: - :func:`list`: The files that have been found + list of strings: The files that have been found """ if isinstance(files, six.string_types): files = [files] @@ -618,9 +618,14 @@ class FileList(collections.Sequence): """Stable de-duplication of the directories where the files reside. >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir1/libc.a']) - >>> assert l.directories == ['/dir1', '/dir2'] + >>> l.directories + ['/dir1', '/dir2'] >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) - >>> assert h.directories == ['/dir1', '/dir2'] + >>> h.directories + ['/dir1', '/dir2'] + + Returns: + list of strings: A list of directories """ return list(dedupe( os.path.dirname(x) for x in self.files if os.path.dirname(x) @@ -631,18 +636,27 @@ class FileList(collections.Sequence): """Stable de-duplication of the base-names in the list >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir3/liba.a']) - >>> assert l.basenames == ['liba.a', 'libb.a'] + >>> l.basenames + ['liba.a', 'libb.a'] >>> h = HeaderList(['/dir1/a.h', '/dir2/b.h', '/dir3/a.h']) - >>> assert h.basenames == ['a.h', 'b.h'] + >>> h.basenames + ['a.h', 'b.h'] + + Returns: + list of strings: A list of base-names """ return list(dedupe(os.path.basename(x) for x in self.files)) @property def names(self): - """Stable de-duplication of file names in the list + """Stable de-duplication of file names in the list without extensions >>> h = HeaderList(['/dir1/a.h', '/dir2/b.h', '/dir3/a.h']) - >>> assert h.names == ['a', 'b'] + >>> h.names + ['a', 'b'] + + Returns: + list of strings: A list of files without extensions """ return list(dedupe(x.split('.')[0] for x in self.basenames)) @@ -688,6 +702,11 @@ class HeaderList(FileList): @property def headers(self): + """Stable de-duplication of the headers. + + Returns: + list of strings: A list of header files + """ return self.files @property @@ -695,7 +714,11 @@ class HeaderList(FileList): """Include flags >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) - >>> assert h.cpp_flags == '-I/dir1 -I/dir2' + >>> h.include_flags + '-I/dir1 -I/dir2' + + Returns: + str: A joined list of include flags """ return ' '.join(['-I' + x for x in self.directories]) @@ -706,7 +729,11 @@ class HeaderList(FileList): >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) >>> h.add_macro('-DBOOST_LIB_NAME=boost_regex') >>> h.add_macro('-DBOOST_DYN_LINK') - >>> assert h.macro_definitions == '-DBOOST_LIB_NAME=boost_regex -DBOOST_DYN_LINK' # noqa + >>> h.macro_definitions + '-DBOOST_LIB_NAME=boost_regex -DBOOST_DYN_LINK' + + Returns: + str: A joined list of macro definitions """ return ' '.join(self._macro_definitions) @@ -715,13 +742,26 @@ class HeaderList(FileList): """Include flags + macro definitions >>> h = HeaderList(['/dir1/a.h', '/dir1/b.h', '/dir2/c.h']) + >>> h.cpp_flags + '-I/dir1 -I/dir2' >>> h.add_macro('-DBOOST_DYN_LINK') - >>> assert h.macro_definitions == '-I/dir1 -I/dir2 -DBOOST_DYN_LINK' + >>> h.cpp_flags + '-I/dir1 -I/dir2 -DBOOST_DYN_LINK' + + Returns: + str: A joined list of include flags and macro definitions """ - return self.include_flags + ' ' + self.macro_definitions + cpp_flags = self.include_flags + if self.macro_definitions: + cpp_flags += ' ' + self.macro_definitions + return cpp_flags def add_macro(self, macro): - """Add a macro definition""" + """Add a macro definition + + Parameters: + macro (str): The macro to add + """ self._macro_definitions.append(macro) @@ -775,6 +815,11 @@ class LibraryList(FileList): @property def libraries(self): + """Stable de-duplication of library files. + + Returns: + list of strings: A list of library files + """ return self.files @property @@ -782,7 +827,11 @@ class LibraryList(FileList): """Stable de-duplication of library names in the list >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir3/liba.so']) - >>> assert l.names == ['a', 'b'] + >>> l.names + ['a', 'b'] + + Returns: + list of strings: A list of library names """ return list(dedupe(x.split('.')[0][3:] for x in self.basenames)) @@ -791,7 +840,11 @@ class LibraryList(FileList): """Search flags for the libraries >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir1/liba.so']) - >>> assert l.search_flags == '-L/dir1 -L/dir2' + >>> l.search_flags + '-L/dir1 -L/dir2' + + Returns: + str: A joined list of search flags """ return ' '.join(['-L' + x for x in self.directories]) @@ -800,7 +853,11 @@ class LibraryList(FileList): """Link flags for the libraries >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir1/liba.so']) - >>> assert l.search_flags == '-la -lb' + >>> l.link_flags + '-la -lb' + + Returns: + str: A joined list of link flags """ return ' '.join(['-l' + name for name in self.names]) @@ -809,7 +866,11 @@ class LibraryList(FileList): """Search flags + link flags >>> l = LibraryList(['/dir1/liba.a', '/dir2/libb.a', '/dir1/liba.so']) - >>> assert l.search_flags == '-L/dir1 -L/dir2 -la -lb' + >>> l.ld_flags + '-L/dir1 -L/dir2 -la -lb' + + Returns: + str: A joined list of search flags and link flags """ return self.search_flags + ' ' + self.link_flags -- cgit v1.2.3-70-g09d2 From 452f382293cffe6fbf134db13cb1420d11e93689 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 4 Aug 2017 10:46:07 -0500 Subject: Add a QMakePackage base class (#4925) * Add a QMakePackage base class * Fix sqlite linking bug in qt-creator * Add latest version of qt-creator * Add latest version of qwt * Use raw strings for regular expressions * Increase minimum required version of qt * Add comment about specific version of sqlite required * Fixes for latest version of qwt and qt-creator * Older versions of Qwt only work with older versions of Qt --- lib/spack/docs/packaging_guide.rst | 5 +- lib/spack/spack/__init__.py | 2 + lib/spack/spack/build_systems/qmake.py | 87 ++++++++++++++++++++++ lib/spack/spack/cmd/build.py | 1 + lib/spack/spack/cmd/configure.py | 1 + lib/spack/spack/cmd/create.py | 38 +++++++--- lib/spack/spack/test/build_system_guess.py | 1 + .../repos/builtin/packages/qt-creator/package.py | 34 ++++++--- var/spack/repos/builtin/packages/qwt/package.py | 21 +++--- var/spack/repos/builtin/packages/sqlite/package.py | 4 + 10 files changed, 159 insertions(+), 35 deletions(-) create mode 100644 lib/spack/spack/build_systems/qmake.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index e4b10cdf53..5d7d69e3d7 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2118,7 +2118,10 @@ The classes that are currently provided by Spack are: | :py:class:`.CMakePackage` | Specialized class for packages | | | built using CMake | +-------------------------------+----------------------------------+ - | :py:class:`.WafPackage` | Specialize class for packages | + | :py:class:`.QMakePackage` | Specialized class for packages | + | | build using QMake | + +-------------------------------+----------------------------------+ + | :py:class:`.WafPackage` | Specialized class for packages | | | built using Waf | +-------------------------------+----------------------------------+ | :py:class:`.RPackage` | Specialized class for | diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index e77a0c75cd..aca906f2e9 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -172,6 +172,7 @@ from spack.package import Package, run_before, run_after, on_package_attributes from spack.build_systems.makefile import MakefilePackage from spack.build_systems.autotools import AutotoolsPackage from spack.build_systems.cmake import CMakePackage +from spack.build_systems.qmake import QMakePackage from spack.build_systems.waf import WafPackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage @@ -185,6 +186,7 @@ __all__ += [ 'MakefilePackage', 'AutotoolsPackage', 'CMakePackage', + 'QMakePackage', 'WafPackage', 'PythonPackage', 'RPackage', diff --git a/lib/spack/spack/build_systems/qmake.py b/lib/spack/spack/build_systems/qmake.py new file mode 100644 index 0000000000..c1a3193b7f --- /dev/null +++ b/lib/spack/spack/build_systems/qmake.py @@ -0,0 +1,87 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import inspect + +from spack.directives import depends_on +from spack.package import PackageBase, run_after + + +class QMakePackage(PackageBase): + """Specialized class for packages built using qmake. + + For more information on the qmake build system, see: + http://doc.qt.io/qt-5/qmake-manual.html + + This class provides three phases that can be overridden: + + 1. :py:meth:`~.QMakePackage.qmake` + 2. :py:meth:`~.QMakePackage.build` + 3. :py:meth:`~.QMakePackage.install` + + They all have sensible defaults and for many packages the only thing + necessary will be to override :py:meth:`~.QMakePackage.qmake_args`. + """ + #: Phases of a qmake package + phases = ['qmake', 'build', 'install'] + + #: This attribute is used in UI queries that need to know the build + #: system base class + build_system_class = 'QMakePackage' + + #: Callback names for build-time test + build_time_test_callbacks = ['check'] + + depends_on('qt', type='build') + + def qmake_args(self): + """Produces a list containing all the arguments that must be passed to + qmake + """ + return [] + + def qmake(self, spec, prefix): + """Run ``qmake`` to configure the project and generate a Makefile.""" + inspect.getmodule(self).qmake(*self.qmake_args()) + + def build(self, spec, prefix): + """Make the build targets""" + inspect.getmodule(self).make() + + def install(self, spec, prefix): + """Make the install targets""" + inspect.getmodule(self).make('install') + + # Tests + + def check(self): + """Searches the Makefile for a ``check:`` target and runs it if found. + """ + self._if_make_target_execute('check') + + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + # Check that self.prefix is there after installation + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 413b73a08e..8ecaca9c12 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -34,6 +34,7 @@ level = "long" build_system_to_phase = { AutotoolsPackage: 'build', CMakePackage: 'build', + QMakePackage: 'build', WafPackage: 'build', PythonPackage: 'build', PerlPackage: 'build', diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 4b590e6176..562582fe09 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -38,6 +38,7 @@ level = "long" build_system_to_phase = { AutotoolsPackage: 'configure', CMakePackage: 'cmake', + QMakePackage: 'qmake', WafPackage: 'configure', PerlPackage: 'configure', } diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 62de3e24e9..239f75b996 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -193,6 +193,18 @@ class CMakePackageTemplate(PackageTemplate): return args""" +class QMakePackageTemplate(PackageTemplate): + """Provides appropriate overrides for QMake-based packages""" + + base_class_name = 'QMakePackage' + + body = """\ + def qmake_args(self): + # FIXME: If not needed delete this function + args = [] + return args""" + + class SconsPackageTemplate(PackageTemplate): """Provides appropriate overrides for SCons-based packages""" @@ -363,6 +375,7 @@ templates = { 'autotools': AutotoolsPackageTemplate, 'autoreconf': AutoreconfPackageTemplate, 'cmake': CMakePackageTemplate, + 'qmake': QMakePackageTemplate, 'scons': SconsPackageTemplate, 'waf': WafPackageTemplate, 'bazel': BazelPackageTemplate, @@ -426,18 +439,19 @@ class BuildSystemGuesser: # uses. If the regular expression matches a file contained in the # archive, the corresponding build system is assumed. clues = [ - ('/configure$', 'autotools'), - ('/configure.(in|ac)$', 'autoreconf'), - ('/Makefile.am$', 'autoreconf'), - ('/CMakeLists.txt$', 'cmake'), - ('/SConstruct$', 'scons'), - ('/waf$', 'waf'), - ('/setup.py$', 'python'), - ('/NAMESPACE$', 'r'), - ('/WORKSPACE$', 'bazel'), - ('/Build.PL$', 'perlbuild'), - ('/Makefile.PL$', 'perlmake'), - ('/(GNU)?[Mm]akefile$', 'makefile'), + (r'/configure$', 'autotools'), + (r'/configure\.(in|ac)$', 'autoreconf'), + (r'/Makefile\.am$', 'autoreconf'), + (r'/CMakeLists\.txt$', 'cmake'), + (r'/SConstruct$', 'scons'), + (r'/waf$', 'waf'), + (r'/setup\.py$', 'python'), + (r'/NAMESPACE$', 'r'), + (r'/WORKSPACE$', 'bazel'), + (r'/Build\.PL$', 'perlbuild'), + (r'/Makefile\.PL$', 'perlmake'), + (r'/.*\.pro$', 'qmake'), + (r'/(GNU)?[Mm]akefile$', 'makefile'), ] # Peek inside the compressed file. diff --git a/lib/spack/spack/test/build_system_guess.py b/lib/spack/spack/test/build_system_guess.py index 733173e3fc..54431e0020 100644 --- a/lib/spack/spack/test/build_system_guess.py +++ b/lib/spack/spack/test/build_system_guess.py @@ -34,6 +34,7 @@ import spack.stage params=[ ('configure', 'autotools'), ('CMakeLists.txt', 'cmake'), + ('project.pro', 'qmake'), ('SConstruct', 'scons'), ('waf', 'waf'), ('setup.py', 'python'), diff --git a/var/spack/repos/builtin/packages/qt-creator/package.py b/var/spack/repos/builtin/packages/qt-creator/package.py index a3f50004ae..4b3054b7b6 100644 --- a/var/spack/repos/builtin/packages/qt-creator/package.py +++ b/var/spack/repos/builtin/packages/qt-creator/package.py @@ -23,24 +23,36 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -import os -class QtCreator(Package): +class QtCreator(QMakePackage): """The Qt Creator IDE.""" homepage = 'https://www.qt.io/ide/' - url = 'http://download.qt.io/official_releases/qtcreator/4.1/4.1.0/qt-creator-opensource-src-4.1.0.tar.gz' + url = 'http://download.qt.io/official_releases/qtcreator/4.3/4.3.1/qt-creator-opensource-src-4.3.1.tar.gz' list_url = 'http://download.qt.io/official_releases/qtcreator/' list_depth = 2 - version('4.1.0', '657727e4209befa4bf5889dff62d9e0a') + version('4.3.1', '6769ea47f287e2d9e30ff92acb899eef') + version('4.1.0', '657727e4209befa4bf5889dff62d9e0a') - depends_on("qt") + depends_on('qt@5.6.0:+opengl') + # Qt Creator comes bundled with its own copy of sqlite. Qt has a build + # dependency on Python, which has a dependency on sqlite. If Python is + # built with a different version of sqlite than the bundled copy, it will + # cause symbol conflict. Force Spack to build with the same version of + # sqlite as the bundled copy. + depends_on('sqlite@3.8.10.2') - def install(self, spec, prefix): - os.environ['INSTALL_ROOT'] = self.prefix - qmake = which('qmake') - qmake('-r') - make() - make("install") + # Qt Creator 4.3.0+ requires a C++14 compiler + conflicts('%gcc@:4.8', when='@4.3.0:') + + def url_for_version(self, version): + url = 'http://download.qt.io/official_releases/qtcreator/{0}/{1}/qt-creator-opensource-src-{1}.tar.gz' + return url.format(version.up_to(2), version) + + def setup_environment(self, spack_env, run_env): + spack_env.set('INSTALL_ROOT', self.prefix) + + def qmake_args(self): + return ['-r'] diff --git a/var/spack/repos/builtin/packages/qwt/package.py b/var/spack/repos/builtin/packages/qwt/package.py index 111ba034c7..10ca44e1c3 100644 --- a/var/spack/repos/builtin/packages/qwt/package.py +++ b/var/spack/repos/builtin/packages/qwt/package.py @@ -25,7 +25,7 @@ from spack import * -class Qwt(Package): +class Qwt(QMakePackage): """The Qwt library contains GUI Components and utility classes which are primarily useful for programs with a technical background. Beside a framework for 2D plots it provides scales, sliders, dials, compasses, @@ -33,18 +33,17 @@ class Qwt(Package): ranges of type double. """ homepage = "http://qwt.sourceforge.net/" - url = "https://downloads.sourceforge.net/project/qwt/qwt/5.2.2/qwt-5.2.2.tar.bz2" + url = "https://sourceforge.net/projects/qwt/files/qwt/6.1.3/qwt-6.1.3.tar.bz2" + version('6.1.3', '19d1f5fa5e22054d22ee3accc37c54ba') version('5.2.2', '70d77e4008a6cc86763737f0f24726ca') - depends_on("qt") - - def install(self, spec, prefix): + depends_on('qt+opengl') + # Qwt 6.1.1 and older use a constant that was removed in Qt 5.4 + # https://bugs.launchpad.net/ubuntu/+source/qwt-qt5/+bug/1485213 + depends_on('qt@:5.3', when='@:6.1.1') + def patch(self): # Subvert hardcoded prefix - filter_file(r'/usr/local/qwt-\$\$VERSION', prefix, 'qwtconfig.pri') - - qmake = which('qmake') - qmake() - make() - make("install") + filter_file(r'/usr/local/qwt-\$\$(QWT_)?VERSION.*', + self.prefix, 'qwtconfig.pri') diff --git a/var/spack/repos/builtin/packages/sqlite/package.py b/var/spack/repos/builtin/packages/sqlite/package.py index 56062c1472..66b76e1be1 100644 --- a/var/spack/repos/builtin/packages/sqlite/package.py +++ b/var/spack/repos/builtin/packages/sqlite/package.py @@ -33,8 +33,12 @@ class Sqlite(AutotoolsPackage): """ homepage = "www.sqlite.org" + version('3.20.0', 'e262a28b73cc330e7e83520c8ce14e4d', + url='https://www.sqlite.org/2017/sqlite-autoconf-3200000.tar.gz') version('3.18.0', 'a6687a8ae1f66abc8df739aeadecfd0c', url='https://www.sqlite.org/2017/sqlite-autoconf-3180000.tar.gz') + version('3.8.10.2', 'a18bfc015cd49a1e7a961b7b77bc3b37', + url='https://www.sqlite.org/2015/sqlite-autoconf-3081002.tar.gz') version('3.8.5', '0544ef6d7afd8ca797935ccc2685a9ed', url='https://www.sqlite.org/2014/sqlite-autoconf-3080500.tar.gz') -- cgit v1.2.3-70-g09d2 From b8ed61cfea58c8cab5c86d6c0189512605890444 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 4 Aug 2017 14:53:05 -0500 Subject: Make CMake the default build system (#4862) --- lib/spack/spack/cmd/create.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index 239f75b996..d8507d1108 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -438,11 +438,13 @@ class BuildSystemGuesser: # A list of clues that give us an idea of the build system a package # uses. If the regular expression matches a file contained in the # archive, the corresponding build system is assumed. + # NOTE: Order is important here. If a package supports multiple + # build systems, we choose the first match in this list. clues = [ + (r'/CMakeLists\.txt$', 'cmake'), (r'/configure$', 'autotools'), (r'/configure\.(in|ac)$', 'autoreconf'), (r'/Makefile\.am$', 'autoreconf'), - (r'/CMakeLists\.txt$', 'cmake'), (r'/SConstruct$', 'scons'), (r'/waf$', 'waf'), (r'/setup\.py$', 'python'), -- cgit v1.2.3-70-g09d2 From 7eb263effe3ac6f2f79e4f6c060b7ae96b7a9cc8 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Fri, 4 Aug 2017 16:52:10 -0500 Subject: Add a SConsPackage base class (#4936) * Add a SConsPackage base class * Make Matlab extendable * Most dependencies are actually required * Cantera requires older version of fmt --- lib/spack/docs/packaging_guide.rst | 3 + lib/spack/spack/__init__.py | 2 + lib/spack/spack/build_systems/scons.py | 92 ++++++++++++++ lib/spack/spack/cmd/build.py | 1 + lib/spack/spack/cmd/create.py | 13 +- .../repos/builtin/packages/cantera/package.py | 137 ++++++++++++--------- var/spack/repos/builtin/packages/fmt/package.py | 47 +++++++ var/spack/repos/builtin/packages/kahip/package.py | 22 ++-- var/spack/repos/builtin/packages/matlab/package.py | 2 + var/spack/repos/builtin/packages/serf/package.py | 68 +++++++--- 10 files changed, 296 insertions(+), 91 deletions(-) create mode 100644 lib/spack/spack/build_systems/scons.py create mode 100644 var/spack/repos/builtin/packages/fmt/package.py (limited to 'lib') diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 5d7d69e3d7..af3f7b408a 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2121,6 +2121,9 @@ The classes that are currently provided by Spack are: | :py:class:`.QMakePackage` | Specialized class for packages | | | build using QMake | +-------------------------------+----------------------------------+ + | :py:class:`.SConsPackage` | Specialized class for packages | + | | built using SCons | + +-------------------------------+----------------------------------+ | :py:class:`.WafPackage` | Specialized class for packages | | | built using Waf | +-------------------------------+----------------------------------+ diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index aca906f2e9..e8a010bb26 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -173,6 +173,7 @@ from spack.build_systems.makefile import MakefilePackage from spack.build_systems.autotools import AutotoolsPackage from spack.build_systems.cmake import CMakePackage from spack.build_systems.qmake import QMakePackage +from spack.build_systems.scons import SConsPackage from spack.build_systems.waf import WafPackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage @@ -187,6 +188,7 @@ __all__ += [ 'AutotoolsPackage', 'CMakePackage', 'QMakePackage', + 'SConsPackage', 'WafPackage', 'PythonPackage', 'RPackage', diff --git a/lib/spack/spack/build_systems/scons.py b/lib/spack/spack/build_systems/scons.py new file mode 100644 index 0000000000..694ed936cc --- /dev/null +++ b/lib/spack/spack/build_systems/scons.py @@ -0,0 +1,92 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import inspect + +from spack.directives import depends_on +from spack.package import PackageBase, run_after + + +class SConsPackage(PackageBase): + """Specialized class for packages built using SCons. + + See http://scons.org/documentation.html for more information. + + This class provides the following phases that can be overridden: + + 1. :py:meth:`~.SConsPackage.build` + 2. :py:meth:`~.SConsPackage.install` + + Packages that use SCons as a build system are less uniform than packages + that use other build systems. Developers can add custom subcommands or + variables that control the build. You will likely need to override + :py:meth:`~.SConsPackage.build_args` to pass the appropriate variables. + """ + #: Phases of a SCons package + phases = ['build', 'install'] + + #: To be used in UI queries that require to know which + #: build-system class we are using + build_system_class = 'SConsPackage' + + #: Callback names for build-time test + build_time_test_callbacks = ['test'] + + depends_on('scons', type='build') + + def build_args(self, spec, prefix): + """Arguments to pass to build.""" + return [] + + def build(self, spec, prefix): + """Build the package.""" + args = self.build_args(spec, prefix) + + inspect.getmodule(self).scons(*args) + + def install_args(self, spec, prefix): + """Arguments to pass to install.""" + return [] + + def install(self, spec, prefix): + """Install the package.""" + args = self.install_args(spec, prefix) + + inspect.getmodule(self).scons('install', *args) + + # Testing + + def test(self): + """Run unit tests after build. + + By default, does nothing. Override this if you want to + add package-specific tests. + """ + pass + + run_after('build')(PackageBase._run_default_build_time_test_callbacks) + + # Check that self.prefix is there after installation + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index 8ecaca9c12..a4821214d6 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -35,6 +35,7 @@ build_system_to_phase = { AutotoolsPackage: 'build', CMakePackage: 'build', QMakePackage: 'build', + SConsPackage: 'build', WafPackage: 'build', PythonPackage: 'build', PerlPackage: 'build', diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index d8507d1108..ca49eb03fa 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -208,15 +208,14 @@ class QMakePackageTemplate(PackageTemplate): class SconsPackageTemplate(PackageTemplate): """Provides appropriate overrides for SCons-based packages""" - dependencies = """\ - # FIXME: Add additional dependencies if required. - depends_on('scons', type='build')""" + base_class_name = 'SConsPackage' body = """\ - def install(self, spec, prefix): - # FIXME: Add logic to build and install here. - scons('prefix={0}'.format(prefix)) - scons('install')""" + def build_args(self, spec, prefix): + # FIXME: Add arguments to pass to build. + # FIXME: If not needed delete this function + args = [] + return args""" class WafPackageTemplate(PackageTemplate): diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py index 5987f0865a..36c796e45d 100644 --- a/var/spack/repos/builtin/packages/cantera/package.py +++ b/var/spack/repos/builtin/packages/cantera/package.py @@ -26,132 +26,147 @@ from spack import * import os -class Cantera(Package): +class Cantera(SConsPackage): """Cantera is a suite of object-oriented software tools for problems involving chemical kinetics, thermodynamics, and/or transport processes.""" homepage = "http://www.cantera.org/docs/sphinx/html/index.html" - url = "https://github.com/Cantera/cantera/archive/v2.2.1.tar.gz" + url = "https://github.com/Cantera/cantera/archive/v2.3.0.tar.gz" + version('2.3.0', 'aebbd8d891cb1623604245398502b72e') version('2.2.1', '9d1919bdef39ddec54485fc8a741a3aa') - variant('lapack', default=True, - description='Build with external BLAS/LAPACK libraries') - variant('threadsafe', default=True, - description='Build threadsafe, requires Boost') - variant('sundials', default=True, - description='Build with external Sundials') variant('python', default=False, description='Build the Cantera Python module') variant('matlab', default=False, description='Build the Cantera Matlab toolbox') # Required dependencies - depends_on('scons', type='build') - - # Recommended dependencies - depends_on('blas', when='+lapack') - depends_on('lapack', when='+lapack') - depends_on('boost', when='+threadsafe') - depends_on('sundials', when='+sundials') # must be compiled with -fPIC + depends_on('fmt@3.0.0:3.0.2', when='@2.3.0:') + depends_on('googletest', when='@2.3.0:') + depends_on('eigen', when='@2.3.0:') + depends_on('boost') + depends_on('sundials') # must be compiled with -fPIC + depends_on('blas') + depends_on('lapack') # Python module dependencies extends('python', when='+python') + depends_on('py-cython', when='+python', type='build') depends_on('py-numpy', when='+python', type=('build', 'run')) depends_on('py-scipy', when='+python', type=('build', 'run')) - depends_on('py-cython', when='+python', type=('build', 'run')) depends_on('py-3to2', when='+python', type=('build', 'run')) # TODO: these "when" specs don't actually work # depends_on('py-unittest2', when='+python^python@2.6', type=('build', 'run')) # noqa # depends_on('py-unittest2py3k', when='+python^python@3.1', type=('build', 'run')) # noqa # Matlab toolbox dependencies - # TODO: add Matlab package - # TODO: allow packages to extend multiple other packages - # extends('matlab', when='+matlab') + extends('matlab', when='+matlab') + + def build_args(self, spec, prefix): + # Valid args can be found by running `scons help` - def install(self, spec, prefix): - # Required options - options = [ + # Required args + args = [ + 'build', 'prefix={0}'.format(prefix), - 'CC={0}'.format(os.environ['CC']), - 'CXX={0}'.format(os.environ['CXX']), - 'F77={0}'.format(os.environ['F77']), - 'FORTRAN={0}'.format(os.environ['FC']), + 'VERBOSE=yes', + 'CC={0}'.format(spack_cc), + 'CXX={0}'.format(spack_cxx), + 'FORTRAN={0}'.format(spack_fc), 'cc_flags={0}'.format(self.compiler.pic_flag), # Allow Spack environment variables to propagate through to SCons 'env_vars=all' ] - # BLAS/LAPACK support - if '+lapack' in spec: - lapack_blas = spec['lapack'].libs + spec['blas'].libs - options.extend([ - 'blas_lapack_libs={0}'.format(','.join(lapack_blas.names)), - 'blas_lapack_dir={0}'.format(spec['lapack'].prefix.lib) + if spec.satisfies('@:2.2.1'): + args.append('F77={0}'.format(spack_f77)) + + # fmt support + if spec.satisfies('@2.3.0:'): + args.append('system_fmt=y') + + # Googletest support + if spec.satisfies('@2.3.0:'): + args.append('system_googletest=y') + + # Eigen support + if spec.satisfies('@2.3.0:'): + args.extend([ + 'system_eigen=y', + 'extra_inc_dirs={0}'.format( + join_path(spec['eigen'].prefix.include, 'eigen{0}'.format( + spec['eigen'].version.up_to(1)))), ]) - # Threadsafe build, requires Boost - if '+threadsafe' in spec: - options.extend([ + # BLAS/LAPACK support + lapack_blas = spec['lapack'].libs + spec['blas'].libs + args.extend([ + 'blas_lapack_libs={0}'.format(','.join(lapack_blas.names)), + 'blas_lapack_dir={0}'.format(spec['lapack'].prefix.lib) + ]) + + # Boost support + if spec.satisfies('@2.3.0:'): + args.append('boost_inc_dir={0}'.format( + spec['boost'].prefix.include)) + else: + args.extend([ 'build_thread_safe=yes', 'boost_inc_dir={0}'.format(spec['boost'].prefix.include), - 'boost_lib_dir={0}'.format(spec['boost'].prefix.lib) + 'boost_lib_dir={0}'.format(spec['boost'].prefix.lib), ]) - else: - options.append('build_thread_safe=no') # Sundials support - if '+sundials' in spec: - options.extend([ + if spec.satisfies('@2.3.0:'): + args.append('system_sundials=y') + else: + args.extend([ 'use_sundials=y', - 'sundials_include={0}'.format(spec['sundials'].prefix.include), - 'sundials_libdir={0}'.format(spec['sundials'].prefix.lib), 'sundials_license={0}'.format( - join_path(spec['sundials'].prefix, 'LICENSE')) + spec['sundials'].prefix.LICENSE) ]) - else: - options.append('use_sundials=n') + + args.extend([ + 'sundials_include={0}'.format(spec['sundials'].prefix.include), + 'sundials_libdir={0}'.format(spec['sundials'].prefix.lib), + ]) # Python module if '+python' in spec: - options.extend([ + args.extend([ 'python_package=full', 'python_cmd={0}'.format(spec['python'].command.path), - 'python_array_home={0}'.format(spec['py-numpy'].prefix) ]) - if spec['python'].satisfies('@3'): - options.extend([ + if spec['python'].satisfies('@3:'): + args.extend([ 'python3_package=y', 'python3_cmd={0}'.format(spec['python'].command.path), - 'python3_array_home={0}'.format(spec['py-numpy'].prefix) ]) else: - options.append('python3_package=n') + args.append('python3_package=n') else: - options.append('python_package=none') - options.append('python3_package=n') + args.append('python_package=none') + args.append('python3_package=n') # Matlab toolbox if '+matlab' in spec: - options.extend([ + args.extend([ 'matlab_toolbox=y', 'matlab_path={0}'.format(spec['matlab'].prefix) ]) else: - options.append('matlab_toolbox=n') + args.append('matlab_toolbox=n') - scons('build', *options) + return args - if '+python' in spec: + def test(self): + if '+python' in self.spec: # Tests will always fail if Python dependencies aren't built # In addition, 3 of the tests fail when run in parallel scons('test', parallel=False) - scons('install') - - self.filter_compilers() - + @run_after('install') def filter_compilers(self): """Run after install to tell the Makefile and SConstruct files to use the compilers that Spack built the package with. diff --git a/var/spack/repos/builtin/packages/fmt/package.py b/var/spack/repos/builtin/packages/fmt/package.py new file mode 100644 index 0000000000..eea62f2a6a --- /dev/null +++ b/var/spack/repos/builtin/packages/fmt/package.py @@ -0,0 +1,47 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Fmt(CMakePackage): + """fmt (formerly cppformat) is an open-source formatting library. + It can be used as a safe alternative to printf or as a fast alternative + to C++ IOStreams.""" + + homepage = "http://fmtlib.net/latest/index.html" + url = "https://github.com/fmtlib/fmt/releases/download/4.0.0/fmt-4.0.0.zip" + + version('4.0.0', '605b5abee11b83195191234f4f414cf1') + version('3.0.2', 'b190a7b8f2a5e522ee70cf339a53d3b2') + version('3.0.1', '14505463b838befe1513b09cae112715') + version('3.0.0', 'c099561e70fa194bb03b3fd5de2d3fd0') + + depends_on('cmake@2.8.12:', type='build') + + def cmake_args(self): + return [ + '-DCMAKE_C_FLAGS={0}'.format(self.compiler.pic_flag), + '-DCMAKE_CXX_FLAGS={0}'.format(self.compiler.pic_flag), + ] diff --git a/var/spack/repos/builtin/packages/kahip/package.py b/var/spack/repos/builtin/packages/kahip/package.py index 2bc127a4c2..b02e6de8f4 100644 --- a/var/spack/repos/builtin/packages/kahip/package.py +++ b/var/spack/repos/builtin/packages/kahip/package.py @@ -29,7 +29,7 @@ import os import re -class Kahip(Package): +class Kahip(SConsPackage): """KaHIP - Karlsruhe High Quality Partitioning - is a family of graph partitioning programs. It includes KaFFPa (Karlsruhe Fast Flow Partitioner), which is a multilevel graph partitioning algorithm, @@ -46,17 +46,25 @@ class Kahip(Package): url = 'http://algo2.iti.kit.edu/schulz/software_releases/KaHIP_2.00.tar.gz' version('develop', git='https://github.com/schulzchristian/KaHIP.git') - version('2.00', '9daeda32f43c90570ed436d5d93c8a872b1a14d8') + version('2.00', '0a66b0a604ad72cfb7e3dce00e2c9fdfac82b855') depends_on('argtable') depends_on('mpi') # Note: upstream package only tested on openmpi - depends_on('scons', type='build') - phases = ['build', 'install'] + conflicts('%clang') - # - # - End of definitions / setup - - # + def patch(self): + """Internal compile.sh scripts hardcode number of cores to build with. + Filter these out so Spack can control it.""" + + files = [ + 'compile.sh', + 'parallel/modified_kahip/compile.sh', + 'parallel/parallel_src/compile.sh', + ] + + for f in files: + filter_file('NCORES=.*', 'NCORES={0}'.format(make_jobs), f) def build(self, spec, prefix): """Build using the KaHIP compile.sh script. Uses scons internally.""" diff --git a/var/spack/repos/builtin/packages/matlab/package.py b/var/spack/repos/builtin/packages/matlab/package.py index 4d2b91546e..fbd272393e 100644 --- a/var/spack/repos/builtin/packages/matlab/package.py +++ b/var/spack/repos/builtin/packages/matlab/package.py @@ -66,6 +66,8 @@ class Matlab(Package): license_vars = ['LM_LICENSE_FILE'] license_url = 'https://www.mathworks.com/help/install/index.html' + extendable = True + def url_for_version(self, version): return "file://{0}/matlab_{1}_glnxa64.zip".format(os.getcwd(), version) diff --git a/var/spack/repos/builtin/packages/serf/package.py b/var/spack/repos/builtin/packages/serf/package.py index 3d8e228548..250a6f498f 100644 --- a/var/spack/repos/builtin/packages/serf/package.py +++ b/var/spack/repos/builtin/packages/serf/package.py @@ -25,31 +25,67 @@ from spack import * -class Serf(Package): +class Serf(SConsPackage): """Apache Serf - a high performance C-based HTTP client library built upon the Apache Portable Runtime (APR) library""" homepage = 'https://serf.apache.org/' - url = 'https://archive.apache.org/dist/serf/serf-1.3.8.tar.bz2' + url = 'https://archive.apache.org/dist/serf/serf-1.3.9.tar.bz2' + version('1.3.9', '26015c63e3bbb108c1689bf2090e4c26351db674') version('1.3.8', '1d45425ca324336ce2f4ae7d7b4cfbc5567c5446') + variant('debug', default=False, + description='Enable debugging info and strict compile warnings') + + depends_on('scons@2.3.0:', type='build') + depends_on('apr') depends_on('apr-util') - depends_on('scons', type='build') - depends_on('expat') depends_on('openssl') depends_on('zlib') - def install(self, spec, prefix): - options = ['PREFIX=%s' % prefix] - options.append('APR=%s' % spec['apr'].prefix) - options.append('APU=%s' % spec['apr-util'].prefix) - options.append('OPENSSL=%s' % spec['openssl'].prefix) - options.append('LINKFLAGS=-L%s/lib -L%s/lib' % - (spec['expat'].prefix, spec['zlib'].prefix)) - options.append('CPPFLAGS=-I%s/include -I%s/include' % - (spec['expat'].prefix, spec['zlib'].prefix)) - - scons(*options) - scons('install') + def build_args(self, spec, prefix): + args = [ + 'PREFIX={0}'.format(prefix), + 'APR={0}'.format(spec['apr'].prefix), + 'APU={0}'.format(spec['apr-util'].prefix), + 'OPENSSL={0}'.format(spec['openssl'].prefix), + 'ZLIB={0}'.format(spec['zlib'].prefix), + ] + + if '+debug' in spec: + args.append('DEBUG=yes') + else: + args.append('DEBUG=no') + + # SCons doesn't pass Spack environment variables to the + # execution environment. Therefore, we can't use Spack's compiler + # wrappers. Use the actual compilers. SCons seems to RPATH things + # on its own anyway. + args.append('CC={0}'.format(self.compiler.cc)) + + return args + + def test(self): + # FIXME: Several test failures: + # + # There were 14 failures: + # 1) test_ssl_trust_rootca + # 2) test_ssl_certificate_chain_with_anchor + # 3) test_ssl_certificate_chain_all_from_server + # 4) test_ssl_no_servercert_callback_allok + # 5) test_ssl_large_response + # 6) test_ssl_large_request + # 7) test_ssl_client_certificate + # 8) test_ssl_future_server_cert + # 9) test_setup_ssltunnel + # 10) test_ssltunnel_basic_auth + # 11) test_ssltunnel_basic_auth_server_has_keepalive_off + # 12) test_ssltunnel_basic_auth_proxy_has_keepalive_off + # 13) test_ssltunnel_basic_auth_proxy_close_conn_on_200resp + # 14) test_ssltunnel_digest_auth + # + # These seem to be related to: + # https://groups.google.com/forum/#!topic/serf-dev/YEFTTdF1Qwc + scons('check') -- cgit v1.2.3-70-g09d2 From c7df12f69826448fd9af875e44348b8f8d0ff067 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 5 Aug 2017 10:15:18 -0500 Subject: Massive conversion from Package to CMakePackage (#4975) --- lib/spack/spack/build_environment.py | 1 + .../repos/builtin/packages/adept-utils/package.py | 13 ++--- var/spack/repos/builtin/packages/apex/package.py | 29 ++++------ var/spack/repos/builtin/packages/archer/package.py | 31 +++++------ .../repos/builtin/packages/armadillo/package.py | 16 +++--- .../repos/builtin/packages/automaded/package.py | 10 ++-- var/spack/repos/builtin/packages/bear/package.py | 12 ++--- .../repos/builtin/packages/bpp-core/package.py | 10 ++-- .../repos/builtin/packages/bpp-phyl/package.py | 10 ++-- .../repos/builtin/packages/bpp-seq/package.py | 10 ++-- .../repos/builtin/packages/bpp-suite/package.py | 9 +--- .../repos/builtin/packages/c-blosc/package.py | 26 +++++---- .../repos/builtin/packages/callpath/package.py | 26 ++++----- var/spack/repos/builtin/packages/cereal/package.py | 31 ++++------- var/spack/repos/builtin/packages/cgal/package.py | 29 ++++------ var/spack/repos/builtin/packages/cgns/package.py | 15 +++--- .../repos/builtin/packages/cleverleaf/package.py | 15 ++---- var/spack/repos/builtin/packages/cmocka/package.py | 12 ++--- var/spack/repos/builtin/packages/cnmem/package.py | 7 +-- var/spack/repos/builtin/packages/cram/package.py | 13 ++--- var/spack/repos/builtin/packages/dakota/package.py | 32 ++++------- .../repos/builtin/packages/damselfly/package.py | 10 +--- .../repos/builtin/packages/doxygen/package.py | 8 +-- var/spack/repos/builtin/packages/gflags/package.py | 12 ++--- var/spack/repos/builtin/packages/glm/package.py | 14 ++--- .../repos/builtin/packages/graphlib/package.py | 10 +--- .../repos/builtin/packages/grib-api/package.py | 39 +++++++------- var/spack/repos/builtin/packages/hepmc/package.py | 21 +++----- .../repos/builtin/packages/jsoncpp/package.py | 20 +++---- var/spack/repos/builtin/packages/kealib/package.py | 21 ++++---- var/spack/repos/builtin/packages/kripke/package.py | 33 ++++++------ .../repos/builtin/packages/libemos/package.py | 28 +++++----- .../repos/builtin/packages/llvm-lld/package.py | 20 +++---- .../builtin/packages/llvm-openmp-ompt/package.py | 35 ++++++------ var/spack/repos/builtin/packages/magics/package.py | 62 +++++++++++----------- .../repos/builtin/packages/mariadb/package.py | 12 +---- .../repos/builtin/packages/mbedtls/package.py | 13 +++-- var/spack/repos/builtin/packages/mitos/package.py | 10 +--- .../repos/builtin/packages/msgpack-c/package.py | 10 +--- var/spack/repos/builtin/packages/muster/package.py | 13 ++--- .../repos/builtin/packages/ompt-openmp/package.py | 15 ++---- var/spack/repos/builtin/packages/opencv/package.py | 43 ++++++--------- .../builtin/packages/openscenegraph/package.py | 36 +++++-------- var/spack/repos/builtin/packages/panda/package.py | 12 ++--- .../repos/builtin/packages/paradiseo/package.py | 27 +++------- var/spack/repos/builtin/packages/pidx/package.py | 12 ++--- .../repos/builtin/packages/piranha/package.py | 25 +++------ var/spack/repos/builtin/packages/psi4/package.py | 35 +++++------- var/spack/repos/builtin/packages/raja/package.py | 8 +-- var/spack/repos/builtin/packages/ravel/package.py | 8 ++- var/spack/repos/builtin/packages/sdl2/package.py | 11 +--- var/spack/repos/builtin/packages/sympol/package.py | 9 +--- var/spack/repos/builtin/packages/task/package.py | 17 ++---- var/spack/repos/builtin/packages/taskd/package.py | 16 ++---- var/spack/repos/builtin/packages/tethex/package.py | 11 ++-- var/spack/repos/builtin/packages/visit/package.py | 35 ++++++------ var/spack/repos/builtin/packages/xrootd/package.py | 19 +------ 57 files changed, 410 insertions(+), 677 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index e41edc14f8..34c9cd56d2 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -333,6 +333,7 @@ def set_module_variables_for_package(pkg, module): m.make = MakeExecutable('make', jobs) m.gmake = MakeExecutable('gmake', jobs) m.scons = MakeExecutable('scons', jobs) + m.ninja = MakeExecutable('ninja', jobs) # easy shortcut to os.environ m.env = os.environ diff --git a/var/spack/repos/builtin/packages/adept-utils/package.py b/var/spack/repos/builtin/packages/adept-utils/package.py index 609dff2fe7..ab1a4ca861 100644 --- a/var/spack/repos/builtin/packages/adept-utils/package.py +++ b/var/spack/repos/builtin/packages/adept-utils/package.py @@ -25,7 +25,7 @@ from spack import * -class AdeptUtils(Package): +class AdeptUtils(CMakePackage): """Utility libraries for LLNL performance tools.""" homepage = "https://github.com/llnl/adept-utils" @@ -34,11 +34,6 @@ class AdeptUtils(Package): version('1.0.1', '731a310717adcb004d9d195130efee7d') version('1.0', '5c6cd9badce56c945ac8551e34804397') - depends_on("boost") - depends_on("mpi") - depends_on('cmake', type='build') - - def install(self, spec, prefix): - cmake(*std_cmake_args) - make() - make("install") + depends_on('boost') + depends_on('mpi') + depends_on('cmake@2.8:', type='build') diff --git a/var/spack/repos/builtin/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py index 55e22342b1..4c1c0466eb 100644 --- a/var/spack/repos/builtin/packages/apex/package.py +++ b/var/spack/repos/builtin/packages/apex/package.py @@ -23,10 +23,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -from spack.util.environment import * -class Apex(Package): +class Apex(CMakePackage): homepage = "http://github.com/khuck/xpress-apex" url = "http://github.com/khuck/xpress-apex/archive/v0.1.tar.gz" @@ -38,19 +37,13 @@ class Apex(Package): depends_on("activeharmony@4.5:") depends_on("ompt-openmp") - def install(self, spec, prefix): - - path = get_path("PATH") - path.remove(spec["binutils"].prefix.bin) - path_set("PATH", path) - with working_dir("build", create=True): - cmake('-DBOOST_ROOT=%s' % spec['boost'].prefix, - '-DUSE_BFD=TRUE', - '-DBFD_ROOT=%s' % spec['binutils'].prefix, - '-DUSE_ACTIVEHARMONY=TRUE', - '-DACTIVEHARMONY_ROOT=%s' % spec['activeharmony'].prefix, - '-DUSE_OMPT=TRUE', - '-DOMPT_ROOT=%s' % spec['ompt-openmp'].prefix, - '..', *std_cmake_args) - make() - make("install") + def cmake_args(self): + return [ + '-DBOOST_ROOT=%s' % spec['boost'].prefix, + '-DUSE_BFD=TRUE', + '-DBFD_ROOT=%s' % spec['binutils'].prefix, + '-DUSE_ACTIVEHARMONY=TRUE', + '-DACTIVEHARMONY_ROOT=%s' % spec['activeharmony'].prefix, + '-DUSE_OMPT=TRUE', + '-DOMPT_ROOT=%s' % spec['ompt-openmp'].prefix, + ] diff --git a/var/spack/repos/builtin/packages/archer/package.py b/var/spack/repos/builtin/packages/archer/package.py index 9c577e6517..f5c18a3988 100644 --- a/var/spack/repos/builtin/packages/archer/package.py +++ b/var/spack/repos/builtin/packages/archer/package.py @@ -26,7 +26,7 @@ from spack import * -class Archer(Package): +class Archer(CMakePackage): """ARCHER, a data race detection tool for large OpenMP applications.""" homepage = "https://github.com/PRUNERS/ARCHER" @@ -34,23 +34,24 @@ class Archer(Package): version('1.0.0', '790bfaf00b9f57490eb609ecabfe954a') - depends_on('cmake', type='build') + depends_on('cmake@3.4.3:', type='build') depends_on('llvm') depends_on('ninja', type='build') depends_on('llvm-openmp-ompt') - def install(self, spec, prefix): - - with working_dir('spack-build', create=True): - cmake_args = std_cmake_args[:] - cmake_args.extend([ - '-G', 'Ninja', - '-DCMAKE_C_COMPILER=clang', - '-DCMAKE_CXX_COMPILER=clang++', - '-DOMP_PREFIX:PATH=%s' % spec['llvm-openmp-ompt'].prefix, - ]) - - cmake('..', *cmake_args) - ninja = Executable('ninja') + def cmake_args(self): + return [ + '-G', 'Ninja', + '-DCMAKE_C_COMPILER=clang', + '-DCMAKE_CXX_COMPILER=clang++', + '-DOMP_PREFIX:PATH=%s' % spec['llvm-openmp-ompt'].prefix, + ] + + # TODO: Add better ninja support to CMakePackage + def build(self, spec, prefix): + with working_dir(self.build_directory): ninja() + + def install(self, spec, prefix): + with working_dir(self.build_directory): ninja('install') diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py index 90fc78d8c3..a3c9c2bf3f 100644 --- a/var/spack/repos/builtin/packages/armadillo/package.py +++ b/var/spack/repos/builtin/packages/armadillo/package.py @@ -25,7 +25,7 @@ from spack import * -class Armadillo(Package): +class Armadillo(CMakePackage): """Armadillo is a high quality linear algebra library (matrix maths) for the C++ language, aiming towards a good balance between speed and ease of use.""" @@ -40,19 +40,21 @@ class Armadillo(Package): variant('hdf5', default=False, description='Include HDF5 support') - depends_on('cmake@2.8:', type='build') + depends_on('cmake@2.8.12:', type='build') depends_on('arpack-ng') # old arpack causes undefined symbols depends_on('blas') depends_on('lapack') depends_on('superlu@5.2:') depends_on('hdf5', when='+hdf5') - def install(self, spec, prefix): + def cmake_args(self): + spec = self.spec + arpack = find_libraries('libarpack', root=spec[ 'arpack-ng'].prefix.lib, shared=True) superlu = find_libraries('libsuperlu', root=spec[ 'superlu'].prefix, shared=False, recurse=True) - cmake_args = [ + return [ # ARPACK support '-DARPACK_LIBRARY={0}'.format(arpack.joined()), # BLAS support @@ -65,9 +67,3 @@ class Armadillo(Package): # HDF5 support '-DDETECT_HDF5={0}'.format('ON' if '+hdf5' in spec else 'OFF') ] - - cmake_args.extend(std_cmake_args) - cmake('.', *cmake_args) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/automaded/package.py b/var/spack/repos/builtin/packages/automaded/package.py index 1edeecf245..1d84a4f6f4 100644 --- a/var/spack/repos/builtin/packages/automaded/package.py +++ b/var/spack/repos/builtin/packages/automaded/package.py @@ -25,7 +25,7 @@ from spack import * -class Automaded(Package): +class Automaded(CMakePackage): """AutomaDeD (Automata-based Debugging for Dissimilar parallel tasks) is a tool for automatic diagnosis of performance and correctness problems in MPI applications. It creates @@ -45,9 +45,7 @@ class Automaded(Package): depends_on('mpi') depends_on('boost') depends_on('callpath') - depends_on('cmake', type='build') + depends_on('cmake@2.8:', type='build') - def install(self, spec, prefix): - cmake("-DSTATE_TRACKER_WITH_CALLPATH=ON", *std_cmake_args) - make() - make("install") + def cmake_args(self): + return ['-DSTATE_TRACKER_WITH_CALLPATH=ON'] diff --git a/var/spack/repos/builtin/packages/bear/package.py b/var/spack/repos/builtin/packages/bear/package.py index 7078931c59..eed95ebf89 100644 --- a/var/spack/repos/builtin/packages/bear/package.py +++ b/var/spack/repos/builtin/packages/bear/package.py @@ -25,7 +25,7 @@ from spack import * -class Bear(Package): +class Bear(CMakePackage): """Bear is a tool that generates a compilation database for clang tooling from non-cmake build systems.""" homepage = "https://github.com/rizsotto/Bear" @@ -34,11 +34,5 @@ class Bear(Package): version('2.2.0', '87250cc3a9a697e7d1e8972253a35259') version('2.0.4', 'fd8afb5e8e18f8737ba06f90bd77d011') - depends_on('cmake', type='build') - depends_on("python") - - def install(self, spec, prefix): - cmake('.', *std_cmake_args) - - make("all") - make("install") + depends_on('python') + depends_on('cmake@2.8:', type='build') diff --git a/var/spack/repos/builtin/packages/bpp-core/package.py b/var/spack/repos/builtin/packages/bpp-core/package.py index e7cc1abf29..df2c09b3ae 100644 --- a/var/spack/repos/builtin/packages/bpp-core/package.py +++ b/var/spack/repos/builtin/packages/bpp-core/package.py @@ -25,7 +25,7 @@ from spack import * -class BppCore(Package): +class BppCore(CMakePackage): """Bio++ core library.""" homepage = "http://biopp.univ-montp2.fr/wiki/index.php/Installation" @@ -33,9 +33,7 @@ class BppCore(Package): version('2.2.0', '5789ed2ae8687d13664140cd77203477') - depends_on('cmake', type='build') + depends_on('cmake@2.6:', type='build') - def install(self, spec, prefix): - cmake('-DBUILD_TESTING=FALSE', '.', *std_cmake_args) - make() - make('install') + def cmake_args(self): + return ['-DBUILD_TESTING=FALSE'] diff --git a/var/spack/repos/builtin/packages/bpp-phyl/package.py b/var/spack/repos/builtin/packages/bpp-phyl/package.py index 4d73d6bd59..1e1a2a393f 100644 --- a/var/spack/repos/builtin/packages/bpp-phyl/package.py +++ b/var/spack/repos/builtin/packages/bpp-phyl/package.py @@ -25,7 +25,7 @@ from spack import * -class BppPhyl(Package): +class BppPhyl(CMakePackage): """Bio++ phylogeny library.""" homepage = "http://biopp.univ-montp2.fr/wiki/index.php/Installation" @@ -33,11 +33,9 @@ class BppPhyl(Package): version('2.2.0', '5c40667ec0bf37e0ecaba321be932770') - depends_on('cmake', type='build') + depends_on('cmake@2.6:', type='build') depends_on('bpp-core') depends_on('bpp-seq') - def install(self, spec, prefix): - cmake('-DBUILD_TESTING=FALSE', '.', *std_cmake_args) - make() - make('install') + def cmake_args(self): + return ['-DBUILD_TESTING=FALSE'] diff --git a/var/spack/repos/builtin/packages/bpp-seq/package.py b/var/spack/repos/builtin/packages/bpp-seq/package.py index 6e1f06a64b..d89d029d26 100644 --- a/var/spack/repos/builtin/packages/bpp-seq/package.py +++ b/var/spack/repos/builtin/packages/bpp-seq/package.py @@ -25,7 +25,7 @@ from spack import * -class BppSeq(Package): +class BppSeq(CMakePackage): """Bio++ seq library.""" homepage = "http://biopp.univ-montp2.fr/wiki/index.php/Installation" @@ -33,10 +33,8 @@ class BppSeq(Package): version('2.2.0', '44adef0ff4d5ca4e69ccf258c9270633') - depends_on('cmake', type='build') + depends_on('cmake@2.6:', type='build') depends_on('bpp-core') - def install(self, spec, prefix): - cmake('-DBUILD_TESTING=FALSE', '.', *std_cmake_args) - make() - make('install') + def cmake_args(self): + return ['-DBUILD_TESTING=FALSE'] diff --git a/var/spack/repos/builtin/packages/bpp-suite/package.py b/var/spack/repos/builtin/packages/bpp-suite/package.py index 8223c40275..f52f76b822 100644 --- a/var/spack/repos/builtin/packages/bpp-suite/package.py +++ b/var/spack/repos/builtin/packages/bpp-suite/package.py @@ -25,7 +25,7 @@ from spack import * -class BppSuite(Package): +class BppSuite(CMakePackage): """BppSuite is a suite of ready-to-use programs for phylogenetic and sequence analysis.""" @@ -34,13 +34,8 @@ class BppSuite(Package): version('2.2.0', 'd8b29ad7ccf5bd3a7beb701350c9e2a4') - depends_on('cmake', type='build') + depends_on('cmake@2.6:', type='build') depends_on('texinfo', type='build') depends_on('bpp-core') depends_on('bpp-seq') depends_on('bpp-phyl') - - def install(self, spec, prefix): - cmake('.', *std_cmake_args) - make() - make('install') diff --git a/var/spack/repos/builtin/packages/c-blosc/package.py b/var/spack/repos/builtin/packages/c-blosc/package.py index 186f314f1e..636657bf8d 100644 --- a/var/spack/repos/builtin/packages/c-blosc/package.py +++ b/var/spack/repos/builtin/packages/c-blosc/package.py @@ -28,7 +28,7 @@ import sys from spack import * -class CBlosc(Package): +class CBlosc(CMakePackage): """Blosc, an extremely fast, multi-threaded, meta-compressor library""" homepage = "http://www.blosc.org" url = "https://github.com/Blosc/c-blosc/archive/v1.11.1.tar.gz" @@ -42,15 +42,21 @@ class CBlosc(Package): variant('avx2', default=True, description='Enable AVX2 support') - depends_on("cmake", type='build') - depends_on("snappy") - depends_on("zlib") + depends_on('cmake@2.8.10:', type='build') + depends_on('snappy') + depends_on('zlib') - def install(self, spec, prefix): - avx2 = '-DDEACTIVATE_AVX2=%s' % ('ON' if '~avx2' in spec else 'OFF') - cmake('.', avx2, *std_cmake_args) + def cmake_args(self): + args = [] - make() - make("install") + if '+avx2' in self.spec: + args.append('-DDEACTIVATE_AVX2=OFF') + else: + args.append('-DDEACTIVATE_AVX2=ON') + + return args + + @run_after('install') + def darwin_fix(self): if sys.platform == 'darwin': - fix_darwin_install_name(prefix.lib) + fix_darwin_install_name(self.prefix.lib) diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py index 813e491dfd..ef2058f557 100644 --- a/var/spack/repos/builtin/packages/callpath/package.py +++ b/var/spack/repos/builtin/packages/callpath/package.py @@ -25,7 +25,7 @@ from spack import * -class Callpath(Package): +class Callpath(CMakePackage): """Library for representing callpaths consistently in distributed-memory performance tools.""" @@ -35,20 +35,20 @@ class Callpath(Package): version('1.0.2', 'b1994d5ee7c7db9d27586fc2dcf8f373') version('1.0.1', '0047983d2a52c5c335f8ba7f5bab2325') - depends_on("elf", type="link") - depends_on("libdwarf") - depends_on("dyninst") - depends_on("adept-utils") - depends_on("mpi") - depends_on('cmake', type='build') + depends_on('elf', type='link') + depends_on('libdwarf') + depends_on('dyninst') + depends_on('adept-utils') + depends_on('mpi') + depends_on('cmake@2.8:', type='build') - def install(self, spec, prefix): + def cmake_args(self): # TODO: offer options for the walker used. - cmake_args = std_cmake_args + args = ["-DCALLPATH_WALKER=dyninst"] + if spec.satisfies("^dyninst@9.3.0:"): std_flag = self.compiler.cxx11_flag - cmake_args.append("-DCMAKE_CXX_FLAGS='{0} -fpermissive'".format( + args.append("-DCMAKE_CXX_FLAGS='{0} -fpermissive'".format( std_flag)) - cmake('.', "-DCALLPATH_WALKER=dyninst", *cmake_args) - make() - make("install") + + return args diff --git a/var/spack/repos/builtin/packages/cereal/package.py b/var/spack/repos/builtin/packages/cereal/package.py index 22da01e789..fc7aba4955 100644 --- a/var/spack/repos/builtin/packages/cereal/package.py +++ b/var/spack/repos/builtin/packages/cereal/package.py @@ -23,11 +23,9 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack import * -import os -import shutil -class Cereal(Package): +class Cereal(CMakePackage): """cereal is a header-only C++11 serialization library. cereal takes arbitrary data types and reversibly turns them into different representations, such as compact binary encodings, XML, or @@ -54,25 +52,18 @@ class Cereal(Package): depends_on('cmake@2.6.2:', type='build') - def install(self, spec, prefix): + def patch(self): # Don't use -Werror filter_file(r'-Werror', '', 'CMakeLists.txt') - # configure + def cmake_args(self): # Boost is only used for self-tests, which we are not running (yet?) - cmake('.', - '-DCMAKE_DISABLE_FIND_PACKAGE_Boost=TRUE', - '-DSKIP_PORTABILITY_TEST=TRUE', - *std_cmake_args) - - # Build - make() + return [ + '-DCMAKE_DISABLE_FIND_PACKAGE_Boost=TRUE', + '-DSKIP_PORTABILITY_TEST=TRUE', + ] - # Install - shutil.rmtree(join_path(prefix, 'doc'), ignore_errors=True) - shutil.rmtree(join_path(prefix, 'include'), ignore_errors=True) - shutil.rmtree(join_path(prefix, 'lib'), ignore_errors=True) - shutil.copytree('doc', join_path(prefix, 'doc'), symlinks=True) - shutil.copytree('include', join_path(prefix, 'include'), symlinks=True) - # Create empty directory to avoid linker warnings later - os.mkdir(join_path(prefix, 'lib')) + def install(self, spec, prefix): + with working_dir(self.build_directory): + install_tree('doc', prefix.doc) + install_tree('include', prefix.include) diff --git a/var/spack/repos/builtin/packages/cgal/package.py b/var/spack/repos/builtin/packages/cgal/package.py index 235d02ccde..381eb493e5 100644 --- a/var/spack/repos/builtin/packages/cgal/package.py +++ b/var/spack/repos/builtin/packages/cgal/package.py @@ -25,7 +25,7 @@ from spack import * -class Cgal(Package): +class Cgal(CMakePackage): """The Computational Geometry Algorithms Library (CGAL) is a C++ library that aims to provide easy access to efficient and reliable algorithms in computational geometry. CGAL is used in various areas needing geometric @@ -42,8 +42,9 @@ class Cgal(Package): variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, - description='Builds a debug version of the libraries') + variant('build_type', default='Release', + description='The build type to build', + values=('Debug', 'Release')) # ---- See "7 CGAL Libraries" at: # http://doc.cgal.org/latest/Manual/installation.html @@ -58,6 +59,8 @@ class Cgal(Package): variant('demos', default=False, description='Build CGAL demos') + depends_on('cmake@2.8.11:', type='build') + # Essential Third Party Libraries depends_on('boost+thread+system') depends_on('gmp') @@ -82,18 +85,12 @@ class Cgal(Package): # depends_on('esbtl') # depends_on('intel-tbb') - # Build dependencies - depends_on('cmake', type='build') - - def install(self, spec, prefix): + def cmake_args(self): # Installation instructions: # http://doc.cgal.org/latest/Manual/installation.html + spec = self.spec - options = std_cmake_args + [ - # CGAL supports only Release and Debug build type. Any - # other build type will raise an error at configure time - '-DCMAKE_BUILD_TYPE:STRING=%s' % - ('Debug' if '+debug' in spec else 'Release'), + return [ '-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if '+shared' in spec else 'OFF'), '-DWITH_CGAL_Core:BOOL=%s' % @@ -101,9 +98,5 @@ class Cgal(Package): '-DWITH_CGAL_ImageIO:BOOL=%s' % ('YES' if '+imageio' in spec else 'NO'), '-DWITH_CGAL_Qt5:BOOL=%s' % - ('YES' if '+demos' in spec else 'NO')] - - with working_dir('spack-build', create=True): - cmake('..', *options) - make() - make('install') + ('YES' if '+demos' in spec else 'NO'), + ] diff --git a/var/spack/repos/builtin/packages/cgns/package.py b/var/spack/repos/builtin/packages/cgns/package.py index 24f932a8d0..e3a4f89ff6 100644 --- a/var/spack/repos/builtin/packages/cgns/package.py +++ b/var/spack/repos/builtin/packages/cgns/package.py @@ -25,7 +25,7 @@ from spack import * -class Cgns(Package): +class Cgns(CMakePackage): """The CFD General Notation System (CGNS) provides a general, portable, and extensible standard for the storage and retrieval of computational fluid dynamics (CFD) analysis data.""" @@ -37,11 +37,12 @@ class Cgns(Package): variant('hdf5', default=True, description='Enable HDF5 interface') - depends_on('cmake', type='build') + depends_on('cmake@2.8:', type='build') depends_on('hdf5', when='+hdf5') - def install(self, spec, prefix): - cmake_args = std_cmake_args[:] + def cmake_args(self): + spec = self.spec + cmake_args = [] if self.compiler.f77 and self.compiler.fc: cmake_args.append('-DCGNS_ENABLE_FORTRAN=ON') @@ -66,8 +67,4 @@ class Cgns(Package): else: cmake_args.append('-DCGNS_ENABLE_HDF5=OFF') - with working_dir('spack-build', create=True): - cmake('..', *cmake_args) - - make() - make('install') + return cmake_args diff --git a/var/spack/repos/builtin/packages/cleverleaf/package.py b/var/spack/repos/builtin/packages/cleverleaf/package.py index 6ce9f51111..62907533ac 100644 --- a/var/spack/repos/builtin/packages/cleverleaf/package.py +++ b/var/spack/repos/builtin/packages/cleverleaf/package.py @@ -25,7 +25,7 @@ from spack import * -class Cleverleaf(Package): +class Cleverleaf(CMakePackage): """CleverLeaf is a hydrodynamics mini-app that extends CloverLeaf with Adaptive Mesh Refinement using the SAMRAI toolkit from Lawrence Livermore National Laboratory. The primary goal of CleverLeaf is @@ -40,12 +40,7 @@ class Cleverleaf(Package): version('develop', git='https://github.com/UK-MAC/CleverLeaf_ref.git', branch='develop') - depends_on("samrai@3.8.0:") - depends_on("hdf5+mpi") - depends_on("boost") - depends_on('cmake', type='build') - - def install(self, spec, prefix): - cmake(*std_cmake_args) - make() - make("install") + depends_on('samrai@3.8.0:') + depends_on('hdf5+mpi') + depends_on('boost') + depends_on('cmake@3.1:', type='build') diff --git a/var/spack/repos/builtin/packages/cmocka/package.py b/var/spack/repos/builtin/packages/cmocka/package.py index b0d9414ac6..944295a036 100644 --- a/var/spack/repos/builtin/packages/cmocka/package.py +++ b/var/spack/repos/builtin/packages/cmocka/package.py @@ -25,7 +25,7 @@ from spack import * -class Cmocka(Package): +class Cmocka(CMakePackage): """Unit-testing framework in pure C""" homepage = "https://cmocka.org/" url = "https://cmocka.org/files/1.1/cmocka-1.1.1.tar.xz" @@ -33,13 +33,7 @@ class Cmocka(Package): version('1.1.1', '6fbff4e42589566eda558db98b97623e') version('1.1.0', '59c9aa5735d9387fb591925ec53523ec') version('1.0.1', 'ed861e501a21a92b2af63e466df2015e') - parallel = False - - depends_on('cmake', type='build') - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('..', *std_cmake_args) + depends_on('cmake@2.6.0:', type='build') - make() - make("install") + parallel = False diff --git a/var/spack/repos/builtin/packages/cnmem/package.py b/var/spack/repos/builtin/packages/cnmem/package.py index cdbd0c86d4..fc4df89e09 100644 --- a/var/spack/repos/builtin/packages/cnmem/package.py +++ b/var/spack/repos/builtin/packages/cnmem/package.py @@ -25,13 +25,10 @@ from spack import * -class Cnmem(Package): +class Cnmem(CMakePackage): """CNMem mempool for CUDA devices""" homepage = "https://github.com/NVIDIA/cnmem" version('git', git='https://github.com/NVIDIA/cnmem.git', branch="master") - def install(self, spec, prefix): - cmake('.', *std_cmake_args) - make() - make('install') + depends_on('cmake@2.8.8:', type='build') diff --git a/var/spack/repos/builtin/packages/cram/package.py b/var/spack/repos/builtin/packages/cram/package.py index f0c33ae2c6..25427292cb 100644 --- a/var/spack/repos/builtin/packages/cram/package.py +++ b/var/spack/repos/builtin/packages/cram/package.py @@ -25,18 +25,13 @@ from spack import * -class Cram(Package): +class Cram(CMakePackage): """Cram runs many small MPI jobs inside one large MPI job.""" homepage = "https://github.com/llnl/cram" url = "http://github.com/llnl/cram/archive/v1.0.1.tar.gz" version('1.0.1', 'c73711e945cf5dc603e44395f6647f5e') - extends('python') - depends_on("mpi") - depends_on('cmake', type='build') - - def install(self, spec, prefix): - cmake(".", *std_cmake_args) - make() - make("install") + extends('python@2.7:') + depends_on('mpi') + depends_on('cmake@2.8:', type='build') diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py index fc8f478bf3..ebc303a193 100644 --- a/var/spack/repos/builtin/packages/dakota/package.py +++ b/var/spack/repos/builtin/packages/dakota/package.py @@ -25,7 +25,7 @@ from spack import * -class Dakota(Package): +class Dakota(CMakePackage): """The Dakota toolkit provides a flexible, extensible interface between analysis codes and iterative systems analysis methods. Dakota contains algorithms for: @@ -49,8 +49,6 @@ class Dakota(Package): version('6.3', '05a58d209fae604af234c894c3f73f6d') - variant('debug', default=False, - description='Builds a debug version of the libraries') variant('shared', default=True, description='Enables the build of shared libraries') variant('mpi', default=True, description='Activates MPI support') @@ -61,28 +59,20 @@ class Dakota(Package): depends_on('python') depends_on('boost') - depends_on('cmake', type='build') + depends_on('cmake@2.8.9:', type='build') - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) + def cmake_args(self): + spec = self.spec - options.extend([ - '-DCMAKE_BUILD_TYPE:STRING=%s' % ( - 'Debug' if '+debug' in spec else 'Release'), + args = [ '-DBUILD_SHARED_LIBS:BOOL=%s' % ( - 'ON' if '+shared' in spec else 'OFF')]) + 'ON' if '+shared' in spec else 'OFF'), + ] if '+mpi' in spec: - options.extend([ + args.extend([ '-DDAKOTA_HAVE_MPI:BOOL=ON', - '-DMPI_CXX_COMPILER:STRING=%s' % join_path( - spec['mpi'].prefix.bin, 'mpicxx')]) + '-DMPI_CXX_COMPILER:STRING=%s' % join_path(spec['mpi'].mpicxx), + ]) - build_directory = join_path(self.stage.path, 'spack-build') - source_directory = self.stage.source_path - - with working_dir(build_directory, create=True): - cmake(source_directory, *options) - make() - make("install") + return args diff --git a/var/spack/repos/builtin/packages/damselfly/package.py b/var/spack/repos/builtin/packages/damselfly/package.py index e78bb21f44..05cbee4a4e 100644 --- a/var/spack/repos/builtin/packages/damselfly/package.py +++ b/var/spack/repos/builtin/packages/damselfly/package.py @@ -25,7 +25,7 @@ from spack import * -class Damselfly(Package): +class Damselfly(CMakePackage): """Damselfly is a model-based parallel network simulator.""" homepage = "https://github.com/llnl/damselfly" url = "https://github.com/llnl/damselfly" @@ -33,10 +33,4 @@ class Damselfly(Package): version('1.0', '05cf7e2d8ece4408c0f2abb7ab63fd74c0d62895', git='https://github.com/llnl/damselfly.git', tag='v1.0') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('-DCMAKE_BUILD_TYPE=release', '..', *std_cmake_args) - make() - make('install') + depends_on('cmake@2.6:', type='build') diff --git a/var/spack/repos/builtin/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py index 61740fe91a..7817c2a8d8 100644 --- a/var/spack/repos/builtin/packages/doxygen/package.py +++ b/var/spack/repos/builtin/packages/doxygen/package.py @@ -25,7 +25,7 @@ from spack import * -class Doxygen(Package): +class Doxygen(CMakePackage): """Doxygen is the de facto standard tool for generating documentation from annotated C++ sources, but it also supports other popular programming languages such as C, Objective-C, C#, PHP, Java, Python, IDL (Corba, @@ -49,9 +49,3 @@ class Doxygen(Package): # optional dependencies depends_on("graphviz", when="+graphviz", type='run') - - def install(self, spec, prefix): - cmake('.', *std_cmake_args) - - make() - make("install") diff --git a/var/spack/repos/builtin/packages/gflags/package.py b/var/spack/repos/builtin/packages/gflags/package.py index 57a01f8c78..b96ee7a706 100644 --- a/var/spack/repos/builtin/packages/gflags/package.py +++ b/var/spack/repos/builtin/packages/gflags/package.py @@ -25,7 +25,7 @@ from spack import * -class Gflags(Package): +class Gflags(CMakePackage): """The gflags package contains a C++ library that implements commandline flags processing. It includes built-in support for standard types such as string and the ability to define flags @@ -37,11 +37,7 @@ class Gflags(Package): version('2.1.2', 'ac432de923f9de1e9780b5254884599f') - depends_on('cmake', type='build') + depends_on('cmake@2.8.12:', type='build') - def install(self, spec, prefix): - cmake("-DCMAKE_INSTALL_PREFIX=" + prefix, - "-DBUILD_SHARED_LIBS=ON") - make() - make("test") - make("install") + def cmake_args(self): + return ['-DBUILD_SHARED_LIBS=ON'] diff --git a/var/spack/repos/builtin/packages/glm/package.py b/var/spack/repos/builtin/packages/glm/package.py index 9825cbdb94..507c9606e3 100644 --- a/var/spack/repos/builtin/packages/glm/package.py +++ b/var/spack/repos/builtin/packages/glm/package.py @@ -25,11 +25,9 @@ from spack import * -class Glm(Package): +class Glm(CMakePackage): """OpenGL Mathematics (GLM) is a header only C++ mathematics library for - graphics software based on the OpenGL Shading Language (GLSL) - specification. - + graphics software based on the OpenGL Shading Language (GLSL) specification """ homepage = "https://github.com/g-truc/glm" @@ -37,10 +35,4 @@ class Glm(Package): version('0.9.7.1', '61af6639cdf652d1cdd7117190afced8') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('..', *std_cmake_args) - make() - make("install") + depends_on('cmake@2.6:', type='build') diff --git a/var/spack/repos/builtin/packages/graphlib/package.py b/var/spack/repos/builtin/packages/graphlib/package.py index 0ed50001f6..5d4582c365 100644 --- a/var/spack/repos/builtin/packages/graphlib/package.py +++ b/var/spack/repos/builtin/packages/graphlib/package.py @@ -25,7 +25,7 @@ from spack import * -class Graphlib(Package): +class Graphlib(CMakePackage): """Library to create, manipulate, and export graphs Graphlib.""" homepage = "https://github.com/LLNL/graphlib" url = "https://github.com/LLNL/graphlib/archive/v2.0.0.tar.gz" @@ -33,10 +33,4 @@ class Graphlib(Package): version('2.0.0', '43c6df84f1d38ba5a5dce0ae19371a70') version('3.0.0', '625d199f97ab1b84cbc8daabcaee5e2a') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - cmake(".", *std_cmake_args) - - make() - make("install") + depends_on('cmake@2.6:', type='build') diff --git a/var/spack/repos/builtin/packages/grib-api/package.py b/var/spack/repos/builtin/packages/grib-api/package.py index 9597964c94..d3f971d737 100644 --- a/var/spack/repos/builtin/packages/grib-api/package.py +++ b/var/spack/repos/builtin/packages/grib-api/package.py @@ -25,7 +25,7 @@ from spack import * -class GribApi(Package): +class GribApi(CMakePackage): """The ECMWF GRIB API is an application program interface accessible from C, FORTRAN and Python programs developed for encoding and decoding WMO FM-92 GRIB edition 1 and edition 2 messages.""" @@ -40,42 +40,41 @@ class GribApi(Package): variant('netcdf', default=False, description='Enable netcdf encoding/decoding using netcdf library') variant('jpeg', default=True, description='Enable jpeg 2000 for grib 2 decoding/encoding') variant('png', default=False, description='Enable png for decoding/encoding') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', 'Production')) - depends_on('cmake', type='build') depends_on('libpng', when='+png') depends_on('netcdf', when='+netcdf') depends_on('jasper', when='+jpeg') + depends_on('cmake@2.8.11:', type='build') - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) - options.append('-DBUILD_SHARED_LIBS=BOTH') + def cmake_args(self): + spec = self.spec + args = ['-DBUILD_SHARED_LIBS=BOTH'] # We will add python support later. - options.append('-DENABLE_PYTHON=OFF') + args.append('-DENABLE_PYTHON=OFF') # Disable FORTRAN interface if we don't have it. if (self.compiler.f77 is None) or (self.compiler.fc is None): - options.append('-DENABLE_FORTRAN=OFF') + args.append('-DENABLE_FORTRAN=OFF') if '+netcdf' in spec: - options.append('-DENABLE_NETCDF=ON') - options.append('-DNETCDF_PATH=%s' % spec['netcdf'].prefix) + args.append('-DENABLE_NETCDF=ON') + args.append('-DNETCDF_PATH=%s' % spec['netcdf'].prefix) else: - options.append('-DENABLE_NETCDF=OFF') + args.append('-DENABLE_NETCDF=OFF') if '+jpeg' in spec: - options.append('-DENABLE_JPG=ON') - options.append('-DJASPER_PATH=%s' % spec['jasper'].prefix) + args.append('-DENABLE_JPG=ON') + args.append('-DJASPER_PATH=%s' % spec['jasper'].prefix) else: - options.append('-DENABLE_JPG=OFF') + args.append('-DENABLE_JPG=OFF') if '+png' in spec: - options.append('-DENABLE_PNG=ON') + args.append('-DENABLE_PNG=ON') else: - options.append('-DENABLE_PNG=OFF') + args.append('-DENABLE_PNG=OFF') - with working_dir('spack-build', create=True): - cmake('..', *options) - make() - make('install') + return args diff --git a/var/spack/repos/builtin/packages/hepmc/package.py b/var/spack/repos/builtin/packages/hepmc/package.py index dfad9adb48..711daa88f8 100644 --- a/var/spack/repos/builtin/packages/hepmc/package.py +++ b/var/spack/repos/builtin/packages/hepmc/package.py @@ -26,7 +26,7 @@ from spack import * -class Hepmc(Package): +class Hepmc(CMakePackage): """The HepMC package is an object oriented, C++ event record for High Energy Physics Monte Carlo generators and simulation.""" @@ -39,17 +39,10 @@ class Hepmc(Package): version('2.06.06', '102e5503537a3ecd6ea6f466aa5bc4ae') version('2.06.05', '2a4a2a945adf26474b8bdccf4f881d9c') - depends_on("cmake", type='build') + depends_on('cmake@2.6:', type='build') - def install(self, spec, prefix): - build_directory = join_path(self.stage.path, 'spack-build') - source_directory = self.stage.source_path - options = [source_directory] - options.append('-Dmomentum:STRING=GEV') - options.append('-Dlength:STRING=MM') - options.extend(std_cmake_args) - - with working_dir(build_directory, create=True): - cmake(*options) - make() - make('install') + def cmake_args(self): + return [ + '-Dmomentum:STRING=GEV', + '-Dlength:STRING=MM', + ] diff --git a/var/spack/repos/builtin/packages/jsoncpp/package.py b/var/spack/repos/builtin/packages/jsoncpp/package.py index d21b948264..1889bffc1e 100644 --- a/var/spack/repos/builtin/packages/jsoncpp/package.py +++ b/var/spack/repos/builtin/packages/jsoncpp/package.py @@ -25,7 +25,7 @@ from spack import * -class Jsoncpp(Package): +class Jsoncpp(CMakePackage): """JsonCpp is a C++ library that allows manipulating JSON values, including serialization and deserialization to and from strings. It can also preserve existing comment in unserialization/serialization @@ -36,14 +36,14 @@ class Jsoncpp(Package): version('1.7.3', 'aff6bfb5b81d9a28785429faa45839c5') - depends_on('cmake', type='build') - # depends_on('python', type='test') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', + 'MinSizeRel', 'Coverage')) - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('..', '-DBUILD_SHARED_LIBS=ON', *std_cmake_args) + depends_on('cmake@3.1:', type='build') + # TODO: Add a 'test' deptype + # depends_on('python', type='test') - make() - if self.run_tests: - make('test') # Python needed to run tests - make('install') + def cmake_args(self): + return ['-DBUILD_SHARED_LIBS=ON'] diff --git a/var/spack/repos/builtin/packages/kealib/package.py b/var/spack/repos/builtin/packages/kealib/package.py index b417c6be78..6abc7c643f 100644 --- a/var/spack/repos/builtin/packages/kealib/package.py +++ b/var/spack/repos/builtin/packages/kealib/package.py @@ -25,7 +25,7 @@ from spack import * -class Kealib(Package): +class Kealib(CMakePackage): """An HDF5 Based Raster File Format KEALib provides an implementation of the GDAL data model. @@ -46,16 +46,13 @@ class Kealib(Package): version('1.4.5', '112e9c42d980b2d2987a3c15d0833a5d') - depends_on("hdf5") + depends_on('hdf5') + depends_on('cmake@2.8.10:', type='build') - 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) + root_cmakelists_dir = 'trunk' - make() - make("install") + def cmake_args(self): + return [ + '-DHDF5_INCLUDE_DIR=%s' % spec['hdf5'].prefix.include, + '-DHDF5_LIB_PATH=%s' % spec['hdf5'].prefix.lib, + ] diff --git a/var/spack/repos/builtin/packages/kripke/package.py b/var/spack/repos/builtin/packages/kripke/package.py index 9d630f1206..65f722feed 100644 --- a/var/spack/repos/builtin/packages/kripke/package.py +++ b/var/spack/repos/builtin/packages/kripke/package.py @@ -25,7 +25,7 @@ from spack import * -class Kripke(Package): +class Kripke(CMakePackage): """Kripke is a simple, scalable, 3D Sn deterministic particle transport proxy/mini app. """ @@ -38,21 +38,20 @@ class Kripke(Package): variant('mpi', default=True, description='Build with MPI.') variant('openmp', default=True, description='Build with OpenMP enabled.') - depends_on('mpi', when="+mpi") + depends_on('mpi', when='+mpi') + depends_on('cmake@3.0:', type='build') + + def cmake_args(self): + def enabled(variant): + return (1 if variant in spec else 0) + + return [ + '-DENABLE_OPENMP=%d' % enabled('+openmp'), + '-DENABLE_MPI=%d' % enabled('+mpi'), + ] def install(self, spec, prefix): - with working_dir('build', create=True): - def enabled(variant): - return (1 if variant in spec else 0) - - cmake('-DCMAKE_INSTALL_PREFIX:PATH=.', - '-DENABLE_OPENMP=%d' % enabled('+openmp'), - '-DENABLE_MPI=%d' % enabled('+mpi'), - '..', - *std_cmake_args) - make() - - # Kripke does not provide install target, so we have to copy - # things into place. - mkdirp(prefix.bin) - install('kripke', prefix.bin) + # Kripke does not provide install target, so we have to copy + # things into place. + mkdirp(prefix.bin) + install('kripke', prefix.bin) diff --git a/var/spack/repos/builtin/packages/libemos/package.py b/var/spack/repos/builtin/packages/libemos/package.py index 371a8437b7..b8840e526d 100644 --- a/var/spack/repos/builtin/packages/libemos/package.py +++ b/var/spack/repos/builtin/packages/libemos/package.py @@ -25,7 +25,7 @@ from spack import * -class Libemos(Package): +class Libemos(CMakePackage): """The Interpolation library (EMOSLIB) includes Interpolation software and BUFR & CREX encoding/decoding routines.""" @@ -37,27 +37,27 @@ class Libemos(Package): variant('eccodes', default=False, description="Use eccodes instead of grib-api for GRIB decoding") + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', 'Production')) - depends_on('cmake', type='build') depends_on('eccodes', when='+eccodes') depends_on('grib-api', when='~eccodes') depends_on('fftw+float+double') + depends_on('cmake@2.8.11:', type='build') - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) + def cmake_args(self): + spec = self.spec + args = [] if spec.satisfies('+eccodes'): - options.append('-DENABLE_ECCODES=ON') - options.append('-DECCODES_PATH=%s' % spec['eccodes'].prefix) + args.append('-DENABLE_ECCODES=ON') + args.append('-DECCODES_PATH=%s' % spec['eccodes'].prefix) else: - options.append('-DENABLE_ECCODES=OFF') - options.append('-DGRIB_API_PATH=%s' % spec['grib-api'].prefix) + args.append('-DENABLE_ECCODES=OFF') + args.append('-DGRIB_API_PATH=%s' % spec['grib-api'].prefix) # To support long pathnames that spack generates - options.append('-DCMAKE_Fortran_FLAGS=-ffree-line-length-none') + args.append('-DCMAKE_Fortran_FLAGS=-ffree-line-length-none') - with working_dir('spack-build', create=True): - cmake('..', *options) - make() - make('install') + return args diff --git a/var/spack/repos/builtin/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py index 0ebe2e6b89..801c384c79 100644 --- a/var/spack/repos/builtin/packages/llvm-lld/package.py +++ b/var/spack/repos/builtin/packages/llvm-lld/package.py @@ -25,28 +25,24 @@ from spack import * -class LlvmLld(Package): +class LlvmLld(CMakePackage): """lld - The LLVM Linker lld is a new set of modular code for creating linker tools.""" homepage = "http://lld.llvm.org" url = "http://llvm.org/releases/3.4/lld-3.4.src.tar.gz" - depends_on('llvm') - version('3.4', '3b6a17e58c8416c869c14dd37682f78e') - depends_on('cmake', type='build') + depends_on('llvm') + depends_on('cmake@2.8:', type='build') - def install(self, spec, prefix): + def cmake_args(self): if 'CXXFLAGS' in env and env['CXXFLAGS']: env['CXXFLAGS'] += ' ' + self.compiler.cxx11_flag else: env['CXXFLAGS'] = self.compiler.cxx11_flag - with working_dir('spack-build', create=True): - cmake('..', - '-DLLD_PATH_TO_LLVM_BUILD=%s' % spec['llvm'].prefix, - '-DLLVM_MAIN_SRC_DIR=%s' % spec['llvm'].prefix, - *std_cmake_args) - make() - make("install") + return [ + '-DLLD_PATH_TO_LLVM_BUILD=%s' % spec['llvm'].prefix, + '-DLLVM_MAIN_SRC_DIR=%s' % spec['llvm'].prefix, + ] diff --git a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py index 3479b08bc5..8039ec1717 100644 --- a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py +++ b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py @@ -26,7 +26,7 @@ from spack import * -class LlvmOpenmpOmpt(Package): +class LlvmOpenmpOmpt(CMakePackage): """The OpenMP subproject provides an OpenMP runtime for use with the OpenMP implementation in Clang. This branch includes experimental changes for OMPT, the OpenMP Tools interface""" @@ -42,25 +42,26 @@ class LlvmOpenmpOmpt(Package): git='https://github.com/OpenMPToolsInterface/LLVM-openmp.git', commit='982a08bcf3df9fb5afc04ac3bada47f19cc4e3d3') - depends_on('cmake', type='build') + depends_on('cmake@2.8:', type='build') depends_on('llvm') depends_on('ninja', type='build') - def install(self, spec, prefix): - - with working_dir('spack-build', create=True): - cmake_args = std_cmake_args[:] - cmake_args.extend([ - '-G', 'Ninja', - '-DCMAKE_C_COMPILER=clang', - '-DCMAKE_CXX_COMPILER=clang++', - '-DCMAKE_BUILD_TYPE=Release', - '-DLIBOMP_OMPT_SUPPORT=on', - '-DLIBOMP_OMPT_BLAME=on', - '-DLIBOMP_OMPT_TRACE=on' - ]) + def cmake_args(self): + return [ + '-G', 'Ninja', + '-DCMAKE_C_COMPILER=clang', + '-DCMAKE_CXX_COMPILER=clang++', + '-DCMAKE_BUILD_TYPE=Release', + '-DLIBOMP_OMPT_SUPPORT=on', + '-DLIBOMP_OMPT_BLAME=on', + '-DLIBOMP_OMPT_TRACE=on' + ] - cmake('..', *cmake_args) - ninja = Executable('ninja') + # TODO: Add better ninja support to CMakePackage + def build(self, spec, prefix): + with working_dir(self.build_directory): ninja() + + def install(self, spec, prefix): + with working_dir(self.build_directory): ninja('install') diff --git a/var/spack/repos/builtin/packages/magics/package.py b/var/spack/repos/builtin/packages/magics/package.py index 33a6bb5640..4eac010c18 100644 --- a/var/spack/repos/builtin/packages/magics/package.py +++ b/var/spack/repos/builtin/packages/magics/package.py @@ -26,7 +26,7 @@ from spack import * import glob -class Magics(Package): +class Magics(CMakePackage): """Magics is the latest generation of the ECMWF's Meteorological plotting software MAGICS. Although completely redesigned in C++, it is intended to be as backwards-compatible as possible with the Fortran interface.""" @@ -52,8 +52,11 @@ class Magics(Package): variant('metview', default=False, description='Enable metview support') variant('qt', default=False, description='Enable metview support with qt') variant('eccodes', default=False, description='Use eccodes instead of grib-api') + variant('build_type', default='RelWithDebInfo', + description='The build type to build', + values=('Debug', 'Release', 'RelWithDebInfo', 'Production')) - depends_on('cmake', type='build') + depends_on('cmake@2.8.11:', type='build') depends_on('pkg-config', type='build') # Currently python is only necessary to run @@ -80,53 +83,50 @@ class Magics(Package): for pyfile in glob.glob('*/*.py'): filter_file('#!/usr/bin/python', '#!/usr/bin/env python', pyfile) - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) - options.append('-DENABLE_ODB=OFF') - options.append('-DENABLE_PYTHON=OFF') - options.append('-DBOOST_ROOT=%s' % spec['boost'].prefix) - options.append('-DPROJ4_PATH=%s' % spec['proj'].prefix) - options.append('-DENABLE_TESTS=OFF') + def cmake_args(self): + args = [ + '-DENABLE_ODB=OFF', + '-DENABLE_PYTHON=OFF', + '-DBOOST_ROOT=%s' % spec['boost'].prefix, + '-DPROJ4_PATH=%s' % spec['proj'].prefix, + '-DENABLE_TESTS=OFF', + ] if '+bufr' in spec: - options.append('-DENABLE_BUFR=ON') - options.append('-DLIBEMOS_PATH=%s' % spec['libemos'].prefix) + args.append('-DENABLE_BUFR=ON') + args.append('-DLIBEMOS_PATH=%s' % spec['libemos'].prefix) else: - options.append('-DENABLE_BUFR=OFF') + args.append('-DENABLE_BUFR=OFF') if '+netcdf' in spec: - options.append('-DENABLE_NETCDF=ON') - options.append('-DNETCDF_PATH=%s' % spec['netcdf-cxx'].prefix) + args.append('-DENABLE_NETCDF=ON') + args.append('-DNETCDF_PATH=%s' % spec['netcdf-cxx'].prefix) else: - options.append('-DENABLE_NETCDF=OFF') + args.append('-DENABLE_NETCDF=OFF') if '+cairo' in spec: - options.append('-DENABLE_CAIRO=ON') + args.append('-DENABLE_CAIRO=ON') else: - options.append('-DENABLE_CAIRO=OFF') + args.append('-DENABLE_CAIRO=OFF') if '+metview' in spec: if '+qt' in spec: - options.append('-DENABLE_METVIEW=ON') + args.append('-DENABLE_METVIEW=ON') if spec['qt'].version[0] == 5: - options.append('-DENABLE_QT5=ON') + args.append('-DENABLE_QT5=ON') else: - options.append('-DENABLE_METVIEW_NO_QT=ON') + args.append('-DENABLE_METVIEW_NO_QT=ON') else: - options.append('-DENABLE_METVIEW=OFF') + args.append('-DENABLE_METVIEW=OFF') if '+eccodes' in spec: - options.append('-DENABLE_ECCODES=ON') - options.append('-DECCODES_PATH=%s' % spec['eccodes'].prefix) + args.append('-DENABLE_ECCODES=ON') + args.append('-DECCODES_PATH=%s' % spec['eccodes'].prefix) else: - options.append('-DENABLE_ECCODES=OFF') - options.append('-DGRIB_API_PATH=%s' % spec['grib-api'].prefix) + args.append('-DENABLE_ECCODES=OFF') + args.append('-DGRIB_API_PATH=%s' % spec['grib-api'].prefix) if (self.compiler.f77 is None) or (self.compiler.fc is None): - options.append('-DENABLE_FORTRAN=OFF') + args.append('-DENABLE_FORTRAN=OFF') - with working_dir('spack-build', create=True): - cmake('..', *options) - make() - make('install') + return args diff --git a/var/spack/repos/builtin/packages/mariadb/package.py b/var/spack/repos/builtin/packages/mariadb/package.py index 6374fdb8d3..78332a05b4 100644 --- a/var/spack/repos/builtin/packages/mariadb/package.py +++ b/var/spack/repos/builtin/packages/mariadb/package.py @@ -25,7 +25,7 @@ from spack import * -class Mariadb(Package): +class Mariadb(CMakePackage): """MariaDB turns data into structured information in a wide array of applications, ranging from banking to websites. It is an enhanced, drop-in replacement for MySQL. MariaDB is used because it is fast, scalable and @@ -45,18 +45,10 @@ class Mariadb(Package): 'operations in the mariadb client library.') depends_on('boost') - depends_on('cmake') + depends_on('cmake@2.6:', type='build') depends_on('jemalloc') depends_on('libaio') depends_on('libedit') depends_on('libevent', when='+nonblocking') depends_on('ncurses') depends_on('zlib') - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - - cmake('..', *std_cmake_args) - - make() - make('install') diff --git a/var/spack/repos/builtin/packages/mbedtls/package.py b/var/spack/repos/builtin/packages/mbedtls/package.py index b93b82abd0..09820321de 100644 --- a/var/spack/repos/builtin/packages/mbedtls/package.py +++ b/var/spack/repos/builtin/packages/mbedtls/package.py @@ -25,7 +25,7 @@ from spack import * -class Mbedtls(Package): +class Mbedtls(CMakePackage): """mbed TLS (formerly known as PolarSSL) makes it trivially easy for developers to include cryptographic and SSL/TLS capabilities in their (embedded) products, facilitating this functionality with a @@ -42,10 +42,9 @@ class Mbedtls(Package): version('2.1.3', '7eb4cf1dfa68578a2c8dbd0b6fa752dd') version('1.3.16', '4144d7320c691f721aeb9e67a1bc38e0') - depends_on('cmake', type='build') + variant('build_type', default='Release', + description='The build type to build', + values=('Debug', 'Release', 'Coverage', 'ASan', 'ASanDbg', + 'MemSan', 'MemSanDbg', 'Check', 'CheckFull')) - def install(self, spec, prefix): - cmake('.', *std_cmake_args) - - make() - make("install") + depends_on('cmake@2.6:', type='build') diff --git a/var/spack/repos/builtin/packages/mitos/package.py b/var/spack/repos/builtin/packages/mitos/package.py index 0e87f7c376..2c2177f968 100644 --- a/var/spack/repos/builtin/packages/mitos/package.py +++ b/var/spack/repos/builtin/packages/mitos/package.py @@ -25,7 +25,7 @@ from spack import * -class Mitos(Package): +class Mitos(CMakePackage): """Mitos is a library and a tool for collecting sampled memory performance data to view with MemAxes""" @@ -40,10 +40,4 @@ class Mitos(Package): depends_on('dyninst@8.2.1:') depends_on('hwloc') depends_on('mpi') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('..', *std_cmake_args) - make() - make("install") + depends_on('cmake@2.8:', type='build') diff --git a/var/spack/repos/builtin/packages/msgpack-c/package.py b/var/spack/repos/builtin/packages/msgpack-c/package.py index 5771fba86d..a22fd0e312 100644 --- a/var/spack/repos/builtin/packages/msgpack-c/package.py +++ b/var/spack/repos/builtin/packages/msgpack-c/package.py @@ -25,17 +25,11 @@ from spack import * -class MsgpackC(Package): +class MsgpackC(CMakePackage): """A small, fast binary interchange format convertible to/from JSON""" homepage = "http://www.msgpack.org" url = "https://github.com/msgpack/msgpack-c/archive/cpp-1.4.1.tar.gz" version('1.4.1', 'e2fd3a7419b9bc49e5017fdbefab87e0') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - cmake('.', *std_cmake_args) - - make() - make("install") + depends_on('cmake@2.8.12:', type='build') diff --git a/var/spack/repos/builtin/packages/muster/package.py b/var/spack/repos/builtin/packages/muster/package.py index bcc68ade27..4f61938a80 100644 --- a/var/spack/repos/builtin/packages/muster/package.py +++ b/var/spack/repos/builtin/packages/muster/package.py @@ -25,7 +25,7 @@ from spack import * -class Muster(Package): +class Muster(CMakePackage): """The Muster library provides implementations of sequential and parallel K-Medoids clustering algorithms. It is intended as a general framework for parallel cluster analysis, particularly @@ -38,11 +38,6 @@ class Muster(Package): version('1.0.1', 'd709787db7e080447afb6571ac17723c') version('1.0', '2eec6979a4a36d3a65a792d12969be16') - depends_on("boost") - depends_on("mpi") - depends_on('cmake', type='build') - - def install(self, spec, prefix): - cmake(".", *std_cmake_args) - make() - make("install") + depends_on('boost') + depends_on('mpi') + depends_on('cmake@2.8:', type='build') diff --git a/var/spack/repos/builtin/packages/ompt-openmp/package.py b/var/spack/repos/builtin/packages/ompt-openmp/package.py index daa3fed670..f751dedef0 100644 --- a/var/spack/repos/builtin/packages/ompt-openmp/package.py +++ b/var/spack/repos/builtin/packages/ompt-openmp/package.py @@ -25,7 +25,7 @@ from spack import * -class OmptOpenmp(Package): +class OmptOpenmp(CMakePackage): """LLVM/Clang OpenMP runtime with OMPT support. This is a fork of the OpenMPToolsInterface/LLVM-openmp fork of the official LLVM OpenMP mirror. This library provides a drop-in replacement of the OpenMP @@ -37,13 +37,8 @@ class OmptOpenmp(Package): version('0.1', '2334e6a84b52da41b27afd9831ed5370') - depends_on('cmake', type='build') + depends_on('cmake@2.8:', type='build') - def install(self, spec, prefix): - with working_dir("runtime/build", create=True): - cmake('-DCMAKE_C_COMPILER=%s' % self.compiler.cc, - '-DCMAKE_CXX_COMPILER=%s' % self.compiler.cxx, - '-DCMAKE_INSTALL_PREFIX=%s' % prefix, - '..', *std_cmake_args) - make() - make("install") + conflicts('%gcc@:4.7') + + root_cmakelists_dir = 'runtime' diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py index 09fa68b9c0..e0743e17c6 100644 --- a/var/spack/repos/builtin/packages/opencv/package.py +++ b/var/spack/repos/builtin/packages/opencv/package.py @@ -25,7 +25,7 @@ from spack import * -class Opencv(Package): +class Opencv(CMakePackage): """OpenCV is released under a BSD license and hence it's free for both academic and commercial use. It has C++, C, Python and Java interfaces and supports Windows, Linux, Mac OS, iOS and Android. OpenCV was designed for @@ -47,8 +47,6 @@ class Opencv(Package): variant('shared', default=True, description='Enables the build of shared libraries') - variant('debug', default=False, - description='Builds a debug version of the libraries') variant('eigen', default=True, description='Activates support for eigen') variant('ipp', default=True, description='Activates support for IPP') @@ -62,7 +60,6 @@ class Opencv(Package): variant('java', default=False, description='Activates support for Java') - depends_on('cmake', type='build') depends_on('eigen', when='+eigen', type='build') depends_on('zlib') @@ -80,13 +77,10 @@ class Opencv(Package): extends('python', when='+python') - def install(self, spec, prefix): - cmake_options = [] - cmake_options.extend(std_cmake_args) + def cmake_args(self): + spec = self.spec - cmake_options.extend([ - '-DCMAKE_BUILD_TYPE:STRING={0}'.format(( - 'Debug' if '+debug' in spec else 'Release')), + args = [ '-DBUILD_SHARED_LIBS:BOOL={0}'.format(( 'ON' if '+shared' in spec else 'OFF')), '-DENABLE_PRECOMPILED_HEADERS:BOOL=OFF', @@ -100,11 +94,11 @@ class Opencv(Package): 'ON' if '+vtk' in spec else 'OFF')), '-DBUILD_opencv_java:BOOL={0}'.format(( 'ON' if '+java' in spec else 'OFF')), - ]) + ] # Media I/O zlib = spec['zlib'] - cmake_options.extend([ + args.extend([ '-DZLIB_LIBRARY_{0}:FILEPATH={1}'.format(( 'DEBUG' if '+debug' in spec else 'RELEASE'), join_path(zlib.prefix.lib, @@ -113,7 +107,7 @@ class Opencv(Package): ]) libpng = spec['libpng'] - cmake_options.extend([ + args.extend([ '-DPNG_LIBRARY_{0}:FILEPATH={1}'.format(( 'DEBUG' if '+debug' in spec else 'RELEASE'), join_path(libpng.prefix.lib, @@ -122,7 +116,7 @@ class Opencv(Package): ]) libjpeg = spec['libjpeg-turbo'] - cmake_options.extend([ + args.extend([ '-DJPEG_LIBRARY:FILEPATH={0}'.format( join_path(libjpeg.prefix.lib, 'libjpeg.{0}'.format(dso_suffix))), @@ -130,7 +124,7 @@ class Opencv(Package): ]) libtiff = spec['libtiff'] - cmake_options.extend([ + args.extend([ '-DTIFF_LIBRARY_{0}:FILEPATH={1}'.format(( 'DEBUG' if '+debug' in spec else 'RELEASE'), join_path(libtiff.prefix.lib, @@ -139,7 +133,7 @@ class Opencv(Package): ]) jasper = spec['jasper'] - cmake_options.extend([ + args.extend([ '-DJASPER_LIBRARY_{0}:FILEPATH={1}'.format(( 'DEBUG' if '+debug' in spec else 'RELEASE'), join_path(jasper.prefix.lib, @@ -149,17 +143,17 @@ class Opencv(Package): # GUI if '+gtk' not in spec: - cmake_options.extend([ + args.extend([ '-DWITH_GTK:BOOL=OFF', '-DWITH_GTK_2_X:BOOL=OFF' ]) elif '^gtkplus@3:' in spec: - cmake_options.extend([ + args.extend([ '-DWITH_GTK:BOOL=ON', '-DWITH_GTK_2_X:BOOL=OFF' ]) elif '^gtkplus@2:3' in spec: - cmake_options.extend([ + args.extend([ '-DWITH_GTK:BOOL=OFF', '-DWITH_GTK_2_X:BOOL=ON' ]) @@ -171,7 +165,7 @@ class Opencv(Package): python_include_dir = spec['python'].headers.directories[0] if '^python@3:' in spec: - cmake_options.extend([ + args.extend([ '-DBUILD_opencv_python3=ON', '-DPYTHON3_EXECUTABLE={0}'.format(python_exe), '-DPYTHON3_LIBRARY={0}'.format(python_lib), @@ -179,7 +173,7 @@ class Opencv(Package): '-DBUILD_opencv_python2=OFF', ]) elif '^python@2:3' in spec: - cmake_options.extend([ + args.extend([ '-DBUILD_opencv_python2=ON', '-DPYTHON2_EXECUTABLE={0}'.format(python_exe), '-DPYTHON2_LIBRARY={0}'.format(python_lib), @@ -187,12 +181,9 @@ class Opencv(Package): '-DBUILD_opencv_python3=OFF', ]) else: - cmake_options.extend([ + args.extend([ '-DBUILD_opencv_python2=OFF', '-DBUILD_opencv_python3=OFF' ]) - with working_dir('spack_build', create=True): - cmake('..', *cmake_options) - make('VERBOSE=1') - make("install") + return args diff --git a/var/spack/repos/builtin/packages/openscenegraph/package.py b/var/spack/repos/builtin/packages/openscenegraph/package.py index 28a7187da8..e90d010e83 100644 --- a/var/spack/repos/builtin/packages/openscenegraph/package.py +++ b/var/spack/repos/builtin/packages/openscenegraph/package.py @@ -26,7 +26,7 @@ from spack import * -class Openscenegraph(Package): +class Openscenegraph(CMakePackage): """OpenSceneGraph is an open source, high performance 3D graphics toolkit that's used in a variety of visual simulation applications.""" @@ -36,42 +36,34 @@ class Openscenegraph(Package): version('3.2.3', '02ffdad7744c747d8fad0d7babb58427') version('3.1.5', '1c90b851b109849c985006486ef59822') - variant('debug', default=False, description='Builds a debug version of the library') variant('shared', default=True, description='Builds a shared version of the library') depends_on('cmake@2.8.7:', type='build') depends_on('qt@4:') depends_on('zlib') - def install(self, spec, prefix): - build_type = 'Debug' if '+debug' in spec else 'Release' + def cmake_args(self): + spec = self.spec + shared_status = 'ON' if '+shared' in spec else 'OFF' - cmake_args = std_cmake_args[:] - cmake_args.extend([ - '-DCMAKE_BUILD_TYPE={0}'.format(build_type), + args = [ '-DDYNAMIC_OPENSCENEGRAPH={0}'.format(shared_status), '-DDYNAMIC_OPENTHREADS={0}'.format(shared_status), - ]) + '-DZLIB_INCLUDE_DIR={0}'.format(spec['zlib'].prefix.include), + '-DZLIB_LIBRARY={0}/libz.{1}'.format(spec['zlib'].prefix.lib, + dso_suffix), + '-DBUILD_OSG_APPLICATIONS=OFF', + '-DOSG_NOTIFY_DISABLED=ON', + '-DLIB_POSTFIX=', + ] # NOTE: This is necessary in order to allow OpenSceneGraph to compile # despite containing a number of implicit bool to int conversions. if spec.satisfies('%gcc'): - cmake_args.extend([ + args.extend([ '-DCMAKE_C_FLAGS=-fpermissive', '-DCMAKE_CXX_FLAGS=-fpermissive', ]) - with working_dir('spack-build', create=True): - cmake( - '..', - '-DZLIB_INCLUDE_DIR={0}'.format(spec['zlib'].prefix.include), - '-DZLIB_LIBRARY={0}/libz.{1}'.format(spec['zlib'].prefix.lib, - dso_suffix), - '-DBUILD_OSG_APPLICATIONS=OFF', - '-DOSG_NOTIFY_DISABLED=ON', - '-DLIB_POSTFIX=', - *cmake_args - ) - make() - make('install') + return args diff --git a/var/spack/repos/builtin/packages/panda/package.py b/var/spack/repos/builtin/packages/panda/package.py index 7e5f7710d2..5c905fb2d3 100644 --- a/var/spack/repos/builtin/packages/panda/package.py +++ b/var/spack/repos/builtin/packages/panda/package.py @@ -26,7 +26,7 @@ from spack import * -class Panda(Package): +class Panda(CMakePackage): """PANDA: Parallel AdjaceNcy Decomposition Algorithm""" homepage = "http://comopt.ifi.uni-heidelberg.de/software/PANDA/index.html" url = "http://comopt.ifi.uni-heidelberg.de/software/PANDA/downloads/panda-2016-03-07.tar" @@ -35,11 +35,5 @@ class Panda(Package): # Note: Panda can also be built without MPI support - depends_on("cmake", type="build") - depends_on("mpi") - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake("..", *std_cmake_args) - make() - make("install") + depends_on('cmake@2.6.4:', type='build') + depends_on('mpi') diff --git a/var/spack/repos/builtin/packages/paradiseo/package.py b/var/spack/repos/builtin/packages/paradiseo/package.py index 4b9bad0f3e..fbcf8ca5e5 100644 --- a/var/spack/repos/builtin/packages/paradiseo/package.py +++ b/var/spack/repos/builtin/packages/paradiseo/package.py @@ -25,7 +25,7 @@ from spack import * -class Paradiseo(Package): +class Paradiseo(CMakePackage): """A C++ white-box object-oriented framework dedicated to the reusable design of metaheuristics.""" homepage = "http://paradiseo.gforge.inria.fr/" @@ -51,13 +51,11 @@ class Paradiseo(Package): description='Compile with (Experimental) EDO module') # variant('doc', default=False, description='Compile with documentation') - variant('debug', default=False, - description='Builds a debug version of the libraries') variant('openmp', default=False, description='Enable OpenMP support') variant('gnuplot', default=False, description='Enable GnuPlot support') # Required dependencies - depends_on("cmake", type='build') + depends_on("cmake@2.8:", type='build') # Optional dependencies depends_on("mpi", when="+mpi") @@ -73,13 +71,10 @@ class Paradiseo(Package): patch('fix_tests.patch') patch('fix_tutorials.patch') - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) + def cmake_args(self): + spec = self.spec - options.extend([ - '-DCMAKE_BUILD_TYPE:STRING=%s' % ( - 'Debug' if '+debug' in spec else 'Release'), + return [ '-DINSTALL_TYPE:STRING=MIN', '-DMPI:BOOL=%s' % ('TRUE' if '+mpi' in spec else 'FALSE'), # Note: This requires a C++11 compatible compiler @@ -91,14 +86,4 @@ class Paradiseo(Package): 'TRUE' if '+openmp' in spec else 'FALSE'), '-DENABLE_GNUPLOT:BOOL=%s' % ( 'TRUE' if '+gnuplot' in spec else 'FALSE') - ]) - - with working_dir('spack-build', create=True): - # Configure - cmake('..', *options) - - # Build, test and install - make("VERBOSE=1") - if self.run_tests: - make("test") - make("install") + ] diff --git a/var/spack/repos/builtin/packages/pidx/package.py b/var/spack/repos/builtin/packages/pidx/package.py index f79ff7eec4..e4be597f0f 100644 --- a/var/spack/repos/builtin/packages/pidx/package.py +++ b/var/spack/repos/builtin/packages/pidx/package.py @@ -25,7 +25,7 @@ from spack import * -class Pidx(Package): +class Pidx(CMakePackage): """PIDX Parallel I/O Library. PIDX is an efficient parallel I/O library that reads and writes @@ -37,11 +37,5 @@ class Pidx(Package): version('1.0', git='https://github.com/sci-visus/PIDX.git', commit='6afa1cf71d1c41263296dc049c8fabaf73c296da') - depends_on('cmake', type='build') - depends_on("mpi") - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('..', *std_cmake_args) - make() - make("install") + depends_on('cmake@2.8.4:', type='build') + depends_on('mpi') diff --git a/var/spack/repos/builtin/packages/piranha/package.py b/var/spack/repos/builtin/packages/piranha/package.py index 8d684ce277..4bc4d5f894 100644 --- a/var/spack/repos/builtin/packages/piranha/package.py +++ b/var/spack/repos/builtin/packages/piranha/package.py @@ -25,7 +25,7 @@ from spack import * -class Piranha(Package): +class Piranha(CMakePackage): """Piranha is a computer-algebra library for the symbolic manipulation of sparse multivariate polynomials and other closely-related symbolic objects (such as Poisson series).""" @@ -40,7 +40,7 @@ class Piranha(Package): description='Build the Python bindings') # Build dependencies - depends_on('cmake@3.0:', type='build') + depends_on('cmake@3.2.0:', type='build') extends('python', when='+pyranha') depends_on('python@2.6:', type='build', when='+pyranha') @@ -53,21 +53,8 @@ class Piranha(Package): depends_on('gmp') # mpir is a drop-in replacement for this depends_on('mpfr') # Could also be built against mpir - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) - - # Python bindings - options.extend([ - '-DBUILD_PYRANHA=%s' % ( - 'ON' if '+python' in spec else 'OFF'), + def cmake_args(self): + return [ + '-DBUILD_PYRANHA=%s' % ('ON' if '+python' in self.spec else 'OFF'), '-DBUILD_TESTS:BOOL=ON', - ]) - - with working_dir('spack-build', create=True): - cmake('..', *options) - - make() - make('install') - if self.run_tests: - make('test') + ] diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py index 41633ffceb..3c50a8413c 100644 --- a/var/spack/repos/builtin/packages/psi4/package.py +++ b/var/spack/repos/builtin/packages/psi4/package.py @@ -26,7 +26,7 @@ from spack import * import os -class Psi4(Package): +class Psi4(CMakePackage): """Psi4 is an open-source suite of ab initio quantum chemistry programs designed for efficient, high-accuracy simulations of a variety of molecular properties.""" @@ -36,20 +36,16 @@ class Psi4(Package): version('0.5', '53041b8a9be3958384171d0d22f9fdd0') + variant('build_type', default='Release', + description='The build type to build', + values=('Debug', 'Release')) + # Required dependencies depends_on('blas') depends_on('lapack') - depends_on('boost' - '+chrono' - '+filesystem' - '+python' - '+regex' - '+serialization' - '+system' - '+timer' - '+thread') + depends_on('boost+chrono+filesystem+python+regex+serialization+system+timer+thread') depends_on('python') - depends_on('cmake', type='build') + depends_on('cmake@3.3:', type='build') depends_on('py-numpy', type=('build', 'run')) # Optional dependencies @@ -59,8 +55,10 @@ class Psi4(Package): # depends_on('pcm-solver') # depends_on('chemps2') - def install(self, spec, prefix): - cmake_args = [ + def cmake_args(self): + spec = self.spec + + return [ '-DBLAS_TYPE={0}'.format(spec['blas'].name.upper()), '-DBLAS_LIBRARIES={0}'.format(spec['blas'].libs.joined()), '-DLAPACK_TYPE={0}'.format(spec['lapack'].name.upper()), @@ -71,16 +69,7 @@ class Psi4(Package): '-DENABLE_CHEMPS2=OFF' ] - cmake_args.extend(std_cmake_args) - - with working_dir('spack-build', create=True): - cmake('..', *cmake_args) - - make() - make('install') - - self.filter_compilers(spec, prefix) - + @run_after('install') def filter_compilers(self, spec, prefix): """Run after install to tell the configuration files to use the compilers that Spack built the package with. diff --git a/var/spack/repos/builtin/packages/raja/package.py b/var/spack/repos/builtin/packages/raja/package.py index b01f9570fe..0fba029cab 100644 --- a/var/spack/repos/builtin/packages/raja/package.py +++ b/var/spack/repos/builtin/packages/raja/package.py @@ -25,14 +25,10 @@ from spack import * -class Raja(Package): +class Raja(CMakePackage): """RAJA Parallel Framework.""" homepage = "http://software.llnl.gov/RAJA/" version('git', git='https://github.com/LLNL/RAJA.git', branch="master") - def install(self, spec, prefix): - with working_dir('build', create=True): - cmake('..', *std_cmake_args) - make() - make('install') + depends_on('cmake@3.3:', type='build') diff --git a/var/spack/repos/builtin/packages/ravel/package.py b/var/spack/repos/builtin/packages/ravel/package.py index 5875312a7b..e7ba7abb4a 100644 --- a/var/spack/repos/builtin/packages/ravel/package.py +++ b/var/spack/repos/builtin/packages/ravel/package.py @@ -25,7 +25,7 @@ from spack import * -class Ravel(Package): +class Ravel(CMakePackage): """Ravel is a parallel communication trace visualization tool that orders events according to logical time.""" @@ -41,7 +41,5 @@ class Ravel(Package): depends_on('otf2') depends_on('qt@5:') - def install(self, spec, prefix): - cmake('-Wno-dev', *std_cmake_args) - make() - make("install") + def cmake_args(self): + return ['-Wno-dev'] diff --git a/var/spack/repos/builtin/packages/sdl2/package.py b/var/spack/repos/builtin/packages/sdl2/package.py index e841cd4da4..bb7f46d036 100644 --- a/var/spack/repos/builtin/packages/sdl2/package.py +++ b/var/spack/repos/builtin/packages/sdl2/package.py @@ -25,7 +25,7 @@ from spack import * -class Sdl2(Package): +class Sdl2(CMakePackage): """Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D.""" @@ -35,11 +35,4 @@ class Sdl2(Package): version('2.0.5', 'd4055424d556b4a908aa76fad63abd3c') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('..', *std_cmake_args) - - make() - make('install') + depends_on('cmake@2.8.5:', type='build') diff --git a/var/spack/repos/builtin/packages/sympol/package.py b/var/spack/repos/builtin/packages/sympol/package.py index 6385bd09da..3e129e68eb 100644 --- a/var/spack/repos/builtin/packages/sympol/package.py +++ b/var/spack/repos/builtin/packages/sympol/package.py @@ -26,14 +26,14 @@ from spack import * -class Sympol(Package): +class Sympol(CMakePackage): """SymPol is a C++ tool to work with symmetric polyhedra""" homepage = "http://www.math.uni-rostock.de/~rehn/software/sympol.html" url = "http://www.math.uni-rostock.de/~rehn/software/sympol-0.1.8.tar.gz" version('0.1.8', '7cba1997f8532c754cb7259bf70caacb') - depends_on("cmake", type='build') + depends_on("cmake@2.6:", type="build") depends_on("bliss") depends_on("boost") @@ -41,8 +41,3 @@ class Sympol(Package): depends_on("lrslib") patch("lrs_mp_close.patch") - - def install(self, spec, prefix): - cmake(".", *std_cmake_args) - make() - make("install") diff --git a/var/spack/repos/builtin/packages/task/package.py b/var/spack/repos/builtin/packages/task/package.py index ac34bedd93..11cc280a9a 100644 --- a/var/spack/repos/builtin/packages/task/package.py +++ b/var/spack/repos/builtin/packages/task/package.py @@ -25,22 +25,15 @@ from spack import * -class Task(Package): +class Task(CMakePackage): """Feature-rich console based todo list manager""" homepage = "http://www.taskwarrior.org" url = "http://taskwarrior.org/download/task-2.4.4.tar.gz" version('2.4.4', '517450c4a23a5842df3e9905b38801b3') - depends_on('cmake', type='build') - depends_on("gnutls") - depends_on("libuuid") - # depends_on("gcc@4.8:") + depends_on('cmake@2.8:', type='build') + depends_on('gnutls') + depends_on('libuuid') - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('-DCMAKE_BUILD_TYPE=release', - '..', - *std_cmake_args) - make() - make("install") + conflicts('%gcc@:4.7') diff --git a/var/spack/repos/builtin/packages/taskd/package.py b/var/spack/repos/builtin/packages/taskd/package.py index b14a507424..9a9e250011 100644 --- a/var/spack/repos/builtin/packages/taskd/package.py +++ b/var/spack/repos/builtin/packages/taskd/package.py @@ -25,7 +25,7 @@ from spack import * -class Taskd(Package): +class Taskd(CMakePackage): """TaskWarrior task synchronization daemon""" homepage = "http://www.taskwarrior.org" @@ -33,14 +33,8 @@ class Taskd(Package): version('1.1.0', 'ac855828c16f199bdbc45fbc227388d0') - depends_on('cmake', type='build') - depends_on("libuuid") - depends_on("gnutls") + depends_on('libuuid') + depends_on('gnutls') + depends_on('cmake@2.8:', type='build') - def install(self, spec, prefix): - with working_dir('spack-build', create=True): - cmake('-DCMAKE_BUILD_TYPE=release', - '..', - *std_cmake_args) - make() - make("install") + conflicts('%gcc@:4.7') diff --git a/var/spack/repos/builtin/packages/tethex/package.py b/var/spack/repos/builtin/packages/tethex/package.py index d5d4ba891b..9429678661 100644 --- a/var/spack/repos/builtin/packages/tethex/package.py +++ b/var/spack/repos/builtin/packages/tethex/package.py @@ -25,7 +25,7 @@ from spack import * -class Tethex(Package): +class Tethex(CMakePackage): """Tethex is designed to convert triangular (in 2D) or tetrahedral (in 3D) Gmsh's mesh to quadrilateral or hexahedral one respectively. These meshes can be used in software packages working with hexahedrals only - for @@ -38,12 +38,13 @@ class Tethex(Package): version('0.0.7', '6c9e4a18a6637deb4400c6d77ec03184') version('develop', git='https://github.com/martemyev/tethex.git') - depends_on('cmake', type='build') + variant('build_type', default='Release', + description='The build type to build', + values=('Debug', 'Release')) - def install(self, spec, prefix): - cmake('.') - make() + depends_on('cmake@2.8:', type='build') + def install(self, spec, prefix): # install by hand mkdirp(prefix.bin) install('tethex', prefix.bin) diff --git a/var/spack/repos/builtin/packages/visit/package.py b/var/spack/repos/builtin/packages/visit/package.py index 17efe0eb80..2c08c73a3c 100644 --- a/var/spack/repos/builtin/packages/visit/package.py +++ b/var/spack/repos/builtin/packages/visit/package.py @@ -25,7 +25,7 @@ from spack import * -class Visit(Package): +class Visit(CMakePackage): """VisIt is an Open Source, interactive, scalable, visualization, animation and analysis tool.""" homepage = "https://wci.llnl.gov/simulation/computer-codes/visit/" @@ -36,29 +36,26 @@ class Visit(Package): version('2.10.2', '253de0837a9d69fb689befc98ea4d068') version('2.10.1', '3cbca162fdb0249f17c4456605c4211e') - depends_on('cmake', type='build') + depends_on('cmake@3.0:', type='build') depends_on('vtk@6.1.0~opengl2') depends_on('qt@4.8.6') depends_on('python') depends_on('silo+shared') depends_on('hdf5~mpi') - def install(self, spec, prefix): - qt_bin = spec['qt'].prefix.bin + root_cmakelists_dir = 'src' - with working_dir('spack-build', create=True): - cmake_args = std_cmake_args[:] - cmake_args.extend([ - '-DVTK_MAJOR_VERSION=6', - '-DVTK_MINOR_VERSION=1', - '-DVISIT_USE_GLEW=OFF', - '-DVISIT_LOC_QMAKE_EXE:FILEPATH={0}/qmake-qt4'.format(qt_bin), - '-DPYTHON_DIR:PATH={0}'.format(spec['python'].home), - '-DVISIT_SILO_DIR:PATH={0}'.format(spec['silo'].prefix), - '-DVISIT_HDF5_DIR:PATH={0}'.format(spec['hdf5'].prefix), - '-DVISIT_VTK_DIR:PATH={0}'.format(spec['vtk'].prefix), - ]) + def cmake_args(self): + spec = self.spec + qt_bin = spec['qt'].prefix.bin - cmake(join_path('..', 'src'), *cmake_args) - make() - make('install') + return [ + '-DVTK_MAJOR_VERSION={0}'.format(spec['vtk'].version[0]), + '-DVTK_MINOR_VERSION={0}'.format(spec['vtk'].version[1]), + '-DVISIT_USE_GLEW=OFF', + '-DVISIT_LOC_QMAKE_EXE:FILEPATH={0}/qmake-qt4'.format(qt_bin), + '-DPYTHON_DIR:PATH={0}'.format(spec['python'].home), + '-DVISIT_SILO_DIR:PATH={0}'.format(spec['silo'].prefix), + '-DVISIT_HDF5_DIR:PATH={0}'.format(spec['hdf5'].prefix), + '-DVISIT_VTK_DIR:PATH={0}'.format(spec['vtk'].prefix), + ] diff --git a/var/spack/repos/builtin/packages/xrootd/package.py b/var/spack/repos/builtin/packages/xrootd/package.py index d377c68968..6388c006a7 100644 --- a/var/spack/repos/builtin/packages/xrootd/package.py +++ b/var/spack/repos/builtin/packages/xrootd/package.py @@ -26,7 +26,7 @@ from spack import * -class Xrootd(Package): +class Xrootd(CMakePackage): """The XROOTD project aims at giving high performance, scalable fault tolerant access to data repositories of many kinds.""" homepage = "http://xrootd.org" @@ -38,19 +38,4 @@ class Xrootd(Package): version('4.4.0', '58f55e56801d3661d753ff5fd33dbcc9') version('4.3.0', '39c2fab9f632f35e12ff607ccaf9e16c') - depends_on('cmake', type='build') - - def install(self, spec, prefix): - options = [] - options.extend(std_cmake_args) - - build_directory = join_path(self.stage.path, 'spack-build') - source_directory = self.stage.source_path - - if '+debug' in spec: - options.append('-DCMAKE_BUILD_TYPE:STRING=Debug') - - with working_dir(build_directory, create=True): - cmake(source_directory, *options) - make() - make("install") + depends_on('cmake@2.6:', type='build') -- cgit v1.2.3-70-g09d2 From a31ce17f0b08f2ca5eb9e14b571a8de2db69ab5b Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 5 Aug 2017 10:15:47 -0500 Subject: Various fixes to package name URL parsing (#4978) --- lib/spack/spack/cmd/url.py | 2 ++ lib/spack/spack/test/url_parse.py | 2 ++ lib/spack/spack/url.py | 1 + 3 files changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py index 49c29ff469..633e345640 100644 --- a/lib/spack/spack/cmd/url.py +++ b/lib/spack/spack/cmd/url.py @@ -334,6 +334,8 @@ def name_parsed_correctly(pkg, name): pkg_name = pkg_name[2:] elif pkg_name.startswith('py-'): pkg_name = pkg_name[3:] + elif pkg_name.startswith('perl-'): + pkg_name = pkg_name[5:] elif pkg_name.startswith('octave-'): pkg_name = pkg_name[7:] diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 41a2fda649..5749ff2d6e 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -124,6 +124,8 @@ def test_url_strip_version_suffixes(url, expected): ('converge_install_2.3.16', '2.3.16', 'converge'), # Download type - src ('jpegsrc.v9b', '9b', 'jpeg'), + # Download type - archive + ('coinhsl-archive-2014.01.17', '2014.01.17', 'coinhsl'), # Download type - std ('ghostscript-fonts-std-8.11', '8.11', 'ghostscript-fonts'), # Download version - release diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index e3da753a76..67a58cdd12 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -290,6 +290,7 @@ def strip_name_suffixes(path, version): 'install', 'src', '(open)?[Ss]ources?', + '[._-]archive', '[._-]std', # Download version -- cgit v1.2.3-70-g09d2 From 5a94cee216d071b6232772b7db8adfdda89f8feb Mon Sep 17 00:00:00 2001 From: scheibelp Date: Mon, 7 Aug 2017 10:48:48 -0700 Subject: Variant satisfaction for indirect dependencies Fixes #4898 Constraints that were supposed to be conditionally activated for specified values of a single-valued variant were being activated unconditionally in the case that the variant was associated with an implicit dependency. For example if X->Y->Z and Y places a conditional constraint on Z for a given single-valued variant on Y, then it would have been applied unconditionally when concretizing X. --- lib/spack/spack/spec.py | 1 + lib/spack/spack/test/cmd/dependents.py | 3 +- lib/spack/spack/test/spec_semantics.py | 14 ++++++++ var/spack/repos/builtin.mock/packages/a/package.py | 1 + .../packages/multivalue_variant/package.py | 2 ++ .../singlevalue-variant-dependent/package.py | 39 ++++++++++++++++++++++ 6 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index cbbd48d9fa..32e08d3896 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1879,6 +1879,7 @@ class Spec(object): pkg = spack.repo.get(self.fullname) conditions = pkg.dependencies[name] + substitute_abstract_variants(self) # evaluate when specs to figure out constraints on the dependency. dep = None for when_spec, dep_spec in conditions.items(): diff --git a/lib/spack/spack/test/cmd/dependents.py b/lib/spack/spack/test/cmd/dependents.py index 69f57d88a3..546d6d48c9 100644 --- a/lib/spack/spack/test/cmd/dependents.py +++ b/lib/spack/spack/test/cmd/dependents.py @@ -42,7 +42,8 @@ def test_transitive_dependents(builtin_mock): out, err = dependents('--transitive', 'libelf') actual = set(re.split(r'\s+', out.strip())) assert actual == set( - ['callpath', 'dyninst', 'libdwarf', 'mpileaks', 'multivalue_variant']) + ['callpath', 'dyninst', 'libdwarf', 'mpileaks', 'multivalue_variant', + 'singlevalue-variant-dependent']) def test_immediate_installed_dependents(builtin_mock, database): diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 1623133ef3..4ed7c635e9 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -307,6 +307,20 @@ class TestSpecSematics(object): # Check that conditional dependencies are treated correctly assert '^b' in a + def test_unsatisfied_single_valued_variant(self): + a = Spec('a foobar=baz') + a.concretize() + assert '^b' not in a + + mv = Spec('multivalue_variant') + mv.concretize() + assert 'a@1.0' not in mv + + def test_indirect_unsatisfied_single_valued_variant(self): + spec = Spec('singlevalue-variant-dependent') + spec.concretize() + assert 'a@1.0' not in spec + def test_unsatisfiable_multi_value_variant(self): # Semantics for a multi-valued variant is different diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index e2fa6c35b0..037b322f10 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -32,6 +32,7 @@ class A(AutotoolsPackage): url = "http://www.example.com/a-1.0.tar.gz" version('1.0', '0123456789abcdef0123456789abcdef') + version('2.0', '2.0_a_hash') variant( 'foo', diff --git a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py index f20bf7c369..946b9893d8 100644 --- a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py +++ b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py @@ -52,6 +52,8 @@ class MultivalueVariant(Package): depends_on('mpi') depends_on('callpath') + depends_on('a') + depends_on('a@1.0', when='fee=barbaz') def install(self, spec, prefix): pass diff --git a/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py b/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py new file mode 100644 index 0000000000..c6630927c7 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py @@ -0,0 +1,39 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 SinglevalueVariantDependent(Package): + """Simple package with one optional dependency""" + + homepage = "http://www.example.com" + url = "http://www.example.com/archive-1.0.tar.gz" + + version('1.0', '0123456789abcdef0123456789abcdef') + + depends_on('multivalue_variant fee=baz') + + def install(self, spec, prefix): + pass -- cgit v1.2.3-70-g09d2 From e463461ed1934c30e71756e6dbfade90d95b56be Mon Sep 17 00:00:00 2001 From: Sergey Kosukhin Date: Wed, 9 Aug 2017 18:00:34 +0200 Subject: Bugfixes for compiler detection on the Cray platform. (#3075) * Typo fixes in docstrings. * Let OS classes know if the paths they get were explicitly specified by user. * Fixed regexp for cray compiler version matching. * Replaced LinuxDistro with CrayFrontend for the Cray platform's frontend. --- lib/spack/spack/architecture.py | 2 +- lib/spack/spack/cmd/compiler.py | 3 - lib/spack/spack/compilers/__init__.py | 2 +- lib/spack/spack/compilers/cce.py | 2 +- lib/spack/spack/operating_systems/cray_frontend.py | 76 ++++++++++++++++++++++ lib/spack/spack/platforms/cray.py | 4 +- 6 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 lib/spack/spack/operating_systems/cray_frontend.py (limited to 'lib') diff --git a/lib/spack/spack/architecture.py b/lib/spack/spack/architecture.py index 487948dd4e..27092fb344 100644 --- a/lib/spack/spack/architecture.py +++ b/lib/spack/spack/architecture.py @@ -254,7 +254,7 @@ class OperatingSystem(object): def find_compilers(self, *paths): """ - Return a list of compilers found in the suppied paths. + Return a list of compilers found in the supplied paths. This invokes the find() method for each Compiler class, and appends the compilers detected to a list. """ diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index d5aa25ee8e..356161d3b3 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -36,7 +36,6 @@ from llnl.util.lang import index_by from llnl.util.tty.colify import colify from llnl.util.tty.color import colorize from spack.spec import CompilerSpec, ArchSpec -from spack.util.environment import get_path description = "manage compilers" section = "system" @@ -89,8 +88,6 @@ def compiler_find(args): """ paths = args.add_paths - if not paths: - paths = get_path('PATH') # Don't initialize compilers config via compilers.get_compiler_config. # Just let compiler_find do the diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 53b2572ab9..517a0bd5e8 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -182,7 +182,7 @@ def all_compiler_specs(scope=None, init_config=True): def find_compilers(*paths): - """Return a list of compilers found in the suppied paths. + """Return a list of compilers found in the supplied paths. This invokes the find_compilers() method for each operating system associated with the host platform, and appends the compilers detected to a list. diff --git a/lib/spack/spack/compilers/cce.py b/lib/spack/spack/compilers/cce.py index 936614efac..2a5858f4e8 100644 --- a/lib/spack/spack/compilers/cce.py +++ b/lib/spack/spack/compilers/cce.py @@ -52,7 +52,7 @@ class Cce(Compiler): @classmethod def default_version(cls, comp): - return get_compiler_version(comp, '-V', r'[Vv]ersion.*(\d+(\.\d+)+)') + return get_compiler_version(comp, '-V', r'[Vv]ersion.*?(\d+(\.\d+)+)') @property def openmp_flag(self): diff --git a/lib/spack/spack/operating_systems/cray_frontend.py b/lib/spack/spack/operating_systems/cray_frontend.py new file mode 100644 index 0000000000..bf3b76faf2 --- /dev/null +++ b/lib/spack/spack/operating_systems/cray_frontend.py @@ -0,0 +1,76 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import os + +from spack.operating_systems.linux_distro import LinuxDistro +from spack.util.module_cmd import get_module_cmd + + +class CrayFrontend(LinuxDistro): + """Represents OS that runs on login and service nodes of the Cray platform. + It acts as a regular Linux without Cray-specific modules and compiler + wrappers.""" + + def find_compilers(self, *paths): + """Calls the overridden method but prevents it from detecting Cray + compiler wrappers to avoid possible false detections. The detected + compilers come into play only if a user decides to work with the Cray's + frontend OS as if it was a regular Linux environment.""" + + env_bu = None + + # We rely on the fact that the PrgEnv-* modules set the PE_ENV + # environment variable. + if 'PE_ENV' in os.environ: + # Copy environment variables to restore them after the compiler + # detection. We expect that the only thing PrgEnv-* modules do is + # the environment variables modifications. + env_bu = os.environ.copy() + + # Get the name of the module from the environment variable. + prg_env = 'PrgEnv-' + os.environ['PE_ENV'].lower() + + # Unload the PrgEnv-* module. By doing this we intentionally + # provoke errors when the Cray's compiler wrappers are executed + # (Error: A PrgEnv-* modulefile must be loaded.) so they will not + # be detected as valid compilers by the overridden method. We also + # expect that the modules that add the actual compilers' binaries + # into the PATH environment variable (i.e. the following modules: + # 'intel', 'cce', 'gcc', etc.) will also be unloaded since they are + # specified as prerequisites in the PrgEnv-* modulefiles. + modulecmd = get_module_cmd() + exec (compile( + modulecmd('unload', prg_env, output=str, error=os.devnull), + '', 'exec')) + + # Call the overridden method. + clist = super(CrayFrontend, self).find_compilers(*paths) + + # Restore the environment. + if env_bu is not None: + os.environ.clear() + os.environ.update(env_bu) + + return clist diff --git a/lib/spack/spack/platforms/cray.py b/lib/spack/spack/platforms/cray.py index 9a7301d1f8..411eb32b1c 100644 --- a/lib/spack/spack/platforms/cray.py +++ b/lib/spack/spack/platforms/cray.py @@ -28,7 +28,7 @@ import llnl.util.tty as tty from spack import build_env_path from spack.util.executable import which from spack.architecture import Platform, Target, NoPlatformError -from spack.operating_systems.linux_distro import LinuxDistro +from spack.operating_systems.cray_frontend import CrayFrontend from spack.operating_systems.cnl import Cnl from llnl.util.filesystem import join_path from spack.util.module_cmd import get_module_cmd @@ -88,7 +88,7 @@ class Cray(Platform): else: raise NoPlatformError() - front_distro = LinuxDistro() + front_distro = CrayFrontend() back_distro = Cnl() self.default_os = str(back_distro) -- cgit v1.2.3-70-g09d2 From faeb1b77b2a5c5188b0d765c337c342dc2b8fd35 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 9 Aug 2017 19:02:38 +0200 Subject: Merged 'purge' command with 'clean' and deleted 'purge' (#4970) * Merged 'purge' command with 'clean'. Deleted 'purge'. fixes #2942 'spack purge' has been merged with 'spack clean'. Documentation has been updated accordingly. The 'clean' and 'purge' behavior are not mutually exclusive, and they log brief information to tty while they go. * Fixed a wrong reference to spack clean in the docs * Added tests for 'spack clean'. Updated bash completion. --- lib/spack/docs/config_yaml.rst | 10 +++--- lib/spack/docs/mirrors.rst | 2 +- lib/spack/docs/packaging_guide.rst | 21 ++++-------- lib/spack/spack/cmd/clean.py | 57 +++++++++++++++++++++++++++----- lib/spack/spack/cmd/purge.py | 60 --------------------------------- lib/spack/spack/test/cmd/clean.py | 68 ++++++++++++++++++++++++++++++++++++++ share/spack/spack-completion.bash | 8 ++--- 7 files changed, 131 insertions(+), 95 deletions(-) delete mode 100644 lib/spack/spack/cmd/purge.py create mode 100644 lib/spack/spack/test/cmd/clean.py (limited to 'lib') diff --git a/lib/spack/docs/config_yaml.rst b/lib/spack/docs/config_yaml.rst index 28b258c2e5..1c51db1b96 100644 --- a/lib/spack/docs/config_yaml.rst +++ b/lib/spack/docs/config_yaml.rst @@ -126,8 +126,8 @@ When Spack builds a package, it creates a temporary directory within the After a package is successfully installed, Spack deletes the temporary directory it used to build. Unsuccessful builds are not deleted, but you -can manually purge them with :ref:`spack purge --stage -`. +can manually purge them with :ref:`spack clean --stage +`. .. note:: @@ -142,8 +142,8 @@ can manually purge them with :ref:`spack purge --stage Location to cache downloaded tarballs and repositories. By default these are stored in ``$spack/var/spack/cache``. These are stored indefinitely -by default. Can be purged with :ref:`spack purge --downloads -`. +by default. Can be purged with :ref:`spack clean --downloads +`. -------------------- ``misc_cache`` @@ -151,7 +151,7 @@ by default. Can be purged with :ref:`spack purge --downloads Temporary directory to store long-lived cache files, such as indices of packages available in repositories. Defaults to ``~/.spack/cache``. Can -be purged with :ref:`spack purge --misc-cache `. +be purged with :ref:`spack clean --misc-cache `. -------------------- ``verify_ssl`` diff --git a/lib/spack/docs/mirrors.rst b/lib/spack/docs/mirrors.rst index c69496066f..8f4eea1f8c 100644 --- a/lib/spack/docs/mirrors.rst +++ b/lib/spack/docs/mirrors.rst @@ -237,7 +237,7 @@ as other Spack mirrors (so it can be copied anywhere and referenced with a URL like other mirrors). The mirror is maintained locally (within the Spack installation directory) at :file:`var/spack/cache/`. It is always enabled (and is always searched first when attempting to retrieve files for an installation) -but can be cleared with :ref:`purge `; the cache directory can also +but can be cleared with :ref:`clean `; the cache directory can also be deleted manually without issue. Caching includes retrieved tarball archives and source control repositories, but diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index af3f7b408a..7e789bc294 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -3432,24 +3432,12 @@ Does this in one of two ways: ``spack clean`` ^^^^^^^^^^^^^^^ -Cleans up temporary files for a particular package, by deleting the -expanded/checked out source code *and* any downloaded archive. If -``fetch``, ``stage``, or ``install`` are run again after this, Spack's -build process will start from scratch. - -.. _cmd-spack-purge: - -^^^^^^^^^^^^^^^ -``spack purge`` -^^^^^^^^^^^^^^^ - Cleans up all of Spack's temporary and cached files. This can be used to recover disk space if temporary files from interrupted or failed installs accumulate in the staging area. When called with ``--stage`` or without arguments this removes all staged -files and will be equivalent to running ``spack clean`` for every package -you have fetched or staged. +files. When called with ``--downloads`` this will clear all resources :ref:`cached ` during installs. @@ -3459,6 +3447,11 @@ directory, including cached virtual indices. To remove all of the above, the command can be called with ``--all``. +When called with positional arguments, cleans up temporary files only +for a particular package. If ``fetch``, ``stage``, or ``install`` +are run again after this, Spack's build process will start from scratch. + + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Keeping the stage directory on success ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -3472,7 +3465,7 @@ package has been successfully built and installed. Use $ spack install --keep-stage This allows you to inspect the build directory and potentially debug -the build. You can use ``purge`` or ``clean`` later to get rid of the +the build. You can use ``clean`` later to get rid of the unwanted temporary files. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py index b7812bffc4..634e20b4e4 100644 --- a/lib/spack/spack/cmd/clean.py +++ b/lib/spack/spack/cmd/clean.py @@ -29,21 +29,60 @@ import llnl.util.tty as tty import spack import spack.cmd -description = "remove build stage and source tarball for packages" +description = "remove temporary build files and/or downloaded archives" section = "build" level = "long" +class AllClean(argparse.Action): + """Activates flags -s -d and -m simultaneously""" + def __call__(self, parser, namespace, values, option_string=None): + parser.parse_args(['-sdm'], namespace=namespace) + + def setup_parser(subparser): - subparser.add_argument('packages', nargs=argparse.REMAINDER, - help="specs of packages to clean") + subparser.add_argument( + '-s', '--stage', action='store_true', + help="remove all temporary build stages (default)") + subparser.add_argument( + '-d', '--downloads', action='store_true', + help="remove cached downloads") + subparser.add_argument( + '-m', '--misc-cache', action='store_true', + help="remove long-lived caches, like the virtual package index") + subparser.add_argument( + '-a', '--all', action=AllClean, help="equivalent to -sdm", nargs=0 + ) + subparser.add_argument( + 'specs', + nargs=argparse.REMAINDER, + help="removes the build stages and tarballs for specs" + ) def clean(parser, args): - if not args.packages: - tty.die("spack clean requires at least one package spec.") - specs = spack.cmd.parse_specs(args.packages, concretize=True) - for spec in specs: - package = spack.repo.get(spec) - package.do_clean() + # If nothing was set, activate the default + if not any([args.specs, args.stage, args.downloads, args.misc_cache]): + args.stage = True + + # Then do the cleaning falling through the cases + if args.specs: + specs = spack.cmd.parse_specs(args.specs, concretize=True) + for spec in specs: + msg = 'Cleaning build stage [{0}]' + tty.msg(msg.format(spec.short_spec)) + package = spack.repo.get(spec) + package.do_clean() + + if args.stage: + tty.msg('Removing all temporary build stages') + spack.stage.purge() + + if args.downloads: + tty.msg('Removing cached downloads') + spack.fetch_cache.destroy() + + if args.misc_cache: + tty.msg('Removing cached information on repositories') + spack.misc_cache.destroy() diff --git a/lib/spack/spack/cmd/purge.py b/lib/spack/spack/cmd/purge.py deleted file mode 100644 index ac2aa1c21f..0000000000 --- a/lib/spack/spack/cmd/purge.py +++ /dev/null @@ -1,60 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. -# LLNL-CODE-647188 -# -# For details, see https://github.com/llnl/spack -# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -############################################################################## -import spack -import spack.stage as stage - -description = "remove temporary build files and/or downloaded archives" -section = "admin" -level = "long" - - -def setup_parser(subparser): - subparser.add_argument( - '-s', '--stage', action='store_true', default=True, - help="remove all temporary build stages (default)") - subparser.add_argument( - '-d', '--downloads', action='store_true', - help="remove cached downloads") - subparser.add_argument( - '-m', '--misc-cache', action='store_true', - help="remove long-lived caches, like the virtual package index") - subparser.add_argument( - '-a', '--all', action='store_true', - help="remove all of the above") - - -def purge(parser, args): - # Special case: no flags. - if not any((args.stage, args.downloads, args.misc_cache, args.all)): - stage.purge() - return - - # handle other flags with fall through. - if args.stage or args.all: - stage.purge() - if args.downloads or args.all: - spack.fetch_cache.destroy() - if args.misc_cache or args.all: - spack.misc_cache.destroy() diff --git a/lib/spack/spack/test/cmd/clean.py b/lib/spack/spack/test/cmd/clean.py new file mode 100644 index 0000000000..a905cd9e1e --- /dev/null +++ b/lib/spack/spack/test/cmd/clean.py @@ -0,0 +1,68 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import pytest +import spack +import spack.main +import spack.package + +clean = spack.main.SpackCommand('clean') + + +@pytest.fixture() +def mock_calls_for_clean(monkeypatch): + + class Counter(object): + def __init__(self): + self.call_count = 0 + + def __call__(self, *args, **kwargs): + self.call_count += 1 + + monkeypatch.setattr(spack.package.PackageBase, 'do_clean', Counter()) + monkeypatch.setattr(spack.stage, 'purge', Counter()) + monkeypatch.setattr(spack.fetch_cache, 'destroy', Counter(), raising=False) + monkeypatch.setattr(spack.misc_cache, 'destroy', Counter()) + + +@pytest.mark.usefixtures( + 'builtin_mock', 'config', 'mock_calls_for_clean' +) +@pytest.mark.parametrize('command_line,counters', [ + ('mpileaks', [1, 0, 0, 0]), + ('-s', [0, 1, 0, 0]), + ('-sd', [0, 1, 1, 0]), + ('-a', [0, 1, 1, 1]), +]) +def test_function_calls(command_line, counters): + + # Call the command with the supplied command line + clean(command_line) + + # Assert that we called the expected functions the correct + # number of times + assert spack.package.PackageBase.do_clean.call_count == counters[0] + assert spack.stage.purge.call_count == counters[1] + assert spack.fetch_cache.destroy.call_count == counters[2] + assert spack.misc_cache.destroy.call_count == counters[3] diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index e60d587c18..46070d68cc 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -175,7 +175,8 @@ function _spack_checksum { function _spack_clean { if $list_options then - compgen -W "-h --help" -- "$cur" + compgen -W "-h --help -s --stage -d --downloads + -m --misc-cache -a --all" -- "$cur" else compgen -W "$(_all_packages)" -- "$cur" fi @@ -598,11 +599,6 @@ function _spack_providers { fi } -function _spack_purge { - compgen -W "-h --help -s --stage -d --downloads - -m --misc-cache -a --all" -- "$cur" -} - function _spack_python { if $list_options then -- cgit v1.2.3-70-g09d2 From 79f9548a9ad31a901fae1296e31c6b8d184cdc0e Mon Sep 17 00:00:00 2001 From: becker33 Date: Wed, 9 Aug 2017 12:14:35 -0700 Subject: bugfix for module_cmd (#5038) * bugfix for modulecmd when bash is symlinked to sh * update test to make sure module_cmd can interpret sh --- lib/spack/spack/test/module_parsing.py | 2 +- lib/spack/spack/util/module_cmd.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/module_parsing.py b/lib/spack/spack/test/module_parsing.py index d306915834..e563953478 100644 --- a/lib/spack/spack/test/module_parsing.py +++ b/lib/spack/spack/test/module_parsing.py @@ -112,7 +112,7 @@ def test_get_module_cmd_from_bash_ticks(save_env): def test_get_module_cmd_from_bash_parens(save_env): - os.environ['BASH_FUNC_module()'] = '() { eval $(echo fill bash $*)\n}' + os.environ['BASH_FUNC_module()'] = '() { eval $(echo fill sh $*)\n}' module_cmd = get_module_cmd() module_cmd_list = module_cmd('list', output=str, error=str) diff --git a/lib/spack/spack/util/module_cmd.py b/lib/spack/spack/util/module_cmd.py index 4de3fb051e..87ccd79fd6 100644 --- a/lib/spack/spack/util/module_cmd.py +++ b/lib/spack/spack/util/module_cmd.py @@ -97,7 +97,7 @@ def get_module_cmd_from_bash(bashopts=''): module_cmd = which(args[0]) if module_cmd: for arg in args[1:]: - if arg == 'bash': + if arg in ('bash', 'sh'): module_cmd.add_default_arg('python') break else: -- cgit v1.2.3-70-g09d2 From 41c87a71a8c5a5f09b486f6a79fdd52d4602a158 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Sat, 12 Aug 2017 04:18:52 +0200 Subject: patch: get correct package directory for a given package fixes #4236 fixes #5002 When a package is defined in more than one repository, RepoPath.dirname_for_package_name may return the path to either definition. This sidesteps that ambiguity by accessing the module associated with the package definition. --- lib/spack/spack/patch.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index 78bb15f41c..c970f4dfdc 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -23,16 +23,28 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import os +import os.path +import inspect import spack import spack.error -import spack.stage import spack.fetch_strategy as fs - +import spack.stage from llnl.util.filesystem import join_path from spack.util.executable import which +def absolute_path_for_package(pkg): + """Returns the absolute path to the ``package.py`` file implementing + the recipe for the package passed as argument. + + Args: + pkg: a valid package object + """ + m = inspect.getmodule(pkg) + return os.path.abspath(m.__file__) + + class Patch(object): """Base class to describe a patch that needs to be applied to some expanded source code. @@ -90,7 +102,7 @@ class FilePatch(Patch): def __init__(self, pkg, path_or_url, level): super(FilePatch, self).__init__(pkg, path_or_url, level) - pkg_dir = spack.repo.dirname_for_package_name(pkg.name) + pkg_dir = os.path.dirname(absolute_path_for_package(pkg)) self.path = join_path(pkg_dir, path_or_url) if not os.path.isfile(self.path): raise NoSuchPatchFileError(pkg.name, self.path) -- cgit v1.2.3-70-g09d2 From 4d9ef49b49a5f2e3034e26de535e6744251a10fa Mon Sep 17 00:00:00 2001 From: scheibelp Date: Mon, 14 Aug 2017 11:23:03 -0700 Subject: Decode process stream only for python3 Popen.communicate outputs a str object for python2 and a bytes object for python3. This updates the Executable.__call__ function to call .decode on the output of Popen.communicate only for python3. This ensures that Executable.__call__ returns a str for python2 and python3. --- lib/spack/spack/util/executable.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 584e224db7..5fd40790ed 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -26,6 +26,7 @@ import os import re import subprocess from six import string_types +import sys import llnl.util.tty as tty import spack @@ -184,9 +185,9 @@ class Executable(object): if output is str or error is str: result = '' if output is str: - result += out.decode('utf-8') + result += to_str(out) if error is str: - result += err.decode('utf-8') + result += to_str(err) return result except OSError as e: @@ -223,6 +224,20 @@ class Executable(object): return ' '.join(self.exe) +def to_str(content): + """Produce a str type from the content of a process stream obtained with + Popen.communicate. + """ + # Prior to python3, Popen.communicate returns a str type. For python3 it + # returns a bytes type. In the case of python3 we decode the + # byte string to produce a str type. This will generate junk if the + # encoding is not UTF-8 (which includes ASCII). + if sys.version_info < (3, 0, 0): + return content + else: + return content.decode('utf-8') + + def which(*args, **kwargs): """Finds an executable in the path like command-line which. -- cgit v1.2.3-70-g09d2 From 5184edb15f2cf260d561d8fcb7bf56ad147b6555 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 14 Aug 2017 20:29:18 +0200 Subject: Added a custom action for --clean and --dirty. (#5081) The action `CleanOrDirtyAction` has been added. It sets the default value for `dest` to `spack.dirty`, and changes it according to the flags passed via command line. Added unit tests to check that the arguments are parsed correctly. Removed lines in `PackageBase` that were setting the default value of dirty according to what was in the configuration. --- lib/spack/spack/cmd/common/arguments.py | 33 +++++++++++++++++++++++++++++---- lib/spack/spack/package.py | 4 ---- lib/spack/spack/test/cmd/install.py | 24 +++++++++++++++++++++++- 3 files changed, 52 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index 46ff44c84a..d1b0418770 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -74,6 +74,23 @@ class ConstraintAction(argparse.Action): return sorted(specs) +class CleanOrDirtyAction(argparse.Action): + """Sets the dirty flag in the current namespace""" + + def __init__(self, *args, **kwargs): + kwargs['default'] = spack.dirty + super(CleanOrDirtyAction, self).__init__(*args, **kwargs) + + def __call__(self, parser, namespace, values, option_string=None): + if option_string == '--clean': + setattr(namespace, self.dest, False) + elif option_string == '--dirty': + setattr(namespace, self.dest, True) + else: + msg = 'expected "--dirty" or "--clean" [got {0} instead]' + raise argparse.ArgumentError(msg.format(option_string)) + + _arguments['constraint'] = Args( 'constraint', nargs=argparse.REMAINDER, action=ConstraintAction, help='constraint to select a subset of installed packages') @@ -93,12 +110,20 @@ _arguments['recurse_dependencies'] = Args( help='recursively traverse spec dependencies') _arguments['clean'] = Args( - '--clean', action='store_false', dest='dirty', - help='clean environment before installing package') + '--clean', + action=CleanOrDirtyAction, + dest='dirty', + help='clean environment before installing package', + nargs=0 +) _arguments['dirty'] = Args( - '--dirty', action='store_true', dest='dirty', - help='do NOT clean environment before installing') + '--dirty', + action=CleanOrDirtyAction, + dest='dirty', + help='do NOT clean environment before installing', + nargs=0 +) _arguments['long'] = Args( '-l', '--long', action='store_true', diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index e8e741fefa..86df0ec947 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1218,10 +1218,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): rec = spack.store.db.get_record(self.spec) return self._update_explicit_entry_in_db(rec, explicit) - # Dirty argument takes precedence over dirty config setting. - if dirty is None: - dirty = spack.dirty - self._do_install_pop_kwargs(kwargs) # First, install dependencies recursively. diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 951d9d85d7..5886d602a2 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -22,12 +22,24 @@ # 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.main import SpackCommand +import argparse + +import pytest +import spack.cmd.install +from spack.main import SpackCommand install = SpackCommand('install') +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the module command""" + parser = argparse.ArgumentParser() + spack.cmd.install.setup_parser(parser) + return parser + + def _install_package_and_dependency( tmpdir, builtin_mock, mock_archive, mock_fetch, config, install_mockery): @@ -64,3 +76,13 @@ def test_install_package_already_installed( skipped = [line for line in content.split('\n') if 'skipped' in line] assert len(skipped) == 2 + + +@pytest.mark.parametrize('arguments,expected', [ + ([], spack.dirty), # The default read from configuration file + (['--clean'], False), + (['--dirty'], True), +]) +def test_install_dirty_flag(parser, arguments, expected): + args = parser.parse_args(arguments) + assert args.dirty == expected -- cgit v1.2.3-70-g09d2 From ab56c742ca1768fef484a02bfb542d6df449c1f6 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Mon, 14 Aug 2017 16:32:27 -0500 Subject: Create, install and relocate tarballs of installed packages Adds the "buildcache" command to spack. The buildcache command is used to create gpg signatures for archives of installed spack packages; the signatures and archives are placed together in a directory that can be added to a spack mirror. A user can retrieve the archives from a mirror and verify their integrity using the buildcache command. It is often the case that the user's Spack instance is located in a different path compared to the Spack instance used to generate the package archive and signature, so this includes logic to relocate the RPATHs generated by Spack. --- lib/spack/docs/binary_caches.rst | 108 +++++ lib/spack/docs/index.rst | 1 + lib/spack/spack/binary_distribution.py | 494 +++++++++++++++++++++ lib/spack/spack/cmd/buildcache.py | 230 ++++++++++ lib/spack/spack/relocate.py | 289 ++++++++++++ lib/spack/spack/test/packaging.py | 304 +++++++++++++ .../builtin.mock/packages/patchelf/package.py | 41 ++ 7 files changed, 1467 insertions(+) create mode 100644 lib/spack/docs/binary_caches.rst create mode 100644 lib/spack/spack/binary_distribution.py create mode 100644 lib/spack/spack/cmd/buildcache.py create mode 100644 lib/spack/spack/relocate.py create mode 100644 lib/spack/spack/test/packaging.py create mode 100644 var/spack/repos/builtin.mock/packages/patchelf/package.py (limited to 'lib') diff --git a/lib/spack/docs/binary_caches.rst b/lib/spack/docs/binary_caches.rst new file mode 100644 index 0000000000..d655d2ce58 --- /dev/null +++ b/lib/spack/docs/binary_caches.rst @@ -0,0 +1,108 @@ +.. _binary_caches: + +Build caches +============ + +Some sites may encourage users to set up their own test environments +before carrying out central installations, or some users prefer to set +up these environments on their own motivation. To reduce the load of +recompiling otherwise identical package specs in different installations, +installed packages can be put into build cache tarballs, uploaded to +your spack mirror and then downloaded and installed by others. + + +Creating build cache files +-------------------------- + +A compressed tarball of an installed package is created. Tarballs are created +for all of its link and run dependency packages as well. Compressed tarballs are +signed with gpg and signature and tarball and put in a ".spack" file. Optionally +, the rpaths ( and ids and deps on macOS ) can be changed to paths relative to +the spack install tree before the tarball is created. + +Build caches are created via: + +.. code-block:: sh + + $ spack buildcache create + + +Finding or installing build cache files +--------------------------------------- + +To find build caches or install build caches, a spack mirror must be configured +with + +``spack mirror add ``. + +Build caches are found via: + +.. code-block:: sh + + $ spack buildcache list + +Build caches are installed via: + +.. code-block:: sh + + $ spack buildcache install + + +Relocation +---------- + +Initial build and later installation do not necessarily happen at the same +location. Spack provides a relocation capability and corrects for RPATHs and +non-relocatable scripts. However, many packages compile paths into binary +artificats directly. In such cases, the build instructions of this package would +need to be adjusted for better re-locatability. + + +Usage +----- +spack buildcache create <> +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Create tarball of installed spack package and all dependencies. +Tarballs is checksummed and signed if gpg2 is available. +Places them in a directory build_cache that can be copied to a mirror. +Commands like "spack buildcache install" will search it for pre-compiled packages. + + +options: + +-d : directory in which "build_cache" direcory is created, defaults to "." +-f : overwrite ".spack" file in "build_cache" directory if it exists +-k : the key to sign package with. In the case where multiple keys exist, the package will be unsigned unless -k is used. +-r : make paths in binaries relative before creating tarball +-y : answer yes to all create unsigned "build_cache" questions +<> : list of package specs or package hashes with leading / + +spack buildcache list <> +^^^^^^^^^^^^^^^^^^^^^^^^ +Retrieves all specs for build caches available on a spack mirror. + +options: + +<> string to be matched to matched to begining of listed concretized short +specs, eg. "spack buildcache list gcc" with print only commands to install gcc +package(s) + +spack buildcache install <> +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Retrieves all specs for build caches available on a spack mirror and installs build caches +with specs matching the specs or hashes input. + +options: + +-f : remove install directory if it exists before unpacking tarball +-y : answer yes to all to don't verify package with gpg questions +<> : list of package specs or package hashes with leading / + +spack buildcache keys +^^^^^^^^^^^^^^^^^^^^^ +List public keys available on spack mirror. + +options: + +-i : trust the keys downloaded with prompt for each +-y : answer yes to all trust all keys downloaded diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index f4918b58db..e86ab0ca85 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -65,6 +65,7 @@ or refer to the full manual below. repositories command_index package_list + binary_caches .. toctree:: :maxdepth: 2 diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py new file mode 100644 index 0000000000..e2ae89ac19 --- /dev/null +++ b/lib/spack/spack/binary_distribution.py @@ -0,0 +1,494 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import os +import re +import tarfile +import yaml +import shutil + +import llnl.util.tty as tty +from spack.util.gpg import Gpg +from llnl.util.filesystem import mkdirp, join_path, install_tree +from spack.util.web import spider +import spack.cmd +import spack +from spack.stage import Stage +import spack.fetch_strategy as fs +from contextlib import closing +import spack.util.gpg as gpg_util +import hashlib +from spack.util.executable import ProcessError +import spack.relocate as relocate + + +class NoOverwriteException(Exception): + pass + + +class NoGpgException(Exception): + pass + + +class PickKeyException(Exception): + pass + + +class NoKeyException(Exception): + pass + + +class NoVerifyException(Exception): + pass + + +class NoChecksumException(Exception): + pass + + +def has_gnupg2(): + try: + gpg_util.Gpg.gpg()('--version', output=os.devnull) + return True + except ProcessError: + return False + + +def buildinfo_file_name(prefix): + """ + Filename of the binary package meta-data file + """ + name = prefix + "/.spack/binary_distribution" + return name + + +def read_buildinfo_file(prefix): + """ + Read buildinfo file + """ + filename = buildinfo_file_name(prefix) + with open(filename, 'r') as inputfile: + content = inputfile.read() + buildinfo = yaml.load(content) + return buildinfo + + +def write_buildinfo_file(prefix): + """ + Create a cache file containing information + required for the relocation + """ + text_to_relocate = [] + binary_to_relocate = [] + blacklist = (".spack", "man") + # Do this at during tarball creation to save time when tarball unpacked. + # Used by make_package_relative to determine binaries to change. + for root, dirs, files in os.walk(prefix, topdown=True): + dirs[:] = [d for d in dirs if d not in blacklist] + for filename in files: + path_name = os.path.join(root, filename) + filetype = relocate.get_filetype(path_name) + if relocate.needs_binary_relocation(filetype): + rel_path_name = os.path.relpath(path_name, prefix) + binary_to_relocate.append(rel_path_name) + elif relocate.needs_text_relocation(filetype): + rel_path_name = os.path.relpath(path_name, prefix) + text_to_relocate.append(rel_path_name) + + # Create buildinfo data and write it to disk + buildinfo = {} + buildinfo['buildpath'] = spack.store.layout.root + buildinfo['relocate_textfiles'] = text_to_relocate + buildinfo['relocate_binaries'] = binary_to_relocate + filename = buildinfo_file_name(prefix) + with open(filename, 'w') as outfile: + outfile.write(yaml.dump(buildinfo, default_flow_style=True)) + + +def tarball_directory_name(spec): + """ + Return name of the tarball directory according to the convention + -//-/ + """ + return "%s/%s/%s-%s" % (spack.architecture.sys_type(), + str(spec.compiler).replace("@", "-"), + spec.name, spec.version) + + +def tarball_name(spec, ext): + """ + Return the name of the tarfile according to the convention + --- + """ + return "%s-%s-%s-%s-%s%s" % (spack.architecture.sys_type(), + str(spec.compiler).replace("@", "-"), + spec.name, + spec.version, + spec.dag_hash(), + ext) + + +def tarball_path_name(spec, ext): + """ + Return the full path+name for a given spec according to the convention + / + """ + return os.path.join(tarball_directory_name(spec), + tarball_name(spec, ext)) + + +def checksum_tarball(file): + # calculate sha256 hash of tar file + BLOCKSIZE = 65536 + hasher = hashlib.sha256() + with open(file, 'rb') as tfile: + buf = tfile.read(BLOCKSIZE) + while len(buf) > 0: + hasher.update(buf) + buf = tfile.read(BLOCKSIZE) + return hasher.hexdigest() + + +def sign_tarball(yes_to_all, key, force, specfile_path): + # Sign the packages if keys available + if not has_gnupg2(): + raise NoGpgException() + else: + if key is None: + keys = Gpg.signing_keys() + if len(keys) == 1: + key = keys[0] + if len(keys) > 1: + raise PickKeyException() + if len(keys) == 0: + raise NoKeyException() + if os.path.exists('%s.asc' % specfile_path): + if force: + os.remove('%s.asc' % specfile_path) + else: + raise NoOverwriteException('%s.asc' % specfile_path) + Gpg.sign(key, specfile_path, '%s.asc' % specfile_path) + + +def generate_index(outdir, indexfile_path): + f = open(indexfile_path, 'w') + header = """ + +""" + footer = "" + paths = os.listdir(outdir + '/build_cache') + f.write(header) + for path in paths: + rel = os.path.basename(path) + f.write('
  • ' % (rel, rel)) + f.write(footer) + f.close() + + +def build_tarball(spec, outdir, force=False, rel=False, yes_to_all=False, + key=None): + """ + Build a tarball from given spec and put it into the directory structure + used at the mirror (following ). + """ + # set up some paths + tarfile_name = tarball_name(spec, '.tar.gz') + tarfile_dir = join_path(outdir, "build_cache", + tarball_directory_name(spec)) + tarfile_path = join_path(tarfile_dir, tarfile_name) + mkdirp(tarfile_dir) + spackfile_path = os.path.join( + outdir, "build_cache", tarball_path_name(spec, '.spack')) + if os.path.exists(spackfile_path): + if force: + os.remove(spackfile_path) + else: + raise NoOverwriteException(str(spackfile_path)) + # need to copy the spec file so the build cache can be downloaded + # without concretizing with the current spack packages + # and preferences + spec_file = join_path(spec.prefix, ".spack", "spec.yaml") + specfile_name = tarball_name(spec, '.spec.yaml') + specfile_path = os.path.realpath( + join_path(outdir, "build_cache", specfile_name)) + indexfile_path = join_path(outdir, "build_cache", "index.html") + if os.path.exists(specfile_path): + if force: + os.remove(specfile_path) + else: + raise NoOverwriteException(str(specfile_path)) + # make a copy of the install directory to work with + prefix = join_path(outdir, os.path.basename(spec.prefix)) + if os.path.exists(prefix): + shutil.rmtree(prefix) + install_tree(spec.prefix, prefix) + + # create info for later relocation and create tar + write_buildinfo_file(prefix) + + # optinally make the paths in the binaries relative to each other + # in the spack install tree before creating tarball + if rel: + make_package_relative(prefix) + # create compressed tarball of the install prefix + with closing(tarfile.open(tarfile_path, 'w:gz')) as tar: + tar.add(name='%s' % prefix, + arcname='%s' % os.path.basename(prefix)) + # remove copy of install directory + shutil.rmtree(prefix) + + # get the sha256 checksum of the tarball + checksum = checksum_tarball(tarfile_path) + + # add sha256 checksum to spec.yaml + spec_dict = {} + with open(spec_file, 'r') as inputfile: + content = inputfile.read() + spec_dict = yaml.load(content) + bchecksum = {} + bchecksum['hash_algorithm'] = 'sha256' + bchecksum['hash'] = checksum + spec_dict['binary_cache_checksum'] = bchecksum + with open(specfile_path, 'w') as outfile: + outfile.write(yaml.dump(spec_dict)) + signed = False + if not yes_to_all: + # sign the tarball and spec file with gpg + try: + sign_tarball(yes_to_all, key, force, specfile_path) + signed = True + except NoGpgException: + raise NoGpgException() + except PickKeyException: + raise PickKeyException() + except NoKeyException(): + raise NoKeyException() + # put tarball, spec and signature files in .spack archive + with closing(tarfile.open(spackfile_path, 'w')) as tar: + tar.add(name='%s' % tarfile_path, arcname='%s' % tarfile_name) + tar.add(name='%s' % specfile_path, arcname='%s' % specfile_name) + if signed: + tar.add(name='%s.asc' % specfile_path, + arcname='%s.asc' % specfile_name) + + # cleanup file moved to archive + os.remove(tarfile_path) + if signed: + os.remove('%s.asc' % specfile_path) + + # create an index.html for the build_cache directory so specs can be found + if os.path.exists(indexfile_path): + os.remove(indexfile_path) + generate_index(outdir, indexfile_path) + return None + + +def download_tarball(spec): + """ + Download binary tarball for given package into stage area + Return True if successful + """ + mirrors = spack.config.get_config('mirrors') + if len(mirrors) == 0: + tty.die("Please add a spack mirror to allow " + + "download of pre-compiled packages.") + tarball = tarball_path_name(spec, '.spack') + for key in mirrors: + url = mirrors[key] + "/build_cache/" + tarball + # stage the tarball into standard place + stage = Stage(url, name="build_cache", keep=True) + try: + stage.fetch() + return stage.save_filename + except fs.FetchError: + continue + return None + + +def make_package_relative(prefix): + """ + Change paths in binaries to relative paths + """ + buildinfo = read_buildinfo_file(prefix) + old_path = buildinfo['buildpath'] + for filename in buildinfo['relocate_binaries']: + path_name = os.path.join(prefix, filename) + relocate.make_binary_relative(path_name, old_path) + + +def relocate_package(prefix): + """ + Relocate the given package + """ + buildinfo = read_buildinfo_file(prefix) + new_path = spack.store.layout.root + old_path = buildinfo['buildpath'] + if new_path == old_path: + return + + tty.msg("Relocating package from", + "%s to %s." % (old_path, new_path)) + for filename in buildinfo['relocate_binaries']: + path_name = os.path.join(prefix, filename) + relocate.relocate_binary(path_name, old_path, new_path) + + for filename in buildinfo['relocate_textfiles']: + path_name = os.path.join(prefix, filename) + relocate.relocate_text(path_name, old_path, new_path) + + +def extract_tarball(spec, filename, yes_to_all=False, force=False): + """ + extract binary tarball for given package into install area + """ + installpath = spec.prefix + if os.path.exists(installpath): + if force: + shutil.rmtree(installpath) + else: + raise NoOverwriteException(str(installpath)) + mkdirp(installpath) + stagepath = os.path.dirname(filename) + spackfile_name = tarball_name(spec, '.spack') + spackfile_path = os.path.join(stagepath, spackfile_name) + tarfile_name = tarball_name(spec, '.tar.gz') + tarfile_path = os.path.join(stagepath, tarfile_name) + specfile_name = tarball_name(spec, '.spec.yaml') + specfile_path = os.path.join(stagepath, specfile_name) + + with closing(tarfile.open(spackfile_path, 'r')) as tar: + tar.extractall(stagepath) + + if os.path.exists('%s.asc' % specfile_path): + Gpg.verify('%s.asc' % specfile_path, specfile_path) + os.remove(specfile_path + '.asc') + else: + if not yes_to_all: + raise NoVerifyException() + + # get the sha256 checksum of the tarball + checksum = checksum_tarball(tarfile_path) + + # get the sha256 checksum recorded at creation + spec_dict = {} + with open(specfile_path, 'r') as inputfile: + content = inputfile.read() + spec_dict = yaml.load(content) + bchecksum = spec_dict['binary_cache_checksum'] + + # if the checksums don't match don't install + if bchecksum['hash'] != checksum: + raise NoChecksumException() + + with closing(tarfile.open(tarfile_path, 'r')) as tar: + tar.extractall(path=join_path(installpath, '..')) + + os.remove(tarfile_path) + os.remove(specfile_path) + relocate_package(installpath) + + +def get_specs(): + """ + Get spec.yaml's for build caches available on mirror + """ + mirrors = spack.config.get_config('mirrors') + if len(mirrors) == 0: + tty.die("Please add a spack mirror to allow " + + "download of build caches.") + path = str(spack.architecture.sys_type()) + specs = set() + urls = set() + from collections import defaultdict + durls = defaultdict(list) + for key in mirrors: + url = mirrors[key] + if url.startswith('file'): + mirror = url.replace('file://', '') + '/build_cache' + tty.msg("Finding buildcaches in %s" % mirror) + files = os.listdir(mirror) + for file in files: + if re.search('spec.yaml', file): + link = 'file://' + mirror + '/' + file + urls.add(link) + else: + tty.msg("Finding buildcaches on %s" % url) + p, links = spider(url + "/build_cache") + for link in links: + if re.search("spec.yaml", link) and re.search(path, link): + urls.add(link) + for link in urls: + with Stage(link, name="build_cache", keep=True) as stage: + try: + stage.fetch() + except fs.FetchError: + continue + with open(stage.save_filename, 'r') as f: + spec = spack.spec.Spec.from_yaml(f) + specs.add(spec) + durls[spec].append(link) + return specs, durls + + +def get_keys(install=False, yes_to_all=False): + """ + Get pgp public keys available on mirror + """ + mirrors = spack.config.get_config('mirrors') + if len(mirrors) == 0: + tty.die("Please add a spack mirror to allow " + + "download of build caches.") + + keys = set() + for key in mirrors: + url = mirrors[key] + if url.startswith('file'): + mirror = url.replace('file://', '') + '/build_cache' + tty.msg("Finding public keys in %s" % mirror) + files = os.listdir(mirror) + for file in files: + if re.search('\.key', file): + link = 'file://' + mirror + '/' + file + keys.add(link) + else: + tty.msg("Finding public keys on %s" % url) + p, links = spider(url + "/build_cache", depth=1) + for link in links: + if re.search("\.key", link): + keys.add(link) + for link in keys: + with Stage(link, name="build_cache", keep=True) as stage: + try: + stage.fetch() + except fs.FetchError: + continue + tty.msg('Found key %s' % link) + if install: + if yes_to_all: + Gpg.trust(stage.save_filename) + tty.msg('Added this key to trusted keys.') + else: + tty.msg('Will not add this key to trusted keys.' + 'Use -y to override') diff --git a/lib/spack/spack/cmd/buildcache.py b/lib/spack/spack/cmd/buildcache.py new file mode 100644 index 0000000000..213442acef --- /dev/null +++ b/lib/spack/spack/cmd/buildcache.py @@ -0,0 +1,230 @@ +############################################################################## +# 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 +############################################################################## +import argparse + +import os +import re +import llnl.util.tty as tty + +import spack +import spack.cmd +import spack.binary_distribution as bindist +from spack.binary_distribution import NoOverwriteException, NoGpgException +from spack.binary_distribution import NoKeyException, PickKeyException +from spack.binary_distribution import NoVerifyException, NoChecksumException + +description = "Create, download and install build cache files." +section = "caching" +level = "long" + + +def setup_parser(subparser): + setup_parser.parser = subparser + subparsers = subparser.add_subparsers(help='buildcache sub-commands') + + create = subparsers.add_parser('create') + create.add_argument('-r', '--rel', action='store_true', + help="make all rpaths relative" + + " before creating tarballs.") + create.add_argument('-f', '--force', action='store_true', + help="overwrite tarball if it exists.") + create.add_argument('-y', '--yes-to-all', action='store_true', + help="answer yes to all create unsigned " + + "buildcache questions") + create.add_argument('-k', '--key', metavar='key', + type=str, default=None, + help="Key for signing.") + create.add_argument('-d', '--directory', metavar='directory', + type=str, default='.', + help="directory in which to save the tarballs.") + create.add_argument( + 'packages', nargs=argparse.REMAINDER, + help="specs of packages to create buildcache for") + create.set_defaults(func=createtarball) + + install = subparsers.add_parser('install') + install.add_argument('-f', '--force', action='store_true', + help="overwrite install directory if it exists.") + install.add_argument('-y', '--yes-to-all', action='store_true', + help="answer yes to all install unsigned " + + "buildcache questions") + install.add_argument( + 'packages', nargs=argparse.REMAINDER, + help="specs of packages to install biuldache for") + install.set_defaults(func=installtarball) + + listcache = subparsers.add_parser('list') + listcache.add_argument( + 'packages', nargs=argparse.REMAINDER, + help="specs of packages to search for") + listcache.set_defaults(func=listspecs) + + dlkeys = subparsers.add_parser('keys') + dlkeys.add_argument( + '-i', '--install', action='store_true', + help="install Keys pulled from mirror") + dlkeys.add_argument( + '-y', '--yes-to-all', action='store_true', + help="answer yes to all trust questions") + dlkeys.set_defaults(func=getkeys) + + +def createtarball(args): + if not args.packages: + tty.die("build cache file creation requires at least one" + + " installed package argument") + pkgs = set(args.packages) + specs = set() + outdir = os.getcwd() + if args.directory: + outdir = args.directory + signkey = None + if args.key: + signkey = args.key + yes_to_all = False + force = False + relative = False + if args.yes_to_all: + yes_to_all = True + if args.force: + force = True + if args.rel: + relative = True + for pkg in pkgs: + for spec in spack.cmd.parse_specs(pkg, concretize=True): + specs.add(spec) + tty.msg('recursing dependencies') + for d, node in spec.traverse(order='post', + depth=True, + deptype=('link', 'run'), + deptype_query='run'): + if not node.external: + tty.msg('adding dependency %s' % node.format()) + specs.add(node) + for spec in specs: + tty.msg('creating binary cache file for package %s ' % spec.format()) + try: + bindist.build_tarball(spec, outdir, force, + relative, yes_to_all, signkey) + except NoOverwriteException as e: + tty.warn("%s exists, use -f to force overwrite." % e) + except NoGpgException: + tty.warn("gpg2 is not available," + " use -y to create unsigned build caches") + except NoKeyException: + tty.warn("no default key available for signing," + " use -y to create unsigned build caches" + " or spack gpg init to create a default key") + except PickKeyException: + tty.warn("multi keys available for signing," + " use -y to create unsigned build caches" + " or -k to pick a key") + + +def installtarball(args): + if not args.packages: + tty.die("build cache file installation requires" + + " at least one package spec argument") + pkgs = set(args.packages) + specs, links = bindist.get_specs() + matches = set() + for spec in specs: + for pkg in pkgs: + if re.match(re.escape(pkg), str(spec)): + matches.add(spec) + if re.match(re.escape(pkg), '/%s' % spec.dag_hash()): + matches.add(spec) + + for match in matches: + install_tarball(match, args) + + +def install_tarball(spec, args): + s = spack.spec.Spec(spec) + yes_to_all = False + force = False + if args.yes_to_all: + yes_to_all = True + if args.force: + force = True + for d in s.dependencies(): + tty.msg("Installing buildcache for dependency spec %s" % d) + install_tarball(d, args) + package = spack.repo.get(spec) + if s.concrete and package.installed and not force: + tty.warn("Package for spec %s already installed." % spec.format(), + " Use -f flag to overwrite.") + else: + tarball = bindist.download_tarball(spec) + if tarball: + tty.msg('Installing buildcache for spec %s' % spec.format()) + try: + bindist.extract_tarball(spec, tarball, yes_to_all, force) + except NoOverwriteException as e: + tty.warn("%s exists. use -f to force overwrite." % e.args) + except NoVerifyException: + tty.die("Package spec file failed signature verification," + " use -y flag to install build cache") + except NoChecksumException: + tty.die("Package tarball failed checksum verification," + " use -y flag to install build cache") + finally: + spack.store.db.reindex(spack.store.layout) + else: + tty.die('Download of binary cache file for spec %s failed.' % + spec.format()) + + +def listspecs(args): + specs, links = bindist.get_specs() + if args.packages: + pkgs = set(args.packages) + for pkg in pkgs: + tty.msg("buildcache spec(s) matching %s \n" % pkg) + for spec in sorted(specs): + if re.search("^" + re.escape(pkg), str(spec)): + tty.msg('run "spack buildcache install /%s"' % + spec.dag_hash(7) + ' to install %s\n' % + spec.format()) + else: + tty.msg("buildcache specs ") + for spec in sorted(specs): + tty.msg('run "spack buildcache install /%s" to install %s\n' % + (spec.dag_hash(7), spec.format())) + + +def getkeys(args): + install = False + if args.install: + install = True + yes_to_all = False + if args.yes_to_all: + yes_to_all = True + bindist.get_keys(install, yes_to_all) + + +def buildcache(parser, args): + if args.func: + args.func(args) diff --git a/lib/spack/spack/relocate.py b/lib/spack/spack/relocate.py new file mode 100644 index 0000000000..b4251d05ca --- /dev/null +++ b/lib/spack/spack/relocate.py @@ -0,0 +1,289 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import os +import platform +import re +import spack +import spack.cmd +from spack.util.executable import Executable +from llnl.util.filesystem import filter_file +import llnl.util.tty as tty + + +def get_patchelf(): + """ + Builds and installs spack patchelf package on linux platforms + using the first concretized spec. + Returns the full patchelf binary path. + """ + # as we may need patchelf, find out where it is + if platform.system() == 'Darwin': + return None + patchelf_spec = spack.cmd.parse_specs("patchelf", concretize=True)[0] + patchelf = spack.repo.get(patchelf_spec) + if not patchelf.installed: + patchelf.do_install() + patchelf_executable = os.path.join(patchelf.prefix.bin, "patchelf") + return patchelf_executable + + +def get_existing_elf_rpaths(path_name): + """ + Return the RPATHS returned by patchelf --print-rpath path_name + as a list of strings. + """ + if platform.system() == 'Linux': + command = Executable(get_patchelf()) + output = command('--print-rpath', '%s' % + path_name, output=str, err=str) + return output.rstrip('\n').split(':') + else: + tty.die('relocation not supported for this platform') + return + + +def get_relative_rpaths(path_name, orig_dir, orig_rpaths): + """ + Replaces orig_dir with relative path from dirname(path_name) if an rpath + in orig_rpaths contains orig_path. Prefixes $ORIGIN + to relative paths and returns replacement rpaths. + """ + rel_rpaths = [] + for rpath in orig_rpaths: + if re.match(orig_dir, rpath): + rel = os.path.relpath(rpath, start=os.path.dirname(path_name)) + rel_rpaths.append('$ORIGIN/%s' % rel) + else: + rel_rpaths.append(rpath) + return rel_rpaths + + +def macho_get_paths(path_name): + """ + Examines the output of otool -l path_name for these three fields: + LC_ID_DYLIB, LC_LOAD_DYLIB, LC_RPATH and parses out the rpaths, + dependiencies and library id. + Returns these values. + """ + otool = Executable('otool') + output = otool("-l", path_name, output=str, err=str) + last_cmd = None + idpath = '' + rpaths = [] + deps = [] + for line in output.split('\n'): + match = re.search('( *[a-zA-Z]+ )(.*)', line) + if match: + lhs = match.group(1).lstrip().rstrip() + rhs = match.group(2) + match2 = re.search('(.*) \(.*\)', rhs) + if match2: + rhs = match2.group(1) + if lhs == 'cmd': + last_cmd = rhs + if lhs == 'path' and last_cmd == 'LC_RPATH': + rpaths.append(rhs) + if lhs == 'name' and last_cmd == 'LC_ID_DYLIB': + idpath = rhs + if lhs == 'name' and last_cmd == 'LC_LOAD_DYLIB': + deps.append(rhs) + return rpaths, deps, idpath + + +def macho_make_paths_relative(path_name, old_dir, rpaths, deps, idpath): + """ + Replace old_dir with relative path from dirname(path_name) + in rpaths and deps; idpaths are replaced with @rpath/basebane(path_name); + replacement are returned. + """ + id = None + nrpaths = [] + ndeps = [] + if idpath: + id = '@rpath/%s' % os.path.basename(idpath) + for rpath in rpaths: + if re.match(old_dir, rpath): + rel = os.path.relpath(rpath, start=os.path.dirname(path_name)) + nrpaths.append('@loader_path/%s' % rel) + else: + nrpaths.append(rpath) + for dep in deps: + if re.match(old_dir, dep): + rel = os.path.relpath(dep, start=os.path.dirname(path_name)) + ndeps.append('@loader_path/%s' % rel) + else: + ndeps.append(dep) + return nrpaths, ndeps, id + + +def macho_replace_paths(old_dir, new_dir, rpaths, deps, idpath): + """ + Replace old_dir with new_dir in rpaths, deps and idpath + and return replacements + """ + id = None + nrpaths = [] + ndeps = [] + if idpath: + id = idpath.replace(old_dir, new_dir) + for rpath in rpaths: + nrpath = rpath.replace(old_dir, new_dir) + nrpaths.append(nrpath) + for dep in deps: + ndep = dep.replace(old_dir, new_dir) + ndeps.append(ndep) + return nrpaths, ndeps, id + + +def modify_macho_object(path_name, old_dir, new_dir, relative): + """ + Modify MachO binary path_name by replacing old_dir with new_dir + or the relative path to spack install root. + The old install dir in LC_ID_DYLIB is replaced with the new install dir + using install_name_tool -id newid binary + The old install dir in LC_LOAD_DYLIB is replaced with the new install dir + using install_name_tool -change old new binary + The old install dir in LC_RPATH is replaced with the new install dir using + install_name_tool -rpath old new binary + """ + # avoid error message for libgcc_s + if 'libgcc_' in path_name: + return + rpaths, deps, idpath = macho_get_paths(path_name) + id = None + nrpaths = [] + ndeps = [] + if relative: + nrpaths, ndeps, id = macho_make_paths_relative(path_name, + old_dir, rpaths, + deps, idpath) + else: + nrpaths, ndeps, id = macho_replace_paths(old_dir, new_dir, rpaths, + deps, idpath) + install_name_tool = Executable('install_name_tool') + if id: + install_name_tool('-id', id, path_name, output=str, err=str) + + for orig, new in zip(deps, ndeps): + install_name_tool('-change', orig, new, path_name) + + for orig, new in zip(rpaths, nrpaths): + install_name_tool('-rpath', orig, new, path_name) + return + + +def get_filetype(path_name): + """ + Return the output of file path_name as a string to identify file type. + """ + file = Executable('file') + file.add_default_env('LC_ALL', 'C') + output = file('-b', '-h', '%s' % path_name, + output=str, err=str) + return output.strip() + + +def modify_elf_object(path_name, orig_rpath, new_rpath): + """ + Replace orig_rpath with new_rpath in RPATH of elf object path_name + """ + if platform.system() == 'Linux': + new_joined = ':'.join(new_rpath) + patchelf = Executable(get_patchelf()) + patchelf('--force-rpath', '--set-rpath', '%s' % new_joined, + '%s' % path_name, output=str, cmd=str) + else: + tty.die('relocation not supported for this platform') + + +def needs_binary_relocation(filetype): + """ + Check whether the given filetype is a binary that may need relocation. + """ + retval = False + if "relocatable" in filetype: + return False + if platform.system() == 'Darwin': + return ('Mach-O' in filetype) + elif platform.system() == 'Linux': + return ('ELF' in filetype) + else: + tty.die("Relocation not implemented for %s" % platform.system()) + return retval + + +def needs_text_relocation(filetype): + """ + Check whether the given filetype is text that may need relocation. + """ + return ("text" in filetype) + + +def relocate_binary(path_name, old_dir, new_dir): + """ + Change old_dir to new_dir in RPATHs of elf or mach-o file path_name + """ + if platform.system() == 'Darwin': + modify_macho_object(path_name, old_dir, new_dir, relative=False) + elif platform.system() == 'Linux': + orig_rpaths = get_existing_elf_rpaths(path_name) + new_rpaths = substitute_rpath(orig_rpaths, old_dir, new_dir) + modify_elf_object(path_name, orig_rpaths, new_rpaths) + else: + tty.die("Relocation not implemented for %s" % platform.system()) + + +def make_binary_relative(path_name, old_dir): + """ + Make RPATHs relative to old_dir in given elf or mach-o file path_name + """ + if platform.system() == 'Darwin': + new_dir = '' + modify_macho_object(path_name, old_dir, new_dir, relative=True) + elif platform.system() == 'Linux': + orig_rpaths = get_existing_elf_rpaths(path_name) + new_rpaths = get_relative_rpaths(path_name, old_dir, orig_rpaths) + modify_elf_object(path_name, orig_rpaths, new_rpaths) + else: + tty.die("Prelocation not implemented for %s" % platform.system()) + + +def relocate_text(path_name, old_dir, new_dir): + """ + Replace old path with new path in text file path_name + """ + filter_file("r'%s'" % old_dir, "r'%s'" % new_dir, path_name) + + +def substitute_rpath(orig_rpath, topdir, new_root_path): + """ + Replace topdir with new_root_path RPATH list orig_rpath + """ + new_rpaths = [] + for path in orig_rpath: + new_rpath = path.replace(topdir, new_root_path) + new_rpaths.append(new_rpath) + return new_rpaths diff --git a/lib/spack/spack/test/packaging.py b/lib/spack/spack/test/packaging.py new file mode 100644 index 0000000000..bac8bf980f --- /dev/null +++ b/lib/spack/spack/test/packaging.py @@ -0,0 +1,304 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 +############################################################################## +""" +This test checks the binary packaging infrastructure +""" +import pytest +import spack +import spack.store +from spack.fetch_strategy import URLFetchStrategy, FetchStrategyComposite +from spack.spec import Spec +import spack.binary_distribution as bindist +from llnl.util.filesystem import join_path, mkdirp +import argparse +import spack.cmd.buildcache as buildcache +from spack.relocate import * +import os +import stat +import sys +import shutil +from spack.util.executable import ProcessError + + +@pytest.fixture(scope='function') +def testing_gpg_directory(tmpdir): + old_gpg_path = spack.util.gpg.GNUPGHOME + spack.util.gpg.GNUPGHOME = str(tmpdir.join('gpg')) + yield + spack.util.gpg.GNUPGHOME = old_gpg_path + + +def has_gnupg2(): + try: + spack.util.gpg.Gpg.gpg()('--version', output=os.devnull) + return True + except ProcessError: + return False + + +def fake_fetchify(url, pkg): + """Fake the URL for a package so it downloads from a file.""" + fetcher = FetchStrategyComposite() + fetcher.append(URLFetchStrategy(url)) + pkg.fetcher = fetcher + + +@pytest.mark.usefixtures('install_mockery', 'testing_gpg_directory') +def test_packaging(mock_archive, tmpdir): + # tweak patchelf to only do a download + spec = Spec("patchelf") + spec.concretize() + pkg = spack.repo.get(spec) + fake_fetchify(pkg.fetcher, pkg) + mkdirp(join_path(pkg.prefix, "bin")) + patchelfscr = join_path(pkg.prefix, "bin", "patchelf") + f = open(patchelfscr, 'w') + body = """#!/bin/bash +echo $PATH""" + f.write(body) + f.close() + st = os.stat(patchelfscr) + os.chmod(patchelfscr, st.st_mode | stat.S_IEXEC) + + # Install the test package + spec = Spec('trivial-install-test-package') + spec.concretize() + assert spec.concrete + pkg = spack.repo.get(spec) + fake_fetchify(mock_archive.url, pkg) + pkg.do_install() + + # Put some non-relocatable file in there + filename = join_path(spec.prefix, "dummy.txt") + with open(filename, "w") as script: + script.write(spec.prefix) + + # Create the build cache and + # put it directly into the mirror + + mirror_path = join_path(tmpdir, 'test-mirror') + specs = [spec] + spack.mirror.create( + mirror_path, specs, no_checksum=True + ) + + # register mirror with spack config + mirrors = {'spack-mirror-test': 'file://' + mirror_path} + spack.config.update_config('mirrors', mirrors) + + stage = spack.stage.Stage( + mirrors['spack-mirror-test'], name="build_cache", keep=True) + stage.create() + # setup argument parser + parser = argparse.ArgumentParser() + buildcache.setup_parser(parser) + + # Create a private key to sign package with if gpg2 available + if has_gnupg2(): + spack.util.gpg.Gpg.create(name='test key 1', expires='0', + email='spack@googlegroups.com', + comment='Spack test key') + # Create build cache with signing + args = parser.parse_args(['create', '-d', mirror_path, str(spec)]) + buildcache.buildcache(parser, args) + + # Uninstall the package + pkg.do_uninstall(force=True) + + # test overwrite install + args = parser.parse_args(['install', '-f', str(spec)]) + buildcache.buildcache(parser, args) + + # create build cache with relative path and signing + args = parser.parse_args( + ['create', '-d', mirror_path, '-f', '-r', str(spec)]) + buildcache.buildcache(parser, args) + + # Uninstall the package + pkg.do_uninstall(force=True) + + # install build cache with verification + args = parser.parse_args(['install', str(spec)]) + buildcache.install_tarball(spec, args) + + # test overwrite install + args = parser.parse_args(['install', '-f', str(spec)]) + buildcache.buildcache(parser, args) + + else: + # create build cache without signing + args = parser.parse_args( + ['create', '-d', mirror_path, '-y', str(spec)]) + buildcache.buildcache(parser, args) + + # Uninstall the package + pkg.do_uninstall(force=True) + + # install build cache without verification + args = parser.parse_args(['install', '-y', str(spec)]) + buildcache.install_tarball(spec, args) + + # test overwrite install without verification + args = parser.parse_args(['install', '-f', '-y', str(spec)]) + buildcache.buildcache(parser, args) + + # create build cache with relative path + args = parser.parse_args( + ['create', '-d', mirror_path, '-f', '-r', '-y', str(spec)]) + buildcache.buildcache(parser, args) + + # Uninstall the package + pkg.do_uninstall(force=True) + + # install build cache + args = parser.parse_args(['install', '-y', str(spec)]) + buildcache.install_tarball(spec, args) + + # test overwrite install + args = parser.parse_args(['install', '-f', '-y', str(spec)]) + buildcache.buildcache(parser, args) + + # Validate the relocation information + buildinfo = bindist.read_buildinfo_file(spec.prefix) + assert(buildinfo['relocate_textfiles'] == ['dummy.txt']) + + args = parser.parse_args(['list']) + buildcache.buildcache(parser, args) + + args = parser.parse_args(['list', 'trivial']) + buildcache.buildcache(parser, args) + + # Copy a key to the mirror to have something to download + shutil.copyfile(spack.mock_gpg_keys_path + '/external.key', + mirror_path + '/external.key') + + args = parser.parse_args(['keys']) + buildcache.buildcache(parser, args) + + # unregister mirror with spack config + mirrors = {} + spack.config.update_config('mirrors', mirrors) + shutil.rmtree(mirror_path) + stage.destroy() + + +def test_relocate(): + assert (needs_binary_relocation('relocatable') is False) + + out = macho_make_paths_relative('/Users/Shares/spack/pkgC/lib/libC.dylib', + '/Users/Shared/spack', + ('/Users/Shared/spack/pkgA/lib', + '/Users/Shared/spack/pkgB/lib', + '/usr/local/lib'), + ('/Users/Shared/spack/pkgA/libA.dylib', + '/Users/Shared/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'), + '/Users/Shared/spack/pkgC/lib/libC.dylib') + assert out == (['@loader_path/../../../../Shared/spack/pkgA/lib', + '@loader_path/../../../../Shared/spack/pkgB/lib', + '/usr/local/lib'], + ['@loader_path/../../../../Shared/spack/pkgA/libA.dylib', + '@loader_path/../../../../Shared/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'], + '@rpath/libC.dylib') + + out = macho_make_paths_relative('/Users/Shared/spack/pkgC/bin/exeC', + '/Users/Shared/spack', + ('/Users/Shared/spack/pkgA/lib', + '/Users/Shared/spack/pkgB/lib', + '/usr/local/lib'), + ('/Users/Shared/spack/pkgA/libA.dylib', + '/Users/Shared/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'), None) + + assert out == (['@loader_path/../../pkgA/lib', + '@loader_path/../../pkgB/lib', + '/usr/local/lib'], + ['@loader_path/../../pkgA/libA.dylib', + '@loader_path/../../pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'], None) + + out = macho_replace_paths('/Users/Shared/spack', + '/Applications/spack', + ('/Users/Shared/spack/pkgA/lib', + '/Users/Shared/spack/pkgB/lib', + '/usr/local/lib'), + ('/Users/Shared/spack/pkgA/libA.dylib', + '/Users/Shared/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'), + '/Users/Shared/spack/pkgC/lib/libC.dylib') + assert out == (['/Applications/spack/pkgA/lib', + '/Applications/spack/pkgB/lib', + '/usr/local/lib'], + ['/Applications/spack/pkgA/libA.dylib', + '/Applications/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'], + '/Applications/spack/pkgC/lib/libC.dylib') + + out = macho_replace_paths('/Users/Shared/spack', + '/Applications/spack', + ('/Users/Shared/spack/pkgA/lib', + '/Users/Shared/spack/pkgB/lib', + '/usr/local/lib'), + ('/Users/Shared/spack/pkgA/libA.dylib', + '/Users/Shared/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'), + None) + assert out == (['/Applications/spack/pkgA/lib', + '/Applications/spack/pkgB/lib', + '/usr/local/lib'], + ['/Applications/spack/pkgA/libA.dylib', + '/Applications/spack/pkgB/libB.dylib', + '/usr/local/lib/libloco.dylib'], + None) + + out = get_relative_rpaths( + '/usr/bin/test', '/usr', + ('/usr/lib', '/usr/lib64', '/opt/local/lib')) + assert out == ['$ORIGIN/../lib', '$ORIGIN/../lib64', '/opt/local/lib'] + + out = substitute_rpath( + ('/usr/lib', '/usr/lib64', '/opt/local/lib'), '/usr', '/opt') + assert out == ['/opt/lib', '/opt/lib64', '/opt/local/lib'] + + +@pytest.mark.skipif(sys.platform != 'darwin', + reason="only works with Mach-o objects") +def test_relocate_macho(): + get_patchelf() + assert (needs_binary_relocation('Mach-O') is True) + macho_get_paths('/bin/bash') + shutil.copyfile('/bin/bash', 'bash') + modify_macho_object('bash', '/usr', '/opt', False) + modify_macho_object('bash', '/usr', '/opt', True) + shutil.copyfile('/usr/lib/libncurses.5.4.dylib', 'libncurses.5.4.dylib') + modify_macho_object('libncurses.5.4.dylib', '/usr', '/opt', False) + modify_macho_object('libncurses.5.4.dylib', '/usr', '/opt', True) + + +@pytest.mark.skipif(sys.platform != 'linux2', + reason="only works with Elf objects") +def test_relocate_elf(): + assert (needs_binary_relocation('ELF') is True) diff --git a/var/spack/repos/builtin.mock/packages/patchelf/package.py b/var/spack/repos/builtin.mock/packages/patchelf/package.py new file mode 100644 index 0000000000..915f3df0c6 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/patchelf/package.py @@ -0,0 +1,41 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 Patchelf(AutotoolsPackage): + """ + PatchELF is a small utility to modify the + dynamic linker and RPATH of ELF executables. + """ + + homepage = "https://nixos.org/patchelf.html" + url = "http://nixos.org/releases/patchelf/patchelf-0.8/patchelf-0.8.tar.gz" + + list_url = "http://nixos.org/releases/patchelf/" + list_depth = 1 + + version('0.9', '3c265508526760f233620f35d79c79fc') + version('0.8', '407b229e6a681ffb0e2cdd5915cb2d01') -- cgit v1.2.3-70-g09d2 From db657d938d38775e4364a6917cc78cb9cdb0b133 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 16 Aug 2017 12:21:07 -0500 Subject: Refactor IntelInstaller into IntelPackage base class (#4300) * Refactor IntelInstaller into IntelPackage base class * Move license attributes from __init__ to class-level * Flake8 fixes: remove unused imports * Fix logic that writes the silent.cfg file * More specific version numbers for Intel MPI * Rework logic that selects components to install * Final changes necessary to get intel package working * Various updates to intel-parallel-studio * Add latest version of every Intel package * Add environment variables for Intel packages * Update env vars for intel package * Finalize components for intel-parallel-studio package Adds a +tbb variant to intel-parallel-studio. The tbb package was renamed to intel-tbb. Now both intel-tbb and intel-parallel-studio+tbb provide tbb. * Overhaul environment variables set by intel-parallel-studio * Point dependent packages to the correct MPI wrappers * Never default to intel-parallel-studio * Gather env vars by sourcing setup scripts * Use mpiicc instead of mpicc when using Intel compiler * Undo change to ARCH * Add changes from intel-mpi to intel-parallel-studio * Add comment explaining mpicc vs mpiicc * Prepend env vars containing 'PATH' or separators * Flake8 fix * Fix bugs in from_sourcing_file * Indentation fix * Prepend, not set if contains separator * Fix license symlinking broken by changes to intel-parallel-studio * Use comments instead of docstrings to document attributes * Flake8 fixes * Use a set instead of a list to prevent duplicate components * Fix MKL and MPI library linking directories * Remove +all variant from intel-parallel-studio * It is not possible to build with MKL, GCC, and OpenMP at this time * Found a workaround for locating GCC libraries * Typos and variable names * Fix initialization of empty LibraryList --- etc/spack/defaults/packages.yaml | 7 +- lib/spack/docs/packaging_guide.rst | 3 + lib/spack/spack/__init__.py | 2 + lib/spack/spack/build_environment.py | 4 +- lib/spack/spack/build_systems/intel.py | 192 +++++++ lib/spack/spack/cmd/configure.py | 1 + lib/spack/spack/cmd/create.py | 10 + lib/spack/spack/environment.py | 182 ++++--- lib/spack/spack/package.py | 73 +-- lib/spack/spack/test/environment.py | 11 +- .../repos/builtin/packages/intel-daal/package.py | 48 +- .../repos/builtin/packages/intel-ipp/package.py | 48 +- .../repos/builtin/packages/intel-mkl/package.py | 81 ++- .../repos/builtin/packages/intel-mpi/package.py | 92 +++- .../packages/intel-parallel-studio/package.py | 598 +++++++++++---------- .../repos/builtin/packages/intel-tbb/package.py | 117 ++++ var/spack/repos/builtin/packages/intel/package.py | 212 ++------ var/spack/repos/builtin/packages/tbb/package.py | 115 ---- 18 files changed, 1068 insertions(+), 728 deletions(-) create mode 100644 lib/spack/spack/build_systems/intel.py create mode 100644 var/spack/repos/builtin/packages/intel-tbb/package.py delete mode 100644 var/spack/repos/builtin/packages/tbb/package.py (limited to 'lib') diff --git a/etc/spack/defaults/packages.yaml b/etc/spack/defaults/packages.yaml index df785c5aa5..fc25599749 100644 --- a/etc/spack/defaults/packages.yaml +++ b/etc/spack/defaults/packages.yaml @@ -19,13 +19,13 @@ packages: providers: awk: [gawk] blas: [openblas] - daal: [intel-parallel-studio+daal] + daal: [intel-daal] elf: [elfutils] golang: [gcc] - ipp: [intel-parallel-studio+ipp] + ipp: [intel-ipp] java: [jdk] lapack: [openblas] - mkl: [intel-parallel-studio+mkl] + mkl: [intel-mkl] mpe: [mpe2] mpi: [openmpi, mpich] opencl: [pocl] @@ -33,3 +33,4 @@ packages: pil: [py-pillow] scalapack: [netlib-scalapack] szip: [libszip, libaec] + tbb: [intel-tbb] diff --git a/lib/spack/docs/packaging_guide.rst b/lib/spack/docs/packaging_guide.rst index 7e789bc294..e400272e59 100644 --- a/lib/spack/docs/packaging_guide.rst +++ b/lib/spack/docs/packaging_guide.rst @@ -2136,6 +2136,9 @@ The classes that are currently provided by Spack are: | :py:class:`.PerlPackage` | Specialized class for | | | :py:class:`.Perl` extensions | +-------------------------------+----------------------------------+ + | :py:class:`.IntelPackage` | Specialized class for licensed | + | | Intel software | + +-------------------------------+----------------------------------+ .. note:: diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index e8a010bb26..21280f0001 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -178,6 +178,7 @@ from spack.build_systems.waf import WafPackage from spack.build_systems.python import PythonPackage from spack.build_systems.r import RPackage from spack.build_systems.perl import PerlPackage +from spack.build_systems.intel import IntelPackage __all__ += [ 'run_before', @@ -193,6 +194,7 @@ __all__ += [ 'PythonPackage', 'RPackage', 'PerlPackage', + 'IntelPackage', ] from spack.version import Version, ver diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 34c9cd56d2..620445fe1c 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -229,7 +229,7 @@ def set_build_environment_variables(pkg, env, dirty=False): # Install root prefix env.set(SPACK_INSTALL, spack.store.root) - # Stuff in here sanitizes the build environemnt to eliminate + # Stuff in here sanitizes the build environment to eliminate # anything the user has set that may interfere. if not dirty: # Remove these vars from the environment during build because they @@ -518,7 +518,7 @@ def fork(pkg, function, dirty=False): Args: - pkg (PackageBase): package whose environemnt we should set up the + pkg (PackageBase): package whose environment we should set up the forked process for. function (callable): argless function to run in the child process. diff --git a/lib/spack/spack/build_systems/intel.py b/lib/spack/spack/build_systems/intel.py new file mode 100644 index 0000000000..a97f15d62c --- /dev/null +++ b/lib/spack/spack/build_systems/intel.py @@ -0,0 +1,192 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import os +import xml.etree.ElementTree as ET + +from llnl.util.filesystem import install, join_path +from spack.package import PackageBase, run_after +from spack.util.executable import Executable + + +def _valid_components(): + """A generator that yields valid components.""" + + tree = ET.parse('pset/mediaconfig.xml') + root = tree.getroot() + + components = root.findall('.//Abbr') + for component in components: + yield component.text + + +class IntelPackage(PackageBase): + """Specialized class for licensed Intel software. + + This class provides two phases that can be overridden: + + 1. :py:meth:`~.IntelPackage.configure` + 2. :py:meth:`~.IntelPackage.install` + + They both have sensible defaults and for many packages the + only thing necessary will be to override ``setup_environment`` + to set the appropriate environment variables. + """ + #: Phases of an Intel package + phases = ['configure', 'install'] + + #: This attribute is used in UI queries that need to know the build + #: system base class + build_system_class = 'IntelPackage' + + #: By default, we assume that all Intel software requires a license. + #: This can be overridden for packages that do not require a license. + license_required = True + + #: Comment symbol used in the ``license.lic`` file + license_comment = '#' + + #: Location where Intel searches for a license file + license_files = ['Licenses/license.lic'] + + #: Environment variables that Intel searches for a license file + license_vars = ['INTEL_LICENSE_FILE'] + + #: URL providing information on how to acquire a license key + license_url = 'https://software.intel.com/en-us/articles/intel-license-manager-faq' + + #: Components of the package to install. + #: By default, install 'ALL' components. + components = ['ALL'] + + @property + def _filtered_components(self): + """Returns a list or set of valid components that match + the requested components from ``components``.""" + + # Don't filter 'ALL' + if self.components == ['ALL']: + return self.components + + # mediaconfig.xml is known to contain duplicate components. + # If more than one copy of the same component is used, you + # will get an error message about invalid components. + # Use a set to store components to prevent duplicates. + matches = set() + + for valid in _valid_components(): + for requested in self.components: + if valid.startswith(requested): + matches.add(valid) + + return matches + + @property + def global_license_file(self): + """Returns the path where a global license file should be stored. + + All Intel software shares the same license, so we store it in a + common 'intel' directory.""" + return join_path(self.global_license_dir, 'intel', + os.path.basename(self.license_files[0])) + + def configure(self, spec, prefix): + """Writes the ``silent.cfg`` file used to configure the installation. + + See https://software.intel.com/en-us/articles/configuration-file-format + """ + # Patterns used to check silent configuration file + # + # anythingpat - any string + # filepat - the file location pattern (/path/to/license.lic) + # lspat - the license server address pattern (0123@hostname) + # snpat - the serial number pattern (ABCD-01234567) + config = { + # Accept EULA, valid values are: {accept, decline} + 'ACCEPT_EULA': 'accept', + + # Optional error behavior, valid values are: {yes, no} + 'CONTINUE_WITH_OPTIONAL_ERROR': 'yes', + + # Install location, valid values are: {/opt/intel, filepat} + 'PSET_INSTALL_DIR': prefix, + + # Continue with overwrite of existing installation directory, + # valid values are: {yes, no} + 'CONTINUE_WITH_INSTALLDIR_OVERWRITE': 'yes', + + # List of components to install, + # valid values are: {ALL, DEFAULTS, anythingpat} + 'COMPONENTS': ';'.join(self._filtered_components), + + # Installation mode, valid values are: {install, repair, uninstall} + 'PSET_MODE': 'install', + + # Directory for non-RPM database, valid values are: {filepat} + 'NONRPM_DB_DIR': prefix, + + # Perform validation of digital signatures of RPM files, + # valid values are: {yes, no} + 'SIGNING_ENABLED': 'no', + + # Select target architecture of your applications, + # valid values are: {IA32, INTEL64, ALL} + 'ARCH_SELECTED': 'ALL', + } + + # Not all Intel software requires a license. Trying to specify + # one anyway will cause the installation to fail. + if self.license_required: + config.update({ + # License file or license server, + # valid values are: {lspat, filepat} + 'ACTIVATION_LICENSE_FILE': self.global_license_file, + + # Activation type, valid values are: {exist_lic, + # license_server, license_file, trial_lic, serial_number} + 'ACTIVATION_TYPE': 'license_file', + + # Intel(R) Software Improvement Program opt-in, + # valid values are: {yes, no} + 'PHONEHOME_SEND_USAGE_DATA': 'no', + }) + + with open('silent.cfg', 'w') as cfg: + for key in config: + cfg.write('{0}={1}\n'.format(key, config[key])) + + def install(self, spec, prefix): + """Runs the ``install.sh`` installation script.""" + + install_script = Executable('./install.sh') + install_script('--silent', 'silent.cfg') + + @run_after('install') + def save_silent_cfg(self): + """Copies the silent.cfg configuration file to ``/.spack``.""" + install('silent.cfg', join_path(self.prefix, '.spack')) + + # Check that self.prefix is there after installation + run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index 562582fe09..c8588334a5 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -41,6 +41,7 @@ build_system_to_phase = { QMakePackage: 'qmake', WafPackage: 'configure', PerlPackage: 'configure', + IntelPackage: 'configure', } diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index ca49eb03fa..fd1e5f9fd2 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -370,6 +370,15 @@ class MakefilePackageTemplate(PackageTemplate): # makefile.filter('CC = .*', 'CC = cc')""" +class IntelPackageTemplate(PackageTemplate): + """Provides appropriate overrides for licensed Intel software""" + + base_class_name = 'IntelPackage' + + body = """\ + # FIXME: Override `setup_environment` if necessary.""" + + templates = { 'autotools': AutotoolsPackageTemplate, 'autoreconf': AutoreconfPackageTemplate, @@ -384,6 +393,7 @@ templates = { 'perlbuild': PerlbuildPackageTemplate, 'octave': OctavePackageTemplate, 'makefile': MakefilePackageTemplate, + 'intel': IntelPackageTemplate, 'generic': PackageTemplate, } diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index ff278dd6b6..567e54e356 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -284,132 +284,157 @@ class EnvironmentModifications(object): x.execute() @staticmethod - def from_sourcing_files(*args, **kwargs): - """Returns modifications that would be made by sourcing files. - - Args: - *args (list of str): list of files to be sourced + def from_sourcing_file(filename, *args, **kwargs): + """Returns modifications that would be made by sourcing a file. + + Parameters: + filename (str): The file to source + *args (list of str): Arguments to pass on the command line + + Keyword Arguments: + shell (str): The shell to use (default: ``bash``) + shell_options (str): Options passed to the shell (default: ``-c``) + source_command (str): The command to run (default: ``source``) + suppress_output (str): Redirect used to suppress output of command + (default: ``&> /dev/null``) + concatenate_on_success (str): Operator used to execute a command + only when the previous command succeeds (default: ``&&``) Returns: EnvironmentModifications: an object that, if executed, has - the same effect on the environment as sourcing the files - passed as parameters + the same effect on the environment as sourcing the file """ - env = EnvironmentModifications() + # Check if the file actually exists + if not os.path.isfile(filename): + msg = 'Trying to source non-existing file: {0}'.format(filename) + raise RuntimeError(msg) + + # Kwargs parsing and default values + shell = kwargs.get('shell', '/bin/bash') + shell_options = kwargs.get('shell_options', '-c') + source_command = kwargs.get('source_command', 'source') + suppress_output = kwargs.get('suppress_output', '&> /dev/null') + concatenate_on_success = kwargs.get('concatenate_on_success', '&&') - # Check if the files are actually there - files = [line.split(' ')[0] for line in args] - non_existing = [file for file in files if not os.path.isfile(file)] - if non_existing: - message = 'trying to source non-existing files\n' - message += '\n'.join(non_existing) - raise RuntimeError(message) - - # Relevant kwd parameters and formats - info = dict(kwargs) - info.setdefault('shell', '/bin/bash') - info.setdefault('shell_options', '-c') - info.setdefault('source_command', 'source') - info.setdefault('suppress_output', '&> /dev/null') - info.setdefault('concatenate_on_success', '&&') - - shell = '{shell}'.format(**info) - shell_options = '{shell_options}'.format(**info) - source_file = '{source_command} {file} {concatenate_on_success}' - - dump_cmd = "import os, json; print(json.dumps(dict(os.environ)))" - dump_environment = 'python -c "%s"' % dump_cmd + source_file = [source_command, filename] + source_file.extend(args) + source_file = ' '.join(source_file) + + dump_cmd = 'import os, json; print(json.dumps(dict(os.environ)))' + dump_environment = 'python -c "{0}"'.format(dump_cmd) # Construct the command that will be executed - command = [source_file.format(file=file, **info) for file in args] - command.append(dump_environment) - command = ' '.join(command) command = [ shell, shell_options, - command + ' '.join([ + source_file, suppress_output, + concatenate_on_success, dump_environment, + ]), ] - # Try to source all the files, + # Try to source the file proc = subprocess.Popen( command, stdout=subprocess.PIPE, env=os.environ) proc.wait() + if proc.returncode != 0: - raise RuntimeError('sourcing files returned a non-zero exit code') + msg = 'Sourcing file {0} returned a non-zero exit code'.format( + filename) + raise RuntimeError(msg) + output = ''.join([line.decode('utf-8') for line in proc.stdout]) - # Construct a dictionaries of the environment before and after - # sourcing the files, so that we can diff them. - this_environment = dict(os.environ) - after_source_env = json.loads(output) + # Construct dictionaries of the environment before and after + # sourcing the file, so that we can diff them. + env_before = dict(os.environ) + env_after = json.loads(output) # If we're in python2, convert to str objects instead of unicode # like json gives us. We can't put unicode in os.environ anyway. if sys.version_info[0] < 3: - after_source_env = dict((k.encode('utf-8'), v.encode('utf-8')) - for k, v in after_source_env.items()) + env_after = dict((k.encode('utf-8'), v.encode('utf-8')) + for k, v in env_after.items()) # Filter variables that are not related to sourcing a file - to_be_filtered = 'SHLVL', '_', 'PWD', 'OLDPWD' - for d in after_source_env, this_environment: + to_be_filtered = 'SHLVL', '_', 'PWD', 'OLDPWD', 'PS2' + for d in env_after, env_before: for name in to_be_filtered: d.pop(name, None) # Fill the EnvironmentModifications instance + env = EnvironmentModifications() # New variables - new_variables = set(after_source_env) - set(this_environment) - for x in new_variables: - env.set(x, after_source_env[x]) + new_variables = set(env_after) - set(env_before) # Variables that have been unset - unset_variables = set(this_environment) - set(after_source_env) - for x in unset_variables: - env.unset(x) + unset_variables = set(env_before) - set(env_after) # Variables that have been modified common_variables = set( - this_environment).intersection(set(after_source_env)) + env_before).intersection(set(env_after)) modified_variables = [x for x in common_variables - if this_environment[x] != after_source_env[x]] + if env_before[x] != env_after[x]] - def return_separator_if_any(first_value, second_value): + def return_separator_if_any(*args): separators = ':', ';' for separator in separators: - if separator in first_value and separator in second_value: - return separator + for arg in args: + if separator in arg: + return separator return None - for x in modified_variables: - current = this_environment[x] - modified = after_source_env[x] - sep = return_separator_if_any(current, modified) - if sep is None: - # We just need to set the variable to the new value - env.set(x, after_source_env[x]) + # Add variables to env. + # Assume that variables with 'PATH' in the name or that contain + # separators like ':' or ';' are more likely to be paths + for x in new_variables: + sep = return_separator_if_any(env_after[x]) + if sep: + env.prepend_path(x, env_after[x], separator=sep) + elif 'PATH' in x: + env.prepend_path(x, env_after[x]) else: - current_list = current.split(sep) - modified_list = modified.split(sep) + # We just need to set the variable to the new value + env.set(x, env_after[x]) + + for x in unset_variables: + env.unset(x) + + for x in modified_variables: + before = env_before[x] + after = env_after[x] + sep = return_separator_if_any(before, after) + if sep: + before_list = before.split(sep) + after_list = after.split(sep) + + # Filter out empty strings + before_list = list(filter(None, before_list)) + after_list = list(filter(None, after_list)) + # Paths that have been removed remove_list = [ - ii for ii in current_list if ii not in modified_list] - # Check that nothing has been added in the middle of vurrent - # list + ii for ii in before_list if ii not in after_list] + # Check that nothing has been added in the middle of + # before_list remaining_list = [ - ii for ii in current_list if ii in modified_list] - start = modified_list.index(remaining_list[0]) - end = modified_list.index(remaining_list[-1]) - search = sep.join(modified_list[start:end + 1]) - - if search not in current: + ii for ii in before_list if ii in after_list] + try: + start = after_list.index(remaining_list[0]) + end = after_list.index(remaining_list[-1]) + search = sep.join(after_list[start:end + 1]) + except IndexError: + env.prepend_path(x, env_after[x]) + + if search not in before: # We just need to set the variable to the new value - env.set(x, after_source_env[x]) - break + env.prepend_path(x, env_after[x]) else: try: - prepend_list = modified_list[:start] + prepend_list = after_list[:start] except KeyError: prepend_list = [] try: - append_list = modified_list[end + 1:] + append_list = after_list[end + 1:] except KeyError: append_list = [] @@ -419,6 +444,9 @@ class EnvironmentModifications(object): env.append_path(x, item) for item in prepend_list: env.prepend_path(x, item) + else: + # We just need to set the variable to the new value + env.set(x, env_after[x]) return env diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 86df0ec947..8c849573a7 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -484,38 +484,65 @@ class PackageBase(with_metaclass(PackageMeta, object)): # # These are default values for instance variables. # - """By default we build in parallel. Subclasses can override this.""" + + #: By default we build in parallel. Subclasses can override this. parallel = True - """# jobs to use for parallel make. If set, overrides default of ncpus.""" + #: # jobs to use for parallel make. If set, overrides default of ncpus. make_jobs = spack.build_jobs - """By default do not run tests within package's install()""" + #: By default do not run tests within package's install() run_tests = False # FIXME: this is a bad object-oriented design, should be moved to Clang. - """By default do not setup mockup XCode on macOS with Clang""" + #: By default do not setup mockup XCode on macOS with Clang use_xcode = False - """Most packages are NOT extendable. Set to True if you want extensions.""" + #: Most packages are NOT extendable. Set to True if you want extensions. extendable = False - """When True, add RPATHs for the entire DAG. When False, add RPATHs only - for immediate dependencies.""" + #: When True, add RPATHs for the entire DAG. When False, add RPATHs only + #: for immediate dependencies. transitive_rpaths = True - """List of prefix-relative file paths (or a single path). If these do - not exist after install, or if they exist but are not files, - sanity checks fail. - """ + #: List of prefix-relative file paths (or a single path). If these do + #: not exist after install, or if they exist but are not files, + #: sanity checks fail. sanity_check_is_file = [] - """List of prefix-relative directory paths (or a single path). If - these do not exist after install, or if they exist but are not - directories, sanity checks will fail. - """ + #: List of prefix-relative directory paths (or a single path). If + #: these do not exist after install, or if they exist but are not + #: directories, sanity checks will fail. sanity_check_is_dir = [] + # + # Set default licensing information + # + + #: Boolean. If set to ``True``, this software requires a license. + #: If set to ``False``, all of the ``license_*`` attributes will + #: be ignored. Defaults to ``False``. + license_required = False + + #: String. Contains the symbol used by the license manager to denote + #: a comment. Defaults to ``#``. + license_comment = '#' + + #: List of strings. These are files that the software searches for when + #: looking for a license. All file paths must be relative to the + #: installation directory. More complex packages like Intel may require + #: multiple licenses for individual components. Defaults to the empty list. + license_files = [] + + #: List of strings. Environment variables that can be set to tell the + #: software where to look for a license if it is not in the usual location. + #: Defaults to the empty list. + license_vars = [] + + #: String. A URL pointing to license setup instructions for the software. + #: Defaults to the empty string. + license_url = '' + def __init__(self, spec): # this determines how the package should be built. self.spec = spec @@ -569,22 +596,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): if not hasattr(self, 'list_depth'): self.list_depth = 0 - # Set default licensing information - if not hasattr(self, 'license_required'): - self.license_required = False - - if not hasattr(self, 'license_comment'): - self.license_comment = '#' - - if not hasattr(self, 'license_files'): - self.license_files = [] - - if not hasattr(self, 'license_vars'): - self.license_vars = [] - - if not hasattr(self, 'license_url'): - self.license_url = None - # Set up some internal variables for timing. self._fetch_time = 0.0 self._total_time = 0.0 diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index 7f3b7bf2bd..d07223221c 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -89,7 +89,7 @@ def files_to_be_sourced(): files = [ os.path.join(datadir, 'sourceme_first.sh'), os.path.join(datadir, 'sourceme_second.sh'), - os.path.join(datadir, 'sourceme_parameters.sh intel64'), + os.path.join(datadir, 'sourceme_parameters.sh'), os.path.join(datadir, 'sourceme_unicode.sh') ] @@ -224,7 +224,14 @@ def test_source_files(files_to_be_sourced): """Tests the construction of a list of environment modifications that are the result of sourcing a file. """ - env = EnvironmentModifications.from_sourcing_files(*files_to_be_sourced) + env = EnvironmentModifications() + for filename in files_to_be_sourced: + if filename.endswith('sourceme_parameters.sh'): + env.extend(EnvironmentModifications.from_sourcing_file( + filename, 'intel64')) + else: + env.extend(EnvironmentModifications.from_sourcing_file(filename)) + modifications = env.group_by_name() # This is sensitive to the user's environment; can include diff --git a/var/spack/repos/builtin/packages/intel-daal/package.py b/var/spack/repos/builtin/packages/intel-daal/package.py index 7fb6371e7e..1713218ad3 100644 --- a/var/spack/repos/builtin/packages/intel-daal/package.py +++ b/var/spack/repos/builtin/packages/intel-daal/package.py @@ -22,18 +22,14 @@ # 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 -from spack.pkg.builtin.intel import IntelInstaller - +from spack import * +from spack.environment import EnvironmentModifications -class IntelDaal(IntelInstaller): - """Intel Data Analytics Acceleration Library. - Note: You will have to add the download file to a - mirror so that Spack can find it. For instructions on how to set up a - mirror, see http://spack.readthedocs.io/en/latest/mirrors.html""" +class IntelDaal(IntelPackage): + """Intel Data Analytics Acceleration Library.""" homepage = "https://software.intel.com/en-us/daal" @@ -52,11 +48,35 @@ class IntelDaal(IntelInstaller): provides('daal') - def install(self, spec, prefix): + @property + def license_required(self): + # The Intel libraries are provided without requiring a license as of + # version 2017.2. Trying to specify the license will fail. See: + # https://software.intel.com/en-us/articles/free-ipsxe-tools-and-libraries + if self.version >= Version('2017.2'): + return False + else: + return True + + def setup_environment(self, spack_env, run_env): + """Adds environment variables to the generated module file. + + These environment variables come from running: + + .. code-block:: console - self.intel_prefix = os.path.join(prefix, "pkg") - IntelInstaller.install(self, spec, prefix) + $ source daal/bin/daalvars.sh intel64 + """ + # NOTE: Spack runs setup_environment twice, once pre-build to set up + # the build environment, and once post-installation to determine + # the environment variables needed at run-time to add to the module + # file. The script we need to source is only present post-installation, + # so check for its existence before sourcing. + # TODO: At some point we should split setup_environment into + # setup_build_environment and setup_run_environment to get around + # this problem. + daalvars = os.path.join(self.prefix.daal.bin, 'daalvars.sh') - daal_dir = os.path.join(self.intel_prefix, "daal") - for f in os.listdir(daal_dir): - os.symlink(os.path.join(daal_dir, f), os.path.join(self.prefix, f)) + if os.path.isfile(daalvars): + run_env.extend(EnvironmentModifications.from_sourcing_file( + daalvars, 'intel64')) diff --git a/var/spack/repos/builtin/packages/intel-ipp/package.py b/var/spack/repos/builtin/packages/intel-ipp/package.py index c9cfa609c8..4ca20a9906 100644 --- a/var/spack/repos/builtin/packages/intel-ipp/package.py +++ b/var/spack/repos/builtin/packages/intel-ipp/package.py @@ -22,18 +22,14 @@ # 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 -from spack.pkg.builtin.intel import IntelInstaller - +from spack import * +from spack.environment import EnvironmentModifications -class IntelIpp(IntelInstaller): - """Intel Integrated Performance Primitives. - Note: You will have to add the download file to a - mirror so that Spack can find it. For instructions on how to set up a - mirror, see http://spack.readthedocs.io/en/latest/mirrors.html""" +class IntelIpp(IntelPackage): + """Intel Integrated Performance Primitives.""" homepage = "https://software.intel.com/en-us/intel-ipp" @@ -50,11 +46,35 @@ class IntelIpp(IntelInstaller): provides('ipp') - def install(self, spec, prefix): + @property + def license_required(self): + # The Intel libraries are provided without requiring a license as of + # version 2017.2. Trying to specify the license will fail. See: + # https://software.intel.com/en-us/articles/free-ipsxe-tools-and-libraries + if self.version >= Version('2017.2'): + return False + else: + return True + + def setup_environment(self, spack_env, run_env): + """Adds environment variables to the generated module file. + + These environment variables come from running: + + .. code-block:: console - self.intel_prefix = os.path.join(prefix, "pkg") - IntelInstaller.install(self, spec, prefix) + $ source ipp/bin/ippvars.sh intel64 + """ + # NOTE: Spack runs setup_environment twice, once pre-build to set up + # the build environment, and once post-installation to determine + # the environment variables needed at run-time to add to the module + # file. The script we need to source is only present post-installation, + # so check for its existence before sourcing. + # TODO: At some point we should split setup_environment into + # setup_build_environment and setup_run_environment to get around + # this problem. + ippvars = os.path.join(self.prefix.ipp.bin, 'ippvars.sh') - ipp_dir = os.path.join(self.intel_prefix, "ipp") - for f in os.listdir(ipp_dir): - os.symlink(os.path.join(ipp_dir, f), os.path.join(self.prefix, f)) + if os.path.isfile(ippvars): + run_env.extend(EnvironmentModifications.from_sourcing_file( + ippvars, 'intel64')) diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index 4eaf50dea5..1cc3c00af2 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -22,13 +22,13 @@ # 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 -from spack.pkg.builtin.intel import IntelInstaller +from spack import * +from spack.environment import EnvironmentModifications -class IntelMkl(IntelInstaller): +class IntelMkl(IntelPackage): """Intel Math Kernel Library.""" homepage = "https://software.intel.com/en-us/intel-mkl" @@ -50,12 +50,21 @@ class IntelMkl(IntelInstaller): variant('ilp64', default=False, description='64 bit integers') variant('openmp', default=False, description='OpenMP multithreading layer') - # virtual dependency provides('blas') provides('lapack') provides('scalapack') provides('mkl') + @property + def license_required(self): + # The Intel libraries are provided without requiring a license as of + # version 2017.2. Trying to specify the license will fail. See: + # https://software.intel.com/en-us/articles/free-ipsxe-tools-and-libraries + if self.version >= Version('2017.2'): + return False + else: + return True + @property def blas_libs(self): spec = self.spec @@ -69,15 +78,27 @@ class IntelMkl(IntelInstaller): mkl_threading = ['libmkl_sequential'] + omp_libs = LibraryList([]) + if '+openmp' in spec: if '%intel' in spec: - mkl_threading = ['libmkl_intel_thread', 'libiomp5'] - else: + mkl_threading = ['libmkl_intel_thread'] + omp_threading = ['libiomp5'] + + omp_root = prefix.compilers_and_libraries.linux.lib.intel64 + omp_libs = find_libraries( + omp_threading, root=omp_root, shared=shared) + elif '%gcc' in spec: mkl_threading = ['libmkl_gnu_thread'] + gcc = Executable(self.compiler.cc) + libgomp = gcc('--print-file-name', 'libgomp.{0}'.format( + dso_suffix), output=str) + omp_libs = LibraryList(libgomp) + # TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++'] - mkl_root = join_path(prefix.lib, 'intel64') + mkl_root = prefix.compilers_and_libraries.linux.mkl.lib.intel64 mkl_libs = find_libraries( mkl_integer + ['libmkl_core'] + mkl_threading, @@ -91,7 +112,7 @@ class IntelMkl(IntelInstaller): shared=shared ) - return mkl_libs + system_libs + return mkl_libs + omp_libs + system_libs @property def lapack_libs(self): @@ -120,30 +141,46 @@ class IntelMkl(IntelInstaller): elif '^intel-mpi' in root: libnames.append('libmkl_blacs_intelmpi') else: - raise InstallError("No MPI found for scalapack") + raise InstallError('No MPI found for scalapack') - shared = True if '+shared' in self.spec else False integer = 'ilp64' if '+ilp64' in self.spec else 'lp64' + mkl_root = self.prefix.compilers_and_libraries.linux.mkl.lib.intel64 + shared = True if '+shared' in self.spec else False + libs = find_libraries( ['{0}_{1}'.format(l, integer) for l in libnames], - root=join_path(self.prefix.lib, 'intel64'), + root=mkl_root, shared=shared ) - return libs - - def install(self, spec, prefix): - self.intel_prefix = os.path.join(prefix, "pkg") - IntelInstaller.install(self, spec, prefix) - mkl_dir = os.path.join(self.intel_prefix, "mkl") - for f in os.listdir(mkl_dir): - os.symlink(os.path.join(mkl_dir, f), os.path.join(self.prefix, f)) + return libs def setup_dependent_environment(self, spack_env, run_env, dependent_spec): # set up MKLROOT for everyone using MKL package + mkl_root = self.prefix.compilers_and_libraries.linux.mkl.lib.intel64 + spack_env.set('MKLROOT', self.prefix) - spack_env.append_path('SPACK_COMPILER_EXTRA_RPATHS', - join_path(self.prefix.lib, 'intel64')) + spack_env.append_path('SPACK_COMPILER_EXTRA_RPATHS', mkl_root) def setup_environment(self, spack_env, run_env): - run_env.set('MKLROOT', self.prefix) + """Adds environment variables to the generated module file. + + These environment variables come from running: + + .. code-block:: console + + $ source mkl/bin/mklvars.sh intel64 + """ + # NOTE: Spack runs setup_environment twice, once pre-build to set up + # the build environment, and once post-installation to determine + # the environment variables needed at run-time to add to the module + # file. The script we need to source is only present post-installation, + # so check for its existence before sourcing. + # TODO: At some point we should split setup_environment into + # setup_build_environment and setup_run_environment to get around + # this problem. + mklvars = os.path.join(self.prefix.mkl.bin, 'mklvars.sh') + + if os.path.isfile(mklvars): + run_env.extend(EnvironmentModifications.from_sourcing_file( + mklvars, 'intel64')) diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py index d0167552b0..b9aaf12c1c 100644 --- a/var/spack/repos/builtin/packages/intel-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-mpi/package.py @@ -22,30 +22,41 @@ # 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 -from spack.pkg.builtin.intel import IntelInstaller +from spack import * +from spack.environment import EnvironmentModifications -class IntelMpi(IntelInstaller): +class IntelMpi(IntelPackage): """Intel MPI""" homepage = "https://software.intel.com/en-us/intel-mpi-library" - version('2017.3', '721ecd5f6afa385e038777e5b5361dfb', + version('2017.3.196', '721ecd5f6afa385e038777e5b5361dfb', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11595/l_mpi_2017.3.196.tgz') - version('2017.2', 'b6c2e62c3fb9b1558ede72ccf72cf1d6', + version('2017.2.174', 'b6c2e62c3fb9b1558ede72ccf72cf1d6', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11334/l_mpi_2017.2.174.tgz') - version('2017.1', 'd5e941ac2bcf7c5576f85f6bcfee4c18', + version('2017.1.132', 'd5e941ac2bcf7c5576f85f6bcfee4c18', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11014/l_mpi_2017.1.132.tgz') - version('5.1.3', '4316e78533a932081b1a86368e890800', + version('5.1.3.223', '4316e78533a932081b1a86368e890800', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9278/l_mpi_p_5.1.3.223.tgz') provides('mpi') + @property + def license_required(self): + # The Intel libraries are provided without requiring a license as of + # version 2017.2. Trying to specify the license will fail. See: + # https://software.intel.com/en-us/articles/free-ipsxe-tools-and-libraries + if self.version >= Version('2017.2'): + return False + else: + return True + @property def mpi_libs(self): + mpi_root = self.prefix.compilers_and_libraries.linux.mpi.lib64 query_parameters = self.spec.last_query.extra_parameters libraries = ['libmpifort', 'libmpi'] @@ -53,19 +64,15 @@ class IntelMpi(IntelInstaller): libraries = ['libmpicxx'] + libraries return find_libraries( - libraries, root=self.prefix.lib64, shared=True, recurse=True + libraries, root=mpi_root, shared=True, recurse=True ) @property def mpi_headers(self): # recurse from self.prefix will find too many things for all the # supported sub-architectures like 'mic' - return find_headers( - 'mpi', root=self.prefix.include64, recurse=False) - - def install(self, spec, prefix): - self.intel_prefix = prefix - IntelInstaller.install(self, spec, prefix) + mpi_root = self.prefix.compilers_and_libraries.linux.mpi.include64 + return find_headers('mpi', root=mpi_root, recurse=False) def setup_dependent_environment(self, spack_env, run_env, dependent_spec): spack_env.set('I_MPI_CC', spack_cc) @@ -75,15 +82,52 @@ class IntelMpi(IntelInstaller): spack_env.set('I_MPI_FC', spack_fc) def setup_dependent_package(self, module, dep_spec): - # Check for presence of bin64 or bin directory - if os.path.isdir(self.prefix.bin): - bindir = self.prefix.bin - elif os.path.isdir(self.prefix.bin64): - bindir = self.prefix.bin64 + # Intel comes with 2 different flavors of MPI wrappers: + # + # * mpiicc, mpiicpc, and mpifort are hardcoded to wrap around + # the Intel compilers. + # * mpicc, mpicxx, mpif90, and mpif77 allow you to set which + # compilers to wrap using I_MPI_CC and friends. By default, + # wraps around the GCC compilers. + # + # In theory, these should be equivalent as long as I_MPI_CC + # and friends are set to point to the Intel compilers, but in + # practice, mpicc fails to compile some applications while + # mpiicc works. + bindir = self.prefix.compilers_and_libraries.linux.mpi.intel64.bin + + if self.compiler.name == 'intel': + self.spec.mpicc = bindir.mpiicc + self.spec.mpicxx = bindir.mpiicpc + self.spec.mpifc = bindir.mpiifort + self.spec.mpif77 = bindir.mpiifort else: - raise RuntimeError('No suitable bindir found') + self.spec.mpicc = bindir.mpicc + self.spec.mpicxx = bindir.mpicxx + self.spec.mpifc = bindir.mpif90 + self.spec.mpif77 = bindir.mpif77 + + def setup_environment(self, spack_env, run_env): + """Adds environment variables to the generated module file. + + These environment variables come from running: + + .. code-block:: console + + $ source compilers_and_libraries/linux/mpi/intel64/bin/mpivars.sh + """ + # NOTE: Spack runs setup_environment twice, once pre-build to set up + # the build environment, and once post-installation to determine + # the environment variables needed at run-time to add to the module + # file. The script we need to source is only present post-installation, + # so check for its existence before sourcing. + # TODO: At some point we should split setup_environment into + # setup_build_environment and setup_run_environment to get around + # this problem. + mpivars = os.path.join( + self.prefix.compilers_and_libraries.linux.mpi.intel64.bin, + 'mpivars.sh') - self.spec.mpicc = join_path(bindir, 'mpicc') - self.spec.mpicxx = join_path(bindir, 'mpicxx') - self.spec.mpifc = join_path(bindir, 'mpif90') - self.spec.mpif77 = join_path(bindir, 'mpif77') + if os.path.isfile(mpivars): + run_env.extend(EnvironmentModifications.from_sourcing_file( + mpivars)) diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py index 531b29b986..12a3f15f26 100644 --- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py +++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py @@ -22,30 +22,29 @@ # 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 glob import os -import re -from spack.pkg.builtin.intel import IntelInstaller, filter_pick, \ - get_all_components +from spack import * +from spack.environment import EnvironmentModifications -class IntelParallelStudio(IntelInstaller): +class IntelParallelStudio(IntelPackage): """Intel Parallel Studio.""" homepage = "https://software.intel.com/en-us/intel-parallel-studio-xe" version('professional.2017.4', '27398416078e1e4005afced3e9a6df7e', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11537/parallel_studio_xe_2017_update4.tgz') - version('cluster.2017.4', '27398416078e1e4005afced3e9a6df7e', + version('cluster.2017.4', '27398416078e1e4005afced3e9a6df7e', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11537/parallel_studio_xe_2017_update4.tgz') - version('composer.2017.4', 'd03d351809e182c481dc65e07376d9a2', + version('composer.2017.4', 'd03d351809e182c481dc65e07376d9a2', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11541/parallel_studio_xe_2017_update4_composer_edition.tgz') version('professional.2017.3', '691874735458d3e88fe0bcca4438b2a9', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11460/parallel_studio_xe_2017_update3.tgz') - version('cluster.2017.3', '691874735458d3e88fe0bcca4438b2a9', + version('cluster.2017.3', '691874735458d3e88fe0bcca4438b2a9', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11460/parallel_studio_xe_2017_update3.tgz') - version('composer.2017.3', '52344df122c17ddff3687f84ceb21623', + version('composer.2017.3', '52344df122c17ddff3687f84ceb21623', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11464/parallel_studio_xe_2017_update3_composer_edition.tgz') version('professional.2017.2', '70e54b33d940a1609ff1d35d3c56e3b3', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11298/parallel_studio_xe_2017_update2.tgz') @@ -90,34 +89,64 @@ class IntelParallelStudio(IntelInstaller): version('composer.2015.6', 'da9f8600c18d43d58fba0488844f79c9', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/8432/l_compxe_2015.6.233.tgz') - variant('rpath', default=True, description="Add rpath to .cfg files") + # Generic Variants + variant('rpath', default=True, + description='Add rpath to .cfg files') variant('newdtags', default=False, - description="Allow use of --enable-new-dtags in MPI wrappers") - variant('all', default=False, - description="Install all files with the requested edition") - variant('mpi', default=True, - description="Install the Intel MPI library and ITAC tool") - variant('mkl', default=True, description="Install the Intel MKL library") - variant('daal', - default=True, description="Install the Intel DAAL libraries") - variant('ipp', default=True, description="Install the Intel IPP libraries") - variant('tools', default=True, description="Install the Intel Advisor, " - "VTune Amplifier, and Inspector tools") - - variant('shared', default=True, description='Builds shared library') - variant('ilp64', default=False, description='64 bit integers') - variant('openmp', default=False, description='OpenMP multithreading layer') - - provides('mpi', when='@cluster.0:cluster.9999+mpi') - provides('mkl', when='+mkl') + description='Allow use of --enable-new-dtags in MPI wrappers') + variant('shared', default=True, + description='Builds shared library') + variant('ilp64', default=False, + description='64 bit integers') + variant('openmp', default=False, + description='OpenMP multithreading layer') + + # Components available in all editions + variant('daal', default=True, + description='Install the Intel DAAL libraries') + variant('gdb', default=False, + description='Install the Intel Debugger for Heterogeneous Compute') + variant('ipp', default=True, + description='Install the Intel IPP libraries') + variant('mkl', default=True, + description='Install the Intel MKL library') + variant('mpi', default=True, + description='Install the Intel MPI library') + variant('tbb', default=True, + description='Install the Intel TBB libraries') + + # Components only available in the Professional and Cluster Editions + variant('advisor', default=False, + description='Install the Intel Advisor') + variant('clck', default=False, + description='Install the Intel Cluster Checker') + variant('inspector', default=False, + description='Install the Intel Inspector') + variant('itac', default=False, + description='Install the Intel Trace Analyzer and Collector') + variant('vtune', default=False, + description='Install the Intel VTune Amplifier XE') + provides('daal', when='+daal') + provides('ipp', when='+ipp') - # virtual dependency - provides('blas', when='+mkl') - provides('lapack', when='+mkl') + provides('mkl', when='+mkl') + provides('blas', when='+mkl') + provides('lapack', when='+mkl') provides('scalapack', when='+mkl') + provides('mpi', when='+mpi') + + provides('tbb', when='+tbb') + + # The following components are not available in the Composer Edition + conflicts('+advisor', when='@composer.0:composer.9999') + conflicts('+clck', when='@composer.0:composer.9999') + conflicts('+inspector', when='@composer.0:composer.9999') + conflicts('+itac', when='@composer.0:composer.9999') + conflicts('+vtune', when='@composer.0:composer.9999') + @property def blas_libs(self): spec = self.spec @@ -131,15 +160,27 @@ class IntelParallelStudio(IntelInstaller): mkl_threading = ['libmkl_sequential'] + omp_libs = LibraryList([]) + if '+openmp' in spec: if '%intel' in spec: - mkl_threading = ['libmkl_intel_thread', 'libiomp5'] - else: + mkl_threading = ['libmkl_intel_thread'] + omp_threading = ['libiomp5'] + + omp_root = prefix.compilers_and_libraries.linux.lib.intel64 + omp_libs = find_libraries( + omp_threading, root=omp_root, shared=shared) + elif '%gcc' in spec: mkl_threading = ['libmkl_gnu_thread'] + gcc = Executable(self.compiler.cc) + omp_libs = gcc('--print-file-name', 'libgomp.{0}'.format( + dso_suffix), output=str) + omp_libs = LibraryList(omp_libs) + # TODO: TBB threading: ['libmkl_tbb_thread', 'libtbb', 'libstdc++'] - mkl_root = join_path(prefix, 'mkl', 'lib', 'intel64') + mkl_root = prefix.compilers_and_libraries.linux.mkl.lib.intel64 mkl_libs = find_libraries( mkl_integer + ['libmkl_core'] + mkl_threading, @@ -153,7 +194,7 @@ class IntelParallelStudio(IntelInstaller): shared=shared ) - return mkl_libs + system_libs + return mkl_libs + omp_libs + system_libs @property def lapack_libs(self): @@ -176,109 +217,182 @@ class IntelParallelStudio(IntelInstaller): # elif self.spec.satisfies('^intel-parallel-studio'): # libnames.append('libmkl_blacs_intelmpi') else: - raise InstallError("No MPI found for scalapack") + raise InstallError('No MPI found for scalapack') - shared = True if '+shared' in self.spec else False integer = 'ilp64' if '+ilp64' in self.spec else 'lp64' + mkl_root = self.prefix.compilers_and_libraries.linux.mkl.lib.intel64 + shared = True if '+shared' in self.spec else False + libs = find_libraries( ['{0}_{1}'.format(l, integer) for l in libnames], - root=join_path(self.prefix, 'mkl', 'lib', 'intel64'), + root=mkl_root, shared=shared ) return libs - def install(self, spec, prefix): - base_components = "ALL" # when in doubt, install everything - mpi_components = "" - mkl_components = "" - daal_components = "" - ipp_components = "" - - if not spec.satisfies('+all'): - all_components = get_all_components() - regex = '(comp|openmp|intel-tbb|icc|ifort|psxe)' - base_components = \ - filter_pick(all_components, re.compile(regex).search) - regex = '(icsxe|imb|mpi|itac|intel-ta|intel-tc|clck)' - mpi_components = \ - filter_pick(all_components, re.compile(regex).search) - mkl_components = \ - filter_pick(all_components, re.compile('(mkl)').search) - daal_components = \ - filter_pick(all_components, re.compile('(daal)').search) - ipp_components = \ - filter_pick(all_components, re.compile('(ipp)').search) - regex = '(gdb|vtune|inspector|advisor)' - tool_components = \ - filter_pick(all_components, re.compile(regex).search) - components = base_components - - if not spec.satisfies('+all'): - if spec.satisfies('+mpi'): - components += mpi_components - if spec.satisfies('+mkl'): - components += mkl_components - if spec.satisfies('+daal'): - components += daal_components - if spec.satisfies('+ipp'): - components += ipp_components - if spec.satisfies('+tools') and (spec.satisfies('@cluster') or - spec.satisfies('@professional')): - components += tool_components - - if spec.satisfies('+all'): - self.intel_components = 'ALL' - else: - self.intel_components = ';'.join(components) - IntelInstaller.install(self, spec, prefix) - - absbindir = os.path.dirname( - os.path.realpath(os.path.join(self.prefix.bin, "icc"))) - abslibdir = os.path.dirname( - os.path.realpath(os.path.join( - self.prefix.lib, "intel64", "libimf.a"))) - - os.symlink(self.global_license_file, os.path.join(absbindir, - "license.lic")) - if spec.satisfies('+tools') and (spec.satisfies('@cluster') or - spec.satisfies('@professional')): - inspector_dir = "inspector_xe/licenses" - advisor_dir = "advisor_xe/licenses" - vtune_amplifier_dir = "vtune_amplifier_xe/licenses" - - year = int(str(self.version).split('.')[1]) + @property + def mpi_libs(self): + mpi_root = self.prefix.compilers_and_libraries.linux.mpi.lib64 + query_parameters = self.spec.last_query.extra_parameters + libraries = ['libmpifort', 'libmpi'] + + if 'cxx' in query_parameters: + libraries = ['libmpicxx'] + libraries + + return find_libraries( + libraries, root=mpi_root, shared=True, recurse=True + ) + + @property + def mpi_headers(self): + # recurse from self.prefix will find too many things for all the + # supported sub-architectures like 'mic' + mpi_root = self.prefix.compilers_and_libraries.linux.mpi.include64 + return find_headers('mpi', root=mpi_root, recurse=False) + + @property + def components(self): + spec = self.spec + edition = self.version[0] + + # Intel(R) Compilers + components = [ + # Common files + 'intel-comp-', + 'intel-openmp', + + # C/C++ + 'intel-icc', + + # Fortran + 'intel-ifort', + + # Parallel Studio Documentation and Licensing Files + 'intel-psxe', + ] + + # Intel(R) Parallel Studio XE Suite Files and Documentation + if edition == 'cluster': + components.append('intel-icsxe') + elif edition == 'professional': + components.extend(['intel-ips', 'intel-ipsc', 'intel-ipsf']) + elif edition == 'composer': + components.extend([ + 'intel-compxe', 'intel-ccompxe', 'intel-fcompxe' + ]) + + # Intel(R) Data Analytics Acceleration Library + if '+daal' in spec: + components.append('intel-daal') + + # Intel(R) Debugger for Heterogeneous Compute + if '+gdb' in spec: + components.append('intel-gdb') + + # Intel(R) Integrated Performance Primitives + if '+ipp' in spec: + components.extend(['intel-ipp', 'intel-crypto-ipp']) + + # Intel(R) Math Kernel Library + if '+mkl' in spec: + components.append('intel-mkl') + + # Intel(R) MPI Library + if '+mpi' in spec: + components.extend(['intel-mpi', 'intel-mpirt', 'intel-imb']) + + # Intel(R) Threading Building Blocks + if '+tbb' in spec: + components.append('intel-tbb') + + # Intel(R) Advisor + if '+advisor' in spec: + components.append('intel-advisor') + + # Intel(R) Cluster Checker + if '+clck' in spec: + components.append('intel_clck') + + # Intel(R) Inspector + if '+inspector' in spec: + components.append('intel-inspector') + + # Intel(R) Trace Analyzer and Collector + if '+itac' in spec: + components.extend(['intel-itac', 'intel-ta', 'intel-tc']) + + # Intel(R) VTune(TM) Amplifier XE + if '+vtune' in spec: + components.append('intel-vtune-amplifier-xe') + + return components + + @property + def bin_dir(self): + """The relative path to the bin directory with symlinks resolved.""" + + bin_path = os.path.join(self.prefix.bin, 'icc') + absolute_path = os.path.realpath(bin_path) # resolve symlinks + relative_path = os.path.relpath(absolute_path, self.prefix) + return os.path.dirname(relative_path) + + @property + def lib_dir(self): + """The relative path to the lib directory with symlinks resolved.""" + + lib_path = os.path.join(self.prefix.lib, 'intel64', 'libimf.a') + absolute_path = os.path.realpath(lib_path) # resolve symlinks + relative_path = os.path.relpath(absolute_path, self.prefix) + return os.path.dirname(relative_path) + + @property + def license_files(self): + spec = self.spec + year = self.version[1] + + directories = [ + 'Licenses', + self.bin_dir + ] + + if '+advisor' in spec: + advisor_dir = 'advisor_xe/licenses' + + if year >= 2017: + advisor_dir = 'advisor/licenses' + + directories.append(advisor_dir) + + if '+inspector' in spec: + inspector_dir = 'inspector_xe/licenses' + if year >= 2017: - inspector_dir = "inspector/licenses" - advisor_dir = "advisor/licenses" - - os.mkdir(os.path.join(self.prefix, inspector_dir)) - os.symlink(self.global_license_file, os.path.join( - self.prefix, inspector_dir, "license.lic")) - os.mkdir(os.path.join(self.prefix, advisor_dir)) - os.symlink(self.global_license_file, os.path.join( - self.prefix, advisor_dir, "license.lic")) - os.mkdir(os.path.join(self.prefix, vtune_amplifier_dir)) - os.symlink(self.global_license_file, os.path.join( - self.prefix, vtune_amplifier_dir, "license.lic")) - - if (spec.satisfies('+all') or spec.satisfies('+mpi')) and \ - spec.satisfies('@cluster'): - for ifile in os.listdir(os.path.join(self.prefix, "itac")): - if os.path.isdir(os.path.join(self.prefix, "itac", ifile)): - os.symlink(self.global_license_file, - os.path.join(self.prefix, "itac", ifile, - "license.lic")) - if os.path.isdir(os.path.join(self.prefix, "itac", - ifile, "intel64")): - os.symlink(self.global_license_file, - os.path.join(self.prefix, "itac", - ifile, "intel64", - "license.lic")) - if spec.satisfies('~newdtags'): - wrappers = ["mpif77", "mpif77", "mpif90", "mpif90", - "mpigcc", "mpigcc", "mpigxx", "mpigxx", - "mpiicc", "mpiicc", "mpiicpc", "mpiicpc", - "mpiifort", "mpiifort"] + inspector_dir = 'inspector/licenses' + + directories.append(inspector_dir) + + if '+itac' in spec: + itac_dir = 'itac_{0}'.format(year) + + directories.append(itac_dir) + + if '+vtune' in spec: + vtune_dir = 'vtune_amplifier_xe/licenses' + + directories.append(vtune_dir) + + return [os.path.join(dir, 'license.lic') for dir in directories] + + @run_after('install') + def filter_compiler_wrappers(self): + spec = self.spec + + if '+mpi' in spec: + if '~newdtags' in spec: + wrappers = [ + 'mpif77', 'mpif90', 'mpigcc', 'mpigxx', + 'mpiicc', 'mpiicpc', 'mpiifort' + ] wrapper_paths = [] for root, dirs, files in os.walk(spec.prefix): for name in files: @@ -286,153 +400,95 @@ class IntelParallelStudio(IntelInstaller): wrapper_paths.append(os.path.join(spec.prefix, root, name)) for wrapper in wrapper_paths: - filter_file(r'-Xlinker --enable-new-dtags', r' ', - wrapper) + filter_file('-Xlinker --enable-new-dtags', ' ', + wrapper, string=True) - if spec.satisfies('+rpath'): - for compiler_command in ["icc", "icpc", "ifort"]: - cfgfilename = os.path.join(absbindir, "%s.cfg" % - compiler_command) - with open(cfgfilename, "w") as f: - f.write('-Xlinker -rpath -Xlinker %s\n' % abslibdir) + @run_after('install') + def rpath_configuration(self): + spec = self.spec - os.symlink(os.path.join(self.prefix.man, "common", "man1"), - os.path.join(self.prefix.man, "man1")) + if '+rpath' in spec: + lib_dir = os.path.join(self.prefix, self.lib_dir) + for compiler in ['icc', 'icpc', 'ifort']: + cfgfilename = os.path.join( + self.prefix, self.bin_dir, '{0}.cfg'.format(compiler)) + with open(cfgfilename, 'w') as f: + f.write('-Xlinker -rpath -Xlinker {0}\n'.format(lib_dir)) - def setup_environment(self, spack_env, run_env): - # TODO: Determine variables needed for the professional edition. - - major_ver = self.version[1] - - # Remove paths that were guessed but are incorrect for this package. - run_env.remove_path('LIBRARY_PATH', - join_path(self.prefix, 'lib')) - run_env.remove_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'lib')) - run_env.remove_path('CPATH', - join_path(self.prefix, 'include')) - - # Add the default set of variables - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'lib', 'intel64')) - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'lib', 'intel64')) - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', - 'intel64', 'gcc4.4')) - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', - 'intel64', 'gcc4.4')) - run_env.prepend_path('CPATH', - join_path(self.prefix, 'tbb', 'include')) - run_env.prepend_path('MIC_LIBRARY_PATH', - join_path(self.prefix, 'lib', 'mic')) - run_env.prepend_path('MIC_LD_LIBRARY_PATH', - join_path(self.prefix, 'lib', 'mic')) - run_env.prepend_path('MIC_LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', 'mic')) - run_env.prepend_path('MIC_LD_LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', 'mic')) - - if self.spec.satisfies('+all'): - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, - 'debugger_{0}'.format(major_ver), - 'libipt', 'intel64', 'lib')) - run_env.set('GDBSERVER_MIC', - join_path(self.prefix, - 'debugger_{0}'.format(major_ver), 'gdb', - 'targets', 'mic', 'bin', 'gdbserver')) - run_env.set('GDB_CROSS', - join_path(self.prefix, - 'debugger_{0}'.format(major_ver), - 'gdb', 'intel64_mic', 'bin', 'gdb-mic')) - run_env.set('MPM_LAUNCHER', - join_path(self.prefix, - 'debugger_{0}'.format(major_ver), 'mpm', - 'mic', - 'bin', 'start_mpm.sh')) - run_env.set('INTEL_PYTHONHOME', - join_path(self.prefix, - 'debugger_{0}'.format(major_ver), 'python', - 'intel64')) - - if (self.spec.satisfies('+all') or self.spec.satisfies('+mpi')): - # Only I_MPI_ROOT is set here because setting the various PATH - # variables will potentially be in conflict with other MPI - # environment modules. The I_MPI_ROOT environment variable can be - # used as a base to set necessary PATH variables for using Intel - # MPI. It is also possible to set the variables in the modules.yaml - # file if Intel MPI is the dominant, or only, MPI on a system. - run_env.set('I_MPI_ROOT', join_path(self.prefix, 'impi')) - - if self.spec.satisfies('+all') or self.spec.satisfies('+mkl'): - spack_env.set('MKLROOT', join_path(self.prefix, 'mkl')) - - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'mkl', 'lib', - 'intel64')) - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'mkl', 'lib', - 'intel64')) - run_env.prepend_path('CPATH', - join_path(self.prefix, 'mkl', 'include')) - run_env.prepend_path('MIC_LD_LIBRARY_PATH', - join_path(self.prefix, 'mkl', 'lib', 'mic')) - run_env.set('MKLROOT', join_path(self.prefix, 'mkl')) - - if self.spec.satisfies('+all') or self.spec.satisfies('+daal'): - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'daal', 'lib', - 'intel64_lin')) - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'daal', 'lib', - 'intel64_lin')) - run_env.prepend_path('CPATH', - join_path(self.prefix, 'daal', 'include')) - run_env.prepend_path('CLASSPATH', - join_path(self.prefix, 'daal', 'lib', - 'daal.jar')) - run_env.set('DAALROOT', join_path(self.prefix, 'daal')) - - if self.spec.satisfies('+all') or self.spec.satisfies('+ipp'): - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'ipp', 'lib', - 'intel64')) - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'ipp', 'lib', - 'intel64')) - run_env.prepend_path('CPATH', - join_path(self.prefix, 'ipp', 'include')) - run_env.prepend_path('MIC_LD_LIBRARY_PATH', - join_path(self.prefix, 'ipp', 'lib', 'mic')) - run_env.set('IPPROOT', join_path(self.prefix, 'ipp')) - - if self.spec.satisfies('+all') or self.spec.satisfies('+tools'): - run_env.prepend_path('PATH', - join_path(self.prefix, 'vtune_amplifier_xe', - 'bin64')) - run_env.prepend_path('VTUNE_AMPLIFIER_XE_{0}_DIR'.format( - major_ver), - join_path(self.prefix, 'vtune_amplifier_xe')) + @run_after('install') + def fix_psxevars(self): + """Newer versions of Intel Parallel Studio have a bug in the + ``psxevars.sh`` script.""" + + bindir = glob.glob(join_path( + self.prefix, 'parallel_studio*', 'bin'))[0] + + filter_file('^SCRIPTPATH=.*', 'SCRIPTPATH={0}'.format(self.prefix), + os.path.join(bindir, 'psxevars.sh'), + os.path.join(bindir, 'psxevars.csh')) def setup_dependent_environment(self, spack_env, run_env, dependent_spec): - spack_env.set('I_MPI_CC', spack_cc) - spack_env.set('I_MPI_CXX', spack_cxx) - spack_env.set('I_MPI_F77', spack_fc) - spack_env.set('I_MPI_F90', spack_f77) - spack_env.set('I_MPI_FC', spack_fc) + if '+mpi' in self.spec: + spack_env.set('I_MPI_CC', spack_cc) + spack_env.set('I_MPI_CXX', spack_cxx) + spack_env.set('I_MPI_F77', spack_fc) + spack_env.set('I_MPI_F90', spack_f77) + spack_env.set('I_MPI_FC', spack_fc) + + # set up MKLROOT for everyone using MKL package + if '+mkl' in self.spec: + mkl_root = self.prefix.compilers_and_libraries.linux.mkl.lib.intel64 # noqa + + spack_env.set('MKLROOT', self.prefix) + spack_env.append_path('SPACK_COMPILER_EXTRA_RPATHS', mkl_root) def setup_dependent_package(self, module, dep_spec): - # Check for presence of bin64 or bin directory - if os.path.isdir(self.prefix.bin): - bindir = self.prefix.bin - elif os.path.isdir(self.prefix.bin64): - bindir = self.prefix.bin64 - else: - raise RuntimeError('No suitable bindir found') + if '+mpi' in self.spec: + # Intel comes with 2 different flavors of MPI wrappers: + # + # * mpiicc, mpiicpc, and mpifort are hardcoded to wrap around + # the Intel compilers. + # * mpicc, mpicxx, mpif90, and mpif77 allow you to set which + # compilers to wrap using I_MPI_CC and friends. By default, + # wraps around the GCC compilers. + # + # In theory, these should be equivalent as long as I_MPI_CC + # and friends are set to point to the Intel compilers, but in + # practice, mpicc fails to compile some applications while + # mpiicc works. + bindir = self.prefix.compilers_and_libraries.linux.mpi.intel64.bin + + if self.compiler.name == 'intel': + self.spec.mpicc = bindir.mpiicc + self.spec.mpicxx = bindir.mpiicpc + self.spec.mpifc = bindir.mpiifort + self.spec.mpif77 = bindir.mpiifort + else: + self.spec.mpicc = bindir.mpicc + self.spec.mpicxx = bindir.mpicxx + self.spec.mpifc = bindir.mpif90 + self.spec.mpif77 = bindir.mpif77 - self.spec.mpicc = join_path(bindir, 'mpicc') - self.spec.mpicxx = join_path(bindir, 'mpic++') - self.spec.mpifc = join_path(bindir, 'mpif90') - self.spec.mpif77 = join_path(bindir, 'mpif77') + def setup_environment(self, spack_env, run_env): + """Adds environment variables to the generated module file. + + These environment variables come from running: + + .. code-block:: console + + $ source parallel_studio_xe_2017/bin/psxevars.sh intel64 + """ + # NOTE: Spack runs setup_environment twice, once pre-build to set up + # the build environment, and once post-installation to determine + # the environment variables needed at run-time to add to the module + # file. The script we need to source is only present post-installation, + # so check for its existence before sourcing. + # TODO: At some point we should split setup_environment into + # setup_build_environment and setup_run_environment to get around + # this problem. + psxevars = glob.glob(join_path( + self.prefix, 'parallel_studio*', 'bin', 'psxevars.sh')) + + if psxevars: + run_env.extend(EnvironmentModifications.from_sourcing_file( + psxevars[0], 'intel64')) diff --git a/var/spack/repos/builtin/packages/intel-tbb/package.py b/var/spack/repos/builtin/packages/intel-tbb/package.py new file mode 100644 index 0000000000..6d5c2bbbb0 --- /dev/null +++ b/var/spack/repos/builtin/packages/intel-tbb/package.py @@ -0,0 +1,117 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 glob + + +class IntelTbb(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 + # can also use https://github.com/01org/tbb/releases/ + version('2017.6', '5b0909fbb1741724f7a0ce83232f50b166788af0', + url='https://github.com/01org/tbb/archive/2017_U6.tar.gz') + version('2017.5', '26f720729d322913912e99d1e4a36bd10625d3ca', + url='https://github.com/01org/tbb/archive/2017_U5.tar.gz') + version('2017.3', '2c451a5bcf6fc31487b98b4b29651c369874277c', + url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb2017_20161128oss_src.tgz') + version('4.4.4', 'd4cee5e4ca75cab5181834877738619c56afeb71', + url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160413oss_src.tgz') + version('4.4.3', '80707e277f69d9b20eeebdd7a5f5331137868ce1', + url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160128oss_src_0.tgz') + + provides('tbb') + + 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): + if spec.satisfies('%gcc@6.1:') and spec.satisfies('@:4.4.3'): + raise InstallError('Only TBB 4.4.4 and above build with GCC 6.1!') + + # 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) diff --git a/var/spack/repos/builtin/packages/intel/package.py b/var/spack/repos/builtin/packages/intel/package.py index 70c8453d49..8024a5ebea 100644 --- a/var/spack/repos/builtin/packages/intel/package.py +++ b/var/spack/repos/builtin/packages/intel/package.py @@ -22,102 +22,13 @@ # 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 -import re - - -def filter_pick(input_list, regex_filter): - """Returns the items in input_list that are found in the regex_filter""" - return [l for l in input_list for m in (regex_filter(l),) if m] - - -def unfilter_pick(input_list, regex_filter): - """Returns the items in input_list that are not found in the - regex_filter""" - return [l for l in input_list for m in (regex_filter(l),) if not m] - - -def get_all_components(): - """Returns a list of all the components associated with the downloaded - Intel package""" - all_components = [] - with open("pset/mediaconfig.xml", "r") as f: - lines = f.readlines() - for line in lines: - if line.find('') != -1: - component = line[line.find('') + 6:line.find('')] - all_components.append(component) - return all_components - -class IntelInstaller(Package): - """Base package containing common methods for installing Intel software""" - - homepage = "https://software.intel.com/en-us" - intel_components = "ALL" - license_comment = '#' - license_files = ['Licenses/license.lic'] - license_vars = ['INTEL_LICENSE_FILE'] - license_url = \ - 'https://software.intel.com/en-us/articles/intel-license-manager-faq' +from spack import * +from spack.environment import EnvironmentModifications - @property - def license_required(self): - # The Intel libraries are provided without requiring a license as of - # version 2017.2. Trying to specify the license will fail. See - # https://software.intel.com/en-us/articles/free-mkl - if (self.spec.satisfies("intel-mkl@2017.2:") or - self.spec.satisfies("intel-daal@2017.2:") or - self.spec.satisfies("intel-mpi@2017.2:") or - self.spec.satisfies("intel-ipp@2017.2:")): - return False - return True - @property - def global_license_file(self): - """Returns the path where a global license file should be stored.""" - if not self.license_files: - return - return join_path(self.global_license_dir, "intel", - os.path.basename(self.license_files[0])) - - def install(self, spec, prefix): - - if not hasattr(self, "intel_prefix"): - self.intel_prefix = self.prefix - - silent_config_filename = 'silent.cfg' - with open(silent_config_filename, 'w') as f: - f.write(""" -ACCEPT_EULA=accept -PSET_MODE=install -CONTINUE_WITH_INSTALLDIR_OVERWRITE=yes -PSET_INSTALL_DIR=%s -NONRPM_DB_DIR=%s -CONTINUE_WITH_OPTIONAL_ERROR=yes -COMPONENTS=%s -""" % (self.intel_prefix, self.intel_prefix, self.intel_components)) - - # The Intel libraries are provided without requiring a license as of - # version 2017.2. Trying to specify the license will fail. See - # https://software.intel.com/en-us/articles/free-mkl - if not (spec.satisfies("intel-mkl@2017.2:") or - spec.satisfies("intel-daal@2017.2:") or - spec.satisfies("intel-mpi@2017.2:") or - spec.satisfies("intel-ipp@2017.2:")): - with open(silent_config_filename, 'a') as f: - f.write(""" -ACTIVATION_LICENSE_FILE=%s -ACTIVATION_TYPE=license_file -PHONEHOME_SEND_USAGE_DATA=no -""" % (self.global_license_file)) - - install_script = Executable("./install.sh") - install_script('--silent', silent_config_filename) - - -class Intel(IntelInstaller): +class Intel(IntelPackage): """Intel Compilers.""" homepage = "https://software.intel.com/en-us/intel-parallel-studio-xe" @@ -126,77 +37,72 @@ class Intel(IntelInstaller): url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11541/parallel_studio_xe_2017_update4_composer_edition.tgz') version('17.0.3', '52344df122c17ddff3687f84ceb21623', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11464/parallel_studio_xe_2017_update3_composer_edition.tgz') - version('17.0.2', '2891ab1ece43eb61b6ab892f07c47f01', + version('17.0.2', '2891ab1ece43eb61b6ab892f07c47f01', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/11302/parallel_studio_xe_2017_update2_composer_edition.tgz') - version('17.0.1', '1f31976931ed8ec424ac7c3ef56f5e85', + version('17.0.1', '1f31976931ed8ec424ac7c3ef56f5e85', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/10978/parallel_studio_xe_2017_update1_composer_edition.tgz') - version('17.0.0', 'b67da0065a17a05f110ed1d15c3c6312', + version('17.0.0', 'b67da0065a17a05f110ed1d15c3c6312', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9656/parallel_studio_xe_2017_composer_edition.tgz') - version('16.0.4', '2bc9bfc9be9c1968a6e42efb4378f40e', + version('16.0.4', '2bc9bfc9be9c1968a6e42efb4378f40e', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9785/parallel_studio_xe_2016_composer_edition_update4.tgz') - version('16.0.3', '3208eeabee951fc27579177b593cefe9', + version('16.0.3', '3208eeabee951fc27579177b593cefe9', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/9063/parallel_studio_xe_2016_composer_edition_update3.tgz') - version('16.0.2', '1133fb831312eb519f7da897fec223fa', + version('16.0.2', '1133fb831312eb519f7da897fec223fa', url='http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/8680/parallel_studio_xe_2016_composer_edition_update2.tgz') - variant('rpath', default=True, description="Add rpath to .cfg files") + variant('rpath', default=True, description='Add rpath to .cfg files') - def install(self, spec, prefix): - components = [] - all_components = get_all_components() - regex = '(comp|openmp|intel-tbb|icc|ifort|psxe|icsxe-pset)' - components = filter_pick(all_components, re.compile(regex).search) + components = [ + # Common files + 'intel-comp-', + 'intel-openmp', - self.intel_components = ';'.join(components) - IntelInstaller.install(self, spec, prefix) + # C/C++ + 'intel-icc', - absbindir = os.path.split(os.path.realpath(os.path.join( - self.prefix.bin, "icc")))[0] - abslibdir = os.path.split(os.path.realpath(os.path.join( - self.prefix.lib, "intel64", "libimf.a")))[0] + # Fortran + 'intel-ifort', + ] - # symlink or copy? - os.symlink(self.global_license_file, - os.path.join(absbindir, "license.lic")) - - if spec.satisfies('+rpath'): - for compiler_command in ["icc", "icpc", "ifort"]: - cfgfilename = os.path.join(absbindir, "%s.cfg" % - compiler_command) - with open(cfgfilename, "w") as f: - f.write('-Xlinker -rpath -Xlinker %s\n' % abslibdir) - - os.symlink(os.path.join(self.prefix.man, "common", "man1"), - os.path.join(self.prefix.man, "man1")) + @property + def license_files(self): + return [ + 'Licenses/license.lic', + join_path('compilers_and_libraries', 'linux', 'bin', + 'intel64', 'license.lic') + ] + + @run_after('install') + def rpath_configuration(self): + if '+rpath' in self.spec: + bin_dir = join_path(self.prefix, 'compilers_and_libraries', + 'linux', 'bin', 'intel64') + lib_dir = join_path(self.prefix, 'compilers_and_libraries', + 'linux', 'compiler', 'lib', 'intel64_lin') + for compiler in ['icc', 'icpc', 'ifort']: + cfgfilename = join_path(bin_dir, '{0}.cfg'.format(compiler)) + with open(cfgfilename, 'w') as f: + f.write('-Xlinker -rpath -Xlinker {0}\n'.format(lib_dir)) def setup_environment(self, spack_env, run_env): - - # Remove paths that were guessed but are incorrect for this package. - run_env.remove_path('LIBRARY_PATH', - join_path(self.prefix, 'lib')) - run_env.remove_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'lib')) - run_env.remove_path('CPATH', - join_path(self.prefix, 'include')) - - # Add the default set of variables - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'lib', 'intel64')) - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'lib', 'intel64')) - run_env.prepend_path('LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', - 'intel64', 'gcc4.4')) - run_env.prepend_path('LD_LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', - 'intel64', 'gcc4.4')) - run_env.prepend_path('CPATH', - join_path(self.prefix, 'tbb', 'include')) - run_env.prepend_path('MIC_LIBRARY_PATH', - join_path(self.prefix, 'lib', 'mic')) - run_env.prepend_path('MIC_LD_LIBRARY_PATH', - join_path(self.prefix, 'lib', 'mic')) - run_env.prepend_path('MIC_LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', 'mic')) - run_env.prepend_path('MIC_LD_LIBRARY_PATH', - join_path(self.prefix, 'tbb', 'lib', 'mic')) + """Adds environment variables to the generated module file. + + These environment variables come from running: + + .. code-block:: console + + $ source bin/compilervars.sh intel64 + """ + # NOTE: Spack runs setup_environment twice, once pre-build to set up + # the build environment, and once post-installation to determine + # the environment variables needed at run-time to add to the module + # file. The script we need to source is only present post-installation, + # so check for its existence before sourcing. + # TODO: At some point we should split setup_environment into + # setup_build_environment and setup_run_environment to get around + # this problem. + compilervars = os.path.join(self.prefix.bin, 'compilervars.sh') + + if os.path.isfile(compilervars): + run_env.extend(EnvironmentModifications.from_sourcing_file( + compilervars, 'intel64')) diff --git a/var/spack/repos/builtin/packages/tbb/package.py b/var/spack/repos/builtin/packages/tbb/package.py deleted file mode 100644 index a23ac23983..0000000000 --- a/var/spack/repos/builtin/packages/tbb/package.py +++ /dev/null @@ -1,115 +0,0 @@ -############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. -# Produced at the Lawrence Livermore National Laboratory. -# -# This file is part of Spack. -# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. -# LLNL-CODE-647188 -# -# For details, see https://github.com/llnl/spack -# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as -# published by the Free Software Foundation) version 2.1, 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 Lesser 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 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 - # can also use https://github.com/01org/tbb/releases/ - version('2017.6', '5b0909fbb1741724f7a0ce83232f50b166788af0', - url='https://github.com/01org/tbb/archive/2017_U6.tar.gz') - version('2017.5', '26f720729d322913912e99d1e4a36bd10625d3ca', - url='https://github.com/01org/tbb/archive/2017_U5.tar.gz') - version('2017.3', '2c451a5bcf6fc31487b98b4b29651c369874277c', - url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb2017_20161128oss_src.tgz') - version('4.4.4', 'd4cee5e4ca75cab5181834877738619c56afeb71', - url='https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb44_20160413oss_src.tgz') - 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): - if spec.satisfies('%gcc@6.1:') and spec.satisfies('@:4.4.3'): - raise InstallError('Only TBB 4.4.4 and above build with GCC 6.1!') - - # 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) -- cgit v1.2.3-70-g09d2 From 11b3ce27b7dbd76014955f36f8d6097498bf58be Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 16 Aug 2017 12:25:37 -0500 Subject: Add better generator support to CMakePackage (#4988) * Add better generator support to CMakePackage * List valid CMake generators on error --- lib/spack/spack/build_systems/cmake.py | 53 +++++++++++++++++++--- lib/spack/spack/package.py | 20 +++++++- var/spack/repos/builtin/packages/archer/package.py | 14 ++---- .../builtin/packages/llvm-openmp-ompt/package.py | 15 ++---- 4 files changed, 71 insertions(+), 31 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index db3240e8a5..f643320b10 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -30,12 +30,15 @@ import platform import spack.build_environment from llnl.util.filesystem import working_dir, join_path from spack.directives import depends_on, variant -from spack.package import PackageBase, run_after +from spack.package import PackageBase, InstallError, run_after class CMakePackage(PackageBase): """Specialized class for packages built using CMake + For more information on the CMake build system, see: + https://cmake.org/cmake/help/latest/ + This class provides three phases that can be overridden: 1. :py:meth:`~.CMakePackage.cmake` @@ -69,6 +72,16 @@ class CMakePackage(PackageBase): build_time_test_callbacks = ['check'] + #: The build system generator to use. + #: + #: See ``cmake --help`` for a list of valid generators. + #: Currently, "Unix Makefiles" and "Ninja" are the only generators + #: that Spack supports. Defaults to "Unix Makefiles". + #: + #: See https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html + #: for more information. + generator = 'Unix Makefiles' + # https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html variant('build_type', default='RelWithDebInfo', description='The build type to build', @@ -100,14 +113,31 @@ class CMakePackage(PackageBase): @staticmethod def _std_args(pkg): """Computes the standard cmake arguments for a generic package""" + try: + generator = pkg.generator + except AttributeError: + generator = 'Unix Makefiles' + + # Make sure a valid generator was chosen + valid_generators = ['Unix Makefiles', 'Ninja'] + if generator not in valid_generators: + msg = "Invalid CMake generator: '{0}'\n".format(generator) + msg += "CMakePackage currently supports the following " + msg += "generators: '{0}'".format("', '".join(valid_generators)) + raise InstallError(msg) + try: build_type = pkg.spec.variants['build_type'].value except KeyError: build_type = 'RelWithDebInfo' - args = ['-DCMAKE_INSTALL_PREFIX:PATH={0}'.format(pkg.prefix), - '-DCMAKE_BUILD_TYPE:STRING={0}'.format(build_type), - '-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON'] + args = [ + '-G', generator, + '-DCMAKE_INSTALL_PREFIX:PATH={0}'.format(pkg.prefix), + '-DCMAKE_BUILD_TYPE:STRING={0}'.format(build_type), + '-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON' + ] + if platform.mac_ver()[0]: args.append('-DCMAKE_FIND_FRAMEWORK:STRING=LAST') @@ -158,12 +188,18 @@ class CMakePackage(PackageBase): def build(self, spec, prefix): """Make the build targets""" with working_dir(self.build_directory): - inspect.getmodule(self).make(*self.build_targets) + if self.generator == 'Unix Makefiles': + inspect.getmodule(self).make(*self.build_targets) + elif self.generator == 'Ninja': + inspect.getmodule(self).ninja(*self.build_targets) def install(self, spec, prefix): """Make the install targets""" with working_dir(self.build_directory): - inspect.getmodule(self).make(*self.install_targets) + if self.generator == 'Unix Makefiles': + inspect.getmodule(self).make(*self.install_targets) + elif self.generator == 'Ninja': + inspect.getmodule(self).ninja(*self.install_targets) run_after('build')(PackageBase._run_default_build_time_test_callbacks) @@ -172,7 +208,10 @@ class CMakePackage(PackageBase): and runs it if found. """ with working_dir(self.build_directory): - self._if_make_target_execute('test') + if self.generator == 'Unix Makefiles': + self._if_make_target_execute('test') + elif self.generator == 'Ninja': + self._if_ninja_target_execute('test') # Check that self.prefix is there after installation run_after('install')(PackageBase.sanity_check_prefix) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 8c849573a7..cbf7d92ea6 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1091,12 +1091,30 @@ class PackageBase(with_metaclass(PackageMeta, object)): matches = [line for line in f.readlines() if regex.match(line)] if not matches: - tty.msg('Target \'' + target + ':\' not found in Makefile') + tty.msg("Target '" + target + ":' not found in Makefile") return # Execute target inspect.getmodule(self).make(target) + def _if_ninja_target_execute(self, target): + # Check if we have a ninja build script + if not os.path.exists('build.ninja'): + tty.msg('No ninja build script found in the build directory') + return + + # Check if 'target' is in the ninja build script + regex = re.compile('^build ' + target + ':') + with open('build.ninja', 'r') as f: + matches = [line for line in f.readlines() if regex.match(line)] + + if not matches: + tty.msg("Target 'build " + target + ":' not found in build.ninja") + return + + # Execute target + inspect.getmodule(self).ninja(target) + def _get_needed_resources(self): resources = [] # Select the resources that are needed for this build diff --git a/var/spack/repos/builtin/packages/archer/package.py b/var/spack/repos/builtin/packages/archer/package.py index 0883191277..f5e4fbf8c1 100644 --- a/var/spack/repos/builtin/packages/archer/package.py +++ b/var/spack/repos/builtin/packages/archer/package.py @@ -36,22 +36,14 @@ class Archer(CMakePackage): depends_on('cmake@3.4.3:', type='build') depends_on('llvm') - depends_on('ninja', type='build') + depends_on('ninja@1.5:', type='build') depends_on('llvm-openmp-ompt') + generator = 'Ninja' + def cmake_args(self): return [ - '-G', 'Ninja', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DOMP_PREFIX:PATH=%s' % self.spec['llvm-openmp-ompt'].prefix, ] - - # TODO: Add better ninja support to CMakePackage - def build(self, spec, prefix): - with working_dir(self.build_directory): - ninja() - - def install(self, spec, prefix): - with working_dir(self.build_directory): - ninja('install') diff --git a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py index 8039ec1717..edbd9f04e1 100644 --- a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py +++ b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py @@ -44,24 +44,15 @@ class LlvmOpenmpOmpt(CMakePackage): depends_on('cmake@2.8:', type='build') depends_on('llvm') - depends_on('ninja', type='build') + depends_on('ninja@1.5:', type='build') + + generator = 'Ninja' def cmake_args(self): return [ - '-G', 'Ninja', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', - '-DCMAKE_BUILD_TYPE=Release', '-DLIBOMP_OMPT_SUPPORT=on', '-DLIBOMP_OMPT_BLAME=on', '-DLIBOMP_OMPT_TRACE=on' ] - - # TODO: Add better ninja support to CMakePackage - def build(self, spec, prefix): - with working_dir(self.build_directory): - ninja() - - def install(self, spec, prefix): - with working_dir(self.build_directory): - ninja('install') -- cgit v1.2.3-70-g09d2 From af02774b3ef1ed2cce63a7fba12877744c911371 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 16 Aug 2017 15:58:09 -0500 Subject: Add tab completion & update docs for buildcache This adds tab completion and fixes some formatting issues in the documentation for the "spack buildcache" command. --- lib/spack/docs/binary_caches.rst | 156 ++++++++++++++++++++++---------------- lib/spack/docs/index.rst | 2 +- share/spack/spack-completion.bash | 44 +++++++++++ 3 files changed, 135 insertions(+), 67 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/binary_caches.rst b/lib/spack/docs/binary_caches.rst index d655d2ce58..3839290c98 100644 --- a/lib/spack/docs/binary_caches.rst +++ b/lib/spack/docs/binary_caches.rst @@ -1,108 +1,132 @@ .. _binary_caches: +============ Build caches ============ Some sites may encourage users to set up their own test environments -before carrying out central installations, or some users prefer to set +before carrying out central installations, or some users may prefer to set up these environments on their own motivation. To reduce the load of recompiling otherwise identical package specs in different installations, -installed packages can be put into build cache tarballs, uploaded to -your spack mirror and then downloaded and installed by others. +installed packages can be put into build cache tarballs, uploaded to +your Spack mirror and then downloaded and installed by others. +-------------------------- Creating build cache files -------------------------- A compressed tarball of an installed package is created. Tarballs are created for all of its link and run dependency packages as well. Compressed tarballs are -signed with gpg and signature and tarball and put in a ".spack" file. Optionally -, the rpaths ( and ids and deps on macOS ) can be changed to paths relative to -the spack install tree before the tarball is created. +signed with gpg and signature and tarball and put in a ``.spack`` file. Optionally, +the rpaths (and ids and deps on macOS) can be changed to paths relative to +the Spack install tree before the tarball is created. Build caches are created via: -.. code-block:: sh +.. code-block:: console - $ spack buildcache create + $ spack buildcache create +--------------------------------------- Finding or installing build cache files --------------------------------------- -To find build caches or install build caches, a spack mirror must be configured -with - -``spack mirror add ``. +To find build caches or install build caches, a Spack mirror must be configured +with: + +.. code-block:: console + + $ spack mirror add -Build caches are found via: +Build caches are found via: -.. code-block:: sh +.. code-block:: console $ spack buildcache list Build caches are installed via: -.. code-block:: sh +.. code-block:: console - $ spack buildcache install - + $ spack buildcache install + +---------- Relocation ---------- -Initial build and later installation do not necessarily happen at the same -location. Spack provides a relocation capability and corrects for RPATHs and -non-relocatable scripts. However, many packages compile paths into binary -artificats directly. In such cases, the build instructions of this package would +Initial build and later installation do not necessarily happen at the same +location. Spack provides a relocation capability and corrects for RPATHs and +non-relocatable scripts. However, many packages compile paths into binary +artifacts directly. In such cases, the build instructions of this package would need to be adjusted for better re-locatability. +.. _cmd-spack-buildcache: -Usage ------ -spack buildcache create <> -^^^^^^^^^^^^^^^^^^^^^^^^^^ -Create tarball of installed spack package and all dependencies. -Tarballs is checksummed and signed if gpg2 is available. -Places them in a directory build_cache that can be copied to a mirror. -Commands like "spack buildcache install" will search it for pre-compiled packages. - - -options: - --d : directory in which "build_cache" direcory is created, defaults to "." --f : overwrite ".spack" file in "build_cache" directory if it exists --k : the key to sign package with. In the case where multiple keys exist, the package will be unsigned unless -k is used. --r : make paths in binaries relative before creating tarball --y : answer yes to all create unsigned "build_cache" questions -<> : list of package specs or package hashes with leading / +-------------------- +``spack buildcache`` +-------------------- -spack buildcache list <> -^^^^^^^^^^^^^^^^^^^^^^^^ -Retrieves all specs for build caches available on a spack mirror. - -options: - -<> string to be matched to matched to begining of listed concretized short -specs, eg. "spack buildcache list gcc" with print only commands to install gcc -package(s) - -spack buildcache install <> ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Retrieves all specs for build caches available on a spack mirror and installs build caches -with specs matching the specs or hashes input. - -options: - --f : remove install directory if it exists before unpacking tarball --y : answer yes to all to don't verify package with gpg questions -<> : list of package specs or package hashes with leading / - -spack buildcache keys -^^^^^^^^^^^^^^^^^^^^^ -List public keys available on spack mirror. - -options: +``spack buildcache create`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ --i : trust the keys downloaded with prompt for each --y : answer yes to all trust all keys downloaded +Create tarball of installed Spack package and all dependencies. +Tarballs are checksummed and signed if gpg2 is available. +Places them in a directory ``build_cache`` that can be copied to a mirror. +Commands like ``spack buildcache install`` will search it for pre-compiled packages. + +============== ======================================================================================================================== +Arguments Description +============== ======================================================================================================================== +```` list of package specs or package hashes with leading ``/`` +``-d `` directory in which ``build_cache`` directory is created, defaults to ``.`` +``-f`` overwrite ``.spack`` file in ``build_cache`` directory if it exists +``-k `` the key to sign package with. In the case where multiple keys exist, the package will be unsigned unless ``-k`` is used. +``-r`` make paths in binaries relative before creating tarball +``-y`` answer yes to all create unsigned ``build_cache`` questions +============== ======================================================================================================================== + +^^^^^^^^^^^^^^^^^^^^^^^^^ +``spack buildcache list`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Retrieves all specs for build caches available on a Spack mirror. + +============== ============================================================================== +Arguments Description +============== ============================================================================== +```` string to be matched to matched to beginning of listed concretized short specs +============== ============================================================================== + +E.g. ``spack buildcache list gcc`` with print only commands to install ``gcc`` package(s) + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +``spack buildcache install`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Retrieves all specs for build caches available on a Spack mirror and installs build caches +with specs matching the specs or hashes input. + +============== ============================================================== +Arguments Description +============== ============================================================== +```` list of package specs or package hashes with leading ``/`` +``-f`` remove install directory if it exists before unpacking tarball +``-y`` answer yes to all to don't verify package with gpg questions +============== ============================================================== + +^^^^^^^^^^^^^^^^^^^^^^^^^ +``spack buildcache keys`` +^^^^^^^^^^^^^^^^^^^^^^^^^ + +List public keys available on Spack mirror. + +========= ============================================== +Arguments Description +========= ============================================== +``-i`` trust the keys downloaded with prompt for each +``-y`` answer yes to all trust all keys downloaded +========= ============================================== diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index e86ab0ca85..cae404d2f1 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -63,9 +63,9 @@ or refer to the full manual below. mirrors module_file_support repositories + binary_caches command_index package_list - binary_caches .. toctree:: :maxdepth: 2 diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 46070d68cc..408aaf61ac 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -152,6 +152,50 @@ function _spack_build { fi } +function _spack_buildcache { + if $list_options + then + compgen -W "-h --help" -- "$cur" + else + compgen -W "create install keys list" -- "$cur" + fi +} + +function _spack_buildcache_create { + if $list_options + then + compgen -W "-h --help -r --rel -f --force -y --yes-to-all -k --key + -d --directory" -- "$cur" + else + compgen -W "$(_all_packages)" -- "$cur" + fi +} + +function _spack_buildcache_install { + if $list_options + then + compgen -W "-h --help -f --force -y --yes-to-all" -- "$cur" + else + compgen -W "$(_all_packages)" -- "$cur" + fi +} + +function _spack_buildcache_keys { + if $list_options + then + compgen -W "-h --help -i --install -y --yes-to-all" -- "$cur" + fi +} + +function _spack_buildcache_list { + if $list_options + then + compgen -W "-h --help" -- "$cur" + else + compgen -W "$(_all_packages)" -- "$cur" + fi +} + function _spack_cd { if $list_options then -- cgit v1.2.3-70-g09d2 From 1c8bdd7e24375510a20d7cb617c213bc8b01cbd1 Mon Sep 17 00:00:00 2001 From: Patrick Gartung Date: Wed, 16 Aug 2017 21:03:14 -0500 Subject: buildcache fixes: index.html & unsigned installs This fixes a syntax error in the index.html file generated by the "spack buildcache" command when creating build caches. This also fixes support for installing unsigned binaries. --- lib/spack/spack/binary_distribution.py | 41 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py index e2ae89ac19..2de14938a4 100644 --- a/lib/spack/spack/binary_distribution.py +++ b/lib/spack/spack/binary_distribution.py @@ -194,15 +194,15 @@ def sign_tarball(yes_to_all, key, force, specfile_path): def generate_index(outdir, indexfile_path): f = open(indexfile_path, 'w') - header = """ - -""" - footer = "" + header = """\n +\n\n +\n""" + footer = "\n\n" paths = os.listdir(outdir + '/build_cache') f.write(header) for path in paths: rel = os.path.basename(path) - f.write('
  • ' % (rel, rel)) + f.write('
  • %s\n' % (rel, rel)) f.write(footer) f.close() @@ -381,26 +381,27 @@ def extract_tarball(spec, filename, yes_to_all=False, force=False): with closing(tarfile.open(spackfile_path, 'r')) as tar: tar.extractall(stagepath) - if os.path.exists('%s.asc' % specfile_path): - Gpg.verify('%s.asc' % specfile_path, specfile_path) - os.remove(specfile_path + '.asc') - else: - if not yes_to_all: + if not yes_to_all: + if os.path.exists('%s.asc' % specfile_path): + Gpg.verify('%s.asc' % specfile_path, specfile_path) + os.remove(specfile_path + '.asc') + else: raise NoVerifyException() # get the sha256 checksum of the tarball checksum = checksum_tarball(tarfile_path) - # get the sha256 checksum recorded at creation - spec_dict = {} - with open(specfile_path, 'r') as inputfile: - content = inputfile.read() - spec_dict = yaml.load(content) - bchecksum = spec_dict['binary_cache_checksum'] - - # if the checksums don't match don't install - if bchecksum['hash'] != checksum: - raise NoChecksumException() + if not yes_to_all: + # get the sha256 checksum recorded at creation + spec_dict = {} + with open(specfile_path, 'r') as inputfile: + content = inputfile.read() + spec_dict = yaml.load(content) + bchecksum = spec_dict['binary_cache_checksum'] + + # if the checksums don't match don't install + if bchecksum['hash'] != checksum: + raise NoChecksumException() with closing(tarfile.open(tarfile_path, 'r')) as tar: tar.extractall(path=join_path(installpath, '..')) -- cgit v1.2.3-70-g09d2 From c16a68f517ca1bd08a7dde454fac850e4c3b6013 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 17 Aug 2017 06:37:09 +0200 Subject: Relaxed constraints on config.yaml structure (#5115) This PR allows additional unused properties at the top-level of the config.yaml file. Having these properties permits to use two different versions of Spack, one of which adds a new property, without receiving error messages due to the presence of this new property in a configuration cache stored in the user's home. --- lib/spack/spack/schema/config.py | 1 - 1 file changed, 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py index abcb8d6051..73b59ea3c7 100644 --- a/lib/spack/spack/schema/config.py +++ b/lib/spack/spack/schema/config.py @@ -38,7 +38,6 @@ schema = { 'config': { 'type': 'object', 'default': {}, - 'additionalProperties': False, 'properties': { 'install_tree': {'type': 'string'}, 'install_hash_length': {'type': 'integer', 'minimum': 1}, -- cgit v1.2.3-70-g09d2 From 101693d8233b97e6af986534ff3d8a647de0094d Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 17 Aug 2017 08:26:04 +0200 Subject: Improved error message for unsatisfiable specs (#5113) * Improved error message for unsatisfiable specs. fixes #5066 This PR improves the error message for unsatisfiable specs by showing in tree format both the spec that cannot satisfy the constraint and the spec that asked for that constraint. After that follows a readable error message. --- lib/spack/spack/spec.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 32e08d3896..05db84806f 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1985,10 +1985,19 @@ class Spec(object): try: changed |= spec_deps[dep.name].constrain(dep) except UnsatisfiableSpecError as e: - e.message = "Invalid spec: '%s'. " - e.message += "Package %s requires %s %s, but spec asked for %s" - e.message %= (spec_deps[dep.name], dep.name, - e.constraint_type, e.required, e.provided) + fmt = 'An unsatisfiable {0}'.format(e.constraint_type) + fmt += ' constraint has been detected for spec:' + fmt += '\n\n{0}\n\n'.format(spec_deps[dep.name].tree(indent=4)) + fmt += 'while trying to concretize the partial spec:' + fmt += '\n\n{0}\n\n'.format(self.tree(indent=4)) + fmt += '{0} requires {1} {2} {3}, but spec asked for {4}' + e.message = fmt.format( + self.name, + dep.name, + e.constraint_type, + e.required, + e.provided + ) raise e # Add merged spec to my deps and recurse -- cgit v1.2.3-70-g09d2 From 0f5582cefcfddf04cae2d345aa3d9d036e2feeda Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 17 Aug 2017 18:15:57 +0200 Subject: Colorize spack info. Adds prominence to preferred version. (#4994) * Colorize spack info. Adds prominence to preferred version. fixes #2708 This uses 'llnl.util.tty.color' to colorize the output of 'spack info'. It also displays versions in the order the concretizer would choose them and shows the preferred in a line on its own and in bold. * Modified output according to Adam and Denis reviews. Section titles are not bold + black, but bold + blue. Added a new section named "Preferred version", which prints the preferred version in bold characters. * Further modifications according to Adam and Denis reviews. After "Homepage:" we now have a single space. Removed newline after each variant. Preferred version is not in bold fonts anymore. Added a simple test that just runs the command. --- lib/spack/spack/cmd/info.py | 110 +++++++++++++++++++++++++++------------ lib/spack/spack/test/cmd/info.py | 40 ++++++++++++++ 2 files changed, 117 insertions(+), 33 deletions(-) create mode 100644 lib/spack/spack/test/cmd/info.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 575b65f8b0..71ab5e3207 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -25,14 +25,22 @@ from __future__ import print_function import textwrap -from six.moves import zip_longest -from llnl.util.tty.colify import * + +import llnl.util.tty.color as color import spack import spack.fetch_strategy as fs +import spack.spec + +from llnl.util.tty.colify import * -description = "get detailed information on a particular package" -section = "basic" -level = "short" +from six.moves import zip_longest + +description = 'get detailed information on a particular package' +section = 'basic' +level = 'short' + +header_color = '@*b' +plain_format = '@.' def padder(str_list, extra=0): @@ -48,11 +56,23 @@ def padder(str_list, extra=0): def setup_parser(subparser): subparser.add_argument( - 'name', metavar="PACKAGE", help="name of package to get info for") + 'name', metavar='PACKAGE', help='name of package to get info for') + + +def section_title(s): + return header_color + s + plain_format + + +def version(s): + return spack.spec.version_color + s + plain_format + + +def variant(s): + return spack.spec.enabled_variant_color + s + plain_format class VariantFormatter(object): - def __init__(self, variants, max_widths=(25, 20, 35)): + def __init__(self, variants, max_widths=(30, 20, 30)): self.variants = variants self.headers = ('Name [Default]', 'Allowed values', 'Description') # Set max headers lengths @@ -102,9 +122,9 @@ class VariantFormatter(object): @property def lines(self): if not self.variants: - yield " None" + yield ' None' else: - yield " " + self.fmt % self.headers + yield ' ' + self.fmt % self.headers yield '\n' for k, v in sorted(self.variants.items()): name = textwrap.wrap( @@ -123,61 +143,82 @@ class VariantFormatter(object): name, allowed, description, fillvalue='' ): yield " " + self.fmt % t - yield '' # Trigger a new line def print_text_info(pkg): """Print out a plain text description of a package.""" - header = "{0}: ".format(pkg.build_system_class) - print(header, pkg.name) + header = section_title( + '{0}: ' + ).format(pkg.build_system_class) + pkg.name + color.cprint(header) - print() - print("Description:") + color.cprint('') + color.cprint(section_title('Description:')) if pkg.__doc__: print(pkg.format_doc(indent=4)) else: print(" None") - whitespaces = ''.join([' '] * (len(header) - len("Homepage: "))) - print("Homepage:", whitespaces, pkg.homepage) + color.cprint(section_title('Homepage: ') + pkg.homepage) - print() - print("Safe versions: ") + color.cprint('') + color.cprint(section_title('Preferred version: ')) if not pkg.versions: - print(" None") + color.cprint(version(' None')) + color.cprint('') + color.cprint(section_title('Safe versions: ')) + color.cprint(version(' None')) else: pad = padder(pkg.versions, 4) + + # Here we sort first on the fact that a version is marked + # as preferred in the package, then on the fact that the + # version is not develop, then lexicographically + l = [ + (value.get('preferred', False), not key.isdevelop(), key) + for key, value in pkg.versions.items() + ] + l = sorted(l) + _, _, preferred = l.pop() + + f = fs.for_package_version(pkg, preferred) + line = version(' {0}'.format(pad(preferred))) + str(f) + color.cprint(line) + color.cprint('') + color.cprint(section_title('Safe versions: ')) + for v in reversed(sorted(pkg.versions)): f = fs.for_package_version(pkg, v) - print(" %s%s" % (pad(v), str(f))) + line = version(' {0}'.format(pad(v))) + str(f) + color.cprint(line) - print() - print("Variants:") + color.cprint('') + color.cprint(section_title('Variants:')) formatter = VariantFormatter(pkg.variants) for line in formatter.lines: - print(line) + color.cprint(line) - print() - print("Installation Phases:") + color.cprint('') + color.cprint(section_title('Installation Phases:')) phase_str = '' for phase in pkg.phases: phase_str += " {0}".format(phase) - print(phase_str) + color.cprint(phase_str) for deptype in ('build', 'link', 'run'): - print() - print("%s Dependencies:" % deptype.capitalize()) + color.cprint('') + color.cprint(section_title('%s Dependencies:' % deptype.capitalize())) deps = sorted(pkg.dependencies_of_type(deptype)) if deps: colify(deps, indent=4) else: - print(" None") + print(' None') - print() - print("Virtual Packages: ") + color.cprint('') + color.cprint(section_title('Virtual Packages: ')) if pkg.provided: inverse_map = {} for spec, whens in pkg.provided.items(): @@ -186,8 +227,11 @@ def print_text_info(pkg): inverse_map[when] = set() inverse_map[when].add(spec) for when, specs in reversed(sorted(inverse_map.items())): - print(" %s provides %s" % ( - when, ', '.join(str(s) for s in specs))) + line = " %s provides %s" % ( + when.colorized(), ', '.join(s.colorized() for s in specs) + ) + print(line) + else: print(" None") diff --git a/lib/spack/spack/test/cmd/info.py b/lib/spack/spack/test/cmd/info.py new file mode 100644 index 0000000000..9819f2cd84 --- /dev/null +++ b/lib/spack/spack/test/cmd/info.py @@ -0,0 +1,40 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import pytest + +from spack.main import SpackCommand + +info = SpackCommand('info') + + +@pytest.mark.parametrize('pkg', [ + 'openmpi', + 'trilinos', + 'boost', + 'python', + 'dealii' +]) +def test_it_just_runs(pkg): + info(pkg) -- cgit v1.2.3-70-g09d2 From 6472c39c2e0d764a256430d9a025630b9ba5ae54 Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Thu, 17 Aug 2017 18:25:40 +0200 Subject: Docs: Travis-CI Workflow (#5133) * Docs: Travis-CI Workflow Add a workflow how to use spack on Travis-CI. Future Work: depending if and how we can simplify 5101: add a multi-compiler, multi-C++-standard, multi-software build matrix example * Fix Typos --- lib/spack/docs/workflows.rst | 78 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) (limited to 'lib') diff --git a/lib/spack/docs/workflows.rst b/lib/spack/docs/workflows.rst index 84da3b0f44..10843d302b 100644 --- a/lib/spack/docs/workflows.rst +++ b/lib/spack/docs/workflows.rst @@ -1028,6 +1028,84 @@ or filesystem views. However, it has some drawbacks: integrate Spack explicitly in their workflow. Not all users are willing to do this. +------------------------ +Using Spack on Travis-CI +------------------------ + +Spack can be deployed as a provider for userland software in +`Travis-CI `_. + +A starting-point for a ``.travis.yml`` file can look as follows. +It uses `caching `_ for +already built environments, so make sure to clean the Travis cache if +you run into problems. + +The main points that are implemented below: + +#. Travis is detected as having up to 34 cores available, but only 2 + are actually allocated for the user. We limit the parallelism of + the spack builds in the config. + (The Travis yaml parser is a bit buggy on the echo command.) + +#. Builds over 10 minutes need to be prefixed with ``travis_wait``. + Alternatively, generate output once with ``spack install -v``. + +#. Travis builds are non-interactive. This prevents using bash + aliases and functions for modules. We fix that by sourcing + ``/etc/profile`` first (or running everything in a subshell with + ``bash -l -c '...'``). + +.. code-block:: yaml + + language: cpp + sudo: false + dist: trusty + + cache: + apt: true + directories: + - $HOME/.cache + + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.9 + - environment-modules + + env: + global: + - SPACK_ROOT: $HOME/.cache/spack + - PATH: $PATH:$HOME/.cache/spack/bin + + before_install: + - export CXX=g++-4.9 + - export CC=gcc-4.9 + - export FC=gfortran-4.9 + - export CXXFLAGS="-std=c++11" + + install: + - if ! which spack >/dev/null; then + mkdir -p $SPACK_ROOT && + git clone --depth 50 https://github.com/llnl/spack.git $SPACK_ROOT && + echo -e "config:""\n build_jobs:"" 2" > $SPACK_ROOT/etc/spack/config.yaml; + fi + - travis_wait spack install cmake@3.7.2~openssl~ncurses + - travis_wait spack install boost@1.62.0~graph~iostream~locale~log~wave + - spack clean -a + - source /etc/profile && + source $SPACK_ROOT/share/spack/setup-env.sh + - spack load cmake + - spack load boost + + script: + - mkdir -p $HOME/build + - cd $HOME/build + - cmake $TRAVIS_BUILD_DIR + - make -j 2 + - make test + ------------------ Upstream Bug Fixes ------------------ -- cgit v1.2.3-70-g09d2 From d6d2dff324347dc7dab1d453ef17378c752b8a78 Mon Sep 17 00:00:00 2001 From: healther Date: Fri, 18 Aug 2017 20:57:52 +0200 Subject: sbang support: add node-js and fix lua This adds sbang hook support for node-js and fixes the sbang filter for lua (the character class exclusion was swallowing newlines and reporting a false positive if lua was mentioned anywhere in the file). --- bin/sbang | 2 ++ lib/spack/spack/hooks/sbang.py | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/bin/sbang b/bin/sbang index 0b883a5feb..ce4df4327c 100755 --- a/bin/sbang +++ b/bin/sbang @@ -104,6 +104,8 @@ lines=0 while read line && ((lines < 2)) ; do if [[ "$line" = '#!'* ]]; then interpreter="${line#\#!}" + elif [[ "$line" = '//!'*node* ]]; then + interpreter="${line#//!}" elif [[ "$line" = '--!'*lua* ]]; then interpreter="${line#--!}" fi diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py index e86f8260b8..cd3529dbb8 100644 --- a/lib/spack/spack/hooks/sbang.py +++ b/lib/spack/spack/hooks/sbang.py @@ -62,10 +62,17 @@ def filter_shebang(path): if original.startswith(new_sbang_line): return + # In the following, newlines have to be excluded in the regular expression + # else any mention of "lua" in the document will lead to spurious matches. + # Use --! instead of #! on second line for lua. - if re.search(r'^#!(/[^/]*)*lua\b', original): + if re.search(r'^#!(/[^/\n]*)*lua\b', original): original = re.sub(r'^#', '--', original) + # Use //! instead of #! on second line for node.js. + if re.search(r'^#!(/[^/\n]*)*node\b', original): + original = re.sub(r'^#', '//', original) + # Change non-writable files to be writable if needed. saved_mode = None if not os.access(path, os.W_OK): -- cgit v1.2.3-70-g09d2 From bb10bc39abd27d9ffee379b02ceff23a020f2391 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 19 Aug 2017 14:48:24 -0700 Subject: Make test_inspect_path work on Mac OS X without XCode (#5168) - Mac OS X Sierra has no /usr/include by default - Instead of assuming there's an include directory in /usr, mock up a directory that looks like we expect. --- lib/spack/spack/test/modules.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py index bd37196f2a..40841f15a7 100644 --- a/lib/spack/spack/test/modules.py +++ b/lib/spack/spack/test/modules.py @@ -27,6 +27,7 @@ import contextlib from six import StringIO import pytest + import spack.modules import spack.spec @@ -105,8 +106,13 @@ def test_update_dictionary_extending_list(): assert target['baz'] == 'foobaz' -def test_inspect_path(): - env = spack.modules.inspect_path('/usr') +def test_inspect_path(tmpdir): + tmpdir.chdir() + tmpdir.mkdir('bin') + tmpdir.mkdir('lib') + tmpdir.mkdir('include') + + env = spack.modules.inspect_path(str(tmpdir)) names = [item.name for item in env] assert 'PATH' in names assert 'LIBRARY_PATH' in names -- cgit v1.2.3-70-g09d2 From e77c1a20c5964c169d0ac557e13fd071804f68ed Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 20 Aug 2017 15:34:35 -0700 Subject: Fix issue with color formatting regular expression. (#5171) - Fix issue with color formatting regular expression. - _separators regex in spec.py could be constructed such that '^' came first in the character matcher, e.g. '[^@#/]'. This inverts the match and causes transient KeyErrors. - Fixed to escape all characters in the constructed regex. - This bug comes up in Python3 due to its more randomized hash iteration order, but it could probably also happen in a Python 2 implementation. - also clean up variable docstrings in spec.py --- lib/spack/spack/spec.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 05db84806f..43d57f2b98 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -165,21 +165,20 @@ __all__ = [ 'NoSuchHashError', 'RedundantSpecError'] -# Valid pattern for an identifier in Spack +#: Valid pattern for an identifier in Spack identifier_re = r'\w[\w-]*' -# Convenient names for color formats so that other things can use them -compiler_color = '@g' -version_color = '@c' -architecture_color = '@m' -enabled_variant_color = '@B' -disabled_variant_color = '@r' -dependency_color = '@.' -hash_color = '@K' - -"""This map determines the coloring of specs when using color output. - We make the fields different colors to enhance readability. - See spack.color for descriptions of the color codes. """ +compiler_color = '@g' #: color for highlighting compilers +version_color = '@c' #: color for highlighting versions +architecture_color = '@m' #: color for highlighting architectures +enabled_variant_color = '@B' #: color for highlighting enabled variants +disabled_variant_color = '@r' #: color for highlighting disabled varaints +dependency_color = '@.' #: color for highlighting dependencies +hash_color = '@K' #: color for highlighting package hashes + +#: This map determines the coloring of specs when using color output. +#: We make the fields different colors to enhance readability. +#: See spack.color for descriptions of the color codes. color_formats = {'%': compiler_color, '@': version_color, '=': architecture_color, @@ -188,17 +187,19 @@ color_formats = {'%': compiler_color, '^': dependency_color, '#': hash_color} -"""Regex used for splitting by spec field separators.""" -_separators = '[%s]' % ''.join(color_formats.keys()) +#: Regex used for splitting by spec field separators. +#: These need to be escaped to avoid metacharacters in +#: ``color_formats.keys()``. +_separators = '[\\%s]' % '\\'.join(color_formats.keys()) -"""Versionlist constant so we don't have to build a list - every time we call str()""" +#: Versionlist constant so we don't have to build a list +#: every time we call str() _any_version = VersionList([':']) -"""Types of dependencies that Spack understands.""" +#: Types of dependencies that Spack understands. alldeps = ('build', 'link', 'run') -"""Max integer helps avoid passing too large a value to cyaml.""" +#: Max integer helps avoid passing too large a value to cyaml. maxint = 2 ** (ctypes.sizeof(ctypes.c_int) * 8 - 1) - 1 -- cgit v1.2.3-70-g09d2 From e0dd55e09074087f624443cd86439a854dc0cc18 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 14 Aug 2017 03:57:46 -0700 Subject: Make SpackCommand a bit more testable - add fail_on_error argument - record exception and return code when the command fails --- lib/spack/spack/main.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index d10047e325..b17cb3cdc5 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -369,13 +369,15 @@ class SpackCommand(object): Use this to invoke Spack commands directly from Python and check their stdout and stderr. """ - def __init__(self, command, fail_on_error=True): + def __init__(self, command): """Create a new SpackCommand that invokes ``command`` when called.""" self.parser = make_argument_parser() self.parser.add_command(command) self.command_name = command self.command = spack.cmd.get_command(command) - self.fail_on_error = fail_on_error + + self.returncode = None + self.error = None def __call__(self, *argv, **kwargs): """Invoke this SpackCommand. @@ -384,17 +386,20 @@ class SpackCommand(object): argv (list of str): command line arguments. Keyword Args: - color (optional bool): force-disable or force-enable color + fail_on_error (optional bool): Don't raise an exception on error Returns: (str, str): output and error as a strings On return, if ``fail_on_error`` is False, return value of comman - is set in ``returncode`` property. Otherwise, raise an error. + is set in ``returncode`` property, and the error is set in the + ``error`` property. Otherwise, raise an error. """ args, unknown = self.parser.parse_known_args( [self.command_name] + list(argv)) + fail_on_error = kwargs.get('fail_on_error', True) + out, err = sys.stdout, sys.stderr ofd, ofn = tempfile.mkstemp() efd, efn = tempfile.mkstemp() @@ -408,6 +413,11 @@ class SpackCommand(object): except SystemExit as e: self.returncode = e.code + except: + self.error = sys.exc_info()[1] + if fail_on_error: + raise + finally: sys.stdout.flush() sys.stdout.close() @@ -420,7 +430,7 @@ class SpackCommand(object): os.unlink(ofn) os.unlink(efn) - if self.fail_on_error and self.returncode != 0: + if fail_on_error and self.returncode not in (None, 0): raise SpackCommandError( "Command exited with code %d: %s(%s)" % ( self.returncode, self.command_name, -- cgit v1.2.3-70-g09d2 From 05cc6c966f4d340c42b89a74b63b1bd8fe22673d Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 14 Aug 2017 04:33:01 -0700 Subject: Rework output redirection in Spack. - Simplify interface to log_output. New interface requires only one context handler instead of two. Before: with log_output('logfile.txt') as log_redirection: with log_redirection: # do things ... output will be logged After: with log_output('logfile.txt'): # do things ... output will be logged If you also want the output to be echoed to ``stdout``, use the `echo` parameter:: with log_output('logfile.txt', echo=True): # do things ... output will be logged and printed out And, if you just want to echo *some* stuff from the parent, use ``force_echo``: with log_output('logfile.txt', echo=False) as logger: # do things ... output will be logged with logger.force_echo(): # things here will be echoed *and* logged A key difference between this and the previous implementation is that *everything* in the context handler is logged. Previously, things like `Executing phase 'configure'` would not be logged, only output to the screen, so understanding phases in the build log was difficult. - The implementation of `log_output()` is different in two major ways: 1. This implementation avoids race cases by using only one pipe (before we had a multiprocessing pipe and a unix pipe). The logger daemon stops naturally when the input stream is closed, which avoids a race in the previous implementation where we'd miss some lines of output because the parent would shut the daemon down before it was done with all output. 2. Instead of turning output redirection on and off, which prevented some things from being logged, this version uses control characters in the output stream to enable/disable forced echoing. We're using the time-honored xon and xoff codes, which tell the daemon to echo anything between them AND write it to the log. This is how `logger.force_echo()` works. - Fix places where output could get stuck in buffers by flushing more aggressively. This makes the output printed to the terminal the same as that which would be printed through a pipe to `cat` or to a file. Previously these could be weirdly different, and some output would be missing when redirecting Spack to a file or pipe. - Simplify input and color handling in both `build_environment.fork()` and `llnl.util.tty.log.log_output()`. Neither requires an input_stream parameter anymore; we assume stdin will be forwarded if possible. - remove `llnl.util.lang.duplicate_stream()` and remove associated monkey-patching in tests, as these aren't needed if you just check whether stdin is a tty and has a fileno attribute. --- lib/spack/llnl/util/lang.py | 13 -- lib/spack/llnl/util/tty/log.py | 363 +++++++++++++++++++++-------------- lib/spack/spack/build_environment.py | 58 +++--- lib/spack/spack/package.py | 56 ++---- lib/spack/spack/test/conftest.py | 14 -- 5 files changed, 267 insertions(+), 237 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 012befeada..563835ecfc 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -391,19 +391,6 @@ class RequiredAttributeError(ValueError): super(RequiredAttributeError, self).__init__(message) -def duplicate_stream(original): - """Duplicates a stream at the os level. - - Args: - original (stream): original stream to be duplicated. Must have a - ``fileno`` callable attribute. - - Returns: - file like object: duplicate of the original stream - """ - return os.fdopen(os.dup(original.fileno())) - - class ObjectWrapper(object): """Base class that wraps an object. Derived classes can add new behavior while staying undercover. diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index 4bf7c77d2c..ac77e2dc8d 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -29,27 +29,28 @@ import os import re import select import sys +from contextlib import contextmanager -import llnl.util.lang as lang import llnl.util.tty as tty -import llnl.util.tty.color as color # Use this to strip escape sequences _escape = re.compile(r'\x1b[^m]*m|\x1b\[?1034h') +# control characters for enabling/disabling echo +# +# We use control characters to ensure that echo enable/disable are inline +# with the other output. We always follow these with a newline to ensure +# one per line the following newline is ignored in output. +xon, xoff = '\x11\n', '\x13\n' +control = re.compile('(\x11\n|\x13\n)') def _strip(line): """Strip color and control characters from a line.""" return _escape.sub('', line) -class _SkipWithBlock(): - """Special exception class used to skip a with block.""" - pass - - class keyboard_input(object): - """Disable canonical input and echo on a stream within a with block. + """Context manager to disable line editing and echoing. Use this with ``sys.stdin`` for keyboard input, e.g.:: @@ -57,14 +58,33 @@ class keyboard_input(object): r, w, x = select.select([sys.stdin], [], []) # ... do something with keypresses ... - When the with block completes, this will restore settings before - canonical and echo were disabled. - """ + This disables canonical input so that keypresses are available on the + stream immediately. Typically standard input allows line editing, + which means keypresses won't be sent until the user hits return. + It also disables echoing, so that keys pressed aren't printed to the + terminal. So, the user can hit, e.g., 'v', and it's read on the + other end of the pipe immediately but not printed. + + When the with block completes, prior TTY settings are restored. + + Note: this depends on termios support. If termios isn't available, + or if the stream isn't a TTY, this context manager has no effect. + """ def __init__(self, stream): + """Create a context manager that will enable keyboard input on stream. + + Args: + stream (file-like): stream on which to accept keyboard input + """ self.stream = stream def __enter__(self): + """Enable immediate keypress input on stream. + + If the stream is not a TTY or the system doesn't support termios, + do nothing. + """ self.old_cfg = None # Ignore all this if the input stream is not a tty. @@ -72,7 +92,7 @@ class keyboard_input(object): return try: - # import and mark whether it worked. + # If this fails, self.old_cfg will remain None import termios # save old termios settings @@ -89,11 +109,10 @@ class keyboard_input(object): termios.tcsetattr(fd, termios.TCSADRAIN, self.new_cfg) except Exception: - pass # Some OS's do not support termios, so ignore. + pass # some OS's do not support termios, so ignore def __exit__(self, exc_type, exception, traceback): - # If termios was avaialble, restore old settings after the - # with block + """If termios was avaialble, restore old settings.""" if self.old_cfg: import termios termios.tcsetattr( @@ -101,168 +120,222 @@ class keyboard_input(object): class log_output(object): - """Spawns a daemon that reads from a pipe and writes to a file + """Context manager that logs its output to a file. + + In the simplest case, the usage looks like this:: + + with log_output('logfile.txt'): + # do things ... output will be logged + + Any output from the with block will be redirected to ``logfile.txt``. + If you also want the output to be echoed to ``stdout``, use the + ``echo`` parameter:: + + with log_output('logfile.txt', echo=True): + # do things ... output will be logged and printed out - Usage:: + And, if you just want to echo *some* stuff from the parent, use + ``force_echo``: - # Spawns the daemon - with log_output('logfile.txt', 'w') as log_redirection: - # do things ... output is not redirected - with log_redirection: - # do things ... output will be logged + with log_output('logfile.txt', echo=False) as logger: + # do things ... output will be logged - or:: + with logger.force_echo(): + # things here will be echoed *and* logged - with log_output('logfile.txt', echo=True) as log_redirection: - # do things ... output is not redirected - with log_redirection: - # do things ... output will be logged - # and also printed to stdout. + Under the hood, we spawn a daemon and set up a pipe between this + process and the daemon. The daemon writes our output to both the + file and to stdout (if echoing). The parent process can communicate + with the daemon to tell it when and when not to echo; this is what + force_echo does. You can also enable/disable echoing by typing 'v'. - Opens a stream in 'w' mode at daemon spawning and closes it at - daemon joining. If echo is True, also prints the output to stdout. + We try to use OS-level file descriptors to do the redirection, but if + stdout or stderr has been set to some Python-level file object, we + use Python-level redirection instead. This allows the redirection to + work within test frameworks like nose and pytest. """ - def __init__( - self, - filename, - echo=False, - force_color=False, - debug=False, - input_stream=sys.stdin - ): + def __init__(self, filename, echo=False, debug=False): + """Create a new output log context manager. + + Logger daemon is not started until ``__enter__()``. + """ self.filename = filename - # Various output options self.echo = echo - self.force_color = force_color self.debug = debug - # Default is to try file-descriptor reassignment unless the system - # out/err streams do not have an associated file descriptor - self.directAssignment = False - self.read, self.write = os.pipe() - - # Needed to un-summon the daemon - self.parent_pipe, self.child_pipe = multiprocessing.Pipe() - # Input stream that controls verbosity interactively - self.input_stream = input_stream + self._active = False # used to prevent re-entry def __enter__(self): + if self._active: + raise RuntimeError("Can't re-enter the same log_output!") + + # record parent color settings before redirecting. We do this + # because color output depends on whether the *original* stdout + # is a TTY. New stdout won't be a TTY so we force colorization. + self._saved_color = tty.color._force_color + forced_color = tty.color.get_color_when() + + # also record parent debug settings -- in case the logger is + # forcing debug output. + self._saved_debug = tty._debug + + # OS-level pipe for redirecting output to logger + self.read_fd, self.write_fd = os.pipe() + # Sets a daemon that writes to file what it reads from a pipe try: - fwd_input_stream = lang.duplicate_stream(self.input_stream) - self.p = multiprocessing.Process( - target=self._spawn_writing_daemon, - args=(self.read, fwd_input_stream), - name='logger_daemon' - ) - self.p.daemon = True - self.p.start() + # need to pass this b/c multiprocessing closes stdin in child. + input_stream = os.fdopen(os.dup(sys.stdin.fileno())) + + self.process = multiprocessing.Process( + target=self._writer_daemon, args=(input_stream,)) + self.process.daemon = True # must set before start() + self.process.start() + os.close(self.read_fd) # close in the parent process + finally: - fwd_input_stream.close() - return log_output.OutputRedirection(self) + input_stream.close() - def __exit__(self, exc_type, exc_val, exc_tb): - self.parent_pipe.send(True) - self.p.join(60.0) # 1 minute to join the child + # Flush immediately before redirecting so that anything buffered + # goes to the original stream + sys.stdout.flush() + sys.stderr.flush() - def _spawn_writing_daemon(self, read, input_stream): - # This is the Parent: read from child, skip the with block. + # Now do the actual output rediction. + self.use_fds = True + try: + # We try first to use OS-level file descriptors, as this + # redirects output for subprocesses and system calls. + + # Save old stdout and stderr file descriptors + self._saved_stdout = os.dup(sys.stdout.fileno()) + self._saved_stderr = os.dup(sys.stderr.fileno()) + + # redirect to the pipe we created above + os.dup2(self.write_fd, sys.stdout.fileno()) + os.dup2(self.write_fd, sys.stderr.fileno()) + os.close(self.write_fd) + + except AttributeError: + # Using file descriptors can fail if stdout and stderr don't + # have a fileno attribute. This can happen, when, e.g., the + # test framework replaces stdout with a StringIO object. We + # handle thi the Python way. This won't redirect lower-level + # output, but it's the best we can do. + self.use_fds = False + + # Save old stdout and stderr file objects + self._saved_stdout = sys.stdout + self._saved_stderr = sys.stderr + + # create a file object for the pipe; redirect to it. + pipe_fd_out = os.fdopen(self.write_fd, 'w') + sys.stdout = pipe_fd_out + sys.stderr = pipe_fd_out + + # Force color and debug settings now that we have redirected. + tty.color.set_color_when(forced_color) + tty._debug = self.debug + + # track whether we're currently inside this log_output + self._active = True + + # return this log_output object so that the user can do things + # like temporarily echo some ouptut. + return self + def __exit__(self, exc_type, exc_val, exc_tb): + # Flush any buffered output to the logger daemon. + sys.stdout.flush() + sys.stderr.flush() + + # restore previous output settings, either the low-level way or + # the python way + if self.use_fds: + os.dup2(self._saved_stdout, sys.stdout.fileno()) + os.close(self._saved_stdout) + + os.dup2(self._saved_stderr, sys.stderr.fileno()) + os.close(self._saved_stderr) + else: + sys.stdout = self._saved_stdout + sys.stderr = self._saved_stderr + + # join the daemon process. The daemon will quit automatically + # when the write pipe is closed; we just wait for it here. + self.process.join() + + # restore old color and debug settings + tty.color._force_color = self._saved_color + tty._debug = self._saved_debug + + self._active = False # safe to enter again + + @contextmanager + def force_echo(self): + """Context manager to force local echo, even if echo is off.""" + if not self._active: + raise RuntimeError( + "Can't call force_echo() outside log_output region!") + + # This uses the xon/xoff to highlight regions to be echoed in the + # output. We us these control characters rather than, say, a + # separate pipe, because they're in-band and assured to appear + # exactly before and after the text we want to echo. + sys.stdout.write(xon) + sys.stdout.flush() + yield + sys.stdout.write(xoff) + sys.stdout.flush() + + def _writer_daemon(self, stdin): + """Daemon that writes output to the log file and stdout.""" # Use line buffering (3rd param = 1) since Python 3 has a bug # that prevents unbuffered text I/O. - read_file = os.fdopen(read, 'r', 1) + in_pipe = os.fdopen(self.read_fd, 'r', 1) + os.close(self.write_fd) + + echo = self.echo # initial echo setting, user-controllable + force_echo = False # parent can force echo for certain output with open(self.filename, 'w') as log_file: - with keyboard_input(input_stream): + with keyboard_input(stdin): while True: - # Without the last parameter (timeout) select will wait - # until at least one of the two streams are ready. This - # may cause the function to hang. - rlist, _, _ = select.select( - [read_file, input_stream], [], [], 0 - ) + # Without the last parameter (timeout) select will + # wait until at least one of the two streams are + # ready. This may cause the function to hang. + rlist, _, xlist = select.select( + [in_pipe, stdin], [], [], 0) # Allow user to toggle echo with 'v' key. # Currently ignores other chars. - if input_stream in rlist: - if input_stream.read(1) == 'v': - self.echo = not self.echo + if stdin in rlist: + if stdin.read(1) == 'v': + echo = not echo # Handle output from the with block process. - if read_file in rlist: - # If we arrive here it means that - # read_file was ready for reading : it - # should never happen that line is false-ish - line = read_file.readline() - - # Echo to stdout if requested. - if self.echo: + if in_pipe in rlist: + # If we arrive here it means that in_pipe was + # ready for reading : it should never happen that + # line is false-ish + line = in_pipe.readline() + if not line: + break # EOF + + # find control characters and strip them. + controls = control.findall(line) + line = re.sub(control, '', line) + + # Echo to stdout if requested or forced + if echo or force_echo: sys.stdout.write(line) # Stripped output to log file. log_file.write(_strip(line)) log_file.flush() - if self.child_pipe.poll(): - break - - def __del__(self): - """Closes the pipes""" - os.close(self.write) - os.close(self.read) - - class OutputRedirection(object): - - def __init__(self, other): - self.__dict__.update(other.__dict__) - - def __enter__(self): - """Redirect output from the with block to a file. - - Hijacks stdout / stderr and writes to the pipe - connected to the logger daemon - """ - # remember these values for later. - self._force_color = color._force_color - self._debug = tty._debug - # Redirect this output to a pipe - write = self.write - try: - # Save old stdout and stderr - self._stdout = os.dup(sys.stdout.fileno()) - self._stderr = os.dup(sys.stderr.fileno()) - - # redirect to the pipe. - os.dup2(write, sys.stdout.fileno()) - os.dup2(write, sys.stderr.fileno()) - except AttributeError: - self.directAssignment = True - self._stdout = sys.stdout - self._stderr = sys.stderr - output_redirect = os.fdopen(write, 'w') - sys.stdout = output_redirect - sys.stderr = output_redirect - if self.force_color: - color._force_color = True - if self.debug: - tty._debug = True - - def __exit__(self, exc_type, exception, traceback): - """Plugs back the original file descriptors - for stdout and stderr - """ - # Flush the log to disk. - sys.stdout.flush() - sys.stderr.flush() - if self.directAssignment: - # We seem to need this only to pass test/install.py - sys.stdout = self._stdout - sys.stderr = self._stderr - else: - os.dup2(self._stdout, sys.stdout.fileno()) - os.dup2(self._stderr, sys.stderr.fileno()) - - # restore output options. - color._force_color = self._force_color - tty._debug = self._debug + if xon in controls: + force_echo = True + if xoff in controls: + force_echo = False diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 620445fe1c..53aa14ebc1 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -54,13 +54,11 @@ calls you can make from within the install() function. import inspect import multiprocessing import os -import errno import shutil import sys import traceback from six import iteritems -import llnl.util.lang as lang import llnl.util.tty as tty from llnl.util.filesystem import * @@ -536,21 +534,30 @@ def fork(pkg, function, dirty=False): control over the environment, etc. without affecting other builds that might be executed in the same spack call. - If something goes wrong, the child process is expected to print the - error and the parent process will exit with error as well. If things - go well, the child exits and the parent carries on. + If something goes wrong, the child process catches the error and + passes it to the parent wrapped in a ChildError. The parent is + expected to handle (or re-raise) the ChildError. """ - def child_execution(child_connection, input_stream): + def child_process(child_pipe, input_stream): + # We are in the child process. Python sets sys.stdin to + # open(os.devnull) to prevent our process and its parent from + # simultaneously reading from the original stdin. But, we assume + # that the parent process is not going to read from it till we + # are done with the child, so we undo Python's precaution. + if input_stream is not None: + sys.stdin = input_stream + try: setup_package(pkg, dirty=dirty) - function(input_stream) - child_connection.send(None) + function() + child_pipe.send(None) except StopIteration as e: # StopIteration is used to stop installations # before the final stage, mainly for debug purposes tty.msg(e.message) - child_connection.send(None) + child_pipe.send(None) + except: # catch ANYTHING that goes wrong in the child process exc_type, exc, tb = sys.exc_info() @@ -569,34 +576,29 @@ def fork(pkg, function, dirty=False): # make a pickleable exception to send to parent. msg = "%s: %s" % (str(exc_type.__name__), str(exc)) - ce = ChildError(msg, tb_string, build_log, package_context) - child_connection.send(ce) + child_pipe.send(ce) finally: - child_connection.close() + child_pipe.close() - parent_connection, child_connection = multiprocessing.Pipe() + parent_pipe, child_pipe = multiprocessing.Pipe() + input_stream = None try: - # Forward sys.stdin to be able to activate / deactivate - # verbosity pressing a key at run-time. When sys.stdin can't - # be duplicated (e.g. running under nohup, which results in an - # '[Errno 22] Invalid argument') then just use os.devnull - try: - input_stream = lang.duplicate_stream(sys.stdin) - except OSError as e: - if e.errno == errno.EINVAL: - tty.debug("Using devnull as input_stream") - input_stream = open(os.devnull) + # Forward sys.stdin when appropriate, to allow toggling verbosity + if sys.stdin.isatty() and hasattr(sys.stdin, 'fileno'): + input_stream = os.fdopen(os.dup(sys.stdin.fileno())) + p = multiprocessing.Process( - target=child_execution, - args=(child_connection, input_stream) - ) + target=child_process, args=(child_pipe, input_stream)) p.start() + finally: # Close the input stream in the parent process - input_stream.close() - child_exc = parent_connection.recv() + if input_stream is not None: + input_stream.close() + + child_exc = parent_pipe.recv() p.join() if child_exc is not None: diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index cbf7d92ea6..c94772c2a5 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -186,10 +186,9 @@ class PackageMeta(spack.directives.DirectiveMetaMixin): # Clear the attribute for the next class setattr(mcs, attr_name, {}) - # Preconditions _flush_callbacks('run_before') - # Sanity checks _flush_callbacks('run_after') + return super(PackageMeta, mcs).__new__(mcs, name, bases, attr_dict) @staticmethod @@ -1275,23 +1274,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.make_jobs = make_jobs # Then install the package itself. - def build_process(input_stream): + def build_process(): """Forked for each build. Has its own process and python module space set up by build_environment.fork().""" - # We are in the child process. This means that our sys.stdin is - # equal to open(os.devnull). Python did this to prevent our process - # and the parent process from possible simultaneous reading from - # the original standard input. But we assume that the parent - # process is not going to read from it till we are done here, - # otherwise it should not have passed us the copy of the stream. - # Thus, we are free to work with the the copy (input_stream) - # however we want. For example, we might want to call functions - # (e.g. input()) that implicitly read from whatever stream is - # assigned to sys.stdin. Since we want them to work with the - # original input stream, we are making the following assignment: - sys.stdin = input_stream - start_time = time.time() if not fake: if not skip_patch: @@ -1328,23 +1314,20 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Spawn a daemon that reads from a pipe and redirects # everything to log_path - redirection_context = log_output( - log_path, - echo=verbose, - force_color=sys.stdout.isatty(), - debug=True, - input_stream=input_stream - ) - with redirection_context as log_redirection: - for phase_name, phase in zip( + with log_output(log_path, + echo=verbose, + debug=True) as logger: + + for phase_name, phase_attr in zip( self.phases, self._InstallPhase_phases): - tty.msg( - 'Executing phase : \'{0}\''.format(phase_name) - ) + + with logger.force_echo(): + tty.msg("Executing phase: '%s'" % phase_name) + # Redirect stdout and stderr to daemon pipe - with log_redirection: - getattr(self, phase)( - self.spec, self.prefix) + phase = getattr(self, phase_attr) + phase(self.spec, self.prefix) + self.log() # Run post install hooks before build stage is removed. spack.hooks.post_install(self.spec) @@ -1363,8 +1346,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Create the install prefix and fork the build process. if not os.path.exists(self.prefix): spack.store.layout.create_install_directory(self.spec) + # Fork a child to do the actual installation spack.build_environment.fork(self, build_process, dirty=dirty) + # If we installed then we should keep the prefix keep_prefix = self.last_phase is None or keep_prefix # note: PARENT of the build process adds the new package to @@ -1439,12 +1424,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): def log(self): # Copy provenance into the install directory on success - log_install_path = spack.store.layout.build_log_path( - self.spec) - env_install_path = spack.store.layout.build_env_path( - self.spec) - packages_dir = spack.store.layout.build_packages_path( - self.spec) + log_install_path = spack.store.layout.build_log_path(self.spec) + env_install_path = spack.store.layout.build_env_path(self.spec) + packages_dir = spack.store.layout.build_packages_path(self.spec) # Remove first if we're overwriting another build # (can happen with spack setup) diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index e0a745c7e9..f407943326 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -27,10 +27,7 @@ import copy import os import re import shutil -from six import StringIO -import llnl.util.filesystem -import llnl.util.lang import ordereddict_backport import py @@ -52,17 +49,6 @@ from spack.fetch_strategy import * ########## # Monkey-patching that is applied to all tests ########## - - -@pytest.fixture(autouse=True) -def no_stdin_duplication(monkeypatch): - """Duplicating stdin (or any other stream) returns an empty - StringIO object. - """ - monkeypatch.setattr(llnl.util.lang, 'duplicate_stream', - lambda x: StringIO()) - - @pytest.fixture(autouse=True) def mock_fetch_cache(monkeypatch): """Substitutes spack.fetch_cache with a mock object that does nothing -- cgit v1.2.3-70-g09d2 From 48440766dfd7ea381367f8d957372d262719c8e8 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 14 Aug 2017 05:10:40 -0700 Subject: Fix exit call in `SpackError.die()` - Previously we would use `os._exit()` in to avoid Spack error handling in the parent process when build processes failed. This isn't necessary anymore since build processes propagate their exceptions to the parent process. - Use `sys.exit` instead of `os._exit`. This has the advantage of automatically flushing output streams on quit, so output from child processes is not lost when Spack exits. --- lib/spack/spack/error.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index 7b86415202..6e48a4e76c 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -24,7 +24,6 @@ ############################################################################## from __future__ import print_function -import os import sys import llnl.util.tty as tty @@ -54,7 +53,8 @@ class SpackError(Exception): # basic debug message tty.error(self.message) if self.long_message: - print(self.long_message) + sys.stderr.write(self.long_message) + sys.stderr.write('\n') # stack trace, etc. in debug mode. if spack.debug: @@ -66,7 +66,7 @@ class SpackError(Exception): # run parent exception hook. sys.excepthook(*sys.exc_info()) - os._exit(1) + sys.exit(1) def __str__(self): msg = self.message -- cgit v1.2.3-70-g09d2 From 11196e7b6972474c09aa8aa24e9de6fe8927f1af Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 20 Aug 2017 00:12:05 -0700 Subject: Preserve verbosity across installs when 'v' is pressed. - 'v' toggle was previously only good for the current install. - subsequent installs needed user to press 'v' again. - 'v' state is now preserved across dependency installs. --- lib/spack/llnl/util/tty/log.py | 184 +++++++++++++++++++++++++---------- lib/spack/spack/build_environment.py | 11 ++- lib/spack/spack/package.py | 30 ++++-- 3 files changed, 159 insertions(+), 66 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index ac77e2dc8d..2b3ad22c2d 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -29,6 +29,7 @@ import os import re import select import sys +import traceback from contextlib import contextmanager import llnl.util.tty as tty @@ -44,6 +45,7 @@ _escape = re.compile(r'\x1b[^m]*m|\x1b\[?1034h') xon, xoff = '\x11\n', '\x13\n' control = re.compile('(\x11\n|\x13\n)') + def _strip(line): """Strip color and control characters from a line.""" return _escape.sub('', line) @@ -76,6 +78,9 @@ class keyboard_input(object): Args: stream (file-like): stream on which to accept keyboard input + + Note that stream can be None, in which case ``keyboard_input`` + will do nothing. """ self.stream = stream @@ -88,7 +93,7 @@ class keyboard_input(object): self.old_cfg = None # Ignore all this if the input stream is not a tty. - if not self.stream.isatty(): + if not self.stream or not self.stream.isatty(): return try: @@ -119,6 +124,30 @@ class keyboard_input(object): self.stream.fileno(), termios.TCSADRAIN, self.old_cfg) +def _file_descriptors_work(): + """Whether we can get file descriptors for stdout and stderr. + + This tries to call ``fileno()`` on ``sys.stdout`` and ``sys.stderr`` + and returns ``False`` if anything goes wrong. + + This can happen, when, e.g., the test framework replaces stdout with + a ``StringIO`` object. + + We have to actually try this to see whether it works, rather than + checking for the fileno attribute, beacuse frameworks like pytest add + dummy fileno methods on their dummy file objects that return + ``UnsupportedOperationErrors``. + + """ + # test whether we can get fds for out and error + try: + sys.stdout.fileno() + sys.stderr.fileno() + return True + except: + return False + + class log_output(object): """Context manager that logs its output to a file. @@ -135,7 +164,7 @@ class log_output(object): # do things ... output will be logged and printed out And, if you just want to echo *some* stuff from the parent, use - ``force_echo``: + ``force_echo``:: with log_output('logfile.txt', echo=False) as logger: # do things ... output will be logged @@ -155,7 +184,7 @@ class log_output(object): work within test frameworks like nose and pytest. """ - def __init__(self, filename, echo=False, debug=False): + def __init__(self, filename=None, echo=False, debug=False): """Create a new output log context manager. Logger daemon is not started until ``__enter__()``. @@ -166,10 +195,38 @@ class log_output(object): self._active = False # used to prevent re-entry + def __call__(self, filename=None, echo=None, debug=None): + """Thie behaves the same as init. It allows a logger to be reused. + + With the ``__call__`` function, you can save state between uses + of a single logger. This is useful if you want to remember, + e.g., the echo settings for a prior ``with log_output()``:: + + logger = log_output() + + with logger('foo.txt'): + # log things; user can change echo settings with 'v' + + with logger('bar.txt'): + # log things; logger remembers prior echo settings. + + """ + if filename is not None: + self.filename = filename + if echo is not None: + self.echo = echo + if debug is not None: + self.debug = debug + return self + def __enter__(self): if self._active: raise RuntimeError("Can't re-enter the same log_output!") + if self.filename is None: + raise RuntimeError( + "filename must be set by either __init__ or __call__") + # record parent color settings before redirecting. We do this # because color output depends on whether the *original* stdout # is a TTY. New stdout won't be a TTY so we force colorization. @@ -183,10 +240,17 @@ class log_output(object): # OS-level pipe for redirecting output to logger self.read_fd, self.write_fd = os.pipe() + # Multiprocessing pipe for communication back from the daemon + # Currently only used to save echo value between uses + self.parent, self.child = multiprocessing.Pipe() + # Sets a daemon that writes to file what it reads from a pipe try: # need to pass this b/c multiprocessing closes stdin in child. - input_stream = os.fdopen(os.dup(sys.stdin.fileno())) + try: + input_stream = os.fdopen(os.dup(sys.stdin.fileno())) + except: + input_stream = None # just don't forward input if this fails self.process = multiprocessing.Process( target=self._writer_daemon, args=(input_stream,)) @@ -195,7 +259,8 @@ class log_output(object): os.close(self.read_fd) # close in the parent process finally: - input_stream.close() + if input_stream: + input_stream.close() # Flush immediately before redirecting so that anything buffered # goes to the original stream @@ -203,8 +268,8 @@ class log_output(object): sys.stderr.flush() # Now do the actual output rediction. - self.use_fds = True - try: + self.use_fds = _file_descriptors_work() + if self.use_fds: # We try first to use OS-level file descriptors, as this # redirects output for subprocesses and system calls. @@ -217,13 +282,11 @@ class log_output(object): os.dup2(self.write_fd, sys.stderr.fileno()) os.close(self.write_fd) - except AttributeError: - # Using file descriptors can fail if stdout and stderr don't - # have a fileno attribute. This can happen, when, e.g., the - # test framework replaces stdout with a StringIO object. We - # handle thi the Python way. This won't redirect lower-level - # output, but it's the best we can do. - self.use_fds = False + else: + # Handle I/O the Python way. This won't redirect lower-level + # output, but it's the best we can do, and the caller + # shouldn't expect any better, since *they* have apparently + # redirected I/O the Python way. # Save old stdout and stderr file objects self._saved_stdout = sys.stdout @@ -262,6 +325,9 @@ class log_output(object): sys.stdout = self._saved_stdout sys.stderr = self._saved_stderr + # recover and store echo settings from the child before it dies + self.echo = self.parent.recv() + # join the daemon process. The daemon will quit automatically # when the write pipe is closed; we just wait for it here. self.process.join() @@ -299,43 +365,53 @@ class log_output(object): echo = self.echo # initial echo setting, user-controllable force_echo = False # parent can force echo for certain output - with open(self.filename, 'w') as log_file: - with keyboard_input(stdin): - while True: - # Without the last parameter (timeout) select will - # wait until at least one of the two streams are - # ready. This may cause the function to hang. - rlist, _, xlist = select.select( - [in_pipe, stdin], [], [], 0) - - # Allow user to toggle echo with 'v' key. - # Currently ignores other chars. - if stdin in rlist: - if stdin.read(1) == 'v': - echo = not echo - - # Handle output from the with block process. - if in_pipe in rlist: - # If we arrive here it means that in_pipe was - # ready for reading : it should never happen that - # line is false-ish - line = in_pipe.readline() - if not line: - break # EOF - - # find control characters and strip them. - controls = control.findall(line) - line = re.sub(control, '', line) - - # Echo to stdout if requested or forced - if echo or force_echo: - sys.stdout.write(line) - - # Stripped output to log file. - log_file.write(_strip(line)) - log_file.flush() - - if xon in controls: - force_echo = True - if xoff in controls: - force_echo = False + # list of streams to select from + istreams = [in_pipe, stdin] if stdin else [in_pipe] + + try: + with open(self.filename, 'w') as log_file: + with keyboard_input(stdin): + while True: + # Without the last parameter (timeout) select will + # wait until at least one of the two streams are + # ready. This may cause the function to hang. + rlist, _, xlist = select.select(istreams, [], [], 0) + + # Allow user to toggle echo with 'v' key. + # Currently ignores other chars. + if stdin in rlist: + if stdin.read(1) == 'v': + echo = not echo + + # Handle output from the with block process. + if in_pipe in rlist: + # If we arrive here it means that in_pipe was + # ready for reading : it should never happen that + # line is false-ish + line = in_pipe.readline() + if not line: + break # EOF + + # find control characters and strip them. + controls = control.findall(line) + line = re.sub(control, '', line) + + # Echo to stdout if requested or forced + if echo or force_echo: + sys.stdout.write(line) + + # Stripped output to log file. + log_file.write(_strip(line)) + log_file.flush() + + if xon in controls: + force_echo = True + if xoff in controls: + force_echo = False + + except: + tty.error("Exception occurred in writer daemon!") + traceback.print_exc() + + # send echo value back to the parent so it can be preserved. + self.child.send(echo) diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 53aa14ebc1..339468f4be 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -550,8 +550,8 @@ def fork(pkg, function, dirty=False): try: setup_package(pkg, dirty=dirty) - function() - child_pipe.send(None) + return_value = function() + child_pipe.send(return_value) except StopIteration as e: # StopIteration is used to stop installations # before the final stage, mainly for debug purposes @@ -598,11 +598,12 @@ def fork(pkg, function, dirty=False): if input_stream is not None: input_stream.close() - child_exc = parent_pipe.recv() + child_result = parent_pipe.recv() p.join() - if child_exc is not None: - raise child_exc + if isinstance(child_result, ChildError): + raise child_result + return child_result def get_package_context(traceback): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index c94772c2a5..ef1c411f66 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -542,6 +542,9 @@ class PackageBase(with_metaclass(PackageMeta, object)): #: Defaults to the empty string. license_url = '' + # Verbosity level, preserved across installs. + _verbose = None + def __init__(self, spec): # this determines how the package should be built. self.spec = spec @@ -1275,8 +1278,13 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Then install the package itself. def build_process(): - """Forked for each build. Has its own process and python - module space set up by build_environment.fork().""" + """This implements the process forked for each build. + + Has its own process and python module space set up by + build_environment.fork(). + + This function's return value is returned to the parent process. + """ start_time = time.time() if not fake: @@ -1289,6 +1297,11 @@ class PackageBase(with_metaclass(PackageMeta, object)): 'Building {0} [{1}]'.format(self.name, self.build_system_class) ) + # get verbosity from do_install() parameter or saved value + echo = verbose + if PackageBase._verbose is not None: + echo = PackageBase._verbose + self.stage.keep = keep_stage with self._stage_and_write_lock(): # Run the pre-install hook in the child process after @@ -1314,10 +1327,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Spawn a daemon that reads from a pipe and redirects # everything to log_path - with log_output(log_path, - echo=verbose, - debug=True) as logger: - + with log_output(log_path, echo, True) as logger: for phase_name, phase_attr in zip( self.phases, self._InstallPhase_phases): @@ -1328,6 +1338,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): phase = getattr(self, phase_attr) phase(self.spec, self.prefix) + echo = logger.echo self.log() # Run post install hooks before build stage is removed. spack.hooks.post_install(self.spec) @@ -1342,13 +1353,18 @@ class PackageBase(with_metaclass(PackageMeta, object)): _hms(self._total_time))) print_pkg(self.prefix) + # preserve verbosity across runs + return echo + try: # Create the install prefix and fork the build process. if not os.path.exists(self.prefix): spack.store.layout.create_install_directory(self.spec) # Fork a child to do the actual installation - spack.build_environment.fork(self, build_process, dirty=dirty) + # we preserve verbosity settings across installs. + PackageBase._verbose = spack.build_environment.fork( + self, build_process, dirty=dirty) # If we installed then we should keep the prefix keep_prefix = self.last_phase is None or keep_prefix -- cgit v1.2.3-70-g09d2 From 79045afada7f2a24221adf0788d4a40683a503ec Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 20 Aug 2017 00:48:43 -0700 Subject: Add tests for output redirection. --- lib/spack/spack/test/log.py | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 lib/spack/spack/test/log.py (limited to 'lib') diff --git a/lib/spack/spack/test/log.py b/lib/spack/spack/test/log.py new file mode 100644 index 0000000000..9c05ed002d --- /dev/null +++ b/lib/spack/spack/test/log.py @@ -0,0 +1,95 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 __future__ import print_function +import pytest + +from llnl.util.tty.log import log_output +from spack.util.executable import which + + +def test_log_python_output_with_python_stream(capsys, tmpdir): + # pytest's DontReadFromInput object does not like what we do here, so + # disable capsys or things hang. + with capsys.disabled(): + with log_output('foo.txt'): + print('logged') + + with open('foo.txt') as f: + assert f.read() == 'logged\n' + + assert capsys.readouterr() == ('', '') + + +def test_log_python_output_with_fd_stream(capfd, tmpdir): + with log_output('foo.txt'): + print('logged') + + with open('foo.txt') as f: + assert f.read() == 'logged\n' + + assert capfd.readouterr() == ('', '') + + +def test_log_python_output_and_echo_output(capfd, tmpdir): + with log_output('foo.txt') as logger: + with logger.force_echo(): + print('echo') + print('logged') + + assert capfd.readouterr() == ('echo\n', '') + + with open('foo.txt') as f: + assert f.read() == 'echo\nlogged\n' + + +@pytest.mark.skipif(not which('echo'), reason="needs echo command") +def test_log_subproc_output(capsys, tmpdir): + echo = which('echo') + + # pytest seems to interfere here, so we need to use capsys.disabled() + # TODO: figure out why this is and whether it means we're doing + # sometihng wrong with OUR redirects. Seems like it should work even + # with capsys enabled. + with capsys.disabled(): + with log_output('foo.txt'): + echo('logged') + + with open('foo.txt') as f: + assert f.read() == 'logged\n' + + +@pytest.mark.skipif(not which('echo'), reason="needs echo command") +def test_log_subproc_and_echo_output(capfd, tmpdir): + echo = which('echo') + + with log_output('foo.txt') as logger: + with logger.force_echo(): + echo('echo') + print('logged') + + assert capfd.readouterr() == ('echo\n', '') + + with open('foo.txt') as f: + assert f.read() == 'logged\n' -- cgit v1.2.3-70-g09d2 From 10bb681b5789fd0eba0014b43b24bbbf2d845705 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 20 Aug 2017 03:29:54 -0700 Subject: Unbuffer so that output from packages appears when redirecting - Python I/O would not properly interleave (or appear) with output from subcommands. - Add a flusing wrapper around sys.stdout and sys.stderr when redirecting, so that Python output is synchronous with that of subcommands. --- lib/spack/llnl/util/tty/log.py | 46 +++++++++++++++++++++- lib/spack/spack/test/cmd/install.py | 21 ++++++++++ .../packages/printing-package/package.py | 45 +++++++++++++++++++++ 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/printing-package/package.py (limited to 'lib') diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index 2b3ad22c2d..97547b34ed 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -124,6 +124,26 @@ class keyboard_input(object): self.stream.fileno(), termios.TCSADRAIN, self.old_cfg) +class Unbuffered(object): + """Wrapper for Python streams that forces them to be unbuffered. + + This is implemented by forcing a flush after each write. + """ + def __init__(self, stream): + self.stream = stream + + def write(self, data): + self.stream.write(data) + self.stream.flush() + + def writelines(self, datas): + self.stream.writelines(datas) + self.stream.flush() + + def __getattr__(self, attr): + return getattr(self.stream, attr) + + def _file_descriptors_work(): """Whether we can get file descriptors for stdout and stderr. @@ -184,18 +204,32 @@ class log_output(object): work within test frameworks like nose and pytest. """ - def __init__(self, filename=None, echo=False, debug=False): + def __init__(self, filename=None, echo=False, debug=False, buffer=False): """Create a new output log context manager. + Args: + filename (str): name of file where output should be logged + echo (bool): whether to echo output in addition to logging it + debug (bool): whether to enable tty debug mode during logging + buffer (bool): pass buffer=True to skip unbuffering output; note + this doesn't set up any *new* buffering + + By default, we unbuffer sys.stdout and sys.stderr because the + logger will include output from executed programs and from python + calls. If stdout and stderr are buffered, their output won't be + printed in the right place w.r.t. output from commands. + Logger daemon is not started until ``__enter__()``. + """ self.filename = filename self.echo = echo self.debug = debug + self.buffer = buffer self._active = False # used to prevent re-entry - def __call__(self, filename=None, echo=None, debug=None): + def __call__(self, filename=None, echo=None, debug=None, buffer=None): """Thie behaves the same as init. It allows a logger to be reused. With the ``__call__`` function, you can save state between uses @@ -217,6 +251,8 @@ class log_output(object): self.echo = echo if debug is not None: self.debug = debug + if buffer is not None: + self.buffer = buffer return self def __enter__(self): @@ -297,6 +333,11 @@ class log_output(object): sys.stdout = pipe_fd_out sys.stderr = pipe_fd_out + # Unbuffer stdout and stderr at the Python level + if not self.buffer: + sys.stdout = Unbuffered(sys.stdout) + sys.stderr = Unbuffered(sys.stderr) + # Force color and debug settings now that we have redirected. tty.color.set_color_when(forced_color) tty._debug = self.debug @@ -399,6 +440,7 @@ class log_output(object): # Echo to stdout if requested or forced if echo or force_echo: sys.stdout.write(line) + sys.stdout.flush() # Stripped output to log file. log_file.write(_strip(line)) diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 5886d602a2..1b8549ca3d 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -23,10 +23,12 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## import argparse +import os import pytest import spack.cmd.install +from spack.spec import Spec from spack.main import SpackCommand install = SpackCommand('install') @@ -86,3 +88,22 @@ def test_install_package_already_installed( def test_install_dirty_flag(parser, arguments, expected): args = parser.parse_args(arguments) assert args.dirty == expected + + +def test_package_output(tmpdir, capsys, install_mockery, mock_fetch): + """Ensure output printed from pkgs is captured by output redirection.""" + # we can't use output capture here because it interferes with Spack's + # logging. TODO: see whether we can get multiple log_outputs to work + # when nested AND in pytest + spec = Spec('printing-package').concretized() + pkg = spec.package + pkg.do_install(verbose=True) + + log_file = os.path.join(spec.prefix, '.spack', 'build.out') + with open(log_file) as f: + out = f.read() + + # make sure that output from the actual package file appears in the + # right place in the build log. + assert "BEFORE INSTALL\n==> './configure'" in out + assert "'install'\nAFTER INSTALL" in out diff --git a/var/spack/repos/builtin.mock/packages/printing-package/package.py b/var/spack/repos/builtin.mock/packages/printing-package/package.py new file mode 100644 index 0000000000..2396677252 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/printing-package/package.py @@ -0,0 +1,45 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 PrintingPackage(Package): + """This package prints some output from its install method. + + We use this to test whether that output is properly logged. + """ + homepage = "http://www.example.com/printing_package" + url = "http://www.unit-test-should-replace-this-url/trivial_install-1.0.tar.gz" + + version('1.0', 'foobarbaz') + + def install(self, spec, prefix): + print("BEFORE INSTALL") + + configure('--prefix=%s' % prefix) + make() + make('install') + + print("AFTER INSTALL") -- cgit v1.2.3-70-g09d2 From 581f70ff6f3bc13d53c98da60fa0fe50fe784f2c Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 21 Aug 2017 18:20:07 +0200 Subject: Added custom messages for conflicts directive. fixes #4965 (#5083) Users can now add an optional custom message to the conflicts directive. Layout on screen has been changed to improve readability and the long spec is shown in tree format. Two conflicts in `espresso` have been modified to showcase the feature. --- lib/spack/spack/directives.py | 6 +++-- lib/spack/spack/spec.py | 28 +++++++++++++++++----- .../repos/builtin/packages/espresso/package.py | 13 ++++++++-- 3 files changed, 37 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 2e8b32e5af..2a99e171a0 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -263,7 +263,7 @@ def _depends_on(pkg, spec, when=None, type=None): @directive('conflicts') -def conflicts(conflict_spec, when=None): +def conflicts(conflict_spec, when=None, msg=None): """Allows a package to define a conflict. Currently, a "conflict" is a concretized configuration that is known @@ -280,14 +280,16 @@ def conflicts(conflict_spec, when=None): Args: conflict_spec (Spec): constraint defining the known conflict when (Spec): optional constraint that triggers the conflict + msg (str): optional user defined message """ def _execute(pkg): # If when is not specified the conflict always holds condition = pkg.name if when is None else when when_spec = parse_anonymous_spec(condition, pkg.name) + # Save in a list the conflicts and the associated custom messages when_spec_list = pkg.conflicts.setdefault(conflict_spec, []) - when_spec_list.append(when_spec) + when_spec_list.append((when_spec, msg)) return _execute diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 43d57f2b98..a58e1ceb2f 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1798,9 +1798,9 @@ class Spec(object): for x in self.traverse(): for conflict_spec, when_list in x.package.conflicts.items(): if x.satisfies(conflict_spec): - for when_spec in when_list: + for when_spec, msg in when_list: if x.satisfies(when_spec): - matches.append((x, conflict_spec, when_spec)) + matches.append((x, conflict_spec, when_spec, msg)) if matches: raise ConflictsInSpecError(self, matches) @@ -3447,8 +3447,24 @@ class ConflictsInSpecError(SpecError, RuntimeError): message = 'Conflicts in concretized spec "{0}"\n'.format( spec.short_spec ) - long_message = 'List of matching conflicts:\n\n' - match_fmt = '{0}. "{1}" conflicts with "{2}" in spec "{3}"\n' - for idx, (s, c, w) in enumerate(matches): - long_message += match_fmt.format(idx + 1, c, w, s) + + visited = set() + + long_message = '' + + match_fmt_default = '{0}. "{1}" conflicts with "{2}"\n' + match_fmt_custom = '{0}. "{1}" conflicts with "{2}" [{3}]\n' + + for idx, (s, c, w, msg) in enumerate(matches): + + if s not in visited: + visited.add(s) + long_message += 'List of matching conflicts for spec:\n\n' + long_message += s.tree(indent=4) + '\n' + + if msg is None: + long_message += match_fmt_default.format(idx + 1, c, w) + else: + long_message += match_fmt_custom.format(idx + 1, c, w, msg) + super(ConflictsInSpecError, self).__init__(message, long_message) diff --git a/var/spack/repos/builtin/packages/espresso/package.py b/var/spack/repos/builtin/packages/espresso/package.py index b77e14ec76..26cbf8fd88 100644 --- a/var/spack/repos/builtin/packages/espresso/package.py +++ b/var/spack/repos/builtin/packages/espresso/package.py @@ -75,8 +75,17 @@ class Espresso(Package): patch('dspev_drv_elpa.patch', when='@6.1 ^elpa@2016.05.003') # We can't ask for scalapack or elpa if we don't want MPI - conflicts('+scalapack', when='~mpi') - conflicts('+elpa', when='~mpi') + conflicts( + '+scalapack', + when='~mpi', + msg='scalapack is a parallel library and needs MPI support' + ) + + conflicts( + '+elpa', + when='~mpi', + msg='elpa is a parallel library and needs MPI support' + ) # Elpa is formally supported by @:5.4.0, but QE configure searches # for it in the wrong folders (or tries to download it within -- cgit v1.2.3-70-g09d2 From 48bf1e276bde45acab0d7c78cf2740907b5afce8 Mon Sep 17 00:00:00 2001 From: Matthew Scott Krafczyk Date: Mon, 21 Aug 2017 20:35:00 -0500 Subject: Add environment variables to path substitution Update documentation on config file variable substitutions and add expansion of environment variables in config files. --- lib/spack/docs/config_yaml.rst | 21 ----------------- lib/spack/docs/configuration.rst | 49 ++++++++++++++++++++++++++++++++++++++++ lib/spack/spack/util/path.py | 4 +++- 3 files changed, 52 insertions(+), 22 deletions(-) (limited to 'lib') diff --git a/lib/spack/docs/config_yaml.rst b/lib/spack/docs/config_yaml.rst index 1c51db1b96..da760f05e3 100644 --- a/lib/spack/docs/config_yaml.rst +++ b/lib/spack/docs/config_yaml.rst @@ -14,27 +14,6 @@ see the default settings by looking at These settings can be overridden in ``etc/spack/config.yaml`` or ``~/.spack/config.yaml``. See :ref:`configuration-scopes` for details. -.. _config-file-variables: - ------------------------------- -Config file variables ------------------------------- - -You may notice some variables prefixed with ``$`` in the settings above. -Spack understands several variables that can be used in values of -configuration parameters. They are: - - * ``$spack``: path to the prefix of this spack installation - * ``$tempdir``: default system temporary directory (as specified in - Python's `tempfile.tempdir - `_ - variable. - * ``$user``: name of the current user - -Note that, as with shell variables, you can write these as ``$varname`` -or with braces to distinguish the variable from surrounding characters: -``${varname}``. - -------------------- ``install_tree`` -------------------- diff --git a/lib/spack/docs/configuration.rst b/lib/spack/docs/configuration.rst index 5f76a76c81..f1648eb4e0 100644 --- a/lib/spack/docs/configuration.rst +++ b/lib/spack/docs/configuration.rst @@ -261,3 +261,52 @@ The merged configuration would look like this: - /lustre-scratch/$user - ~/mystage $ _ + +.. _config-file-variables: + +------------------------------ +Config file variables +------------------------------ + +Spack understands several variables which can be used in config file paths +where ever they appear. There are three sets of these variables, Spack specific +variables, environment variables, and user path variables. Spack specific +variables and environment variables both are indicated by prefixing the variable +name with ``$``. User path variables are indicated at the start of the path with +``~`` or ``~user``. Let's discuss each in turn. + +^^^^^^^^^^^^^^^^^^^^^^^^ +Spack Specific Variables +^^^^^^^^^^^^^^^^^^^^^^^^ + +Spack understands several special variables. These are: + + * ``$spack``: path to the prefix of this spack installation + * ``$tempdir``: default system temporary directory (as specified in + Python's `tempfile.tempdir + `_ + variable. + * ``$user``: name of the current user + +Note that, as with shell variables, you can write these as ``$varname`` +or with braces to distinguish the variable from surrounding characters: +``${varname}``. Their names are also case insensitive meaning that ``$SPACK`` +works just as well as ``$spack``. These special variables are also +substituted first, so any environment variables with the same name will not +be used. + +^^^^^^^^^^^^^^^^^^^^^ +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ + +Spack then uses ``os.path.expandvars`` to expand any remaining environment +variables. + +^^^^^^^^^^^^^^ +User Variables +^^^^^^^^^^^^^^ + +Spack also uses the ``os.path.expanduser`` function on the path to expand +any user tilde paths such as ``~`` or ``~user``. These tilde paths must appear +at the beginning of the path or ``os.path.expanduser`` will not properly +expand them. diff --git a/lib/spack/spack/util/path.py b/lib/spack/spack/util/path.py index 0edab60f21..edfd915c65 100644 --- a/lib/spack/spack/util/path.py +++ b/lib/spack/spack/util/path.py @@ -65,8 +65,10 @@ def substitute_config_variables(path): def canonicalize_path(path): - """Substitute config vars, expand user home, take abspath.""" + """Substitute config vars, expand environment vars, + expand user home, take abspath.""" path = substitute_config_variables(path) + path = os.path.expandvars(path) path = os.path.expanduser(path) path = os.path.abspath(path) return path -- cgit v1.2.3-70-g09d2 From 4600d106e27caa87b8206e9db7af825f16c93fc0 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 22 Aug 2017 23:20:19 +0200 Subject: Config scopes are now returning OrderedDicts instead of dicts. (#5183) It seems 8f21332fec4c8adb5349ff90e30bb0e4f75e090e introduced a bug in that normal dictionaries are returned from ConfigScope objects instead of OrderedDicts. This is fixed here. --- lib/spack/spack/config.py | 6 ++-- lib/spack/spack/test/config.py | 28 ++++++++++++++++++ lib/spack/spack/test/data/config/modules.yaml | 42 +++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 lib/spack/spack/test/data/config/modules.yaml (limited to 'lib') diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index d3a385ea80..8b7fcf334c 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -162,7 +162,7 @@ class ConfigScope(object): def __init__(self, name, path): self.name = name # scope name. self.path = path # path to directory containing configs. - self.sections = {} # sections read from config files. + self.sections = syaml.syaml_dict() # sections read from config files. # Register in a dict of all ConfigScopes # TODO: make this cleaner. Mocking up for testing is brittle. @@ -197,7 +197,7 @@ class ConfigScope(object): def clear(self): """Empty cached config information.""" - self.sections = {} + self.sections = syaml.syaml_dict() def __repr__(self): return '' % (self.name, self.path) @@ -314,7 +314,7 @@ def _mark_overrides(data): return [_mark_overrides(elt) for elt in data] elif isinstance(data, dict): - marked = {} + marked = syaml.syaml_dict() for key, val in iteritems(data): if isinstance(key, string_types) and key.endswith(':'): key = syaml.syaml_str(key[:-1]) diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py index 2363754a00..d00dc64bb3 100644 --- a/lib/spack/spack/test/config.py +++ b/lib/spack/spack/test/config.py @@ -369,3 +369,31 @@ class TestConfig(object): 'install_tree': 'install_tree_path', 'build_stage': ['patha', 'pathb'] } + + +def test_keys_are_ordered(): + + expected_order = ( + 'bin', + 'man', + 'share/man', + 'share/aclocal', + 'lib', + 'lib64', + 'include', + 'lib/pkgconfig', + 'lib64/pkgconfig', + '' + ) + + config_scope = spack.config.ConfigScope( + 'modules', + os.path.join(spack.test_path, 'data', 'config') + ) + + data = config_scope.get_section('modules') + + prefix_inspections = data['modules']['prefix_inspections'] + + for actual, expected in zip(prefix_inspections, expected_order): + assert actual == expected diff --git a/lib/spack/spack/test/data/config/modules.yaml b/lib/spack/spack/test/data/config/modules.yaml new file mode 100644 index 0000000000..25fe2088e7 --- /dev/null +++ b/lib/spack/spack/test/data/config/modules.yaml @@ -0,0 +1,42 @@ +# ------------------------------------------------------------------------- +# This is the default configuration for Spack's module file generation. +# +# Settings here are versioned with Spack and are intended to provide +# sensible defaults out of the box. Spack maintainers should edit this +# file to keep it current. +# +# Users can override these settings by editing the following files. +# +# Per-spack-instance settings (overrides defaults): +# $SPACK_ROOT/etc/spack/modules.yaml +# +# Per-user settings (overrides default and site settings): +# ~/.spack/modules.yaml +# ------------------------------------------------------------------------- +modules: + enable: + - tcl + - dotkit + prefix_inspections: + bin: + - PATH + man: + - MANPATH + share/man: + - MANPATH + share/aclocal: + - ACLOCAL_PATH + lib: + - LIBRARY_PATH + - LD_LIBRARY_PATH + lib64: + - LIBRARY_PATH + - LD_LIBRARY_PATH + include: + - CPATH + lib/pkgconfig: + - PKG_CONFIG_PATH + lib64/pkgconfig: + - PKG_CONFIG_PATH + '': + - CMAKE_PREFIX_PATH -- cgit v1.2.3-70-g09d2 From d54110d208f5502bc5ceaf38781508378ddbbdbc Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 5 Aug 2017 01:04:01 -0700 Subject: Limit package context to 3 lines and colorize in error output. --- lib/spack/spack/build_environment.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 339468f4be..6c4674bd26 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -60,6 +60,7 @@ import traceback from six import iteritems import llnl.util.tty as tty +from llnl.util.tty.color import colorize from llnl.util.filesystem import * import spack @@ -606,11 +607,14 @@ def fork(pkg, function, dirty=False): return child_result -def get_package_context(traceback): +def get_package_context(traceback, context=3): """Return some context for an error message when the build fails. Args: - traceback -- A traceback from some exception raised during install. + traceback (traceback): A traceback from some exception raised during + install + context (int): Lines of context to show before and after the line + where the error happened This function inspects the stack to find where we failed in the package file, and it adds detailed context to the long_message @@ -646,9 +650,17 @@ def get_package_context(traceback): # Build a message showing context in the install method. sourcelines, start = inspect.getsourcelines(frame) + + l = frame.f_lineno - start + start_ctx = max(0, l - context) + sourcelines = sourcelines[start_ctx:l + context + 1] for i, line in enumerate(sourcelines): - mark = ">> " if start + i == frame.f_lineno else " " - lines.append(" %s%-5d%s" % (mark, start + i, line.rstrip())) + is_error = start_ctx + i == l + mark = ">> " if is_error else " " + marked = " %s%-5d%s" % (mark, start_ctx + i, line.rstrip()) + if is_error: + marked = colorize('@R{%s}' % marked) + lines.append(marked) return lines -- cgit v1.2.3-70-g09d2 From 139d5bfa6bee97415094dd471947011303168049 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 7 Aug 2017 15:09:44 -0700 Subject: Display build output on ProcessError, instead of Python context. - If a failure comes from an external command and NOT the Python code, display errors highlighted with some context. - Add some rudimentary support for parsing errors out of the build log (not very sophisticated yet). - Build errors in Python code will still display with Python context. --- lib/spack/spack/build_environment.py | 95 +++++++++++++++++-------- lib/spack/spack/util/log_parse.py | 134 +++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 29 deletions(-) create mode 100644 lib/spack/spack/util/log_parse.py (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 6c4674bd26..ad27b3321d 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. @@ -58,6 +58,7 @@ import shutil import sys import traceback from six import iteritems +from six import StringIO import llnl.util.tty as tty from llnl.util.tty.color import colorize @@ -69,6 +70,9 @@ from spack.environment import EnvironmentModifications, validate from spack.util.environment import * from spack.util.executable import Executable from spack.util.module_cmd import load_module, get_path_from_module +from spack.util.log_parse import * + + # # This can be set by the user to globally disable parallel builds. # @@ -576,8 +580,12 @@ def fork(pkg, function, dirty=False): build_log = pkg.log_path # make a pickleable exception to send to parent. - msg = "%s: %s" % (str(exc_type.__name__), str(exc)) - ce = ChildError(msg, tb_string, build_log, package_context) + msg = "%s: %s" % (exc_type.__name__, str(exc)) + + ce = ChildError(msg, + exc_type.__module__, + exc_type.__name__, + tb_string, build_log, package_context) child_pipe.send(ce) finally: @@ -657,7 +665,7 @@ def get_package_context(traceback, context=3): for i, line in enumerate(sourcelines): is_error = start_ctx + i == l mark = ">> " if is_error else " " - marked = " %s%-5d%s" % (mark, start_ctx + i, line.rstrip()) + marked = " %s%-6d%s" % (mark, start_ctx + i, line.rstrip()) if is_error: marked = colorize('@R{%s}' % marked) lines.append(marked) @@ -683,40 +691,67 @@ class ChildError(spack.error.SpackError): failure in lieu of trying to run sys.excepthook on the parent process, so users will see the correct stack trace from a child. - 3. They also contain package_context, which shows source code context - in the Package implementation where the error happened. To get - this, Spack searches the stack trace for the deepest frame where - ``self`` is in scope and is an instance of PackageBase. This will - generally find a useful spot in the ``package.py`` file. + 3. They also contain context, which shows context in the Package + implementation where the error happened. This helps people debug + Python code in their packages. To get it, Spack searches the + stack trace for the deepest frame where ``self`` is in scope and + is an instance of PackageBase. This will generally find a useful + spot in the ``package.py`` file. + + The long_message of a ChildError displays one of two things: + + 1. If the original error was a ProcessError, indicating a command + died during the build, we'll show context from the build log. - The long_message of a ChildError displays all this stuff to the user, - and SpackError handles displaying the special traceback if we're in - debug mode with spack -d. + 2. If the original error was any other type of error, we'll show + context from the Python code. + + SpackError handles displaying the special traceback if we're in debug + mode with spack -d. """ - def __init__(self, msg, traceback_string, build_log, package_context): + # List of errors considered "build errors", for which we'll show log + # context instead of Python context. + build_errors = [('spack.util.executable', 'ProcessError')] + + def __init__(self, msg, module, classname, traceback_string, build_log, + context): super(ChildError, self).__init__(msg) + self.module = module + self.name = classname self.traceback = traceback_string self.build_log = build_log - self.package_context = package_context + self.context = context @property def long_message(self): - msg = self._long_message if self._long_message else '' - - if self.package_context: - if msg: - msg += "\n\n" - msg += '\n'.join(self.package_context) - - if msg: - msg += "\n\n" + out = StringIO() + out.write(self._long_message if self._long_message else '') + + if (self.module, self.name) in ChildError.build_errors: + # The error happened in some external executed process. Show + # the build log with errors highlighted. + if self.build_log: + events = parse_log_events(self.build_log) + out.write("\n%d errors in build log:\n" % len(events)) + out.write(make_log_context(events)) + + else: + # The error happened in in the Python code, so try to show + # some context from the Package itself. + out.write('%s: %s\n\n' % (self.name, self.message)) + if self.context: + out.write('\n'.join(self.context)) + out.write('\n') + + if out.getvalue(): + out.write('\n') if self.build_log: - msg += "See build log for details:\n" - msg += " %s" % self.build_log + out.write('See build log for details:\n') + out.write(' %s' % self.build_log) - return msg + return out.getvalue() def __reduce__(self): """__reduce__ is used to serialize (pickle) ChildErrors. @@ -726,11 +761,13 @@ class ChildError(spack.error.SpackError): """ return _make_child_error, ( self.message, + self.module, + self.name, self.traceback, self.build_log, - self.package_context) + self.context) -def _make_child_error(msg, traceback, build_log, package_context): +def _make_child_error(msg, module, name, traceback, build_log, context): """Used by __reduce__ in ChildError to reconstruct pickled errors.""" - return ChildError(msg, traceback, build_log, package_context) + return ChildError(msg, module, name, traceback, build_log, context) diff --git a/lib/spack/spack/util/log_parse.py b/lib/spack/spack/util/log_parse.py new file mode 100644 index 0000000000..a55dcf59f5 --- /dev/null +++ b/lib/spack/spack/util/log_parse.py @@ -0,0 +1,134 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 __future__ import print_function + +import re +from six import StringIO + +from llnl.util.tty.color import colorize + + +class LogEvent(object): + """Class representing interesting events (e.g., errors) in a build log.""" + def __init__(self, text, line_no, + pre_context='', post_context='', repeat_count=0): + self.text = text + self.line_no = line_no + self.pre_context = pre_context + self.post_context = post_context + self.repeat_count = repeat_count + + @property + def start(self): + """First line in the log with text for the event or its context.""" + return self.line_no - len(self.pre_context) + + @property + def end(self): + """Last line in the log with text for event or its context.""" + return self.line_no + len(self.post_context) + 1 + + def __getitem__(self, line_no): + """Index event text and context by actual line number in file.""" + if line_no == self.line_no: + return self.text + elif line_no < self.line_no: + return self.pre_context[line_no - self.line_no] + elif line_no > self.line_no: + return self.post_context[line_no - self.line_no - 1] + + def __str__(self): + """Returns event lines and context.""" + out = StringIO() + for i in range(self.start, self.end): + if i == self.line_no: + out.write(' >> %-6d%s' % (i, self[i])) + else: + out.write(' %-6d%s' % (i, self[i])) + return out.getvalue() + + +def parse_log_events(logfile, context=6): + """Extract interesting events from a log file as a list of LogEvent. + + Args: + logfile (str): name of the build log to parse + context (int): lines of context to extract around each log event + + Currently looks for lines that contain the string 'error:', ignoring case. + + TODO: Extract warnings and other events from the build log. + """ + with open(logfile, 'r') as f: + lines = [line for line in f] + + log_events = [] + for i, line in enumerate(lines): + if re.search('error:', line, re.IGNORECASE): + event = LogEvent( + line.strip(), + i + 1, + [l.rstrip() for l in lines[i - context:i]], + [l.rstrip() for l in lines[i + 1:i + context + 1]]) + log_events.append(event) + return log_events + + +def make_log_context(log_events): + """Get error context from a log file. + + Args: + log_events (list of LogEvent): list of events created by, e.g., + ``parse_log_events`` + + Returns: + str: context from the build log with errors highlighted + + Parses the log file for lines containing errors, and prints them out + with line numbers and context. Errors are highlighted with '>>' and + with red highlighting (if color is enabled). + """ + error_lines = set(e.line_no for e in log_events) + + out = StringIO() + next_line = 1 + for event in log_events: + start = event.start + + if start > next_line: + out.write(' [ ... ]\n') + + if start < next_line: + start = next_line + + for i in range(start, event.end): + if i in error_lines: + out.write(colorize(' @R{>> %-6d%s}\n' % (i, event[i]))) + else: + out.write(' %-6d%s\n' % (i, event[i])) + + next_line = event.end + + return out.getvalue() -- cgit v1.2.3-70-g09d2 From 4f444c5f58a224749b6dbf9556d50b9a4a6f43a7 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 22 Aug 2017 13:33:31 -0700 Subject: log_ouptut can take either a filename or a file object --- lib/spack/llnl/util/tty/log.py | 148 ++++++++++++++++++++++++++--------------- 1 file changed, 93 insertions(+), 55 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index 97547b34ed..e102e63d4b 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -31,6 +31,8 @@ import select import sys import traceback from contextlib import contextmanager +from six import string_types +from six import StringIO import llnl.util.tty as tty @@ -144,10 +146,10 @@ class Unbuffered(object): return getattr(self.stream, attr) -def _file_descriptors_work(): - """Whether we can get file descriptors for stdout and stderr. +def _file_descriptors_work(*streams): + """Whether we can get file descriptors for the streams specified. - This tries to call ``fileno()`` on ``sys.stdout`` and ``sys.stderr`` + This tries to call ``fileno()`` on all streams in the argument list, and returns ``False`` if anything goes wrong. This can happen, when, e.g., the test framework replaces stdout with @@ -161,8 +163,8 @@ def _file_descriptors_work(): """ # test whether we can get fds for out and error try: - sys.stdout.fileno() - sys.stderr.fileno() + for stream in streams: + stream.fileno() return True except: return False @@ -204,16 +206,22 @@ class log_output(object): work within test frameworks like nose and pytest. """ - def __init__(self, filename=None, echo=False, debug=False, buffer=False): + def __init__(self, file_like=None, echo=False, debug=False, buffer=False): """Create a new output log context manager. Args: - filename (str): name of file where output should be logged + file_like (str or stream): open file object or name of file where + output should be logged echo (bool): whether to echo output in addition to logging it debug (bool): whether to enable tty debug mode during logging buffer (bool): pass buffer=True to skip unbuffering output; note this doesn't set up any *new* buffering + log_output can take either a file object or a filename. If a + filename is passed, the file will be opened and closed entirely + within ``__enter__`` and ``__exit__``. If a file object is passed, + this assumes the caller owns it and will close it. + By default, we unbuffer sys.stdout and sys.stderr because the logger will include output from executed programs and from python calls. If stdout and stderr are buffered, their output won't be @@ -222,16 +230,19 @@ class log_output(object): Logger daemon is not started until ``__enter__()``. """ - self.filename = filename + self.file_like = file_like self.echo = echo self.debug = debug self.buffer = buffer self._active = False # used to prevent re-entry - def __call__(self, filename=None, echo=None, debug=None, buffer=None): + def __call__(self, file_like=None, echo=None, debug=None, buffer=None): """Thie behaves the same as init. It allows a logger to be reused. + Arguments are the same as for ``__init__()``. Args here take + precedence over those passed to ``__init__()``. + With the ``__call__`` function, you can save state between uses of a single logger. This is useful if you want to remember, e.g., the echo settings for a prior ``with log_output()``:: @@ -245,8 +256,8 @@ class log_output(object): # log things; logger remembers prior echo settings. """ - if filename is not None: - self.filename = filename + if file_like is not None: + self.file_like = file_like if echo is not None: self.echo = echo if debug is not None: @@ -259,9 +270,23 @@ class log_output(object): if self._active: raise RuntimeError("Can't re-enter the same log_output!") - if self.filename is None: + if self.file_like is None: raise RuntimeError( - "filename must be set by either __init__ or __call__") + "file argument must be set by either __init__ or __call__") + + # set up a stream for the daemon to write to + self.close_log_in_parent = True + self.write_log_in_parent = False + if isinstance(self.file_like, string_types): + self.log_file = open(self.file_like, 'w') + + elif _file_descriptors_work(self.file_like): + self.log_file = self.file_like + self.close_log_in_parent = False + + else: + self.log_file = StringIO() + self.write_log_in_parent = True # record parent color settings before redirecting. We do this # because color output depends on whether the *original* stdout @@ -304,7 +329,7 @@ class log_output(object): sys.stderr.flush() # Now do the actual output rediction. - self.use_fds = _file_descriptors_work() + self.use_fds = _file_descriptors_work(sys.stdout, sys.stderr) if self.use_fds: # We try first to use OS-level file descriptors, as this # redirects output for subprocesses and system calls. @@ -366,6 +391,14 @@ class log_output(object): sys.stdout = self._saved_stdout sys.stderr = self._saved_stderr + # print log contents in parent if needed. + if self.write_log_in_parent: + string = self.parent.recv() + self.file_like.write(string) + + if self.close_log_in_parent: + self.log_file.close() + # recover and store echo settings from the child before it dies self.echo = self.parent.recv() @@ -409,51 +442,56 @@ class log_output(object): # list of streams to select from istreams = [in_pipe, stdin] if stdin else [in_pipe] + log_file = self.log_file try: - with open(self.filename, 'w') as log_file: - with keyboard_input(stdin): - while True: - # Without the last parameter (timeout) select will - # wait until at least one of the two streams are - # ready. This may cause the function to hang. - rlist, _, xlist = select.select(istreams, [], [], 0) - - # Allow user to toggle echo with 'v' key. - # Currently ignores other chars. - if stdin in rlist: - if stdin.read(1) == 'v': - echo = not echo - - # Handle output from the with block process. - if in_pipe in rlist: - # If we arrive here it means that in_pipe was - # ready for reading : it should never happen that - # line is false-ish - line = in_pipe.readline() - if not line: - break # EOF - - # find control characters and strip them. - controls = control.findall(line) - line = re.sub(control, '', line) - - # Echo to stdout if requested or forced - if echo or force_echo: - sys.stdout.write(line) - sys.stdout.flush() - - # Stripped output to log file. - log_file.write(_strip(line)) - log_file.flush() - - if xon in controls: - force_echo = True - if xoff in controls: - force_echo = False - + with keyboard_input(stdin): + while True: + # Without the last parameter (timeout) select will + # wait until at least one of the two streams are + # ready. This may cause the function to hang. + rlist, _, xlist = select.select(istreams, [], [], 0) + + # Allow user to toggle echo with 'v' key. + # Currently ignores other chars. + if stdin in rlist: + if stdin.read(1) == 'v': + echo = not echo + + # Handle output from the with block process. + if in_pipe in rlist: + # If we arrive here it means that in_pipe was + # ready for reading : it should never happen that + # line is false-ish + line = in_pipe.readline() + if not line: + break # EOF + + # find control characters and strip them. + controls = control.findall(line) + line = re.sub(control, '', line) + + # Echo to stdout if requested or forced + if echo or force_echo: + sys.stdout.write(line) + sys.stdout.flush() + + # Stripped output to log file. + log_file.write(_strip(line)) + log_file.flush() + + if xon in controls: + force_echo = True + if xoff in controls: + force_echo = False except: tty.error("Exception occurred in writer daemon!") traceback.print_exc() + finally: + # send written data back to parent if we used a StringIO + if self.write_log_in_parent: + self.child.send(log_file.getvalue()) + log_file.close() + # send echo value back to the parent so it can be preserved. self.child.send(echo) -- cgit v1.2.3-70-g09d2 From fa1faa61c415ccab4de88b4f3ed3eb96b0e5ec4c Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 22 Aug 2017 14:01:02 -0700 Subject: SpackCommand uses log_output to capture command output. --- lib/spack/spack/main.py | 40 +++++++++++--------------------- lib/spack/spack/test/cmd/dependencies.py | 8 +++---- lib/spack/spack/test/cmd/dependents.py | 8 +++---- lib/spack/spack/test/cmd/python.py | 2 +- lib/spack/spack/test/cmd/url.py | 14 +++++------ 5 files changed, 29 insertions(+), 43 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index b17cb3cdc5..2f542604d5 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -34,9 +34,10 @@ import os import inspect import pstats import argparse -import tempfile +from six import StringIO import llnl.util.tty as tty +from llnl.util.tty.log import log_output from llnl.util.tty.color import * import spack @@ -367,7 +368,7 @@ class SpackCommand(object): install('-v', 'mpich') Use this to invoke Spack commands directly from Python and check - their stdout and stderr. + their output. """ def __init__(self, command): """Create a new SpackCommand that invokes ``command`` when called.""" @@ -376,9 +377,6 @@ class SpackCommand(object): self.command_name = command self.command = spack.cmd.get_command(command) - self.returncode = None - self.error = None - def __call__(self, *argv, **kwargs): """Invoke this SpackCommand. @@ -389,26 +387,26 @@ class SpackCommand(object): fail_on_error (optional bool): Don't raise an exception on error Returns: - (str, str): output and error as a strings + (str): combined output and error as a string On return, if ``fail_on_error`` is False, return value of comman is set in ``returncode`` property, and the error is set in the ``error`` property. Otherwise, raise an error. """ + # set these before every call to clear them out + self.returncode = None + self.error = None + args, unknown = self.parser.parse_known_args( [self.command_name] + list(argv)) fail_on_error = kwargs.get('fail_on_error', True) - out, err = sys.stdout, sys.stderr - ofd, ofn = tempfile.mkstemp() - efd, efn = tempfile.mkstemp() - + out = StringIO() try: - sys.stdout = open(ofn, 'w') - sys.stderr = open(efn, 'w') - self.returncode = _invoke_spack_command( - self.command, self.parser, args, unknown) + with log_output(out): + self.returncode = _invoke_spack_command( + self.command, self.parser, args, unknown) except SystemExit as e: self.returncode = e.code @@ -418,25 +416,13 @@ class SpackCommand(object): if fail_on_error: raise - finally: - sys.stdout.flush() - sys.stdout.close() - sys.stderr.flush() - sys.stderr.close() - sys.stdout, sys.stderr = out, err - - return_out = open(ofn).read() - return_err = open(efn).read() - os.unlink(ofn) - os.unlink(efn) - if fail_on_error and self.returncode not in (None, 0): raise SpackCommandError( "Command exited with code %d: %s(%s)" % ( self.returncode, self.command_name, ', '.join("'%s'" % a for a in argv))) - return return_out, return_err + return out.getvalue() def _main(command, parser, args, unknown_args): diff --git a/lib/spack/spack/test/cmd/dependencies.py b/lib/spack/spack/test/cmd/dependencies.py index e024fcc2e6..58f778c660 100644 --- a/lib/spack/spack/test/cmd/dependencies.py +++ b/lib/spack/spack/test/cmd/dependencies.py @@ -36,14 +36,14 @@ mpi_deps = ['fake'] def test_immediate_dependencies(builtin_mock): - out, err = dependencies('mpileaks') + out = dependencies('mpileaks') actual = set(re.split(r'\s+', out.strip())) expected = set(['callpath'] + mpis) assert expected == actual def test_transitive_dependencies(builtin_mock): - out, err = dependencies('--transitive', 'mpileaks') + out = dependencies('--transitive', 'mpileaks') actual = set(re.split(r'\s+', out.strip())) expected = set( ['callpath', 'dyninst', 'libdwarf', 'libelf'] + mpis + mpi_deps) @@ -52,7 +52,7 @@ def test_transitive_dependencies(builtin_mock): def test_immediate_installed_dependencies(builtin_mock, database): with color_when(False): - out, err = dependencies('--installed', 'mpileaks^mpich') + out = dependencies('--installed', 'mpileaks^mpich') lines = [l for l in out.strip().split('\n') if not l.startswith('--')] hashes = set([re.split(r'\s+', l)[0] for l in lines]) @@ -65,7 +65,7 @@ def test_immediate_installed_dependencies(builtin_mock, database): def test_transitive_installed_dependencies(builtin_mock, database): with color_when(False): - out, err = dependencies('--installed', '--transitive', 'mpileaks^zmpi') + out = dependencies('--installed', '--transitive', 'mpileaks^zmpi') lines = [l for l in out.strip().split('\n') if not l.startswith('--')] hashes = set([re.split(r'\s+', l)[0] for l in lines]) diff --git a/lib/spack/spack/test/cmd/dependents.py b/lib/spack/spack/test/cmd/dependents.py index 546d6d48c9..c43270a2af 100644 --- a/lib/spack/spack/test/cmd/dependents.py +++ b/lib/spack/spack/test/cmd/dependents.py @@ -33,13 +33,13 @@ dependents = SpackCommand('dependents') def test_immediate_dependents(builtin_mock): - out, err = dependents('libelf') + out = dependents('libelf') actual = set(re.split(r'\s+', out.strip())) assert actual == set(['dyninst', 'libdwarf']) def test_transitive_dependents(builtin_mock): - out, err = dependents('--transitive', 'libelf') + out = dependents('--transitive', 'libelf') actual = set(re.split(r'\s+', out.strip())) assert actual == set( ['callpath', 'dyninst', 'libdwarf', 'mpileaks', 'multivalue_variant', @@ -48,7 +48,7 @@ def test_transitive_dependents(builtin_mock): def test_immediate_installed_dependents(builtin_mock, database): with color_when(False): - out, err = dependents('--installed', 'libelf') + out = dependents('--installed', 'libelf') lines = [l for l in out.strip().split('\n') if not l.startswith('--')] hashes = set([re.split(r'\s+', l)[0] for l in lines]) @@ -64,7 +64,7 @@ def test_immediate_installed_dependents(builtin_mock, database): def test_transitive_installed_dependents(builtin_mock, database): with color_when(False): - out, err = dependents('--installed', '--transitive', 'fake') + out = dependents('--installed', '--transitive', 'fake') lines = [l for l in out.strip().split('\n') if not l.startswith('--')] hashes = set([re.split(r'\s+', l)[0] for l in lines]) diff --git a/lib/spack/spack/test/cmd/python.py b/lib/spack/spack/test/cmd/python.py index 5e3ea83053..db9d9c5e41 100644 --- a/lib/spack/spack/test/cmd/python.py +++ b/lib/spack/spack/test/cmd/python.py @@ -29,5 +29,5 @@ python = SpackCommand('python') def test_python(): - out, err = python('-c', 'import spack; print(spack.spack_version)') + out = python('-c', 'import spack; print(spack.spack_version)') assert out.strip() == str(spack.spack_version) diff --git a/lib/spack/spack/test/cmd/url.py b/lib/spack/spack/test/cmd/url.py index 21f88e928b..ab2d750dee 100644 --- a/lib/spack/spack/test/cmd/url.py +++ b/lib/spack/spack/test/cmd/url.py @@ -83,30 +83,30 @@ def test_url_with_no_version_fails(): def test_url_list(): - out, err = url('list') + out = url('list') total_urls = len(out.split('\n')) # The following two options should not change the number of URLs printed. - out, err = url('list', '--color', '--extrapolation') + out = url('list', '--color', '--extrapolation') colored_urls = len(out.split('\n')) assert colored_urls == total_urls # The following options should print fewer URLs than the default. # If they print the same number of URLs, something is horribly broken. # If they say we missed 0 URLs, something is probably broken too. - out, err = url('list', '--incorrect-name') + out = url('list', '--incorrect-name') incorrect_name_urls = len(out.split('\n')) assert 0 < incorrect_name_urls < total_urls - out, err = url('list', '--incorrect-version') + out = url('list', '--incorrect-version') incorrect_version_urls = len(out.split('\n')) assert 0 < incorrect_version_urls < total_urls - out, err = url('list', '--correct-name') + out = url('list', '--correct-name') correct_name_urls = len(out.split('\n')) assert 0 < correct_name_urls < total_urls - out, err = url('list', '--correct-version') + out = url('list', '--correct-version') correct_version_urls = len(out.split('\n')) assert 0 < correct_version_urls < total_urls @@ -121,7 +121,7 @@ def test_url_summary(): assert 0 < correct_versions <= sum(version_count_dict.values()) <= total_urls # noqa # make sure it agrees with the actual command. - out, err = url('summary') + out = url('summary') out_total_urls = int( re.search(r'Total URLs found:\s*(\d+)', out).group(1)) assert out_total_urls == total_urls -- cgit v1.2.3-70-g09d2 From f51b541ef8ca5378020d6caf19a8e59c6c0e8aa6 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 22 Aug 2017 14:35:17 -0700 Subject: Make install command reusable within single Spack run - install and probably other commands were designed to run once, but now we can to test them from within Spack with SpackCommand - cmd/install.py assumed that it could modify do_install in PackageBase and leave it that way; this makes the decorator temporary - package.py didn't properly initialize its stage if the same package had been built successfully before (and the stage removed). - manage stage lifecycle better and remember when Package needs to re-create the stage --- lib/spack/spack/cmd/install.py | 40 +++++++++++++++++++++++++--------------- lib/spack/spack/package.py | 15 +++++++++++---- lib/spack/spack/stage.py | 14 ++++++++++++-- 3 files changed, 48 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 9f35837220..ec1efdc9cf 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -334,31 +334,41 @@ def install(parser, args, **kwargs): tty.error('The `spack install` command requires a spec to install.') for spec in specs: + saved_do_install = PackageBase.do_install + decorator = lambda fn: fn + # Check if we were asked to produce some log for dashboards if args.log_format is not None: # Compute the filename for logging log_filename = args.log_file if not log_filename: log_filename = default_log_file(spec) + # Create the test suite in which to log results test_suite = TestSuite(spec) - # Decorate PackageBase.do_install to get installation status - PackageBase.do_install = junit_output( - spec, test_suite - )(PackageBase.do_install) + + # Temporarily decorate PackageBase.do_install to monitor + # recursive calls. + decorator = junit_output(spec, test_suite) # Do the actual installation - if args.things_to_install == 'dependencies': - # Install dependencies as-if they were installed - # for root (explicit=False in the DB) - kwargs['explicit'] = False - for s in spec.dependencies(): - p = spack.repo.get(s) - p.do_install(**kwargs) - else: - package = spack.repo.get(spec) - kwargs['explicit'] = True - package.do_install(**kwargs) + try: + # decorate the install if necessary + PackageBase.do_install = decorator(PackageBase.do_install) + + if args.things_to_install == 'dependencies': + # Install dependencies as-if they were installed + # for root (explicit=False in the DB) + kwargs['explicit'] = False + for s in spec.dependencies(): + p = spack.repo.get(s) + p.do_install(**kwargs) + else: + package = spack.repo.get(spec) + kwargs['explicit'] = True + package.do_install(**kwargs) + finally: + PackageBase.do_install = saved_do_install # Dump log file if asked to if args.log_format is not None: diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index ef1c411f66..64db8013d0 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -760,10 +760,6 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Append the item to the composite composite_stage.append(stage) - # Create stage on first access. Needed because fetch, stage, - # patch, and install can be called independently of each - # other, so `with self.stage:` in do_install isn't sufficient. - composite_stage.create() return composite_stage @property @@ -772,6 +768,12 @@ class PackageBase(with_metaclass(PackageMeta, object)): raise ValueError("Can only get a stage for a concrete package.") if self._stage is None: self._stage = self._make_stage() + + # Create stage on first access. Needed because fetch, stage, + # patch, and install can be called independently of each + # other, so `with self.stage:` in do_install isn't sufficient. + self._stage.create() + return self._stage @stage.setter @@ -1390,6 +1392,11 @@ class PackageBase(with_metaclass(PackageMeta, object)): if not keep_prefix: self.remove_prefix() + # The subprocess *may* have removed the build stage. Mark it + # not created so that the next time self.stage is invoked, we + # check the filesystem for it. + self.stage.created = False + def check_for_unfinished_installation( self, keep_prefix=False, restage=False): """Check for leftover files from partially-completed prior install to diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index 09f18f7d67..f9995bce6c 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -236,6 +236,10 @@ class Stage(object): self._lock = Stage.stage_locks[self.name] + # When stages are reused, we need to know whether to re-create + # it. This marks whether it has been created/destroyed. + self.created = False + def __enter__(self): """ Entering a stage context will create the stage directory @@ -521,6 +525,7 @@ class Stage(object): mkdirp(self.path) # Make sure we can actually do something with the stage we made. ensure_access(self.path) + self.created = True def destroy(self): """Removes this stage directory.""" @@ -532,6 +537,9 @@ class Stage(object): except OSError: os.chdir(os.path.dirname(self.path)) + # mark as destroyed + self.created = False + class ResourceStage(Stage): @@ -573,8 +581,9 @@ class ResourceStage(Stage): shutil.move(source_path, destination_path) -@pattern.composite(method_list=['fetch', 'create', 'check', 'expand_archive', - 'restage', 'destroy', 'cache_local']) +@pattern.composite(method_list=[ + 'fetch', 'create', 'created', 'check', 'expand_archive', 'restage', + 'destroy', 'cache_local']) class StageComposite: """Composite for Stage type objects. The first item in this composite is considered to be the root package, and operations that return a value are @@ -623,6 +632,7 @@ class DIYStage(object): self.archive_file = None self.path = path self.source_path = path + self.created = True def chdir(self): if os.path.isdir(self.path): -- cgit v1.2.3-70-g09d2 From 40e91713908c1ef96d7b83d8b0dfbbd69bc24e4c Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 22 Aug 2017 14:38:39 -0700 Subject: Add testing for new build output. - Update handling of ChildError so that its output is capturable from a SpackCommand - Update cmd/install test to make sure Python and build log output is being displayed properly. --- lib/spack/spack/build_environment.py | 9 +++++++++ lib/spack/spack/error.py | 23 ++++++++++++++++++++++- lib/spack/spack/test/cmd/install.py | 25 ++++++++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index ad27b3321d..896cbe879b 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -610,8 +610,14 @@ def fork(pkg, function, dirty=False): child_result = parent_pipe.recv() p.join() + # If the child process raised an error, print its output here rather + # than waiting until the call to SpackError.die() in main(). This + # allows exception handling output to be logged from within Spack. + # see spack.main.SpackCommand. if isinstance(child_result, ChildError): + child_result.print_context() raise child_result + return child_result @@ -753,6 +759,9 @@ class ChildError(spack.error.SpackError): return out.getvalue() + def __str__(self): + return self.message + self.long_message + self.traceback + def __reduce__(self): """__reduce__ is used to serialize (pickle) ChildErrors. diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index 6e48a4e76c..8f54e82b11 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -45,11 +45,27 @@ class SpackError(Exception): # traceback as a string and print it in the parent. self.traceback = None + # we allow exceptions to print debug info via print_context() + # before they are caught at the top level. If they *haven't* + # printed context early, we do it by default when die() is + # called, so we need to remember whether it's been called. + self.printed = False + @property def long_message(self): return self._long_message - def die(self): + def print_context(self): + """Print extended debug information about this exception. + + This is usually printed when the top-level Spack error handler + calls ``die()``, but it acn be called separately beforehand if a + lower-level error handler needs to print error context and + continue without raising the exception to the top level. + """ + if self.printed: + return + # basic debug message tty.error(self.message) if self.long_message: @@ -66,6 +82,11 @@ class SpackError(Exception): # run parent exception hook. sys.excepthook(*sys.exc_info()) + sys.stderr.flush() + self.printed = True + + def die(self): + self.print_context() sys.exit(1) def __str__(self): diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 1b8549ca3d..eef5605275 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -27,6 +27,7 @@ import os import pytest +import spack import spack.cmd.install from spack.spec import Spec from spack.main import SpackCommand @@ -42,7 +43,7 @@ def parser(): return parser -def _install_package_and_dependency( +def test_install_package_and_dependency( tmpdir, builtin_mock, mock_archive, mock_fetch, config, install_mockery): @@ -58,6 +59,9 @@ def _install_package_and_dependency( assert 'failures="0"' in content assert 'errors="0"' in content + s = Spec('libdwarf').concretized() + assert not spack.repo.get(s).stage.created + def test_install_package_already_installed( tmpdir, builtin_mock, mock_archive, mock_fetch, config, @@ -107,3 +111,22 @@ def test_package_output(tmpdir, capsys, install_mockery, mock_fetch): # right place in the build log. assert "BEFORE INSTALL\n==> './configure'" in out assert "'install'\nAFTER INSTALL" in out + + +def _test_install_output_on_build_error(builtin_mock, mock_archive, mock_fetch, + config, install_mockery, capfd): + # capfd interferes with Spack's capturing + with capfd.disabled(): + out = install('build-error', fail_on_error=False) + assert isinstance(install.error, spack.build_environment.ChildError) + assert install.error.name == 'ProcessError' + assert 'configure: error: in /path/to/some/file:' in out + assert 'configure: error: cannot run C compiled programs.' in out + + +def test_install_output_on_python_error(builtin_mock, mock_archive, mock_fetch, + config, install_mockery): + out = install('failing-build', fail_on_error=False) + assert isinstance(install.error, spack.build_environment.ChildError) + assert install.error.name == 'InstallError' + assert 'raise InstallError("Expected failure.")' in out -- cgit v1.2.3-70-g09d2 From 15186d4ae81179fa12e86a812cfa791464f5b8dc Mon Sep 17 00:00:00 2001 From: healther Date: Wed, 23 Aug 2017 10:05:36 +0200 Subject: add test for lua and node patching in sbang (#5169) * add test for lua and node handling in sbang patching (cf #5086) --- lib/spack/spack/test/sbang.py | 48 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/sbang.py b/lib/spack/spack/test/sbang.py index c0831a4e2d..0962f508cc 100644 --- a/lib/spack/spack/test/sbang.py +++ b/lib/spack/spack/test/sbang.py @@ -30,6 +30,7 @@ import stat import pytest import tempfile import shutil +import filecmp from llnl.util.filesystem import * @@ -38,12 +39,16 @@ from spack.hooks.sbang import * from spack.util.executable import which -short_line = "#!/this/is/short/bin/bash\n" -long_line = "#!/this/" + ('x' * 200) + "/is/long\n" -lua_line = "#!/this/" + ('x' * 200) + "/is/lua\n" -lua_line_patched = "--!/this/" + ('x' * 200) + "/is/lua\n" -sbang_line = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root -last_line = "last!\n" +short_line = "#!/this/is/short/bin/bash\n" +long_line = "#!/this/" + ('x' * 200) + "/is/long\n" +lua_line = "#!/this/" + ('x' * 200) + "/is/lua\n" +lua_in_text = ("line\n") * 100 + "lua\n" + ("line\n" * 100) +lua_line_patched = "--!/this/" + ('x' * 200) + "/is/lua\n" +node_line = "#!/this/" + ('x' * 200) + "/is/node\n" +node_in_text = ("line\n") * 100 + "lua\n" + ("line\n" * 100) +node_line_patched = "//!/this/" + ('x' * 200) + "/is/node\n" +sbang_line = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root +last_line = "last!\n" class ScriptDirectory(object): @@ -72,6 +77,26 @@ class ScriptDirectory(object): f.write(lua_line) f.write(last_line) + # Lua script with long shebang + self.lua_textbang = os.path.join(self.tempdir, 'lua_in_text') + with open(self.lua_textbang, 'w') as f: + f.write(short_line) + f.write(lua_in_text) + f.write(last_line) + + # Node script with long shebang + self.node_shebang = os.path.join(self.tempdir, 'node') + with open(self.node_shebang, 'w') as f: + f.write(node_line) + f.write(last_line) + + # Node script with long shebang + self.node_textbang = os.path.join(self.tempdir, 'node_in_text') + with open(self.node_textbang, 'w') as f: + f.write(short_line) + f.write(node_in_text) + f.write(last_line) + # Script already using sbang. self.has_sbang = os.path.join(self.tempdir, 'shebang') with open(self.has_sbang, 'w') as f: @@ -123,6 +148,17 @@ def test_shebang_handling(script_dir): assert f.readline() == lua_line_patched assert f.readline() == last_line + # Make sure this got patched. + with open(script_dir.node_shebang, 'r') as f: + assert f.readline() == sbang_line + assert f.readline() == node_line_patched + assert f.readline() == last_line + + assert filecmp.cmp(script_dir.lua_textbang, + os.path.join(script_dir.tempdir, 'lua_in_text')) + assert filecmp.cmp(script_dir.node_textbang, + os.path.join(script_dir.tempdir, 'node_in_text')) + # Make sure this is untouched with open(script_dir.has_sbang, 'r') as f: assert f.readline() == sbang_line -- cgit v1.2.3-70-g09d2 From fa1d0a8a4d41616e4689ca0c80318269f55c5c9e Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Wed, 23 Aug 2017 15:08:52 -0600 Subject: Add --source option to spack install (#4102) - -- source will copy source into prefix along with the package. - added a test for --source, as well --- lib/spack/spack/cmd/install.py | 4 ++++ lib/spack/spack/package.py | 11 +++++++++++ lib/spack/spack/test/cmd/install.py | 12 ++++++++++++ share/spack/spack-completion.bash | 2 +- 4 files changed, 28 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index ec1efdc9cf..83ebe71787 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -68,6 +68,9 @@ the dependencies""" subparser.add_argument( '--restage', action='store_true', dest='restage', help="if a partial install is detected, delete prior state") + subparser.add_argument( + '--source', action='store_true', dest='install_source', + help="install source files in prefix") subparser.add_argument( '-n', '--no-checksum', action='store_true', dest='no_checksum', help="do not check packages against checksum") @@ -314,6 +317,7 @@ def install(parser, args, **kwargs): 'keep_prefix': args.keep_prefix, 'keep_stage': args.keep_stage, 'restage': args.restage, + 'install_source': args.install_source, 'install_deps': 'dependencies' in args.things_to_install, 'make_jobs': args.jobs, 'run_tests': args.run_tests, diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 64db8013d0..c13a566e27 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1193,6 +1193,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): def do_install(self, keep_prefix=False, keep_stage=False, + install_source=False, install_deps=True, skip_patch=False, verbose=False, @@ -1213,6 +1214,8 @@ class PackageBase(with_metaclass(PackageMeta, object)): keep_stage (bool): By default, stage is destroyed only if there are no exceptions during build. Set to True to keep the stage even with exceptions. + install_source (bool): By default, source is not installed, but + for debugging it might be useful to keep it around. install_deps (bool): Install dependencies before installing this package skip_patch (bool): Skip patch stage of build if True. @@ -1260,6 +1263,7 @@ class PackageBase(with_metaclass(PackageMeta, object)): dep.package.do_install( keep_prefix=keep_prefix, keep_stage=keep_stage, + install_source=install_source, install_deps=install_deps, fake=fake, skip_patch=skip_patch, @@ -1312,6 +1316,13 @@ class PackageBase(with_metaclass(PackageMeta, object)): if fake: self.do_fake_install() else: + source_path = self.stage.source_path + if install_source and os.path.isdir(source_path): + src_target = join_path( + self.spec.prefix, 'share', self.name, 'src') + tty.msg('Copying source to {0}'.format(src_target)) + install_tree(self.stage.source_path, src_target) + # Do the real install in the source directory. self.stage.chdir_to_source() diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index eef5605275..2886aa5d6a 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -24,6 +24,7 @@ ############################################################################## import argparse import os +import filecmp import pytest @@ -130,3 +131,14 @@ def test_install_output_on_python_error(builtin_mock, mock_archive, mock_fetch, assert isinstance(install.error, spack.build_environment.ChildError) assert install.error.name == 'InstallError' assert 'raise InstallError("Expected failure.")' in out + + +def test_install_with_source( + builtin_mock, mock_archive, mock_fetch, config, install_mockery): + """Verify that source has been copied into place.""" + install('--source', '--keep-stage', 'trivial-install-test-package') + spec = Spec('trivial-install-test-package').concretized() + src = os.path.join( + spec.prefix.share, 'trivial-install-test-package', 'src') + assert filecmp.cmp(os.path.join(mock_archive.path, 'configure'), + os.path.join(src, 'configure')) diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 408aaf61ac..05ae403eb5 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -456,7 +456,7 @@ function _spack_install { then compgen -W "-h --help --only -j --jobs --keep-prefix --keep-stage -n --no-checksum -v --verbose --fake --clean --dirty - --run-tests --log-format --log-file" -- "$cur" + --run-tests --log-format --log-file --source" -- "$cur" else compgen -W "$(_all_packages)" -- "$cur" fi -- cgit v1.2.3-70-g09d2 From 5d7901b31252e5828eaa99babb827b5dba4eea8e Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 23 Aug 2017 23:20:40 +0200 Subject: Improve Spec literals, add Spec.from_dict() (#5151) * Simplified Spec.__init__ signature by removing the *dep_like argument. The `*dep_like` argument of `Spec.__init__` is used only for tests. This PR removes it from the call signature and introduces an equivalent fixture to be used in tests. * Refactored ``spec_from_dict`` to be a static method of ``Spec`` The fixture ``spec_from_dict`` has been refactored to be a static method of ``Spec``. Test code has been updated accordingly. Added tests for exceptional paths. * Renamed argument `unique` to `normal` + added LazySpecCache class As requested in the review the argument `unique` of `Spec.from_literal` has been renamed to `normal`. To avoid eager evaluations of `Spec(spec_like)` expressions a subclass of `collections.defaultdict` has been introduced. * Spec object can be keys of the dictionary for a spec literal. Added back the possibility use a spec directly as a key. This permits to build DAGs that are partially normalized. --- lib/spack/spack/spec.py | 183 +++++++++++++++++++++--- lib/spack/spack/test/concretize.py | 107 +++++++++----- lib/spack/spack/test/optional_deps.py | 119 ++++++++------- lib/spack/spack/test/spec_dag.py | 262 ++++++++++++++++++++++------------ 4 files changed, 472 insertions(+), 199 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index a58e1ceb2f..aa22978217 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -971,7 +971,159 @@ class SpecBuildInterface(ObjectWrapper): @key_ordering class Spec(object): - def __init__(self, spec_like, *dep_like, **kwargs): + @staticmethod + def from_literal(spec_dict, normal=True): + """Builds a Spec from a dictionary containing the spec literal. + + The dictionary must have a single top level key, representing the root, + and as many secondary level keys as needed in the spec. + + The keys can be either a string or a Spec or a tuple containing the + Spec and the dependency types. + + Args: + spec_dict (dict): the dictionary containing the spec literal + normal (bool): if True the same key appearing at different levels + of the ``spec_dict`` will map to the same object in memory. + + Examples: + A simple spec ``foo`` with no dependencies: + + .. code-block:: python + + {'foo': None} + + A spec ``foo`` with a ``(build, link)`` dependency ``bar``: + + .. code-block:: python + + {'foo': + {'bar:build,link': None}} + + A spec with a diamond dependency and various build types: + + .. code-block:: python + + {'dt-diamond': { + 'dt-diamond-left:build,link': { + 'dt-diamond-bottom:build': None + }, + 'dt-diamond-right:build,link': { + 'dt-diamond-bottom:build,link,run': None + } + }} + + The same spec with a double copy of ``dt-diamond-bottom`` and + no diamond structure: + + .. code-block:: python + + {'dt-diamond': { + 'dt-diamond-left:build,link': { + 'dt-diamond-bottom:build': None + }, + 'dt-diamond-right:build,link': { + 'dt-diamond-bottom:build,link,run': None + } + }, normal=False} + + Constructing a spec using a Spec object as key: + + .. code-block:: python + + mpich = Spec('mpich') + libelf = Spec('libelf@1.8.11') + expected_normalized = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'dyninst': { + 'libdwarf': {libelf: None}, + libelf: None + }, + mpich: None + }, + mpich: None + }, + }) + + """ + + # Maps a literal to a Spec, to be sure we are reusing the same object + spec_cache = LazySpecCache() + + def spec_builder(d): + # The invariant is that the top level dictionary must have + # only one key + assert len(d) == 1 + + # Construct the top-level spec + spec_like, dep_like = next(iter(d.items())) + + # If the requirements was for unique nodes (default) + # then re-use keys from the local cache. Otherwise build + # a new node every time. + if not isinstance(spec_like, Spec): + spec = spec_cache[spec_like] if normal else Spec(spec_like) + else: + spec = spec_like + + if dep_like is None: + return spec + + def name_and_dependency_types(s): + """Given a key in the dictionary containing the literal, + extracts the name of the spec and its dependency types. + + Args: + s (str): key in the dictionary containing the literal + + """ + t = s.split(':') + + if len(t) > 2: + msg = 'more than one ":" separator in key "{0}"' + raise KeyError(msg.format(s)) + + n = t[0] + if len(t) == 2: + dtypes = tuple(dt.strip() for dt in t[1].split(',')) + else: + dtypes = () + + return n, dtypes + + def spec_and_dependency_types(s): + """Given a non-string key in the literal, extracts the spec + and its dependency types. + + Args: + s (spec or tuple): either a Spec object or a tuple + composed of a Spec object and a string with the + dependency types + + """ + if isinstance(s, Spec): + return s, () + + spec_obj, dtypes = s + return spec_obj, tuple(dt.strip() for dt in dtypes.split(',')) + + # Recurse on dependencies + for s, s_dependencies in dep_like.items(): + + if isinstance(s, string_types): + dag_node, dependency_types = name_and_dependency_types(s) + else: + dag_node, dependency_types = spec_and_dependency_types(s) + + dependency_spec = spec_builder({dag_node: s_dependencies}) + spec._add_dependency(dependency_spec, dependency_types) + + return spec + + return spec_builder(spec_dict) + + def __init__(self, spec_like, **kwargs): # Copy if spec_like is a Spec. if isinstance(spec_like, Spec): self._dup(spec_like) @@ -1014,22 +1166,6 @@ class Spec(object): self.external_path = kwargs.get('external_path', None) self.external_module = kwargs.get('external_module', None) - # This allows users to construct a spec DAG with literals. - # Note that given two specs a and b, Spec(a) copies a, but - # Spec(a, b) will copy a but just add b as a dep. - deptypes = () - for dep in dep_like: - - if isinstance(dep, (list, tuple)): - # Literals can be deptypes -- if there are tuples in the - # list, they will be used as deptypes for the following Spec. - deptypes = tuple(dep) - continue - - spec = dep if isinstance(dep, Spec) else Spec(dep) - self._add_dependency(spec, deptypes) - deptypes = () - @property def external(self): return bool(self.external_path) or bool(self.external_module) @@ -2944,6 +3080,19 @@ class Spec(object): return str(self) +class LazySpecCache(collections.defaultdict): + """Cache for Specs that uses a spec_like as key, and computes lazily + the corresponding value ``Spec(spec_like``. + """ + def __init__(self): + super(LazySpecCache, self).__init__(Spec) + + def __missing__(self, key): + value = self.default_factory(key) + self[key] = value + return value + + # # These are possible token types in the spec grammar. # diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 414b0fab84..572436a4b2 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -330,59 +330,94 @@ class TestConcretize(object): def test_find_spec_parents(self): """Tests the spec finding logic used by concretization. """ - s = Spec('a +foo', - Spec('b +foo', - Spec('c'), - Spec('d +foo')), - Spec('e +foo')) + s = Spec.from_literal({ + 'a +foo': { + 'b +foo': { + 'c': None, + 'd+foo': None + }, + 'e +foo': None + } + }) assert 'a' == find_spec(s['b'], lambda s: '+foo' in s).name def test_find_spec_children(self): - s = Spec('a', - Spec('b +foo', - Spec('c'), - Spec('d +foo')), - Spec('e +foo')) + s = Spec.from_literal({ + 'a': { + 'b +foo': { + 'c': None, + 'd+foo': None + }, + 'e +foo': None + } + }) + assert 'd' == find_spec(s['b'], lambda s: '+foo' in s).name - s = Spec('a', - Spec('b +foo', - Spec('c +foo'), - Spec('d')), - Spec('e +foo')) + + s = Spec.from_literal({ + 'a': { + 'b +foo': { + 'c+foo': None, + 'd': None + }, + 'e +foo': None + } + }) + assert 'c' == find_spec(s['b'], lambda s: '+foo' in s).name def test_find_spec_sibling(self): - s = Spec('a', - Spec('b +foo', - Spec('c'), - Spec('d')), - Spec('e +foo')) + + s = Spec.from_literal({ + 'a': { + 'b +foo': { + 'c': None, + 'd': None + }, + 'e +foo': None + } + }) + assert 'e' == find_spec(s['b'], lambda s: '+foo' in s).name assert 'b' == find_spec(s['e'], lambda s: '+foo' in s).name - s = Spec('a', - Spec('b +foo', - Spec('c'), - Spec('d')), - Spec('e', - Spec('f +foo'))) + s = Spec.from_literal({ + 'a': { + 'b +foo': { + 'c': None, + 'd': None + }, + 'e': { + 'f +foo': None + } + } + }) + assert 'f' == find_spec(s['b'], lambda s: '+foo' in s).name def test_find_spec_self(self): - s = Spec('a', - Spec('b +foo', - Spec('c'), - Spec('d')), - Spec('e')) + s = Spec.from_literal({ + 'a': { + 'b +foo': { + 'c': None, + 'd': None + }, + 'e': None + } + }) assert 'b' == find_spec(s['b'], lambda s: '+foo' in s).name def test_find_spec_none(self): - s = Spec('a', - Spec('b', - Spec('c'), - Spec('d')), - Spec('e')) + s = Spec.from_literal({ + 'a': { + 'b': { + 'c': None, + 'd': None + }, + 'e': None + } + }) assert find_spec(s['b'], lambda s: '+foo' in s) is None def test_compiler_child(self): diff --git a/lib/spack/spack/test/optional_deps.py b/lib/spack/spack/test/optional_deps.py index db2267f047..0023fce52d 100644 --- a/lib/spack/spack/test/optional_deps.py +++ b/lib/spack/spack/test/optional_deps.py @@ -29,65 +29,82 @@ from spack.spec import Spec @pytest.fixture( params=[ # Normalize simple conditionals - ('optional-dep-test', Spec('optional-dep-test')), - ('optional-dep-test~a', Spec('optional-dep-test~a')), - ('optional-dep-test+a', Spec('optional-dep-test+a', Spec('a'))), - ('optional-dep-test a=true', Spec( - 'optional-dep-test a=true', Spec('a') - )), - ('optional-dep-test a=true', Spec('optional-dep-test+a', Spec('a'))), - ('optional-dep-test@1.1', Spec('optional-dep-test@1.1', Spec('b'))), - ('optional-dep-test%intel', Spec( - 'optional-dep-test%intel', Spec('c') - )), - ('optional-dep-test%intel@64.1', Spec( - 'optional-dep-test%intel@64.1', Spec('c'), Spec('d') - )), - ('optional-dep-test%intel@64.1.2', Spec( - 'optional-dep-test%intel@64.1.2', Spec('c'), Spec('d') - )), - ('optional-dep-test%clang@35', Spec( - 'optional-dep-test%clang@35', Spec('e') - )), + ('optional-dep-test', {'optional-dep-test': None}), + ('optional-dep-test~a', {'optional-dep-test~a': None}), + ('optional-dep-test+a', {'optional-dep-test+a': {'a': None}}), + ('optional-dep-test a=true', { + 'optional-dep-test a=true': { + 'a': None + }}), + ('optional-dep-test a=true', { + 'optional-dep-test+a': { + 'a': None + }}), + ('optional-dep-test@1.1', {'optional-dep-test@1.1': {'b': None}}), + ('optional-dep-test%intel', {'optional-dep-test%intel': {'c': None}}), + ('optional-dep-test%intel@64.1', { + 'optional-dep-test%intel@64.1': { + 'c': None, + 'd': None + }}), + ('optional-dep-test%intel@64.1.2', { + 'optional-dep-test%intel@64.1.2': { + 'c': None, + 'd': None + }}), + ('optional-dep-test%clang@35', { + 'optional-dep-test%clang@35': { + 'e': None + }}), # Normalize multiple conditionals - ('optional-dep-test+a@1.1', Spec( - 'optional-dep-test+a@1.1', Spec('a'), Spec('b') - )), - ('optional-dep-test+a%intel', Spec( - 'optional-dep-test+a%intel', Spec('a'), Spec('c') - )), - ('optional-dep-test@1.1%intel', Spec( - 'optional-dep-test@1.1%intel', Spec('b'), Spec('c') - )), - ('optional-dep-test@1.1%intel@64.1.2+a', Spec( - 'optional-dep-test@1.1%intel@64.1.2+a', - Spec('b'), - Spec('a'), - Spec('c'), - Spec('d') - )), - ('optional-dep-test@1.1%clang@36.5+a', Spec( - 'optional-dep-test@1.1%clang@36.5+a', - Spec('b'), - Spec('a'), - Spec('e') - )), + ('optional-dep-test+a@1.1', { + 'optional-dep-test+a@1.1': { + 'a': None, + 'b': None + }}), + ('optional-dep-test+a%intel', { + 'optional-dep-test+a%intel': { + 'a': None, + 'c': None + }}), + ('optional-dep-test@1.1%intel', { + 'optional-dep-test@1.1%intel': { + 'b': None, + 'c': None + }}), + ('optional-dep-test@1.1%intel@64.1.2+a', { + 'optional-dep-test@1.1%intel@64.1.2+a': { + 'a': None, + 'b': None, + 'c': None, + 'd': None + }}), + ('optional-dep-test@1.1%clang@36.5+a', { + 'optional-dep-test@1.1%clang@36.5+a': { + 'b': None, + 'a': None, + 'e': None + }}), # Chained MPI - ('optional-dep-test-2+mpi', Spec( - 'optional-dep-test-2+mpi', - Spec('optional-dep-test+mpi', Spec('mpi')) - )), + ('optional-dep-test-2+mpi', { + 'optional-dep-test-2+mpi': { + 'optional-dep-test+mpi': {'mpi': None} + }}), # Each of these dependencies comes from a conditional # dependency on another. This requires iterating to evaluate # the whole chain. - ('optional-dep-test+f', Spec( - 'optional-dep-test+f', Spec('f'), Spec('g'), Spec('mpi') - )) + ('optional-dep-test+f', { + 'optional-dep-test+f': { + 'f': None, + 'g': None, + 'mpi': None + }}) ] ) def spec_and_expected(request): - """Parameters for te normalization test.""" - return request.param + """Parameters for the normalization test.""" + spec, d = request.param + return spec, Spec.from_literal(d) def test_normalize(spec_and_expected, config, builtin_mock): diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index c82365ad11..0d04cb5b0c 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -197,15 +197,19 @@ class TestSpecDag(object): spec.normalize() spec.normalize() - def test_normalize_with_virtual_spec(self): - dag = Spec('mpileaks', - Spec('callpath', - Spec('dyninst', - Spec('libdwarf', - Spec('libelf')), - Spec('libelf')), - Spec('mpi')), - Spec('mpi')) + def test_normalize_with_virtual_spec(self, ): + dag = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'dyninst': { + 'libdwarf': {'libelf': None}, + 'libelf': None + }, + 'mpi': None + }, + 'mpi': None + } + }) dag.normalize() # make sure nothing with the same name occurs twice @@ -219,14 +223,18 @@ class TestSpecDag(object): assert counts[name] == 1 def test_dependents_and_dependencies_are_correct(self): - spec = Spec('mpileaks', - Spec('callpath', - Spec('dyninst', - Spec('libdwarf', - Spec('libelf')), - Spec('libelf')), - Spec('mpi')), - Spec('mpi')) + spec = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'dyninst': { + 'libdwarf': {'libelf': None}, + 'libelf': None + }, + 'mpi': None + }, + 'mpi': None + } + }) check_links(spec) spec.normalize() @@ -274,21 +282,45 @@ class TestSpecDag(object): def test_equal(self): # Different spec structures to test for equality - flat = Spec('mpileaks ^callpath ^libelf ^libdwarf') - - flat_init = Spec( - 'mpileaks', Spec('callpath'), Spec('libdwarf'), Spec('libelf')) - - flip_flat = Spec( - 'mpileaks', Spec('libelf'), Spec('libdwarf'), Spec('callpath')) - - dag = Spec('mpileaks', Spec('callpath', - Spec('libdwarf', - Spec('libelf')))) - - flip_dag = Spec('mpileaks', Spec('callpath', - Spec('libelf', - Spec('libdwarf')))) + flat = Spec.from_literal( + {'mpileaks ^callpath ^libelf ^libdwarf': None} + ) + + flat_init = Spec.from_literal({ + 'mpileaks': { + 'callpath': None, + 'libdwarf': None, + 'libelf': None + } + }) + + flip_flat = Spec.from_literal({ + 'mpileaks': { + 'libelf': None, + 'libdwarf': None, + 'callpath': None + } + }) + + dag = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'libdwarf': { + 'libelf': None + } + } + } + }) + + flip_dag = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'libelf': { + 'libdwarf': None + } + } + } + }) # All these are equal to each other with regular == specs = (flat, flat_init, flip_flat, dag, flip_dag) @@ -311,39 +343,52 @@ class TestSpecDag(object): def test_normalize_mpileaks(self): # Spec parsed in from a string - spec = Spec('mpileaks ^mpich ^callpath ^dyninst ^libelf@1.8.11' - ' ^libdwarf') + spec = Spec.from_literal({ + 'mpileaks ^mpich ^callpath ^dyninst ^libelf@1.8.11 ^libdwarf': None + }) # What that spec should look like after parsing - expected_flat = Spec( - 'mpileaks', Spec('mpich'), Spec('callpath'), Spec('dyninst'), - Spec('libelf@1.8.11'), Spec('libdwarf')) + expected_flat = Spec.from_literal({ + 'mpileaks': { + 'mpich': None, + 'callpath': None, + 'dyninst': None, + 'libelf@1.8.11': None, + 'libdwarf': None + } + }) # What it should look like after normalization mpich = Spec('mpich') libelf = Spec('libelf@1.8.11') - expected_normalized = Spec( - 'mpileaks', - Spec('callpath', - Spec('dyninst', - Spec('libdwarf', - libelf), - libelf), - mpich), - mpich) + expected_normalized = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'dyninst': { + 'libdwarf': {libelf: None}, + libelf: None + }, + mpich: None + }, + mpich: None + }, + }) # Similar to normalized spec, but now with copies of the same # libelf node. Normalization should result in a single unique # node for each package, so this is the wrong DAG. - non_unique_nodes = Spec( - 'mpileaks', - Spec('callpath', - Spec('dyninst', - Spec('libdwarf', - Spec('libelf@1.8.11')), - Spec('libelf@1.8.11')), - mpich), - Spec('mpich')) + non_unique_nodes = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'dyninst': { + 'libdwarf': {'libelf@1.8.11': None}, + 'libelf@1.8.11': None + }, + mpich: None + }, + mpich: None + } + }, normal=False) # All specs here should be equal under regular equality specs = (spec, expected_flat, expected_normalized, non_unique_nodes) @@ -380,14 +425,18 @@ class TestSpecDag(object): spec = Spec('mpileaks ^mpi ^libelf@1.8.11 ^libdwarf') spec.normalize() - expected_normalized = Spec( - 'mpileaks', - Spec('callpath', - Spec('dyninst', - Spec('libdwarf', - Spec('libelf@1.8.11')), - Spec('libelf@1.8.11')), - Spec('mpi')), Spec('mpi')) + expected_normalized = Spec.from_literal({ + 'mpileaks': { + 'callpath': { + 'dyninst': { + 'libdwarf': {'libelf@1.8.11': None}, + 'libelf@1.8.11': None + }, + 'mpi': None + }, + 'mpi': None + } + }) assert str(spec) == str(expected_normalized) @@ -552,16 +601,18 @@ class TestSpecDag(object): def test_traversal_directions(self): """Make sure child and parent traversals of specs work.""" - # We'll use d for a diamond dependency - d = Spec('d') - - # Mock spec. - spec = Spec('a', - Spec('b', - Spec('c', d), - Spec('e')), - Spec('f', - Spec('g', d))) + # Mock spec - d is used for a diamond dependency + spec = Spec.from_literal({ + 'a': { + 'b': { + 'c': {'d': None}, + 'e': None + }, + 'f': { + 'g': {'d': None} + } + } + }) assert ( ['a', 'b', 'c', 'd', 'e', 'f', 'g'] == @@ -577,16 +628,18 @@ class TestSpecDag(object): def test_edge_traversals(self): """Make sure child and parent traversals of specs work.""" - # We'll use d for a diamond dependency - d = Spec('d') - - # Mock spec. - spec = Spec('a', - Spec('b', - Spec('c', d), - Spec('e')), - Spec('f', - Spec('g', d))) + # Mock spec - d is used for a diamond dependency + spec = Spec.from_literal({ + 'a': { + 'b': { + 'c': {'d': None}, + 'e': None + }, + 'f': { + 'g': {'d': None} + } + } + }) assert ( ['a', 'b', 'c', 'd', 'e', 'f', 'g'] == @@ -610,12 +663,14 @@ class TestSpecDag(object): def test_construct_spec_with_deptypes(self): """Ensure that it is possible to construct a spec with explicit dependency types.""" - s = Spec('a', - Spec('b', - ['build'], Spec('c')), - Spec('d', - ['build', 'link'], Spec('e', - ['run'], Spec('f')))) + s = Spec.from_literal({ + 'a': { + 'b': {'c:build': None}, + 'd': { + 'e:build,link': {'f:run': None} + } + } + }) assert s['b']._dependencies['c'].deptypes == ('build',) assert s['d']._dependencies['e'].deptypes == ('build', 'link') @@ -653,12 +708,19 @@ class TestSpecDag(object): 'dt-diamond-bottom'].deptypes == ('build', 'link', 'run') def check_diamond_normalized_dag(self, spec): - bottom = Spec('dt-diamond-bottom') - dag = Spec('dt-diamond', - ['build', 'link'], Spec('dt-diamond-left', - ['build'], bottom), - ['build', 'link'], Spec('dt-diamond-right', - ['build', 'link', 'run'], bottom)) + + dag = Spec.from_literal({ + 'dt-diamond': { + 'dt-diamond-left:build,link': { + 'dt-diamond-bottom:build': None + }, + 'dt-diamond-right:build,link': { + 'dt-diamond-bottom:build,link,run': None + }, + + } + }) + assert spec.eq_dag(dag) def test_normalize_diamond_deptypes(self): @@ -788,3 +850,13 @@ class TestSpecDag(object): canonical_deptype(('foo', 'bar')) with pytest.raises(ValueError): canonical_deptype(('foo',)) + + def test_invalid_literal_spec(self): + + # Can't give type 'build' to a top-level spec + with pytest.raises(spack.spec.SpecParseError): + Spec.from_literal({'foo:build': None}) + + # Can't use more than one ':' separator + with pytest.raises(KeyError): + Spec.from_literal({'foo': {'bar:build:link': None}}) -- cgit v1.2.3-70-g09d2 From f564b2abf75ae01ea95b6995de517c91fb0462b7 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 24 Aug 2017 08:47:22 -0400 Subject: gpg: add an argument for the import directory This is hidden because it is only meant for use by the tests. --- lib/spack/spack/cmd/gpg.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/gpg.py b/lib/spack/spack/cmd/gpg.py index 1f46033813..3ec6094cac 100644 --- a/lib/spack/spack/cmd/gpg.py +++ b/lib/spack/spack/cmd/gpg.py @@ -23,6 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## from spack.util.gpg import Gpg +import argparse import spack import os @@ -87,8 +88,9 @@ def setup_parser(subparser): list.set_defaults(func=gpg_list) init = subparsers.add_parser('init') + init.add_argument('--from', metavar='DIR', type=str, + dest='import_dir', help=argparse.SUPPRESS) init.set_defaults(func=gpg_init) - init.set_defaults(import_dir=spack.gpg_keys_path) export = subparsers.add_parser('export') export.add_argument('location', type=str, @@ -144,7 +146,11 @@ def gpg_trust(args): def gpg_init(args): - for root, _, filenames in os.walk(args.import_dir): + import_dir = args.import_dir + if import_dir is None: + import_dir = spack.gpg_keys_path + + for root, _, filenames in os.walk(import_dir): for filename in filenames: if not filename.endswith('.key'): continue -- cgit v1.2.3-70-g09d2 From 0e7071befe0943e55ee585e3998bd0c262d5a233 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 24 Aug 2017 08:47:52 -0400 Subject: test/gpg: init from the testing key directory The old testing pattern set an attribute on the parser directly. Now that there is a parsed flag, use it instead. --- lib/spack/spack/test/cmd/gpg.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py index 97f7accd60..111436f24f 100644 --- a/lib/spack/spack/test/cmd/gpg.py +++ b/lib/spack/spack/test/cmd/gpg.py @@ -39,14 +39,6 @@ def testing_gpg_directory(tmpdir): gpg_util.GNUPGHOME = old_gpg_path -@pytest.fixture(scope='function') -def mock_gpg_config(): - orig_gpg_keys_path = spack.gpg_keys_path - spack.gpg_keys_path = spack.mock_gpg_keys_path - yield - spack.gpg_keys_path = orig_gpg_keys_path - - @pytest.fixture(scope='function') def gpg(): return SpackCommand('gpg') @@ -60,16 +52,15 @@ def has_gnupg2(): return False -@pytest.mark.xfail # TODO: fix failing tests. @pytest.mark.skipif(not has_gnupg2(), reason='These tests require gnupg2') -def test_gpg(gpg, tmpdir, testing_gpg_directory, mock_gpg_config): +def test_gpg(gpg, tmpdir, testing_gpg_directory): # Verify a file with an empty keyring. with pytest.raises(ProcessError): gpg('verify', os.path.join(spack.mock_gpg_data_path, 'content.txt')) # Import the default key. - gpg('init') + gpg('init', '--from', spack.mock_gpg_keys_path) # List the keys. # TODO: Test the output here. -- cgit v1.2.3-70-g09d2 From fda3249c8bb04c3f2ac87d95a4bb322b3c55ce20 Mon Sep 17 00:00:00 2001 From: Sergey Kosukhin Date: Fri, 25 Aug 2017 11:15:46 +0200 Subject: Respect --insecure (-k) flag when fetching list_url. (#5178) * Respect --insecure when fetching list_url. * Ensure support for Python 2.6, and that urlopen works for python versions prior 2.7.9 and between 3.0 and 3.4.3. --- lib/spack/spack/util/web.py | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index e7e6f80ec8..3fd38c22cf 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -24,6 +24,7 @@ ############################################################################## import re import os +import ssl import sys import traceback @@ -105,6 +106,20 @@ def _spider(url, visited, root, depth, max_depth, raise_on_error): root = re.sub('/index.html$', '', root) try: + context = None + if sys.version_info < (2, 7, 9) or \ + ((3,) < sys.version_info < (3, 4, 3)): + if not spack.insecure: + tty.warn("Spack will not check SSL certificates. You need to " + "update your Python to enable certificate " + "verification.") + else: + # We explicitly create default context to avoid error described in + # https://blog.sucuri.net/2016/03/beware-unverified-tls-certificates-php-python.html + context = ssl._create_unverified_context() \ + if spack.insecure \ + else ssl.create_default_context() + # Make a HEAD request first to check the content type. This lets # us ignore tarballs and gigantic files. # It would be nice to do this with the HTTP Accept header to avoid @@ -112,7 +127,7 @@ def _spider(url, visited, root, depth, max_depth, raise_on_error): # if you ask for a tarball with Accept: text/html. req = Request(url) req.get_method = lambda: "HEAD" - resp = urlopen(req, timeout=TIMEOUT) + resp = _urlopen(req, timeout=TIMEOUT, context=context) if "Content-type" not in resp.headers: tty.debug("ignoring page " + url) @@ -125,7 +140,7 @@ def _spider(url, visited, root, depth, max_depth, raise_on_error): # Do the real GET request when we know it's just HTML. req.get_method = lambda: "GET" - response = urlopen(req, timeout=TIMEOUT) + response = _urlopen(req, timeout=TIMEOUT, context=context) response_url = response.geturl() # Read the page and and stick it in the map we'll return @@ -176,6 +191,13 @@ def _spider(url, visited, root, depth, max_depth, raise_on_error): except URLError as e: tty.debug(e) + + if isinstance(e.reason, ssl.SSLError): + tty.warn("Spack was unable to fetch url list due to a certificate " + "verification problem. You can try running spack -k, " + "which will not check SSL certificates. Use this at your " + "own risk.") + if raise_on_error: raise spack.error.NoNetworkConnectionError(str(e), url) @@ -202,8 +224,16 @@ def _spider_wrapper(args): return _spider(*args) -def spider(root_url, depth=0): +def _urlopen(*args, **kwargs): + """Wrapper for compatibility with old versions of Python.""" + # We don't pass 'context' parameter to urlopen because it + # was introduces only starting versions 2.7.9 and 3.4.3 of Python. + if 'context' in kwargs and kwargs['context'] is None: + del kwargs['context'] + return urlopen(*args, **kwargs) + +def spider(root_url, depth=0): """Gets web pages from a root URL. If depth is specified (e.g., depth=2), then this will also follow -- cgit v1.2.3-70-g09d2 From a0f39397c1efe1d94bbac6fb8a52f8a8113338cb Mon Sep 17 00:00:00 2001 From: "Mark C. Miller" Date: Fri, 25 Aug 2017 02:57:44 -0700 Subject: Add contributors link to Sphinx docs (#5213) --- lib/spack/docs/_themes/sphinx_rtd_theme/footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/docs/_themes/sphinx_rtd_theme/footer.html b/lib/spack/docs/_themes/sphinx_rtd_theme/footer.html index d000dcbc2c..c4f11f3f8d 100644 --- a/lib/spack/docs/_themes/sphinx_rtd_theme/footer.html +++ b/lib/spack/docs/_themes/sphinx_rtd_theme/footer.html @@ -24,7 +24,7 @@
    Written by Todd Gamblin (tgamblin@llnl.gov) and - many contributors. LLNL-CODE-647188. + many contributors. LLNL-CODE-647188. {%- if last_updated %}
    -- cgit v1.2.3-70-g09d2 From 313771c73492882044ee47678d74193e895a9290 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 25 Aug 2017 04:07:42 -0700 Subject: Improve grammar in build log error message. (#5214) - "1 error found" instead of "1 errors found" - don't print any build log context if no errors were found; just refer the user to the build log. --- lib/spack/spack/build_environment.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 896cbe879b..7bef1d3789 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -739,8 +739,13 @@ class ChildError(spack.error.SpackError): # the build log with errors highlighted. if self.build_log: events = parse_log_events(self.build_log) - out.write("\n%d errors in build log:\n" % len(events)) - out.write(make_log_context(events)) + nerr = len(events) + if nerr > 0: + if nerr == 1: + out.write("\n1 error found in build log:\n") + else: + out.write("\n%d errors found in build log:\n" % nerr) + out.write(make_log_context(events)) else: # The error happened in in the Python code, so try to show -- cgit v1.2.3-70-g09d2 From 9a1fd166aa29e014f24e7b590e24713f19c314fe Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Fri, 25 Aug 2017 10:55:41 -0700 Subject: patch config.guess for any ppc64le arch (#5215) --- lib/spack/spack/build_systems/autotools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index 230e12e1f8..e11127e4ed 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -103,7 +103,7 @@ class AutotoolsPackage(PackageBase): build date (automake 1.13.4).""" if not self.patch_config_guess or not self.spec.satisfies( - 'arch=linux-rhel7-ppc64le' + 'target=ppc64le' ): return my_config_guess = None -- cgit v1.2.3-70-g09d2 From 499617897bc73f4a4d0c0ca211d34adeaaae1bca Mon Sep 17 00:00:00 2001 From: scheibelp Date: Fri, 25 Aug 2017 11:02:36 -0700 Subject: Link extra_rpaths from compilers.yaml at build time (#5211) --- lib/spack/env/cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/spack/env/cc b/lib/spack/env/cc index afec3eefaa..e63c371318 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -328,8 +328,10 @@ IFS=':' read -ra extra_rpaths <<< "$SPACK_COMPILER_EXTRA_RPATHS" for extra_rpath in "${extra_rpaths[@]}"; do if [[ $mode == ccld ]]; then $add_rpaths && args=("$rpath$extra_rpath" "${args[@]}") + args=("-L$extra_rpath" "${args[@]}") elif [[ $mode == ld ]]; then $add_rpaths && args=("-rpath" "$extra_rpath" "${args[@]}") + args=("-L$extra_rpath" "${args[@]}") fi done -- cgit v1.2.3-70-g09d2 From b94711a54ffb86822d77af5c904904b9625f4504 Mon Sep 17 00:00:00 2001 From: Michael Kuhn Date: Sat, 26 Aug 2017 02:30:40 +0200 Subject: Improve Ubuntu arch detection (#2649) Ubuntu uses a YY.{04,10} release scheme, where YY.04 is not necessarily binary-compatible with YY.10. --- lib/spack/spack/operating_systems/linux_distro.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/operating_systems/linux_distro.py b/lib/spack/spack/operating_systems/linux_distro.py index 0e97317b1b..276235d18b 100644 --- a/lib/spack/spack/operating_systems/linux_distro.py +++ b/lib/spack/spack/operating_systems/linux_distro.py @@ -48,6 +48,11 @@ class LinuxDistro(OperatingSystem): # grab the first legal identifier in the version field. On # debian you get things like 'wheezy/sid'; sid means unstable. # We just record 'wheezy' and don't get quite so detailed. - version = re.split(r'[^\w-]', version)[0] + version = re.split(r'[^\w-]', version) + + if 'ubuntu' in distname: + version = '.'.join(version[0:2]) + else: + version = version[0] super(LinuxDistro, self).__init__(distname, version) -- cgit v1.2.3-70-g09d2 From 91143e9db4ee82c24bfbd1582e3ab9ff6a78f8d3 Mon Sep 17 00:00:00 2001 From: Michael Kuhn Date: Sat, 26 Aug 2017 05:38:56 +0200 Subject: Fix copyright years in spack create template (#5203) --- lib/spack/spack/cmd/create.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index fd1e5f9fd2..e68b20a6ac 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -46,7 +46,7 @@ level = "short" package_template = '''\ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. -- cgit v1.2.3-70-g09d2 From 005b22aa8b8a68a5d0afe3fc3d06f8e1d85b35da Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Sat, 26 Aug 2017 05:40:37 +0200 Subject: Removed default value for 'dirty' function argument. (#5109) This change is done to avoid inconsistencies during refactoring. The rationale is that functions at different levels in the call stack all define a default for the 'dirty' argument. This PR removes the default value for all the functions except the top-level one (`PackageBase.do_install`). In this way not defining 'dirty' will result in an error, instead of the default value being used. This will reduce the risk of having an inconsistent behavior after a refactoring. --- lib/spack/spack/build_environment.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 7bef1d3789..a27d8c68ab 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -178,7 +178,7 @@ def set_compiler_environment_variables(pkg, env): return env -def set_build_environment_variables(pkg, env, dirty=False): +def set_build_environment_variables(pkg, env, dirty): """Ensure a clean install environment when we build packages. This involves unsetting pesky environment variables that may @@ -450,7 +450,7 @@ def load_external_modules(pkg): load_module(dep.external_module) -def setup_package(pkg, dirty=False): +def setup_package(pkg, dirty): """Execute all environment setup routines.""" spack_env = EnvironmentModifications() run_env = EnvironmentModifications() @@ -516,7 +516,7 @@ def setup_package(pkg, dirty=False): spack_env.apply_modifications() -def fork(pkg, function, dirty=False): +def fork(pkg, function, dirty): """Fork a child process to do part of a spack build. Args: -- cgit v1.2.3-70-g09d2 From c94933343a9459503dc95628a4c0bd09fdcb60ac Mon Sep 17 00:00:00 2001 From: Matthew Scott Krafczyk Date: Mon, 28 Aug 2017 12:35:46 -0500 Subject: Add --show-full-compiler option to 'spack find' When 'spack find' is invoked with the '--show-full-compiler' option, the compiler flags and version are shown for each spec that is found. --- lib/spack/spack/cmd/__init__.py | 10 ++++++++-- lib/spack/spack/cmd/find.py | 4 ++++ share/spack/spack-completion.bash | 6 +++--- 3 files changed, 15 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index 5e4564b1e8..f432fbf585 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -211,6 +211,7 @@ def display_specs(specs, args=None, **kwargs): hashes = get_arg('long', False) namespace = get_arg('namespace', False) flags = get_arg('show_flags', False) + full_compiler = get_arg('show_full_compiler', False) variants = get_arg('variants', False) hlen = 7 @@ -219,7 +220,12 @@ def display_specs(specs, args=None, **kwargs): hlen = None nfmt = '.' if namespace else '_' - ffmt = '$%+' if flags else '' + ffmt = '' + if full_compiler or flags: + ffmt += '$%' + if full_compiler: + ffmt += '@' + ffmt += '+' vfmt = '$+' if variants else '' format_string = '$%s$@%s%s' % (nfmt, ffmt, vfmt) @@ -259,7 +265,7 @@ def display_specs(specs, args=None, **kwargs): elif mode == 'short': # Print columns of output if not printing flags - if not flags: + if not flags and not full_compiler: def fmt(s): string = "" diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index bb8e2e5bcf..02ff10f425 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -60,6 +60,10 @@ def setup_parser(subparser): action='store_true', dest='show_flags', help='show spec compiler flags') + subparser.add_argument('--show-full-compiler', + action='store_true', + dest='show_full_compiler', + help='show full compiler specs') implicit_explicit = subparser.add_mutually_exclusive_group() implicit_explicit.add_argument( '-e', '--explicit', diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 05ae403eb5..4eb1c1c038 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -407,9 +407,9 @@ function _spack_find { if $list_options then compgen -W "-h --help -s --short -p --paths -d --deps -l --long - -L --very-long -f --show-flags -e --explicit - -E --implicit -u --unknown -m --missing -v --variants - -M --only-missing -N --namespace" -- "$cur" + -L --very-long -f --show-flags --show-full-compiler + -e --explicit -E --implicit -u --unknown -m --missing + -v --variants -M --only-missing -N --namespace" -- "$cur" else compgen -W "$(_installed_packages)" -- "$cur" fi -- cgit v1.2.3-70-g09d2 From ee93993b07d774bf1b2cee09960bbafe8ccfac8e Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 29 Aug 2017 00:02:25 -0700 Subject: Make Spec construction simpler (#5227) --- lib/spack/spack/spec.py | 53 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index aa22978217..2e61e88ddb 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1133,34 +1133,19 @@ class Spec(object): if not isinstance(spec_like, string_types): raise TypeError("Can't make spec out of %s" % type(spec_like)) - spec_list = SpecParser().parse(spec_like) + # parse string types *into* this spec + spec_list = SpecParser(self).parse(spec_like) if len(spec_list) > 1: raise ValueError("More than one spec in string: " + spec_like) if len(spec_list) < 1: raise ValueError("String contains no specs: " + spec_like) - # Take all the attributes from the first parsed spec without copying. - # This is safe b/c we throw out the parsed spec. It's a bit nasty, - # but it's nastier to implement the constructor so that the parser - # writes directly into this Spec object. - other = spec_list[0] - self.name = other.name - self.versions = other.versions - self.architecture = other.architecture - self.compiler = other.compiler - self.compiler_flags = other.compiler_flags - self.compiler_flags.spec = self - self._dependencies = other._dependencies - self._dependents = other._dependents - self.variants = other.variants - self.variants.spec = self - self.namespace = other.namespace - self._hash = other._hash - self._cmp_key_cache = other._cmp_key_cache - - # Specs are by default not assumed to be normal or concrete. - self._normal = False - self._concrete = False + # Specs are by default not assumed to be normal, but in some + # cases we've read them from a file want to assume normal. + # This allows us to manipulate specs that Spack doesn't have + # package.py files for. + self._normal = kwargs.get('normal', False) + self._concrete = kwargs.get('concrete', False) # Allow a spec to be constructed with an external path. self.external_path = kwargs.get('external_path', None) @@ -3131,9 +3116,17 @@ _lexer = SpecLexer() class SpecParser(spack.parse.Parser): - def __init__(self): + def __init__(self, initial_spec=None): + """Construct a new SpecParser. + + Args: + initial_spec (Spec, optional): provide a Spec that we'll parse + directly into. This is used to avoid construction of a + superfluous Spec object in the Spec constructor. + """ super(SpecParser, self).__init__(_lexer) self.previous = None + self._initial = initial_spec def do_parse(self): specs = [] @@ -3257,8 +3250,14 @@ class SpecParser(spack.parse.Parser): spec_namespace = None spec_name = None - # This will init the spec without calling __init__. - spec = Spec.__new__(Spec) + if self._initial is None: + # This will init the spec without calling Spec.__init__ + spec = Spec.__new__(Spec) + else: + # this is used by Spec.__init__ + spec = self._initial + self._initial = None + spec.name = spec_name spec.versions = VersionList() spec.variants = VariantMap(spec) @@ -3316,7 +3315,7 @@ class SpecParser(spack.parse.Parser): # Get spec by hash and confirm it matches what we already have hash_spec = self.spec_by_hash() if hash_spec.satisfies(spec): - spec = hash_spec + spec._dup(hash_spec) break else: raise InvalidHashError(spec, hash_spec.dag_hash()) -- cgit v1.2.3-70-g09d2 From bf7b8615544059c075df814b2792e7b7fa4dcf24 Mon Sep 17 00:00:00 2001 From: alalazo Date: Mon, 28 Aug 2017 20:16:32 +0200 Subject: Fixed bug in Spec._dup, updated docstring The private method `Spec._dup` was missing a line (when setting compiler flags the parent spec was not set to `self`). This resulted in an inconsistent state of the duplicated Spec. This problem has been fixed here. The docstring of `Spec._dup` has been updated. --- lib/spack/spack/spec.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 2e61e88ddb..7bc0dce12a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2543,15 +2543,24 @@ class Spec(object): def _dup(self, other, deps=True, cleardeps=True): """Copy the spec other into self. This is an overwriting - copy. It does not copy any dependents (parents), but by default - copies dependencies. + copy. It does not copy any dependents (parents), but by default + copies dependencies. - To duplicate an entire DAG, call _dup() on the root of the DAG. + To duplicate an entire DAG, call _dup() on the root of the DAG. + + Args: + other (Spec): spec to be copied onto ``self`` + deps (bool or Sequence): if True copies all the dependencies. If + False copies None. If a sequence of dependency types copy + only those types. + cleardeps (bool): if True clears the dependencies of ``self``, + before possibly copying the dependencies of ``other`` onto + ``self`` + + Returns: + True if ``self`` changed because of the copy operation, + False otherwise. - Options: - dependencies[=True] - Whether deps should be copied too. Set to False to copy a - spec but not its dependencies. """ # We don't count dependencies as changes here changed = True @@ -2577,6 +2586,7 @@ class Spec(object): self._dependents = DependencyMap(self) self._dependencies = DependencyMap(self) self.compiler_flags = other.compiler_flags.copy() + self.compiler_flags.spec = self self.variants = other.variants.copy() self.variants.spec = self self.external_path = other.external_path -- cgit v1.2.3-70-g09d2 From 462de9847c2271dbd7de149ae775e785c5d31daf Mon Sep 17 00:00:00 2001 From: alalazo Date: Mon, 28 Aug 2017 21:55:34 +0200 Subject: Added unit tests for Spec.__init__ exceptional paths --- lib/spack/spack/test/spec_semantics.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 4ed7c635e9..2c7c1d22ed 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -707,3 +707,14 @@ class TestSpecSematics(object): check_constrain_not_changed( 'libelf^foo target=' + default_target, 'libelf^foo target=' + default_target) + + def test_exceptional_paths_for_constructor(self): + + with pytest.raises(TypeError): + Spec((1, 2)) + + with pytest.raises(ValueError): + Spec('') + + with pytest.raises(ValueError): + Spec('libelf foo') -- cgit v1.2.3-70-g09d2 From c830eda0e6f8e773cdf2d8aeb9b400a307c834fe Mon Sep 17 00:00:00 2001 From: Andrey Prokopenko Date: Wed, 30 Aug 2017 03:56:17 -0400 Subject: Slightly better error matching when parsing spack logs (#5236) --- lib/spack/spack/util/log_parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/util/log_parse.py b/lib/spack/spack/util/log_parse.py index a55dcf59f5..a9ff356aff 100644 --- a/lib/spack/spack/util/log_parse.py +++ b/lib/spack/spack/util/log_parse.py @@ -86,7 +86,7 @@ def parse_log_events(logfile, context=6): log_events = [] for i, line in enumerate(lines): - if re.search('error:', line, re.IGNORECASE): + if re.search('\berror:', line, re.IGNORECASE): event = LogEvent( line.strip(), i + 1, -- cgit v1.2.3-70-g09d2 From b5a9f8ead14a18c3be24fce97cb2277e1a5baad1 Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Wed, 30 Aug 2017 19:56:24 +0200 Subject: add optional maintainers property to package (#5230) * add optional package maintainers --- lib/spack/spack/cmd/info.py | 5 +++++ lib/spack/spack/package.py | 4 ++++ var/spack/repos/builtin/packages/dealii/package.py | 2 ++ 3 files changed, 11 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 71ab5e3207..b7f824c091 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -162,6 +162,11 @@ def print_text_info(pkg): color.cprint(section_title('Homepage: ') + pkg.homepage) + if len(pkg.maintainers) > 0: + mnt = " ".join(['@@' + m for m in pkg.maintainers]) + color.cprint('') + color.cprint(section_title('Maintainers: ') + mnt) + color.cprint('') color.cprint(section_title('Preferred version: ')) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index c13a566e27..b3d619f6f3 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -545,6 +545,10 @@ class PackageBase(with_metaclass(PackageMeta, object)): # Verbosity level, preserved across installs. _verbose = None + #: List of strings which contains GitHub usernames of package maintainers. + #: Do not include @ here in order not to unnecessarily ping the users. + maintainers = [] + def __init__(self, spec): # this determines how the package should be built. self.spec = spec diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index ab95783359..c4e999afe9 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -32,6 +32,8 @@ class Dealii(CMakePackage): homepage = "https://www.dealii.org" url = "https://github.com/dealii/dealii/releases/download/v8.4.1/dealii-8.4.1.tar.gz" + maintainers = ['davydden', 'jppelteret'] + # Don't add RPATHs to this package for the full build DAG. # only add for immediate deps. transitive_rpaths = False -- cgit v1.2.3-70-g09d2 From 01eba56e64fde9d8bf8732a3a82d6369d70589b2 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Fri, 1 Sep 2017 02:06:03 +0200 Subject: Patch directive allows non-archives (#5197) - Don't expand downloaded patch file if it is not gzipped/tar'd/zipped/etc. --- lib/spack/spack/directives.py | 11 +++++ lib/spack/spack/patch.py | 5 +- lib/spack/spack/test/data/patch/bar.txt | 1 + lib/spack/spack/test/data/patch/foo.tgz | Bin 0 -> 116 bytes lib/spack/spack/test/patch.py | 84 ++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 lib/spack/spack/test/data/patch/bar.txt create mode 100644 lib/spack/spack/test/data/patch/foo.tgz create mode 100644 lib/spack/spack/test/patch.py (limited to 'lib') diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 2a99e171a0..7b9a3aa953 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -357,6 +357,17 @@ def patch(url_or_filename, level=1, when=None, **kwargs): optionally provide a when spec to indicate that a particular patch should only be applied when the package's spec meets certain conditions (e.g. a particular version). + + Args: + url_or_filename (str): url or filename of the patch + level (int): patch level (as in the patch shell command) + when (Spec): optional anonymous spec that specifies when to apply + the patch + **kwargs: the following list of keywords is supported + + - md5 (str): md5 sum of the patch (used to verify the file + if it comes from a url) + """ def _execute(pkg): constraint = pkg.name if when is None else when diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index c970f4dfdc..5742f312ce 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -131,7 +131,10 @@ class UrlPatch(Patch): patch_stage.fetch() patch_stage.check() patch_stage.cache_local() - patch_stage.expand_archive() + + if spack.util.compression.allowed_archive(self.url): + patch_stage.expand_archive() + self.path = os.path.abspath( os.listdir(patch_stage.path).pop() ) diff --git a/lib/spack/spack/test/data/patch/bar.txt b/lib/spack/spack/test/data/patch/bar.txt new file mode 100644 index 0000000000..ba578e48b1 --- /dev/null +++ b/lib/spack/spack/test/data/patch/bar.txt @@ -0,0 +1 @@ +BAR diff --git a/lib/spack/spack/test/data/patch/foo.tgz b/lib/spack/spack/test/data/patch/foo.tgz new file mode 100644 index 0000000000..73f598ac25 Binary files /dev/null and b/lib/spack/spack/test/data/patch/foo.tgz differ diff --git a/lib/spack/spack/test/patch.py b/lib/spack/spack/test/patch.py new file mode 100644 index 0000000000..7976956748 --- /dev/null +++ b/lib/spack/spack/test/patch.py @@ -0,0 +1,84 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## + +import os.path + +import pytest +import sys + +import spack +import spack.util.compression +import spack.stage + + +@pytest.fixture() +def mock_apply(monkeypatch): + """Monkeypatches ``Patch.apply`` to test only the additional behavior of + derived classes. + """ + + m = sys.modules['spack.patch'] + + def check_expand(self, *args, **kwargs): + # Check tarball expansion + if spack.util.compression.allowed_archive(self.url): + file = os.path.join(self.path, 'foo.txt') + assert os.path.exists(file) + + # Check tarball fetching + dirname = os.path.dirname(self.path) + basename = os.path.basename(self.url) + tarball = os.path.join(dirname, basename) + assert os.path.exists(tarball) + + monkeypatch.setattr(m.Patch, 'apply', check_expand) + + +@pytest.fixture() +def mock_stage(tmpdir, monkeypatch): + + monkeypatch.setattr(spack, 'stage_path', str(tmpdir)) + + class MockStage(object): + def __init__(self): + self.mirror_path = str(tmpdir) + + return MockStage() + + +data_path = os.path.join(spack.test_path, 'data', 'patch') + + +@pytest.mark.usefixtures('mock_apply') +@pytest.mark.parametrize('filename,md5', [ + (os.path.join(data_path, 'foo.tgz'), 'bff717ca9cbbb293bdf188e44c540758'), + (os.path.join(data_path, 'bar.txt'), 'f98bf6f12e995a053b7647b10d937912') +]) +def test_url_patch_expansion(mock_stage, filename, md5): + + m = sys.modules['spack.patch'] + url = 'file://' + filename + patch = m.Patch.create(None, url, 0, md5=md5) + patch.apply(mock_stage) -- cgit v1.2.3-70-g09d2 From 5342ecf364e633960e84ca021ef44f1274e9938c Mon Sep 17 00:00:00 2001 From: scheibelp Date: Fri, 1 Sep 2017 10:32:04 -0700 Subject: Set default cmake build_type to Release for llvm Override CMake "build_type" variant to default to "Release" for llvm package. --- lib/spack/spack/build_systems/cmake.py | 2 +- var/spack/repos/builtin/packages/llvm/package.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index f643320b10..9160390a06 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -84,7 +84,7 @@ class CMakePackage(PackageBase): # https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html variant('build_type', default='RelWithDebInfo', - description='The build type to build', + description='CMake build type', values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel')) depends_on('cmake', type='build') diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index 64e50f0cfb..396cdbcb0c 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -70,6 +70,9 @@ class Llvm(CMakePackage): variant('all_targets', default=True, description="Build all supported targets, default targets " ",NVPTX,AMDGPU,CppBackend") + variant('build_type', default='Release', + description='CMake build type', + values=('Debug', 'Release', 'RelWithDebInfo', 'MinSizeRel')) # Build dependency depends_on('cmake@3.4.3:', type='build') -- cgit v1.2.3-70-g09d2 From 41d8981ab5b5e912d38e201b71b981ef0f17e20e Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 5 Sep 2017 17:15:25 +0200 Subject: Fixed bug in `spack env` due to missing argument. (#5280) This command broke after #5109. It was using the default value for the "dirty" argument in `setup_package`. Now it adopts the same logic as in `spack install`. Changed help for '--clean' and '--dirty'. Improved coverage of spack env. --- lib/spack/spack/cmd/common/arguments.py | 5 ++-- lib/spack/spack/cmd/env.py | 12 +++++---- lib/spack/spack/test/cmd/env.py | 48 +++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 lib/spack/spack/test/cmd/env.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index d1b0418770..11c90b2ee4 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -113,7 +113,8 @@ _arguments['clean'] = Args( '--clean', action=CleanOrDirtyAction, dest='dirty', - help='clean environment before installing package', + help='sanitize the environment from variables that can affect how ' + + ' packages find libraries or headers', nargs=0 ) @@ -121,7 +122,7 @@ _arguments['dirty'] = Args( '--dirty', action=CleanOrDirtyAction, dest='dirty', - help='do NOT clean environment before installing', + help='maintain the current environment without trying to sanitize it', nargs=0 ) diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index b11216044a..343717a191 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -24,12 +24,13 @@ ############################################################################## from __future__ import print_function -import os import argparse +import os import llnl.util.tty as tty -import spack.cmd import spack.build_environment as build_env +import spack.cmd +import spack.cmd.common.arguments as arguments description = "show install environment for a spec, and run commands" section = "build" @@ -37,6 +38,7 @@ level = "long" def setup_parser(subparser): + arguments.add_common_arguments(subparser, ['clean', 'dirty']) subparser.add_argument( 'spec', nargs=argparse.REMAINDER, help="specs of package environment to emulate") @@ -54,17 +56,17 @@ def env(parser, args): if sep in args.spec: s = args.spec.index(sep) spec = args.spec[:s] - cmd = args.spec[s + 1:] + cmd = args.spec[s + 1:] else: spec = args.spec[0] - cmd = args.spec[1:] + cmd = args.spec[1:] specs = spack.cmd.parse_specs(spec, concretize=True) if len(specs) > 1: tty.die("spack env only takes one spec.") spec = specs[0] - build_env.setup_package(spec.package) + build_env.setup_package(spec.package, args.dirty) if not cmd: # If no command act like the "env" command and print out env vars. diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py new file mode 100644 index 0000000000..a20d3791e9 --- /dev/null +++ b/lib/spack/spack/test/cmd/env.py @@ -0,0 +1,48 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import pytest + +from spack.main import SpackCommand, SpackCommandError + +info = SpackCommand('env') + + +@pytest.mark.parametrize('pkg', [ + ('zlib',), + ('zlib', '--') +]) +@pytest.mark.usefixtures('config') +def test_it_just_runs(pkg): + info(*pkg) + + +@pytest.mark.parametrize('pkg,error_cls', [ + ('zlib libszip', SpackCommandError), + ('', IndexError) +]) +@pytest.mark.usefixtures('config') +def test_it_just_fails(pkg, error_cls): + with pytest.raises(error_cls): + info(pkg) -- cgit v1.2.3-70-g09d2 From d1a5857a03dc2e21f5514fa2bcfafe0ec0210f12 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 6 Sep 2017 03:44:42 +0200 Subject: Added support for querying by tags (#4786) * Added support to query packages by tags. - The querying commands `spack list`, `spack find` and `spack info` have been modified to support querying by tags. Tests have been added to check that the feature is working correctly under what should be the most frequent use cases. * Refactored Repo class to make insertion of new file caches easier. - Added the class FastPackageChecker. This class is a Mapping from package names to stat info, that gets memoized for faster access. - Extracted the creation of a ProviderIndex to its own factory function. * Added a cache file for tags. - Following what was done for providers, a TagIndex class has been added. This class can serialize and deserialize objects from json. Repo and RepoPath have a new method 'packages_with_tags', that uses the TagIndex to compute a list of package names that have all the tags passed as arguments. On Ubuntu 14.04 the effect if the cache reduces the time for spack list from ~3sec. to ~0.3sec. after the cache has been built. * Fixed colorization of `spack info` --- lib/spack/spack/cmd/common/arguments.py | 14 +- lib/spack/spack/cmd/find.py | 13 +- lib/spack/spack/cmd/info.py | 26 +- lib/spack/spack/cmd/list.py | 14 +- lib/spack/spack/file_cache.py | 2 +- lib/spack/spack/repository.py | 394 +++++++++++++++------ lib/spack/spack/test/cmd/find.py | 57 +++ lib/spack/spack/test/cmd/info.py | 52 +++ lib/spack/spack/test/cmd/list.py | 73 ++++ .../repos/builtin.mock/packages/mpich/package.py | 2 + .../repos/builtin.mock/packages/mpich2/package.py | 2 + var/spack/repos/builtin/packages/aspa/package.py | 7 +- 12 files changed, 525 insertions(+), 131 deletions(-) create mode 100644 lib/spack/spack/test/cmd/list.py (limited to 'lib') diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index 11c90b2ee4..46be346837 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -26,15 +26,23 @@ import argparse import spack.cmd -import spack.store import spack.modules +import spack.spec +import spack.store from spack.util.pattern import Args + __all__ = ['add_common_arguments'] _arguments = {} def add_common_arguments(parser, list_of_arguments): + """Extend a parser with extra arguments + + Args: + parser: parser to be extended + list_of_arguments: arguments to be added to the parser + """ for argument in list_of_arguments: if argument not in _arguments: message = 'Trying to add non existing argument "{0}" to a command' @@ -133,3 +141,7 @@ _arguments['long'] = Args( _arguments['very_long'] = Args( '-L', '--very-long', action='store_true', help='show full dependency hashes as well as versions') + +_arguments['tags'] = Args( + '-t', '--tags', action='append', + help='filter a package query by tags') diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index 02ff10f425..b7aa390c59 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -25,8 +25,8 @@ import sys import llnl.util.tty as tty +import spack import spack.cmd.common.arguments as arguments - from spack.cmd import display_specs description = "list and search installed packages" @@ -54,7 +54,7 @@ def setup_parser(subparser): const='deps', help='show full dependency DAG of installed packages') - arguments.add_common_arguments(subparser, ['long', 'very_long']) + arguments.add_common_arguments(subparser, ['long', 'very_long', 'tags']) subparser.add_argument('-f', '--show-flags', action='store_true', @@ -123,11 +123,16 @@ def find(parser, args): # Exit early if no package matches the constraint if not query_specs and args.constraint: - msg = "No package matches the query: {0}".format( - ' '.join(args.constraint)) + msg = "No package matches the query: {0}" + msg = msg.format(' '.join(args.constraint)) tty.msg(msg) return + # If tags have been specified on the command line, filter by tags + if args.tags: + packages_with_tags = spack.repo.packages_with_tags(*args.tags) + query_specs = [x for x in query_specs if x.name in packages_with_tags] + # Display the result if sys.stdout.isatty(): tty.msg("%d installed packages." % len(query_specs)) diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index b7f824c091..3236998710 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -26,15 +26,15 @@ from __future__ import print_function import textwrap +from six.moves import zip_longest + +from llnl.util.tty.colify import * + import llnl.util.tty.color as color import spack import spack.fetch_strategy as fs import spack.spec -from llnl.util.tty.colify import * - -from six.moves import zip_longest - description = 'get detailed information on a particular package' section = 'basic' level = 'short' @@ -156,9 +156,9 @@ def print_text_info(pkg): color.cprint('') color.cprint(section_title('Description:')) if pkg.__doc__: - print(pkg.format_doc(indent=4)) + color.cprint(pkg.format_doc(indent=4)) else: - print(" None") + color.cprint(" None") color.cprint(section_title('Homepage: ') + pkg.homepage) @@ -167,6 +167,14 @@ def print_text_info(pkg): color.cprint('') color.cprint(section_title('Maintainers: ') + mnt) + color.cprint('') + color.cprint(section_title("Tags: ")) + if hasattr(pkg, 'tags'): + tags = sorted(pkg.tags) + colify(tags, indent=4) + else: + color.cprint(" None") + color.cprint('') color.cprint(section_title('Preferred version: ')) @@ -220,7 +228,7 @@ def print_text_info(pkg): if deps: colify(deps, indent=4) else: - print(' None') + color.cprint(' None') color.cprint('') color.cprint(section_title('Virtual Packages: ')) @@ -238,7 +246,9 @@ def print_text_info(pkg): print(line) else: - print(" None") + color.cprint(" None") + + color.cprint('') def info(parser, args): diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index 5b915b94ec..730ad8d9d9 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -29,12 +29,15 @@ import cgi import fnmatch import re import sys + from six import StringIO import llnl.util.tty as tty -import spack from llnl.util.tty.colify import colify +import spack +import spack.cmd.common.arguments as arguments + description = "list and search available packages" section = "basic" level = "short" @@ -60,6 +63,8 @@ def setup_parser(subparser): '--format', default='name_only', choices=formatters, help='format to be used to print the output [default: name_only]') + arguments.add_common_arguments(subparser, ['tags']) + def filter_by_name(pkgs, args): """ @@ -183,5 +188,12 @@ def list(parser, args): pkgs = set(spack.repo.all_package_names()) # Filter the set appropriately sorted_packages = filter_by_name(pkgs, args) + + # Filter by tags + if args.tags: + packages_with_tags = set(spack.repo.packages_with_tags(*args.tags)) + sorted_packages = set(sorted_packages) & packages_with_tags + sorted_packages = sorted(sorted_packages) + # Print to stdout formatters[args.format](sorted_packages) diff --git a/lib/spack/spack/file_cache.py b/lib/spack/spack/file_cache.py index f09be4ecd5..6a6d59942e 100644 --- a/lib/spack/spack/file_cache.py +++ b/lib/spack/spack/file_cache.py @@ -35,7 +35,7 @@ class FileCache(object): """This class manages cached data in the filesystem. - Cache files are fetched and stored by unique keys. Keys can be relative - paths, so that thre can be some hierarchy in the cache. + paths, so that there can be some hierarchy in the cache. - The FileCache handles locking cache files for reading and writing, so client code need not manage locks for cache entries. diff --git a/lib/spack/spack/repository.py b/lib/spack/spack/repository.py index 0a6a774315..fbca9474fb 100644 --- a/lib/spack/spack/repository.py +++ b/lib/spack/spack/repository.py @@ -22,6 +22,7 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import collections import os import stat import shutil @@ -31,11 +32,18 @@ import inspect import imp import re import traceback -from bisect import bisect_left +import json + +try: + from collections.abc import Mapping +except ImportError: + from collections import Mapping + from types import ModuleType import yaml +import llnl.util.lang import llnl.util.tty as tty from llnl.util.filesystem import * @@ -93,6 +101,242 @@ class SpackNamespace(ModuleType): return getattr(self, name) +class FastPackageChecker(Mapping): + """Cache that maps package names to the stats obtained on the + 'package.py' files associated with them. + + For each repository a cache is maintained at class level, and shared among + all instances referring to it. Update of the global cache is done lazily + during instance initialization. + """ + #: Global cache, reused by every instance + _paths_cache = {} + + def __init__(self, packages_path): + + #: The path of the repository managed by this instance + self.packages_path = packages_path + + # If the cache we need is not there yet, then build it appropriately + if packages_path not in self._paths_cache: + self._paths_cache[packages_path] = self._create_new_cache() + + #: Reference to the appropriate entry in the global cache + self._packages_to_stats = self._paths_cache[packages_path] + + def _create_new_cache(self): + """Create a new cache for packages in a repo. + + The implementation here should try to minimize filesystem + calls. At the moment, it is O(number of packages) and makes + about one stat call per package. This is reasonably fast, and + avoids actually importing packages in Spack, which is slow. + """ + # Create a dictionary that will store the mapping between a + # package name and its stat info + cache = {} + for pkg_name in os.listdir(self.packages_path): + # Skip non-directories in the package root. + pkg_dir = join_path(self.packages_path, pkg_name) + + # Warn about invalid names that look like packages. + if not valid_module_name(pkg_name): + msg = 'Skipping package at {0}. ' + msg += '"{1]" is not a valid Spack module name.' + tty.warn(msg.format(pkg_dir, pkg_name)) + continue + + # Construct the file name from the directory + pkg_file = os.path.join( + self.packages_path, pkg_name, package_file_name + ) + + # Use stat here to avoid lots of calls to the filesystem. + try: + sinfo = os.stat(pkg_file) + except OSError as e: + if e.errno == errno.ENOENT: + # No package.py file here. + continue + elif e.errno == errno.EACCES: + tty.warn("Can't read package file %s." % pkg_file) + continue + raise e + + # If it's not a file, skip it. + if stat.S_ISDIR(sinfo.st_mode): + continue + + # If it is a file, then save the stats under the + # appropriate key + cache[pkg_name] = sinfo + + return cache + + def __getitem__(self, item): + return self._packages_to_stats[item] + + def __iter__(self): + return iter(self._packages_to_stats) + + def __len__(self): + return len(self._packages_to_stats) + + +class TagIndex(Mapping): + """Maps tags to list of packages.""" + + def __init__(self): + self._tag_dict = collections.defaultdict(list) + + def to_json(self, stream): + json.dump({'tags': self._tag_dict}, stream) + + @staticmethod + def from_json(stream): + d = json.load(stream) + + r = TagIndex() + + for tag, list in d['tags'].items(): + r[tag].extend(list) + + return r + + def __getitem__(self, item): + return self._tag_dict[item] + + def __iter__(self): + return iter(self._tag_dict) + + def __len__(self): + return len(self._tag_dict) + + def update_package(self, pkg_name): + """Updates a package in the tag index. + + Args: + pkg_name (str): name of the package to be removed from the index + + """ + + package = spack.repo.get(pkg_name) + + # Remove the package from the list of packages, if present + for pkg_list in self._tag_dict.values(): + if pkg_name in pkg_list: + pkg_list.remove(pkg_name) + + # Add it again under the appropriate tags + for tag in getattr(package, 'tags', []): + self._tag_dict[tag].append(package.name) + + +@llnl.util.lang.memoized +def make_provider_index_cache(packages_path, namespace): + """Lazily updates the provider index cache associated with a repository, + if need be, then returns it. Caches results for later look-ups. + + Args: + packages_path: path of the repository + namespace: namespace of the repository + + Returns: + instance of ProviderIndex + """ + # Map that goes from package names to stat info + fast_package_checker = FastPackageChecker(packages_path) + + # Filename of the provider index cache + cache_filename = 'providers/{0}-index.yaml'.format(namespace) + + # Compute which packages needs to be updated in the cache + index_mtime = spack.misc_cache.mtime(cache_filename) + + needs_update = [ + x for x, sinfo in fast_package_checker.items() + if sinfo.st_mtime > index_mtime + ] + + # Read the old ProviderIndex, or make a new one. + index_existed = spack.misc_cache.init_entry(cache_filename) + + if index_existed and not needs_update: + + # If the provider index exists and doesn't need an update + # just read from it + with spack.misc_cache.read_transaction(cache_filename) as f: + index = ProviderIndex.from_yaml(f) + + else: + + # Otherwise we need a write transaction to update it + with spack.misc_cache.write_transaction(cache_filename) as (old, new): + + index = ProviderIndex.from_yaml(old) if old else ProviderIndex() + + for pkg_name in needs_update: + namespaced_name = '{0}.{1}'.format(namespace, pkg_name) + index.remove_provider(namespaced_name) + index.update(namespaced_name) + + index.to_yaml(new) + + return index + + +@llnl.util.lang.memoized +def make_tag_index_cache(packages_path, namespace): + """Lazily updates the tag index cache associated with a repository, + if need be, then returns it. Caches results for later look-ups. + + Args: + packages_path: path of the repository + namespace: namespace of the repository + + Returns: + instance of TagIndex + """ + # Map that goes from package names to stat info + fast_package_checker = FastPackageChecker(packages_path) + + # Filename of the provider index cache + cache_filename = 'tags/{0}-index.json'.format(namespace) + + # Compute which packages needs to be updated in the cache + index_mtime = spack.misc_cache.mtime(cache_filename) + + needs_update = [ + x for x, sinfo in fast_package_checker.items() + if sinfo.st_mtime > index_mtime + ] + + # Read the old ProviderIndex, or make a new one. + index_existed = spack.misc_cache.init_entry(cache_filename) + + if index_existed and not needs_update: + + # If the provider index exists and doesn't need an update + # just read from it + with spack.misc_cache.read_transaction(cache_filename) as f: + index = TagIndex.from_json(f) + + else: + + # Otherwise we need a write transaction to update it + with spack.misc_cache.write_transaction(cache_filename) as (old, new): + + index = TagIndex.from_json(old) if old else TagIndex() + + for pkg_name in needs_update: + namespaced_name = '{0}.{1}'.format(namespace, pkg_name) + index.update_package(namespaced_name) + + index.to_json(new) + + return index + + class RepoPath(object): """A RepoPath is a list of repos that function as one. @@ -220,6 +464,12 @@ class RepoPath(object): self._all_package_names = sorted(all_pkgs, key=lambda n: n.lower()) return self._all_package_names + def packages_with_tags(self, *tags): + r = set() + for repo in self.repos: + r |= set(repo.packages_with_tags(*tags)) + return sorted(r) + def all_packages(self): for name in self.all_package_names(): yield self.get(name) @@ -422,21 +672,18 @@ class Repo(object): self._classes = {} self._instances = {} - # list of packages that are newer than the index. - self._needs_update = [] + # Maps that goes from package name to corresponding file stat + self._fast_package_checker = FastPackageChecker(self.packages_path) - # Index of virtual dependencies + # Index of virtual dependencies, computed lazily self._provider_index = None - # Cached list of package names. - self._all_package_names = None + # Index of tags, computed lazily + self._tag_index = None # make sure the namespace for packages in this repo exists. self._create_namespace() - # Unique filename for cache of virtual dependency providers - self._cache_file = 'providers/%s-index.yaml' % self.namespace - def _create_namespace(self): """Create this repo's namespace module and insert it into sys.modules. @@ -617,41 +864,28 @@ class Repo(object): """Clear entire package instance cache.""" self._instances.clear() - def _update_provider_index(self): - # Check modification dates of all packages - self._fast_package_check() - - def read(): - with open(self.index_file) as f: - self._provider_index = ProviderIndex.from_yaml(f) - - # Read the old ProviderIndex, or make a new one. - key = self._cache_file - index_existed = spack.misc_cache.init_entry(key) - if index_existed and not self._needs_update: - with spack.misc_cache.read_transaction(key) as f: - self._provider_index = ProviderIndex.from_yaml(f) - else: - with spack.misc_cache.write_transaction(key) as (old, new): - if old: - self._provider_index = ProviderIndex.from_yaml(old) - else: - self._provider_index = ProviderIndex() - - for pkg_name in self._needs_update: - namespaced_name = '%s.%s' % (self.namespace, pkg_name) - self._provider_index.remove_provider(namespaced_name) - self._provider_index.update(namespaced_name) - - self._provider_index.to_yaml(new) - @property def provider_index(self): """A provider index with names *specific* to this repo.""" + if self._provider_index is None: - self._update_provider_index() + self._provider_index = make_provider_index_cache( + self.packages_path, self.namespace + ) + return self._provider_index + @property + def tag_index(self): + """A provider index with names *specific* to this repo.""" + + if self._tag_index is None: + self._tag_index = make_tag_index_cache( + self.packages_path, self.namespace + ) + + return self._tag_index + @_autospec def providers_for(self, vpkg_spec): providers = self.provider_index.providers_for(vpkg_spec) @@ -689,73 +923,18 @@ class Repo(object): pkg_dir = self.dirname_for_package_name(spec.name) return join_path(pkg_dir, package_file_name) - def _fast_package_check(self): - """List packages in the repo and check whether index is up to date. - - Both of these opreations require checking all `package.py` - files so we do them at the same time. We list the repo - directory and look at package.py files, and we compare the - index modification date with the ost recently modified package - file, storing the result. - - The implementation here should try to minimize filesystem - calls. At the moment, it is O(number of packages) and makes - about one stat call per package. This is resonably fast, and - avoids actually importing packages in Spack, which is slow. - - """ - if self._all_package_names is None: - self._all_package_names = [] - - # Get index modification time. - index_mtime = spack.misc_cache.mtime(self._cache_file) - - for pkg_name in os.listdir(self.packages_path): - # Skip non-directories in the package root. - pkg_dir = join_path(self.packages_path, pkg_name) - - # Warn about invalid names that look like packages. - if not valid_module_name(pkg_name): - msg = ("Skipping package at %s. " - "'%s' is not a valid Spack module name.") - tty.warn(msg % (pkg_dir, pkg_name)) - continue - - # construct the file name from the directory - pkg_file = join_path( - self.packages_path, pkg_name, package_file_name) - - # Use stat here to avoid lots of calls to the filesystem. - try: - sinfo = os.stat(pkg_file) - except OSError as e: - if e.errno == errno.ENOENT: - # No package.py file here. - continue - elif e.errno == errno.EACCES: - tty.warn("Can't read package file %s." % pkg_file) - continue - raise e - - # if it's not a file, skip it. - if stat.S_ISDIR(sinfo.st_mode): - continue - - # All checks passed. Add it to the list. - self._all_package_names.append(pkg_name) - - # record the package if it is newer than the index. - if sinfo.st_mtime > index_mtime: - self._needs_update.append(pkg_name) + def all_package_names(self): + """Returns a sorted list of all package names in the Repo.""" + return sorted(self._fast_package_checker.keys()) - self._all_package_names.sort() + def packages_with_tags(self, *tags): + v = set(self.all_package_names()) + index = self.tag_index - return self._all_package_names + for t in tags: + v &= set(index[t]) - def all_package_names(self): - """Returns a sorted list of all package names in the Repo.""" - self._fast_package_check() - return self._all_package_names + return sorted(v) def all_packages(self): """Iterator over all packages in the repository. @@ -768,16 +947,7 @@ class Repo(object): def exists(self, pkg_name): """Whether a package with the supplied name exists.""" - if self._all_package_names: - # This does a binary search in the sorted list. - idx = bisect_left(self.all_package_names(), pkg_name) - return (idx < len(self._all_package_names) and - self._all_package_names[idx] == pkg_name) - - # If we haven't generated the full package list, don't. - # Just check whether the file exists. - filename = self.filename_for_package_name(pkg_name) - return os.path.exists(filename) + return pkg_name in self._fast_package_checker def is_virtual(self, pkg_name): """True if the package with this name is virtual, False otherwise.""" diff --git a/lib/spack/spack/test/cmd/find.py b/lib/spack/spack/test/cmd/find.py index b082b71c06..57dd688362 100644 --- a/lib/spack/spack/test/cmd/find.py +++ b/lib/spack/spack/test/cmd/find.py @@ -22,12 +22,40 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import argparse + +import pytest import spack.cmd.find from spack.util.pattern import Bunch +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the module command""" + prs = argparse.ArgumentParser() + spack.cmd.find.setup_parser(prs) + return prs + + +@pytest.fixture() +def specs(): + s = [] + return s + + +@pytest.fixture() +def mock_display(monkeypatch, specs): + """Monkeypatches the display function to return its first argument""" + + def display(x, *args, **kwargs): + specs.extend(x) + + monkeypatch.setattr(spack.cmd.find, 'display_specs', display) + + def test_query_arguments(): query_arguments = spack.cmd.find.query_arguments + # Default arguments args = Bunch( only_missing=False, @@ -36,6 +64,7 @@ def test_query_arguments(): explicit=False, implicit=False ) + q_args = query_arguments(args) assert 'installed' in q_args assert 'known' in q_args @@ -43,11 +72,39 @@ def test_query_arguments(): assert q_args['installed'] is True assert q_args['known'] is any assert q_args['explicit'] is any + # Check that explicit works correctly args.explicit = True q_args = query_arguments(args) assert q_args['explicit'] is True + args.explicit = False args.implicit = True q_args = query_arguments(args) assert q_args['explicit'] is False + + +@pytest.mark.usefixtures('database', 'mock_display') +class TestFindWithTags(object): + + def test_tag1(self, parser, specs): + + args = parser.parse_args(['--tags', 'tag1']) + spack.cmd.find.find(parser, args) + + assert len(specs) == 2 + assert 'mpich' in [x.name for x in specs] + assert 'mpich2' in [x.name for x in specs] + + def test_tag2(self, parser, specs): + args = parser.parse_args(['--tags', 'tag2']) + spack.cmd.find.find(parser, args) + + assert len(specs) == 1 + assert 'mpich' in [x.name for x in specs] + + def test_tag2_tag3(self, parser, specs): + args = parser.parse_args(['--tags', 'tag2', '--tags', 'tag3']) + spack.cmd.find.find(parser, args) + + assert len(specs) == 0 diff --git a/lib/spack/spack/test/cmd/info.py b/lib/spack/spack/test/cmd/info.py index 9819f2cd84..6c71515a3f 100644 --- a/lib/spack/spack/test/cmd/info.py +++ b/lib/spack/spack/test/cmd/info.py @@ -22,13 +22,39 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## +import argparse + import pytest +import spack.cmd.info from spack.main import SpackCommand info = SpackCommand('info') +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the module command""" + prs = argparse.ArgumentParser() + spack.cmd.info.setup_parser(prs) + return prs + + +@pytest.fixture() +def info_lines(): + lines = [] + return lines + + +@pytest.fixture() +def mock_print(monkeypatch, info_lines): + + def _print(*args): + info_lines.extend(args) + + monkeypatch.setattr(spack.cmd.info.color, 'cprint', _print, raising=False) + + @pytest.mark.parametrize('pkg', [ 'openmpi', 'trilinos', @@ -38,3 +64,29 @@ info = SpackCommand('info') ]) def test_it_just_runs(pkg): info(pkg) + + +@pytest.mark.parametrize('pkg_query', [ + 'hdf5', + 'cloverleaf3d', + 'trilinos' +]) +@pytest.mark.usefixtures('mock_print') +def test_info_fields(pkg_query, parser, info_lines): + + expected_fields = ( + 'Description:', + 'Homepage:', + 'Safe versions:', + 'Variants:', + 'Installation Phases:', + 'Virtual Packages:', + 'Tags:' + ) + + args = parser.parse_args([pkg_query]) + spack.cmd.info.info(parser, args) + + for text in expected_fields: + match = [x for x in info_lines if text in x] + assert match diff --git a/lib/spack/spack/test/cmd/list.py b/lib/spack/spack/test/cmd/list.py new file mode 100644 index 0000000000..244ae5fcbc --- /dev/null +++ b/lib/spack/spack/test/cmd/list.py @@ -0,0 +1,73 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import argparse + +import pytest +import spack.cmd.list + + +@pytest.fixture(scope='module') +def parser(): + """Returns the parser for the module command""" + prs = argparse.ArgumentParser() + spack.cmd.list.setup_parser(prs) + return prs + + +@pytest.fixture() +def pkg_names(): + pkg_names = [] + return pkg_names + + +@pytest.fixture() +def mock_name_only(monkeypatch, pkg_names): + + def name_only(x): + pkg_names.extend(x) + + monkeypatch.setattr(spack.cmd.list, 'name_only', name_only) + monkeypatch.setitem(spack.cmd.list.formatters, 'name_only', name_only) + + +@pytest.mark.usefixtures('mock_name_only') +class TestListCommand(object): + + def test_list_without_filters(self, parser, pkg_names): + + args = parser.parse_args([]) + spack.cmd.list.list(parser, args) + + assert pkg_names + assert 'cloverleaf3d' in pkg_names + assert 'hdf5' in pkg_names + + def test_list_with_filters(self, parser, pkg_names): + args = parser.parse_args(['--tags', 'proxy-app']) + spack.cmd.list.list(parser, args) + + assert pkg_names + assert 'cloverleaf3d' in pkg_names + assert 'hdf5' not in pkg_names \ No newline at end of file diff --git a/var/spack/repos/builtin.mock/packages/mpich/package.py b/var/spack/repos/builtin.mock/packages/mpich/package.py index 28d7b57f2d..844cfb940c 100644 --- a/var/spack/repos/builtin.mock/packages/mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/mpich/package.py @@ -31,6 +31,8 @@ class Mpich(Package): list_url = "http://www.mpich.org/static/downloads/" list_depth = 2 + tags = ['tag1', 'tag2'] + variant('debug', default=False, description="Compile MPICH with debug flags.") diff --git a/var/spack/repos/builtin.mock/packages/mpich2/package.py b/var/spack/repos/builtin.mock/packages/mpich2/package.py index bdb5f914c9..aabd5232d7 100644 --- a/var/spack/repos/builtin.mock/packages/mpich2/package.py +++ b/var/spack/repos/builtin.mock/packages/mpich2/package.py @@ -31,6 +31,8 @@ class Mpich2(Package): list_url = "http://www.mpich.org/static/downloads/" list_depth = 2 + tags = ['tag1', 'tag3'] + version('1.5', '9c5d5d4fe1e17dd12153f40bc5b6dbc0') version('1.4', 'foobarbaz') version('1.3', 'foobarbaz') diff --git a/var/spack/repos/builtin/packages/aspa/package.py b/var/spack/repos/builtin/packages/aspa/package.py index 863c8a2980..3b0e0e4c26 100644 --- a/var/spack/repos/builtin/packages/aspa/package.py +++ b/var/spack/repos/builtin/packages/aspa/package.py @@ -28,10 +28,9 @@ import glob class Aspa(MakefilePackage): """A fundamental premise in ExMatEx is that scale-bridging performed in - heterogeneous MPMD materials science simulations will place important - demands upon the exascale ecosystem that need to be identified and - quantified. - tags = proxy-app + heterogeneous MPMD materials science simulations will place important + demands upon the exascale ecosystem that need to be identified and + quantified. """ tags = ['proxy-app'] homepage = "http://www.exmatex.org/aspa.html" -- cgit v1.2.3-70-g09d2 From 84ae7872d36fef95872250cfe801ec0d12f3d28f Mon Sep 17 00:00:00 2001 From: Michael Kuhn Date: Thu, 7 Sep 2017 05:44:16 +0200 Subject: Update copyright notices for 2017 (#5295) --- bin/sbang | 2 +- bin/spack | 2 +- bin/spack-python | 2 +- lib/spack/docs/tutorial/examples/0.package.py | 2 +- lib/spack/docs/tutorial/examples/1.package.py | 2 +- lib/spack/docs/tutorial/examples/2.package.py | 2 +- lib/spack/docs/tutorial/examples/3.package.py | 2 +- lib/spack/docs/tutorial/examples/4.package.py | 2 +- lib/spack/env/cc | 2 +- lib/spack/external/__init__.py | 2 +- lib/spack/llnl/__init__.py | 2 +- lib/spack/llnl/util/__init__.py | 2 +- lib/spack/llnl/util/filesystem.py | 2 +- lib/spack/llnl/util/lang.py | 2 +- lib/spack/llnl/util/link_tree.py | 2 +- lib/spack/llnl/util/lock.py | 2 +- lib/spack/llnl/util/tty/__init__.py | 2 +- lib/spack/llnl/util/tty/colify.py | 2 +- lib/spack/llnl/util/tty/color.py | 2 +- lib/spack/llnl/util/tty/log.py | 2 +- lib/spack/spack/__init__.py | 2 +- lib/spack/spack/abi.py | 2 +- lib/spack/spack/architecture.py | 2 +- lib/spack/spack/binary_distribution.py | 2 +- lib/spack/spack/build_systems/__init__.py | 2 +- lib/spack/spack/build_systems/autotools.py | 2 +- lib/spack/spack/build_systems/cmake.py | 2 +- lib/spack/spack/build_systems/intel.py | 2 +- lib/spack/spack/build_systems/makefile.py | 2 +- lib/spack/spack/build_systems/perl.py | 2 +- lib/spack/spack/build_systems/python.py | 2 +- lib/spack/spack/build_systems/qmake.py | 2 +- lib/spack/spack/build_systems/r.py | 2 +- lib/spack/spack/build_systems/scons.py | 2 +- lib/spack/spack/build_systems/waf.py | 2 +- lib/spack/spack/cmd/__init__.py | 2 +- lib/spack/spack/cmd/activate.py | 2 +- lib/spack/spack/cmd/arch.py | 2 +- lib/spack/spack/cmd/bootstrap.py | 2 +- lib/spack/spack/cmd/build.py | 2 +- lib/spack/spack/cmd/buildcache.py | 2 +- lib/spack/spack/cmd/cd.py | 2 +- lib/spack/spack/cmd/checksum.py | 2 +- lib/spack/spack/cmd/clean.py | 2 +- lib/spack/spack/cmd/common/__init__.py | 2 +- lib/spack/spack/cmd/common/arguments.py | 2 +- lib/spack/spack/cmd/compiler.py | 2 +- lib/spack/spack/cmd/compilers.py | 2 +- lib/spack/spack/cmd/config.py | 2 +- lib/spack/spack/cmd/configure.py | 2 +- lib/spack/spack/cmd/create.py | 2 +- lib/spack/spack/cmd/deactivate.py | 2 +- lib/spack/spack/cmd/debug.py | 2 +- lib/spack/spack/cmd/dependencies.py | 2 +- lib/spack/spack/cmd/dependents.py | 2 +- lib/spack/spack/cmd/diy.py | 2 +- lib/spack/spack/cmd/edit.py | 2 +- lib/spack/spack/cmd/env.py | 2 +- lib/spack/spack/cmd/extensions.py | 2 +- lib/spack/spack/cmd/fetch.py | 2 +- lib/spack/spack/cmd/find.py | 2 +- lib/spack/spack/cmd/flake8.py | 2 +- lib/spack/spack/cmd/gpg.py | 2 +- lib/spack/spack/cmd/graph.py | 2 +- lib/spack/spack/cmd/help.py | 2 +- lib/spack/spack/cmd/info.py | 2 +- lib/spack/spack/cmd/install.py | 2 +- lib/spack/spack/cmd/list.py | 2 +- lib/spack/spack/cmd/load.py | 2 +- lib/spack/spack/cmd/location.py | 2 +- lib/spack/spack/cmd/md5.py | 2 +- lib/spack/spack/cmd/mirror.py | 2 +- lib/spack/spack/cmd/module.py | 2 +- lib/spack/spack/cmd/patch.py | 2 +- lib/spack/spack/cmd/pkg.py | 2 +- lib/spack/spack/cmd/providers.py | 2 +- lib/spack/spack/cmd/python.py | 2 +- lib/spack/spack/cmd/reindex.py | 2 +- lib/spack/spack/cmd/repo.py | 2 +- lib/spack/spack/cmd/restage.py | 2 +- lib/spack/spack/cmd/setup.py | 2 +- lib/spack/spack/cmd/spec.py | 2 +- lib/spack/spack/cmd/stage.py | 2 +- lib/spack/spack/cmd/test.py | 2 +- lib/spack/spack/cmd/uninstall.py | 2 +- lib/spack/spack/cmd/unload.py | 2 +- lib/spack/spack/cmd/unuse.py | 2 +- lib/spack/spack/cmd/url.py | 2 +- lib/spack/spack/cmd/use.py | 2 +- lib/spack/spack/cmd/versions.py | 2 +- lib/spack/spack/cmd/view.py | 2 +- lib/spack/spack/compiler.py | 2 +- lib/spack/spack/compilers/__init__.py | 2 +- lib/spack/spack/compilers/cce.py | 2 +- lib/spack/spack/compilers/clang.py | 2 +- lib/spack/spack/compilers/gcc.py | 2 +- lib/spack/spack/compilers/intel.py | 2 +- lib/spack/spack/compilers/nag.py | 2 +- lib/spack/spack/compilers/pgi.py | 2 +- lib/spack/spack/compilers/xl.py | 2 +- lib/spack/spack/concretize.py | 2 +- lib/spack/spack/config.py | 2 +- lib/spack/spack/database.py | 2 +- lib/spack/spack/directives.py | 2 +- lib/spack/spack/directory_layout.py | 2 +- lib/spack/spack/environment.py | 2 +- lib/spack/spack/error.py | 2 +- lib/spack/spack/fetch_strategy.py | 2 +- lib/spack/spack/file_cache.py | 2 +- lib/spack/spack/graph.py | 2 +- lib/spack/spack/hooks/__init__.py | 2 +- lib/spack/spack/hooks/case_consistency.py | 2 +- lib/spack/spack/hooks/extensions.py | 2 +- lib/spack/spack/hooks/licensing.py | 2 +- lib/spack/spack/hooks/module_file_generation.py | 2 +- lib/spack/spack/hooks/sbang.py | 2 +- lib/spack/spack/hooks/yaml_version_check.py | 2 +- lib/spack/spack/mirror.py | 2 +- lib/spack/spack/modules.py | 2 +- lib/spack/spack/multimethod.py | 2 +- lib/spack/spack/operating_systems/__init__.py | 2 +- lib/spack/spack/operating_systems/cnk.py | 2 +- lib/spack/spack/operating_systems/cnl.py | 2 +- lib/spack/spack/operating_systems/cray_frontend.py | 2 +- lib/spack/spack/operating_systems/linux_distro.py | 2 +- lib/spack/spack/operating_systems/mac_os.py | 2 +- lib/spack/spack/package.py | 2 +- lib/spack/spack/package_prefs.py | 2 +- lib/spack/spack/package_test.py | 2 +- lib/spack/spack/parse.py | 2 +- lib/spack/spack/patch.py | 2 +- lib/spack/spack/platforms/__init__.py | 2 +- lib/spack/spack/platforms/bgq.py | 2 +- lib/spack/spack/platforms/cray.py | 2 +- lib/spack/spack/platforms/darwin.py | 2 +- lib/spack/spack/platforms/linux.py | 2 +- lib/spack/spack/platforms/test.py | 2 +- lib/spack/spack/provider_index.py | 2 +- lib/spack/spack/relocate.py | 2 +- lib/spack/spack/repository.py | 2 +- lib/spack/spack/resource.py | 2 +- lib/spack/spack/schema/__init__.py | 2 +- lib/spack/spack/schema/compilers.py | 2 +- lib/spack/spack/schema/config.py | 2 +- lib/spack/spack/schema/mirrors.py | 2 +- lib/spack/spack/schema/modules.py | 2 +- lib/spack/spack/schema/packages.py | 2 +- lib/spack/spack/schema/repos.py | 2 +- lib/spack/spack/spec.py | 2 +- lib/spack/spack/stage.py | 2 +- lib/spack/spack/store.py | 2 +- lib/spack/spack/test/__init__.py | 2 +- lib/spack/spack/test/architecture.py | 2 +- lib/spack/spack/test/build_system_guess.py | 2 +- lib/spack/spack/test/build_systems.py | 2 +- lib/spack/spack/test/cc.py | 2 +- lib/spack/spack/test/cmd/__init__.py | 2 +- lib/spack/spack/test/cmd/find.py | 2 +- lib/spack/spack/test/cmd/flake8.py | 2 +- lib/spack/spack/test/cmd/gpg.py | 2 +- lib/spack/spack/test/cmd/install.py | 2 +- lib/spack/spack/test/cmd/list.py | 2 +- lib/spack/spack/test/cmd/module.py | 2 +- lib/spack/spack/test/cmd/python.py | 2 +- lib/spack/spack/test/cmd/test_compiler_cmd.py | 2 +- lib/spack/spack/test/cmd/uninstall.py | 2 +- lib/spack/spack/test/cmd/url.py | 2 +- lib/spack/spack/test/compilers.py | 2 +- lib/spack/spack/test/concretize.py | 2 +- lib/spack/spack/test/concretize_preferences.py | 2 +- lib/spack/spack/test/config.py | 2 +- lib/spack/spack/test/conftest.py | 2 +- lib/spack/spack/test/data/sourceme_first.sh | 2 +- lib/spack/spack/test/data/sourceme_parameters.sh | 2 +- lib/spack/spack/test/data/sourceme_second.sh | 2 +- lib/spack/spack/test/data/sourceme_unicode.sh | 2 +- lib/spack/spack/test/database.py | 2 +- lib/spack/spack/test/directory_layout.py | 2 +- lib/spack/spack/test/environment.py | 2 +- lib/spack/spack/test/file_cache.py | 2 +- lib/spack/spack/test/file_list.py | 2 +- lib/spack/spack/test/git_fetch.py | 2 +- lib/spack/spack/test/graph.py | 2 +- lib/spack/spack/test/hg_fetch.py | 2 +- lib/spack/spack/test/install.py | 2 +- lib/spack/spack/test/link_tree.py | 2 +- lib/spack/spack/test/lock.py | 2 +- lib/spack/spack/test/log.py | 2 +- lib/spack/spack/test/make_executable.py | 2 +- lib/spack/spack/test/mirror.py | 2 +- lib/spack/spack/test/module_parsing.py | 2 +- lib/spack/spack/test/modules.py | 2 +- lib/spack/spack/test/multimethod.py | 2 +- lib/spack/spack/test/namespace_trie.py | 2 +- lib/spack/spack/test/optional_deps.py | 2 +- lib/spack/spack/test/package_sanity.py | 2 +- lib/spack/spack/test/packages.py | 2 +- lib/spack/spack/test/packaging.py | 2 +- lib/spack/spack/test/pattern.py | 2 +- lib/spack/spack/test/provider_index.py | 2 +- lib/spack/spack/test/sbang.py | 2 +- lib/spack/spack/test/spack_yaml.py | 2 +- lib/spack/spack/test/spec_dag.py | 2 +- lib/spack/spack/test/spec_semantics.py | 2 +- lib/spack/spack/test/spec_syntax.py | 2 +- lib/spack/spack/test/spec_yaml.py | 2 +- lib/spack/spack/test/stage.py | 2 +- lib/spack/spack/test/svn_fetch.py | 2 +- lib/spack/spack/test/url_fetch.py | 2 +- lib/spack/spack/test/url_parse.py | 2 +- lib/spack/spack/test/url_substitution.py | 2 +- lib/spack/spack/test/util/prefix.py | 2 +- lib/spack/spack/test/variant.py | 2 +- lib/spack/spack/test/versions.py | 2 +- lib/spack/spack/test/web.py | 2 +- lib/spack/spack/url.py | 2 +- lib/spack/spack/util/__init__.py | 2 +- lib/spack/spack/util/compression.py | 2 +- lib/spack/spack/util/crypto.py | 2 +- lib/spack/spack/util/debug.py | 2 +- lib/spack/spack/util/environment.py | 2 +- lib/spack/spack/util/executable.py | 2 +- lib/spack/spack/util/gpg.py | 2 +- lib/spack/spack/util/module_cmd.py | 2 +- lib/spack/spack/util/multiproc.py | 2 +- lib/spack/spack/util/naming.py | 2 +- lib/spack/spack/util/path.py | 2 +- lib/spack/spack/util/pattern.py | 2 +- lib/spack/spack/util/prefix.py | 2 +- lib/spack/spack/util/spack_json.py | 2 +- lib/spack/spack/util/spack_yaml.py | 2 +- lib/spack/spack/util/string.py | 2 +- lib/spack/spack/util/web.py | 2 +- lib/spack/spack/variant.py | 2 +- lib/spack/spack/version.py | 2 +- share/spack/setup-env.csh | 2 +- share/spack/setup-env.sh | 2 +- share/spack/spack-completion.bash | 2 +- var/spack/repos/builtin.mock/packages/a/package.py | 2 +- var/spack/repos/builtin.mock/packages/b/package.py | 2 +- var/spack/repos/builtin.mock/packages/boost/package.py | 2 +- var/spack/repos/builtin.mock/packages/c/package.py | 2 +- var/spack/repos/builtin.mock/packages/callpath/package.py | 2 +- var/spack/repos/builtin.mock/packages/canfail/package.py | 2 +- var/spack/repos/builtin.mock/packages/cmake-client/package.py | 2 +- var/spack/repos/builtin.mock/packages/cmake/package.py | 2 +- var/spack/repos/builtin.mock/packages/conflict-parent/package.py | 2 +- var/spack/repos/builtin.mock/packages/conflict/package.py | 2 +- var/spack/repos/builtin.mock/packages/develop-test/package.py | 2 +- var/spack/repos/builtin.mock/packages/direct-mpich/package.py | 2 +- var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py | 2 +- var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py | 2 +- var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py | 2 +- var/spack/repos/builtin.mock/packages/dt-diamond/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtbuild1/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtbuild2/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtbuild3/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtlink1/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtlink2/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtlink3/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtlink4/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtlink5/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtrun1/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtrun2/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtrun3/package.py | 2 +- var/spack/repos/builtin.mock/packages/dttop/package.py | 2 +- var/spack/repos/builtin.mock/packages/dtuse/package.py | 2 +- var/spack/repos/builtin.mock/packages/dyninst/package.py | 2 +- var/spack/repos/builtin.mock/packages/e/package.py | 2 +- var/spack/repos/builtin.mock/packages/extendee/package.py | 2 +- var/spack/repos/builtin.mock/packages/extension1/package.py | 2 +- var/spack/repos/builtin.mock/packages/extension2/package.py | 2 +- var/spack/repos/builtin.mock/packages/externalmodule/package.py | 2 +- var/spack/repos/builtin.mock/packages/externalprereq/package.py | 2 +- var/spack/repos/builtin.mock/packages/externaltest/package.py | 2 +- var/spack/repos/builtin.mock/packages/externaltool/package.py | 2 +- var/spack/repos/builtin.mock/packages/externalvirtual/package.py | 2 +- var/spack/repos/builtin.mock/packages/failing-build/package.py | 2 +- var/spack/repos/builtin.mock/packages/fake/package.py | 2 +- var/spack/repos/builtin.mock/packages/flake8/package.py | 2 +- var/spack/repos/builtin.mock/packages/git-test/package.py | 2 +- var/spack/repos/builtin.mock/packages/hg-test/package.py | 2 +- var/spack/repos/builtin.mock/packages/hypre/package.py | 2 +- var/spack/repos/builtin.mock/packages/indirect-mpich/package.py | 2 +- var/spack/repos/builtin.mock/packages/libdwarf/package.py | 2 +- var/spack/repos/builtin.mock/packages/libelf/package.py | 2 +- var/spack/repos/builtin.mock/packages/mixedversions/package.py | 2 +- var/spack/repos/builtin.mock/packages/mpich/package.py | 2 +- var/spack/repos/builtin.mock/packages/mpich2/package.py | 2 +- var/spack/repos/builtin.mock/packages/mpileaks/package.py | 2 +- var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py | 2 +- var/spack/repos/builtin.mock/packages/multimethod/package.py | 2 +- var/spack/repos/builtin.mock/packages/multivalue_variant/package.py | 2 +- var/spack/repos/builtin.mock/packages/netlib-blas/package.py | 2 +- var/spack/repos/builtin.mock/packages/netlib-lapack/package.py | 2 +- var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py | 2 +- var/spack/repos/builtin.mock/packages/openblas/package.py | 2 +- var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py | 2 +- var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py | 2 +- var/spack/repos/builtin.mock/packages/optional-dep-test/package.py | 2 +- var/spack/repos/builtin.mock/packages/othervirtual/package.py | 2 +- var/spack/repos/builtin.mock/packages/patchelf/package.py | 2 +- var/spack/repos/builtin.mock/packages/python/package.py | 2 +- .../builtin.mock/packages/singlevalue-variant-dependent/package.py | 2 +- var/spack/repos/builtin.mock/packages/svn-test/package.py | 2 +- .../repos/builtin.mock/packages/trivial-install-test-package/package.py | 2 +- var/spack/repos/builtin.mock/packages/zmpi/package.py | 2 +- var/spack/repos/builtin/packages/abinit/package.py | 2 +- var/spack/repos/builtin/packages/abyss/package.py | 2 +- var/spack/repos/builtin/packages/ack/package.py | 2 +- var/spack/repos/builtin/packages/activeharmony/package.py | 2 +- var/spack/repos/builtin/packages/adept-utils/package.py | 2 +- var/spack/repos/builtin/packages/adios/package.py | 2 +- var/spack/repos/builtin/packages/adlbx/package.py | 2 +- var/spack/repos/builtin/packages/adol-c/package.py | 2 +- var/spack/repos/builtin/packages/albert/package.py | 2 +- var/spack/repos/builtin/packages/alglib/package.py | 2 +- var/spack/repos/builtin/packages/allinea-forge/package.py | 2 +- var/spack/repos/builtin/packages/allinea-reports/package.py | 2 +- var/spack/repos/builtin/packages/allpaths-lg/package.py | 2 +- var/spack/repos/builtin/packages/alquimia/package.py | 2 +- var/spack/repos/builtin/packages/alsa-lib/package.py | 2 +- var/spack/repos/builtin/packages/amg2013/package.py | 2 +- var/spack/repos/builtin/packages/ampliconnoise/package.py | 2 +- var/spack/repos/builtin/packages/amr-exp-parabolic/package.py | 2 +- var/spack/repos/builtin/packages/amrex/package.py | 2 +- var/spack/repos/builtin/packages/andi/package.py | 2 +- var/spack/repos/builtin/packages/angsd/package.py | 2 +- var/spack/repos/builtin/packages/ant/package.py | 2 +- var/spack/repos/builtin/packages/antlr/package.py | 2 +- var/spack/repos/builtin/packages/ape/package.py | 2 +- var/spack/repos/builtin/packages/apex/package.py | 2 +- var/spack/repos/builtin/packages/applewmproto/package.py | 2 +- var/spack/repos/builtin/packages/appres/package.py | 2 +- var/spack/repos/builtin/packages/apr-util/package.py | 2 +- var/spack/repos/builtin/packages/apr/package.py | 2 +- var/spack/repos/builtin/packages/archer/package.py | 2 +- var/spack/repos/builtin/packages/argtable/package.py | 2 +- var/spack/repos/builtin/packages/armadillo/package.py | 2 +- var/spack/repos/builtin/packages/arpack-ng/package.py | 2 +- var/spack/repos/builtin/packages/arpack/package.py | 2 +- var/spack/repos/builtin/packages/asciidoc/package.py | 2 +- var/spack/repos/builtin/packages/aspa/package.py | 2 +- var/spack/repos/builtin/packages/astra/package.py | 2 +- var/spack/repos/builtin/packages/astral/package.py | 2 +- var/spack/repos/builtin/packages/astyle/package.py | 2 +- var/spack/repos/builtin/packages/atk/package.py | 2 +- var/spack/repos/builtin/packages/atlas/package.py | 2 +- var/spack/repos/builtin/packages/atompaw/package.py | 2 +- var/spack/repos/builtin/packages/atop/package.py | 2 +- var/spack/repos/builtin/packages/augustus/package.py | 2 +- var/spack/repos/builtin/packages/autoconf/package.py | 2 +- var/spack/repos/builtin/packages/autogen/package.py | 2 +- var/spack/repos/builtin/packages/automaded/package.py | 2 +- var/spack/repos/builtin/packages/automake/package.py | 2 +- var/spack/repos/builtin/packages/bamtools/package.py | 2 +- var/spack/repos/builtin/packages/bamutil/package.py | 2 +- var/spack/repos/builtin/packages/bash-completion/package.py | 2 +- var/spack/repos/builtin/packages/bash/package.py | 2 +- var/spack/repos/builtin/packages/bats/package.py | 2 +- var/spack/repos/builtin/packages/bazel/package.py | 2 +- var/spack/repos/builtin/packages/bbcp/package.py | 2 +- var/spack/repos/builtin/packages/bcftools/package.py | 2 +- var/spack/repos/builtin/packages/bcl2fastq2/package.py | 2 +- var/spack/repos/builtin/packages/bdftopcf/package.py | 2 +- var/spack/repos/builtin/packages/bdw-gc/package.py | 2 +- var/spack/repos/builtin/packages/bear/package.py | 2 +- var/spack/repos/builtin/packages/beast2/package.py | 2 +- var/spack/repos/builtin/packages/bedtools2/package.py | 2 +- var/spack/repos/builtin/packages/beforelight/package.py | 2 +- var/spack/repos/builtin/packages/benchmark/package.py | 2 +- var/spack/repos/builtin/packages/bertini/package.py | 2 +- var/spack/repos/builtin/packages/bib2xhtml/package.py | 2 +- var/spack/repos/builtin/packages/bigreqsproto/package.py | 2 +- var/spack/repos/builtin/packages/binutils/package.py | 2 +- var/spack/repos/builtin/packages/bison/package.py | 2 +- var/spack/repos/builtin/packages/bitmap/package.py | 2 +- var/spack/repos/builtin/packages/blast-plus/package.py | 2 +- var/spack/repos/builtin/packages/blat/package.py | 2 +- var/spack/repos/builtin/packages/blaze/package.py | 2 +- var/spack/repos/builtin/packages/bliss/package.py | 2 +- var/spack/repos/builtin/packages/blitz/package.py | 2 +- var/spack/repos/builtin/packages/boost/package.py | 2 +- var/spack/repos/builtin/packages/bowtie/package.py | 2 +- var/spack/repos/builtin/packages/bowtie2/package.py | 2 +- var/spack/repos/builtin/packages/boxlib/package.py | 2 +- var/spack/repos/builtin/packages/bpp-core/package.py | 2 +- var/spack/repos/builtin/packages/bpp-phyl/package.py | 2 +- var/spack/repos/builtin/packages/bpp-seq/package.py | 2 +- var/spack/repos/builtin/packages/bpp-suite/package.py | 2 +- var/spack/repos/builtin/packages/braker/package.py | 2 +- var/spack/repos/builtin/packages/brigand/package.py | 2 +- var/spack/repos/builtin/packages/bsseeker2/package.py | 2 +- var/spack/repos/builtin/packages/bucky/package.py | 2 +- var/spack/repos/builtin/packages/busco/package.py | 2 +- var/spack/repos/builtin/packages/butter/package.py | 2 +- var/spack/repos/builtin/packages/bwa/package.py | 2 +- var/spack/repos/builtin/packages/bzip2/package.py | 2 +- var/spack/repos/builtin/packages/c-blosc/package.py | 2 +- var/spack/repos/builtin/packages/caffe/package.py | 2 +- var/spack/repos/builtin/packages/cairo/package.py | 2 +- var/spack/repos/builtin/packages/caliper/package.py | 2 +- var/spack/repos/builtin/packages/callpath/package.py | 2 +- var/spack/repos/builtin/packages/cantera/package.py | 2 +- var/spack/repos/builtin/packages/canu/package.py | 2 +- var/spack/repos/builtin/packages/cap3/package.py | 2 +- var/spack/repos/builtin/packages/cares/package.py | 2 +- var/spack/repos/builtin/packages/cask/package.py | 2 +- var/spack/repos/builtin/packages/catch/package.py | 2 +- var/spack/repos/builtin/packages/cbench/package.py | 2 +- var/spack/repos/builtin/packages/cblas/package.py | 2 +- var/spack/repos/builtin/packages/ccache/package.py | 2 +- var/spack/repos/builtin/packages/cctools/package.py | 2 +- var/spack/repos/builtin/packages/cdbfasta/package.py | 2 +- var/spack/repos/builtin/packages/cdd/package.py | 2 +- var/spack/repos/builtin/packages/cddlib/package.py | 2 +- var/spack/repos/builtin/packages/cdhit/package.py | 2 +- var/spack/repos/builtin/packages/cdo/package.py | 2 +- var/spack/repos/builtin/packages/cereal/package.py | 2 +- var/spack/repos/builtin/packages/cfitsio/package.py | 2 +- var/spack/repos/builtin/packages/cgal/package.py | 2 +- var/spack/repos/builtin/packages/cgm/package.py | 2 +- var/spack/repos/builtin/packages/cgns/package.py | 2 +- var/spack/repos/builtin/packages/charm/package.py | 2 +- var/spack/repos/builtin/packages/check/package.py | 2 +- var/spack/repos/builtin/packages/chlorop/package.py | 2 +- var/spack/repos/builtin/packages/chombo/package.py | 2 +- var/spack/repos/builtin/packages/cityhash/package.py | 2 +- var/spack/repos/builtin/packages/clamr/package.py | 2 +- var/spack/repos/builtin/packages/cleaveland4/package.py | 2 +- var/spack/repos/builtin/packages/cleverleaf/package.py | 2 +- var/spack/repos/builtin/packages/clhep/package.py | 2 +- var/spack/repos/builtin/packages/cloog/package.py | 2 +- var/spack/repos/builtin/packages/cloverleaf/package.py | 2 +- var/spack/repos/builtin/packages/cloverleaf3d/package.py | 2 +- var/spack/repos/builtin/packages/clustalo/package.py | 2 +- var/spack/repos/builtin/packages/clustalw/package.py | 2 +- var/spack/repos/builtin/packages/cmake/package.py | 2 +- var/spack/repos/builtin/packages/cmocka/package.py | 2 +- var/spack/repos/builtin/packages/cmor/package.py | 2 +- var/spack/repos/builtin/packages/cnmem/package.py | 2 +- var/spack/repos/builtin/packages/cnpy/package.py | 2 +- var/spack/repos/builtin/packages/cns-nospec/package.py | 2 +- var/spack/repos/builtin/packages/cntk/package.py | 2 +- var/spack/repos/builtin/packages/cntk1bitsgd/package.py | 2 +- var/spack/repos/builtin/packages/codar-cheetah/package.py | 2 +- var/spack/repos/builtin/packages/cohmm/package.py | 2 +- var/spack/repos/builtin/packages/coinhsl/package.py | 2 +- var/spack/repos/builtin/packages/comd/package.py | 2 +- var/spack/repos/builtin/packages/compiz/package.py | 2 +- var/spack/repos/builtin/packages/compositeproto/package.py | 2 +- var/spack/repos/builtin/packages/conduit/package.py | 2 +- var/spack/repos/builtin/packages/constype/package.py | 2 +- var/spack/repos/builtin/packages/converge/package.py | 2 +- var/spack/repos/builtin/packages/coreutils/package.py | 2 +- var/spack/repos/builtin/packages/corset/package.py | 2 +- var/spack/repos/builtin/packages/cosmomc/package.py | 2 +- var/spack/repos/builtin/packages/cosp2/package.py | 2 +- var/spack/repos/builtin/packages/cp2k/package.py | 2 +- var/spack/repos/builtin/packages/cppad/package.py | 2 +- var/spack/repos/builtin/packages/cppcheck/package.py | 2 +- var/spack/repos/builtin/packages/cpprestsdk/package.py | 2 +- var/spack/repos/builtin/packages/cppunit/package.py | 2 +- var/spack/repos/builtin/packages/cram/package.py | 2 +- var/spack/repos/builtin/packages/cryptopp/package.py | 2 +- var/spack/repos/builtin/packages/cscope/package.py | 2 +- var/spack/repos/builtin/packages/csdp/package.py | 2 +- var/spack/repos/builtin/packages/cub/package.py | 2 +- var/spack/repos/builtin/packages/cube/package.py | 2 +- var/spack/repos/builtin/packages/cuda-memtest/package.py | 2 +- var/spack/repos/builtin/packages/cuda/package.py | 2 +- var/spack/repos/builtin/packages/cudnn/package.py | 2 +- var/spack/repos/builtin/packages/cufflinks/package.py | 2 +- var/spack/repos/builtin/packages/cups/package.py | 2 +- var/spack/repos/builtin/packages/curl/package.py | 2 +- var/spack/repos/builtin/packages/cvs/package.py | 2 +- var/spack/repos/builtin/packages/czmq/package.py | 2 +- var/spack/repos/builtin/packages/dakota/package.py | 2 +- var/spack/repos/builtin/packages/daligner/package.py | 2 +- var/spack/repos/builtin/packages/damageproto/package.py | 2 +- var/spack/repos/builtin/packages/damselfly/package.py | 2 +- var/spack/repos/builtin/packages/darshan-runtime/package.py | 2 +- var/spack/repos/builtin/packages/darshan-util/package.py | 2 +- var/spack/repos/builtin/packages/dash/package.py | 2 +- var/spack/repos/builtin/packages/datamash/package.py | 2 +- var/spack/repos/builtin/packages/dataspaces/package.py | 2 +- var/spack/repos/builtin/packages/dbus/package.py | 2 +- var/spack/repos/builtin/packages/dealii/package.py | 2 +- var/spack/repos/builtin/packages/dejagnu/package.py | 2 +- var/spack/repos/builtin/packages/dia/package.py | 2 +- var/spack/repos/builtin/packages/dialign-tx/package.py | 2 +- var/spack/repos/builtin/packages/direnv/package.py | 2 +- var/spack/repos/builtin/packages/discovar/package.py | 2 +- var/spack/repos/builtin/packages/dmxproto/package.py | 2 +- var/spack/repos/builtin/packages/docbook-xml/package.py | 2 +- var/spack/repos/builtin/packages/docbook-xsl/package.py | 2 +- var/spack/repos/builtin/packages/dos2unix/package.py | 2 +- var/spack/repos/builtin/packages/double-conversion/package.py | 2 +- var/spack/repos/builtin/packages/doxygen/package.py | 2 +- var/spack/repos/builtin/packages/dri2proto/package.py | 2 +- var/spack/repos/builtin/packages/dri3proto/package.py | 2 +- var/spack/repos/builtin/packages/dtcmp/package.py | 2 +- var/spack/repos/builtin/packages/dyninst/package.py | 2 +- var/spack/repos/builtin/packages/ea-utils/package.py | 2 +- var/spack/repos/builtin/packages/ebms/package.py | 2 +- var/spack/repos/builtin/packages/eccodes/package.py | 2 +- var/spack/repos/builtin/packages/editres/package.py | 2 +- var/spack/repos/builtin/packages/eigen/package.py | 2 +- var/spack/repos/builtin/packages/elemental/package.py | 2 +- var/spack/repos/builtin/packages/elfutils/package.py | 2 +- var/spack/repos/builtin/packages/elk/package.py | 2 +- var/spack/repos/builtin/packages/elpa/package.py | 2 +- var/spack/repos/builtin/packages/emacs/package.py | 2 +- var/spack/repos/builtin/packages/emboss/package.py | 2 +- var/spack/repos/builtin/packages/encodings/package.py | 2 +- var/spack/repos/builtin/packages/environment-modules/package.py | 2 +- var/spack/repos/builtin/packages/es/package.py | 2 +- var/spack/repos/builtin/packages/esmf/package.py | 2 +- var/spack/repos/builtin/packages/espresso/package.py | 2 +- var/spack/repos/builtin/packages/espressopp/package.py | 2 +- var/spack/repos/builtin/packages/etsf-io/package.py | 2 +- var/spack/repos/builtin/packages/everytrace-example/package.py | 2 +- var/spack/repos/builtin/packages/everytrace/package.py | 2 +- var/spack/repos/builtin/packages/evieext/package.py | 2 +- var/spack/repos/builtin/packages/exabayes/package.py | 2 +- var/spack/repos/builtin/packages/exmcutils/package.py | 2 +- var/spack/repos/builtin/packages/exodusii/package.py | 2 +- var/spack/repos/builtin/packages/exonerate/package.py | 2 +- var/spack/repos/builtin/packages/expat/package.py | 2 +- var/spack/repos/builtin/packages/expect/package.py | 2 +- var/spack/repos/builtin/packages/extrae/package.py | 2 +- var/spack/repos/builtin/packages/exuberant-ctags/package.py | 2 +- var/spack/repos/builtin/packages/falcon/package.py | 2 +- var/spack/repos/builtin/packages/farmhash/package.py | 2 +- var/spack/repos/builtin/packages/fastjar/package.py | 2 +- var/spack/repos/builtin/packages/fastmath/package.py | 2 +- var/spack/repos/builtin/packages/fastphase/package.py | 2 +- var/spack/repos/builtin/packages/fastqc/package.py | 2 +- var/spack/repos/builtin/packages/fastx-toolkit/package.py | 2 +- var/spack/repos/builtin/packages/fenics/package.py | 2 +- var/spack/repos/builtin/packages/ferret/package.py | 2 +- var/spack/repos/builtin/packages/ffmpeg/package.py | 2 +- var/spack/repos/builtin/packages/fftw/package.py | 2 +- var/spack/repos/builtin/packages/fimpute/package.py | 2 +- var/spack/repos/builtin/packages/findutils/package.py | 2 +- var/spack/repos/builtin/packages/fio/package.py | 2 +- var/spack/repos/builtin/packages/fish/package.py | 2 +- var/spack/repos/builtin/packages/fixesproto/package.py | 2 +- var/spack/repos/builtin/packages/flac/package.py | 2 +- var/spack/repos/builtin/packages/flann/package.py | 2 +- var/spack/repos/builtin/packages/flash/package.py | 2 +- var/spack/repos/builtin/packages/flex/package.py | 2 +- var/spack/repos/builtin/packages/flint/package.py | 2 +- var/spack/repos/builtin/packages/fltk/package.py | 2 +- var/spack/repos/builtin/packages/flux/package.py | 2 +- var/spack/repos/builtin/packages/fmt/package.py | 2 +- var/spack/repos/builtin/packages/foam-extend/package.py | 2 +- var/spack/repos/builtin/packages/folly/package.py | 2 +- var/spack/repos/builtin/packages/font-adobe-100dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-adobe-75dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py | 2 +- var/spack/repos/builtin/packages/font-alias/package.py | 2 +- var/spack/repos/builtin/packages/font-arabic-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-bh-100dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-bh-75dpi/package.py | 2 +- .../repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py | 2 +- .../repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-bh-ttf/package.py | 2 +- var/spack/repos/builtin/packages/font-bh-type1/package.py | 2 +- var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py | 2 +- var/spack/repos/builtin/packages/font-bitstream-speedo/package.py | 2 +- var/spack/repos/builtin/packages/font-bitstream-type1/package.py | 2 +- var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py | 2 +- var/spack/repos/builtin/packages/font-cursor-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-daewoo-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-dec-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-ibm-type1/package.py | 2 +- var/spack/repos/builtin/packages/font-isas-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-jis-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-micro-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-misc-cyrillic/package.py | 2 +- var/spack/repos/builtin/packages/font-misc-ethiopic/package.py | 2 +- var/spack/repos/builtin/packages/font-misc-meltho/package.py | 2 +- var/spack/repos/builtin/packages/font-misc-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-mutt-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-schumacher-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-screen-cyrillic/package.py | 2 +- var/spack/repos/builtin/packages/font-sony-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-sun-misc/package.py | 2 +- var/spack/repos/builtin/packages/font-util/package.py | 2 +- var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py | 2 +- var/spack/repos/builtin/packages/font-xfree86-type1/package.py | 2 +- var/spack/repos/builtin/packages/fontcacheproto/package.py | 2 +- var/spack/repos/builtin/packages/fontconfig/package.py | 2 +- var/spack/repos/builtin/packages/fontsproto/package.py | 2 +- var/spack/repos/builtin/packages/fonttosfnt/package.py | 2 +- var/spack/repos/builtin/packages/freebayes/package.py | 2 +- var/spack/repos/builtin/packages/freetype/package.py | 2 +- var/spack/repos/builtin/packages/fseq/package.py | 2 +- var/spack/repos/builtin/packages/fslsfonts/package.py | 2 +- var/spack/repos/builtin/packages/fstobdf/package.py | 2 +- var/spack/repos/builtin/packages/funhpc/package.py | 2 +- var/spack/repos/builtin/packages/gapcloser/package.py | 2 +- var/spack/repos/builtin/packages/gapfiller/package.py | 2 +- var/spack/repos/builtin/packages/gasnet/package.py | 2 +- var/spack/repos/builtin/packages/gaussian/package.py | 2 +- var/spack/repos/builtin/packages/gawk/package.py | 2 +- var/spack/repos/builtin/packages/gblocks/package.py | 2 +- var/spack/repos/builtin/packages/gcc/package.py | 2 +- var/spack/repos/builtin/packages/gccmakedep/package.py | 2 +- var/spack/repos/builtin/packages/gconf/package.py | 2 +- var/spack/repos/builtin/packages/gdal/package.py | 2 +- var/spack/repos/builtin/packages/gdb/package.py | 2 +- var/spack/repos/builtin/packages/gdbm/package.py | 2 +- var/spack/repos/builtin/packages/gdk-pixbuf/package.py | 2 +- var/spack/repos/builtin/packages/geant4/package.py | 2 +- var/spack/repos/builtin/packages/gemmlowp/package.py | 2 +- var/spack/repos/builtin/packages/genemark-et/package.py | 2 +- var/spack/repos/builtin/packages/genometools/package.py | 2 +- var/spack/repos/builtin/packages/geos/package.py | 2 +- var/spack/repos/builtin/packages/gettext/package.py | 2 +- var/spack/repos/builtin/packages/gflags/package.py | 2 +- var/spack/repos/builtin/packages/ghostscript-fonts/package.py | 2 +- var/spack/repos/builtin/packages/ghostscript/package.py | 2 +- var/spack/repos/builtin/packages/giflib/package.py | 2 +- var/spack/repos/builtin/packages/git-lfs/package.py | 2 +- var/spack/repos/builtin/packages/git/package.py | 2 +- var/spack/repos/builtin/packages/gl2ps/package.py | 2 +- var/spack/repos/builtin/packages/glew/package.py | 2 +- var/spack/repos/builtin/packages/glib/package.py | 2 +- var/spack/repos/builtin/packages/glm/package.py | 2 +- var/spack/repos/builtin/packages/global/package.py | 2 +- var/spack/repos/builtin/packages/globus-toolkit/package.py | 2 +- var/spack/repos/builtin/packages/glog/package.py | 2 +- var/spack/repos/builtin/packages/glpk/package.py | 2 +- var/spack/repos/builtin/packages/glproto/package.py | 2 +- var/spack/repos/builtin/packages/gmake/package.py | 2 +- var/spack/repos/builtin/packages/gmap-gsnap/package.py | 2 +- var/spack/repos/builtin/packages/gmime/package.py | 2 +- var/spack/repos/builtin/packages/gmp/package.py | 2 +- var/spack/repos/builtin/packages/gmsh/package.py | 2 +- var/spack/repos/builtin/packages/gnat/package.py | 2 +- var/spack/repos/builtin/packages/gnu-prolog/package.py | 2 +- var/spack/repos/builtin/packages/gnupg/package.py | 2 +- var/spack/repos/builtin/packages/gnuplot/package.py | 2 +- var/spack/repos/builtin/packages/gnutls/package.py | 2 +- var/spack/repos/builtin/packages/go-bootstrap/package.py | 2 +- var/spack/repos/builtin/packages/go/package.py | 2 +- var/spack/repos/builtin/packages/gobject-introspection/package.py | 2 +- var/spack/repos/builtin/packages/googletest/package.py | 2 +- var/spack/repos/builtin/packages/gource/package.py | 2 +- var/spack/repos/builtin/packages/gperf/package.py | 2 +- var/spack/repos/builtin/packages/gperftools/package.py | 2 +- var/spack/repos/builtin/packages/grackle/package.py | 2 +- var/spack/repos/builtin/packages/gradle/package.py | 2 +- var/spack/repos/builtin/packages/grandr/package.py | 2 +- var/spack/repos/builtin/packages/graphlib/package.py | 2 +- var/spack/repos/builtin/packages/graphmap/package.py | 2 +- var/spack/repos/builtin/packages/graphviz/package.py | 2 +- var/spack/repos/builtin/packages/grib-api/package.py | 2 +- var/spack/repos/builtin/packages/groff/package.py | 2 +- var/spack/repos/builtin/packages/gromacs/package.py | 2 +- var/spack/repos/builtin/packages/gsl/package.py | 2 +- var/spack/repos/builtin/packages/gtkorvo-atl/package.py | 2 +- var/spack/repos/builtin/packages/gtkorvo-cercs-env/package.py | 2 +- var/spack/repos/builtin/packages/gtkorvo-dill/package.py | 2 +- var/spack/repos/builtin/packages/gtkorvo-enet/package.py | 2 +- var/spack/repos/builtin/packages/gtkplus/package.py | 2 +- var/spack/repos/builtin/packages/gts/package.py | 2 +- var/spack/repos/builtin/packages/guile/package.py | 2 +- var/spack/repos/builtin/packages/h5hut/package.py | 2 +- var/spack/repos/builtin/packages/h5utils/package.py | 2 +- var/spack/repos/builtin/packages/h5z-zfp/package.py | 2 +- var/spack/repos/builtin/packages/hadoop/package.py | 2 +- var/spack/repos/builtin/packages/hapcut2/package.py | 2 +- var/spack/repos/builtin/packages/haploview/package.py | 2 +- var/spack/repos/builtin/packages/harfbuzz/package.py | 2 +- var/spack/repos/builtin/packages/harminv/package.py | 2 +- var/spack/repos/builtin/packages/hdf/package.py | 2 +- var/spack/repos/builtin/packages/hdf5-blosc/package.py | 2 +- var/spack/repos/builtin/packages/hdf5/package.py | 2 +- var/spack/repos/builtin/packages/help2man/package.py | 2 +- var/spack/repos/builtin/packages/hepmc/package.py | 2 +- var/spack/repos/builtin/packages/heppdt/package.py | 2 +- var/spack/repos/builtin/packages/highfive/package.py | 2 +- var/spack/repos/builtin/packages/highwayhash/package.py | 2 +- var/spack/repos/builtin/packages/hmmer/package.py | 2 +- var/spack/repos/builtin/packages/hoomd-blue/package.py | 2 +- var/spack/repos/builtin/packages/hpccg/package.py | 2 +- var/spack/repos/builtin/packages/hpctoolkit-externals/package.py | 2 +- var/spack/repos/builtin/packages/hpctoolkit/package.py | 2 +- var/spack/repos/builtin/packages/hpl/package.py | 2 +- var/spack/repos/builtin/packages/hpx5/package.py | 2 +- var/spack/repos/builtin/packages/hsakmt/package.py | 2 +- var/spack/repos/builtin/packages/hstr/package.py | 2 +- var/spack/repos/builtin/packages/htop/package.py | 2 +- var/spack/repos/builtin/packages/htslib/package.py | 2 +- var/spack/repos/builtin/packages/httpie/package.py | 2 +- var/spack/repos/builtin/packages/hub/package.py | 2 +- var/spack/repos/builtin/packages/hunspell/package.py | 2 +- var/spack/repos/builtin/packages/hwloc/package.py | 2 +- var/spack/repos/builtin/packages/hybpiper/package.py | 2 +- var/spack/repos/builtin/packages/hydra/package.py | 2 +- var/spack/repos/builtin/packages/hypre/package.py | 2 +- var/spack/repos/builtin/packages/ibmisc/package.py | 2 +- var/spack/repos/builtin/packages/iceauth/package.py | 2 +- var/spack/repos/builtin/packages/icedtea/package.py | 2 +- var/spack/repos/builtin/packages/icet/package.py | 2 +- var/spack/repos/builtin/packages/ico/package.py | 2 +- var/spack/repos/builtin/packages/icu4c/package.py | 2 +- var/spack/repos/builtin/packages/id3lib/package.py | 2 +- var/spack/repos/builtin/packages/idba/package.py | 2 +- var/spack/repos/builtin/packages/igraph/package.py | 2 +- var/spack/repos/builtin/packages/ilmbase/package.py | 2 +- var/spack/repos/builtin/packages/image-magick/package.py | 2 +- var/spack/repos/builtin/packages/imake/package.py | 2 +- var/spack/repos/builtin/packages/impute2/package.py | 2 +- var/spack/repos/builtin/packages/infernal/package.py | 2 +- var/spack/repos/builtin/packages/inputproto/package.py | 2 +- var/spack/repos/builtin/packages/intel-daal/package.py | 2 +- var/spack/repos/builtin/packages/intel-gpu-tools/package.py | 2 +- var/spack/repos/builtin/packages/intel-ipp/package.py | 2 +- var/spack/repos/builtin/packages/intel-mkl/package.py | 2 +- var/spack/repos/builtin/packages/intel-mpi/package.py | 2 +- var/spack/repos/builtin/packages/intel-parallel-studio/package.py | 2 +- var/spack/repos/builtin/packages/intel-tbb/package.py | 2 +- var/spack/repos/builtin/packages/intel/package.py | 2 +- var/spack/repos/builtin/packages/intltool/package.py | 2 +- var/spack/repos/builtin/packages/ior/package.py | 2 +- var/spack/repos/builtin/packages/iozone/package.py | 2 +- var/spack/repos/builtin/packages/ipopt/package.py | 2 +- var/spack/repos/builtin/packages/isl/package.py | 2 +- var/spack/repos/builtin/packages/itstool/package.py | 2 +- var/spack/repos/builtin/packages/itsx/package.py | 2 +- var/spack/repos/builtin/packages/jags/package.py | 2 +- var/spack/repos/builtin/packages/jansson/package.py | 2 +- var/spack/repos/builtin/packages/jasper/package.py | 2 +- var/spack/repos/builtin/packages/jdk/package.py | 2 +- var/spack/repos/builtin/packages/jemalloc/package.py | 2 +- var/spack/repos/builtin/packages/jmol/package.py | 2 +- var/spack/repos/builtin/packages/jq/package.py | 2 +- var/spack/repos/builtin/packages/json-c/package.py | 2 +- var/spack/repos/builtin/packages/jsoncpp/package.py | 2 +- var/spack/repos/builtin/packages/judy/package.py | 2 +- var/spack/repos/builtin/packages/julia/package.py | 2 +- var/spack/repos/builtin/packages/kaldi/package.py | 2 +- var/spack/repos/builtin/packages/kallisto/package.py | 2 +- var/spack/repos/builtin/packages/kbproto/package.py | 2 +- var/spack/repos/builtin/packages/kdiff3/package.py | 2 +- var/spack/repos/builtin/packages/kealib/package.py | 2 +- var/spack/repos/builtin/packages/kentutils/package.py | 2 +- var/spack/repos/builtin/packages/kmergenie/package.py | 2 +- var/spack/repos/builtin/packages/kokkos/package.py | 2 +- var/spack/repos/builtin/packages/kripke/package.py | 2 +- var/spack/repos/builtin/packages/lammps/package.py | 2 +- var/spack/repos/builtin/packages/last/package.py | 2 +- var/spack/repos/builtin/packages/launchmon/package.py | 2 +- var/spack/repos/builtin/packages/lbann/package.py | 2 +- var/spack/repos/builtin/packages/lbxproxy/package.py | 2 +- var/spack/repos/builtin/packages/lcals/package.py | 2 +- var/spack/repos/builtin/packages/lcms/package.py | 2 +- var/spack/repos/builtin/packages/leveldb/package.py | 2 +- var/spack/repos/builtin/packages/lftp/package.py | 2 +- var/spack/repos/builtin/packages/libaec/package.py | 2 +- var/spack/repos/builtin/packages/libaio/package.py | 2 +- var/spack/repos/builtin/packages/libapplewm/package.py | 2 +- var/spack/repos/builtin/packages/libarchive/package.py | 2 +- var/spack/repos/builtin/packages/libassuan/package.py | 2 +- var/spack/repos/builtin/packages/libatomic-ops/package.py | 2 +- var/spack/repos/builtin/packages/libbeagle/package.py | 2 +- var/spack/repos/builtin/packages/libbsd/package.py | 2 +- var/spack/repos/builtin/packages/libbson/package.py | 2 +- var/spack/repos/builtin/packages/libcanberra/package.py | 2 +- var/spack/repos/builtin/packages/libcap/package.py | 2 +- var/spack/repos/builtin/packages/libcerf/package.py | 2 +- var/spack/repos/builtin/packages/libcircle/package.py | 2 +- var/spack/repos/builtin/packages/libconfig/package.py | 2 +- var/spack/repos/builtin/packages/libctl/package.py | 2 +- var/spack/repos/builtin/packages/libdivsufsort/package.py | 2 +- var/spack/repos/builtin/packages/libdmx/package.py | 2 +- var/spack/repos/builtin/packages/libdrm/package.py | 2 +- var/spack/repos/builtin/packages/libdwarf/package.py | 2 +- var/spack/repos/builtin/packages/libedit/package.py | 2 +- var/spack/repos/builtin/packages/libelf/package.py | 2 +- var/spack/repos/builtin/packages/libemos/package.py | 2 +- var/spack/repos/builtin/packages/libepoxy/package.py | 2 +- var/spack/repos/builtin/packages/libevent/package.py | 2 +- var/spack/repos/builtin/packages/libevpath/package.py | 2 +- var/spack/repos/builtin/packages/libfabric/package.py | 2 +- var/spack/repos/builtin/packages/libffi/package.py | 2 +- var/spack/repos/builtin/packages/libffs/package.py | 2 +- var/spack/repos/builtin/packages/libfontenc/package.py | 2 +- var/spack/repos/builtin/packages/libfs/package.py | 2 +- var/spack/repos/builtin/packages/libgcrypt/package.py | 2 +- var/spack/repos/builtin/packages/libgd/package.py | 2 +- var/spack/repos/builtin/packages/libgit2/package.py | 2 +- var/spack/repos/builtin/packages/libgpg-error/package.py | 2 +- var/spack/repos/builtin/packages/libgpuarray/package.py | 2 +- var/spack/repos/builtin/packages/libgtextutils/package.py | 2 +- var/spack/repos/builtin/packages/libhio/package.py | 2 +- var/spack/repos/builtin/packages/libice/package.py | 2 +- var/spack/repos/builtin/packages/libiconv/package.py | 2 +- var/spack/repos/builtin/packages/libint/package.py | 2 +- var/spack/repos/builtin/packages/libjpeg-turbo/package.py | 2 +- var/spack/repos/builtin/packages/libjpeg/package.py | 2 +- var/spack/repos/builtin/packages/libksba/package.py | 2 +- var/spack/repos/builtin/packages/liblbxutil/package.py | 2 +- var/spack/repos/builtin/packages/libmatheval/package.py | 2 +- var/spack/repos/builtin/packages/libmesh/package.py | 2 +- var/spack/repos/builtin/packages/libmng/package.py | 2 +- var/spack/repos/builtin/packages/libmongoc/package.py | 2 +- var/spack/repos/builtin/packages/libmonitor/package.py | 2 +- var/spack/repos/builtin/packages/libnbc/package.py | 2 +- var/spack/repos/builtin/packages/libogg/package.py | 2 +- var/spack/repos/builtin/packages/liboldx/package.py | 2 +- var/spack/repos/builtin/packages/libpciaccess/package.py | 2 +- var/spack/repos/builtin/packages/libpfm4/package.py | 2 +- var/spack/repos/builtin/packages/libpipeline/package.py | 2 +- var/spack/repos/builtin/packages/libpng/package.py | 2 +- var/spack/repos/builtin/packages/libpsl/package.py | 2 +- var/spack/repos/builtin/packages/libpthread-stubs/package.py | 2 +- var/spack/repos/builtin/packages/libquo/package.py | 2 +- var/spack/repos/builtin/packages/libsigsegv/package.py | 2 +- var/spack/repos/builtin/packages/libsm/package.py | 2 +- var/spack/repos/builtin/packages/libsodium/package.py | 2 +- var/spack/repos/builtin/packages/libspatialindex/package.py | 2 +- var/spack/repos/builtin/packages/libsplash/package.py | 2 +- var/spack/repos/builtin/packages/libssh2/package.py | 2 +- var/spack/repos/builtin/packages/libsvm/package.py | 2 +- var/spack/repos/builtin/packages/libszip/package.py | 2 +- var/spack/repos/builtin/packages/libtermkey/package.py | 2 +- var/spack/repos/builtin/packages/libtiff/package.py | 2 +- var/spack/repos/builtin/packages/libtool/package.py | 2 +- var/spack/repos/builtin/packages/libunistring/package.py | 2 +- var/spack/repos/builtin/packages/libunwind/package.py | 2 +- var/spack/repos/builtin/packages/libuuid/package.py | 2 +- var/spack/repos/builtin/packages/libuv/package.py | 2 +- var/spack/repos/builtin/packages/libvorbis/package.py | 2 +- var/spack/repos/builtin/packages/libvterm/package.py | 2 +- var/spack/repos/builtin/packages/libwebsockets/package.py | 2 +- var/spack/repos/builtin/packages/libwindowswm/package.py | 2 +- var/spack/repos/builtin/packages/libx11/package.py | 2 +- var/spack/repos/builtin/packages/libxau/package.py | 2 +- var/spack/repos/builtin/packages/libxaw/package.py | 2 +- var/spack/repos/builtin/packages/libxaw3d/package.py | 2 +- var/spack/repos/builtin/packages/libxc/package.py | 2 +- var/spack/repos/builtin/packages/libxcb/package.py | 2 +- var/spack/repos/builtin/packages/libxcomposite/package.py | 2 +- var/spack/repos/builtin/packages/libxcursor/package.py | 2 +- var/spack/repos/builtin/packages/libxdamage/package.py | 2 +- var/spack/repos/builtin/packages/libxdmcp/package.py | 2 +- var/spack/repos/builtin/packages/libxevie/package.py | 2 +- var/spack/repos/builtin/packages/libxext/package.py | 2 +- var/spack/repos/builtin/packages/libxfixes/package.py | 2 +- var/spack/repos/builtin/packages/libxfont/package.py | 2 +- var/spack/repos/builtin/packages/libxfont2/package.py | 2 +- var/spack/repos/builtin/packages/libxfontcache/package.py | 2 +- var/spack/repos/builtin/packages/libxft/package.py | 2 +- var/spack/repos/builtin/packages/libxi/package.py | 2 +- var/spack/repos/builtin/packages/libxinerama/package.py | 2 +- var/spack/repos/builtin/packages/libxkbfile/package.py | 2 +- var/spack/repos/builtin/packages/libxkbui/package.py | 2 +- var/spack/repos/builtin/packages/libxml2/package.py | 2 +- var/spack/repos/builtin/packages/libxmu/package.py | 2 +- var/spack/repos/builtin/packages/libxp/package.py | 2 +- var/spack/repos/builtin/packages/libxpm/package.py | 2 +- var/spack/repos/builtin/packages/libxpresent/package.py | 2 +- var/spack/repos/builtin/packages/libxprintapputil/package.py | 2 +- var/spack/repos/builtin/packages/libxprintutil/package.py | 2 +- var/spack/repos/builtin/packages/libxrandr/package.py | 2 +- var/spack/repos/builtin/packages/libxrender/package.py | 2 +- var/spack/repos/builtin/packages/libxres/package.py | 2 +- var/spack/repos/builtin/packages/libxscrnsaver/package.py | 2 +- var/spack/repos/builtin/packages/libxshmfence/package.py | 2 +- var/spack/repos/builtin/packages/libxslt/package.py | 2 +- var/spack/repos/builtin/packages/libxstream/package.py | 2 +- var/spack/repos/builtin/packages/libxt/package.py | 2 +- var/spack/repos/builtin/packages/libxtrap/package.py | 2 +- var/spack/repos/builtin/packages/libxtst/package.py | 2 +- var/spack/repos/builtin/packages/libxv/package.py | 2 +- var/spack/repos/builtin/packages/libxvmc/package.py | 2 +- var/spack/repos/builtin/packages/libxxf86dga/package.py | 2 +- var/spack/repos/builtin/packages/libxxf86misc/package.py | 2 +- var/spack/repos/builtin/packages/libxxf86vm/package.py | 2 +- var/spack/repos/builtin/packages/libyogrt/package.py | 2 +- var/spack/repos/builtin/packages/libzip/package.py | 2 +- var/spack/repos/builtin/packages/likwid/package.py | 2 +- var/spack/repos/builtin/packages/linux-headers/package.py | 2 +- var/spack/repos/builtin/packages/listres/package.py | 2 +- var/spack/repos/builtin/packages/llvm-lld/package.py | 2 +- var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py | 2 +- var/spack/repos/builtin/packages/llvm/package.py | 2 +- var/spack/repos/builtin/packages/lmdb/package.py | 2 +- var/spack/repos/builtin/packages/lmod/package.py | 2 +- var/spack/repos/builtin/packages/lndir/package.py | 2 +- var/spack/repos/builtin/packages/log4cxx/package.py | 2 +- var/spack/repos/builtin/packages/lrslib/package.py | 2 +- var/spack/repos/builtin/packages/lrzip/package.py | 2 +- var/spack/repos/builtin/packages/lua-jit/package.py | 2 +- var/spack/repos/builtin/packages/lua-luafilesystem/package.py | 2 +- var/spack/repos/builtin/packages/lua-luaposix/package.py | 2 +- var/spack/repos/builtin/packages/lua/package.py | 2 +- var/spack/repos/builtin/packages/luit/package.py | 2 +- var/spack/repos/builtin/packages/lulesh/package.py | 2 +- var/spack/repos/builtin/packages/lwgrp/package.py | 2 +- var/spack/repos/builtin/packages/lwm2/package.py | 2 +- var/spack/repos/builtin/packages/lz4/package.py | 2 +- var/spack/repos/builtin/packages/lzma/package.py | 2 +- var/spack/repos/builtin/packages/lzo/package.py | 2 +- var/spack/repos/builtin/packages/m4/package.py | 2 +- var/spack/repos/builtin/packages/mafft/package.py | 2 +- var/spack/repos/builtin/packages/magics/package.py | 2 +- var/spack/repos/builtin/packages/magma/package.py | 2 +- var/spack/repos/builtin/packages/makedepend/package.py | 2 +- var/spack/repos/builtin/packages/man-db/package.py | 2 +- var/spack/repos/builtin/packages/mariadb/package.py | 2 +- var/spack/repos/builtin/packages/matio/package.py | 2 +- var/spack/repos/builtin/packages/matlab/package.py | 2 +- var/spack/repos/builtin/packages/maven/package.py | 2 +- var/spack/repos/builtin/packages/maverick/package.py | 2 +- var/spack/repos/builtin/packages/mawk/package.py | 2 +- var/spack/repos/builtin/packages/mbedtls/package.py | 2 +- var/spack/repos/builtin/packages/mcl/package.py | 2 +- var/spack/repos/builtin/packages/mdtest/package.py | 2 +- var/spack/repos/builtin/packages/meep/package.py | 2 +- var/spack/repos/builtin/packages/memaxes/package.py | 2 +- var/spack/repos/builtin/packages/meme/package.py | 2 +- var/spack/repos/builtin/packages/mercurial/package.py | 2 +- var/spack/repos/builtin/packages/mesa-glu/package.py | 2 +- var/spack/repos/builtin/packages/mesa/package.py | 2 +- var/spack/repos/builtin/packages/meshkit/package.py | 2 +- var/spack/repos/builtin/packages/meson/package.py | 2 +- var/spack/repos/builtin/packages/mesquite/package.py | 2 +- var/spack/repos/builtin/packages/metis/package.py | 2 +- var/spack/repos/builtin/packages/mfem/package.py | 2 +- var/spack/repos/builtin/packages/microbiomeutil/package.py | 2 +- var/spack/repos/builtin/packages/miniaero/package.py | 2 +- var/spack/repos/builtin/packages/miniamr/package.py | 2 +- var/spack/repos/builtin/packages/miniconda2/package.py | 2 +- var/spack/repos/builtin/packages/miniconda3/package.py | 2 +- var/spack/repos/builtin/packages/minife/package.py | 2 +- var/spack/repos/builtin/packages/minighost/package.py | 2 +- var/spack/repos/builtin/packages/minigmg/package.py | 2 +- var/spack/repos/builtin/packages/minimd/package.py | 2 +- var/spack/repos/builtin/packages/minismac2d/package.py | 2 +- var/spack/repos/builtin/packages/minixyce/package.py | 2 +- var/spack/repos/builtin/packages/mitofates/package.py | 2 +- var/spack/repos/builtin/packages/mitos/package.py | 2 +- var/spack/repos/builtin/packages/mkfontdir/package.py | 2 +- var/spack/repos/builtin/packages/mkfontscale/package.py | 2 +- var/spack/repos/builtin/packages/moab/package.py | 2 +- var/spack/repos/builtin/packages/molcas/package.py | 2 +- var/spack/repos/builtin/packages/mono/package.py | 2 +- var/spack/repos/builtin/packages/mosh/package.py | 2 +- var/spack/repos/builtin/packages/mothur/package.py | 2 +- var/spack/repos/builtin/packages/mozjs/package.py | 2 +- var/spack/repos/builtin/packages/mpc/package.py | 2 +- var/spack/repos/builtin/packages/mpe2/package.py | 2 +- var/spack/repos/builtin/packages/mpest/package.py | 2 +- var/spack/repos/builtin/packages/mpfr/package.py | 2 +- var/spack/repos/builtin/packages/mpibash/package.py | 2 +- var/spack/repos/builtin/packages/mpiblast/package.py | 2 +- var/spack/repos/builtin/packages/mpich/package.py | 2 +- var/spack/repos/builtin/packages/mpileaks/package.py | 2 +- var/spack/repos/builtin/packages/mpip/package.py | 2 +- var/spack/repos/builtin/packages/mpir/package.py | 2 +- var/spack/repos/builtin/packages/mpix-launch-swift/package.py | 2 +- var/spack/repos/builtin/packages/mrbayes/package.py | 2 +- var/spack/repos/builtin/packages/mrnet/package.py | 2 +- var/spack/repos/builtin/packages/msgpack-c/package.py | 2 +- var/spack/repos/builtin/packages/multiverso/package.py | 2 +- var/spack/repos/builtin/packages/mummer/package.py | 2 +- var/spack/repos/builtin/packages/mumps/package.py | 2 +- var/spack/repos/builtin/packages/munge/package.py | 2 +- var/spack/repos/builtin/packages/muparser/package.py | 2 +- var/spack/repos/builtin/packages/muscle/package.py | 2 +- var/spack/repos/builtin/packages/muse/package.py | 2 +- var/spack/repos/builtin/packages/muster/package.py | 2 +- var/spack/repos/builtin/packages/mvapich2/package.py | 2 +- var/spack/repos/builtin/packages/mxml/package.py | 2 +- var/spack/repos/builtin/packages/nag/package.py | 2 +- var/spack/repos/builtin/packages/nalu/package.py | 2 +- var/spack/repos/builtin/packages/namd/package.py | 2 +- var/spack/repos/builtin/packages/nano/package.py | 2 +- var/spack/repos/builtin/packages/nanoflann/package.py | 2 +- var/spack/repos/builtin/packages/nasm/package.py | 2 +- var/spack/repos/builtin/packages/nauty/package.py | 2 +- var/spack/repos/builtin/packages/nccl/package.py | 2 +- var/spack/repos/builtin/packages/nccmp/package.py | 2 +- var/spack/repos/builtin/packages/ncdu/package.py | 2 +- var/spack/repos/builtin/packages/ncftp/package.py | 2 +- var/spack/repos/builtin/packages/ncl/package.py | 2 +- var/spack/repos/builtin/packages/nco/package.py | 2 +- var/spack/repos/builtin/packages/ncurses/package.py | 2 +- var/spack/repos/builtin/packages/ncview/package.py | 2 +- var/spack/repos/builtin/packages/ndiff/package.py | 2 +- var/spack/repos/builtin/packages/nekbone/package.py | 2 +- var/spack/repos/builtin/packages/netcdf-cxx/package.py | 2 +- var/spack/repos/builtin/packages/netcdf-cxx4/package.py | 2 +- var/spack/repos/builtin/packages/netcdf-fortran/package.py | 2 +- var/spack/repos/builtin/packages/netcdf/package.py | 2 +- var/spack/repos/builtin/packages/netgauge/package.py | 2 +- var/spack/repos/builtin/packages/netgen/package.py | 2 +- var/spack/repos/builtin/packages/netlib-lapack/package.py | 2 +- var/spack/repos/builtin/packages/netlib-scalapack/package.py | 2 +- var/spack/repos/builtin/packages/nettle/package.py | 2 +- var/spack/repos/builtin/packages/nextflow/package.py | 2 +- var/spack/repos/builtin/packages/nfft/package.py | 2 +- var/spack/repos/builtin/packages/nginx/package.py | 2 +- var/spack/repos/builtin/packages/ngmlr/package.py | 2 +- var/spack/repos/builtin/packages/ninja-fortran/package.py | 2 +- var/spack/repos/builtin/packages/ninja/package.py | 2 +- var/spack/repos/builtin/packages/nmap/package.py | 2 +- var/spack/repos/builtin/packages/node-js/package.py | 2 +- var/spack/repos/builtin/packages/notmuch/package.py | 2 +- var/spack/repos/builtin/packages/npb/package.py | 2 +- var/spack/repos/builtin/packages/npm/package.py | 2 +- var/spack/repos/builtin/packages/npth/package.py | 2 +- var/spack/repos/builtin/packages/nspr/package.py | 2 +- var/spack/repos/builtin/packages/numdiff/package.py | 2 +- var/spack/repos/builtin/packages/nut/package.py | 2 +- var/spack/repos/builtin/packages/nwchem/package.py | 2 +- var/spack/repos/builtin/packages/ocaml/package.py | 2 +- var/spack/repos/builtin/packages/oce/package.py | 2 +- var/spack/repos/builtin/packages/oclock/package.py | 2 +- var/spack/repos/builtin/packages/octave-splines/package.py | 2 +- var/spack/repos/builtin/packages/octave/package.py | 2 +- var/spack/repos/builtin/packages/octopus/package.py | 2 +- var/spack/repos/builtin/packages/ompss/package.py | 2 +- var/spack/repos/builtin/packages/ompt-openmp/package.py | 2 +- var/spack/repos/builtin/packages/oniguruma/package.py | 2 +- var/spack/repos/builtin/packages/ont-albacore/package.py | 2 +- var/spack/repos/builtin/packages/opari2/package.py | 2 +- var/spack/repos/builtin/packages/openbabel/package.py | 2 +- var/spack/repos/builtin/packages/openblas/package.py | 2 +- var/spack/repos/builtin/packages/opencoarrays/package.py | 2 +- var/spack/repos/builtin/packages/opencv/package.py | 2 +- var/spack/repos/builtin/packages/openexr/package.py | 2 +- var/spack/repos/builtin/packages/openfst/package.py | 2 +- var/spack/repos/builtin/packages/openjpeg/package.py | 2 +- var/spack/repos/builtin/packages/openmc/package.py | 2 +- var/spack/repos/builtin/packages/openmpi/package.py | 2 +- var/spack/repos/builtin/packages/openscenegraph/package.py | 2 +- var/spack/repos/builtin/packages/openssl/package.py | 2 +- var/spack/repos/builtin/packages/opium/package.py | 2 +- var/spack/repos/builtin/packages/opus/package.py | 2 +- var/spack/repos/builtin/packages/orfm/package.py | 2 +- var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py | 2 +- var/spack/repos/builtin/packages/otf/package.py | 2 +- var/spack/repos/builtin/packages/otf2/package.py | 2 +- var/spack/repos/builtin/packages/p4est/package.py | 2 +- var/spack/repos/builtin/packages/pacbio-daligner/package.py | 2 +- var/spack/repos/builtin/packages/pacbio-damasker/package.py | 2 +- var/spack/repos/builtin/packages/pacbio-dazz-db/package.py | 2 +- var/spack/repos/builtin/packages/pacbio-dextractor/package.py | 2 +- var/spack/repos/builtin/packages/pagit/package.py | 2 +- var/spack/repos/builtin/packages/pagmo/package.py | 2 +- var/spack/repos/builtin/packages/paml/package.py | 2 +- var/spack/repos/builtin/packages/panda/package.py | 2 +- var/spack/repos/builtin/packages/pango/package.py | 2 +- var/spack/repos/builtin/packages/papi/package.py | 2 +- var/spack/repos/builtin/packages/paradiseo/package.py | 2 +- var/spack/repos/builtin/packages/parallel-netcdf/package.py | 2 +- var/spack/repos/builtin/packages/parallel/package.py | 2 +- var/spack/repos/builtin/packages/paraver/package.py | 2 +- var/spack/repos/builtin/packages/paraview/package.py | 2 +- var/spack/repos/builtin/packages/parmetis/package.py | 2 +- var/spack/repos/builtin/packages/parmgridgen/package.py | 2 +- var/spack/repos/builtin/packages/parpack/package.py | 2 +- var/spack/repos/builtin/packages/parsimonator/package.py | 2 +- var/spack/repos/builtin/packages/partitionfinder/package.py | 2 +- var/spack/repos/builtin/packages/patch/package.py | 2 +- var/spack/repos/builtin/packages/patchelf/package.py | 2 +- var/spack/repos/builtin/packages/pathfinder/package.py | 2 +- var/spack/repos/builtin/packages/pbmpi/package.py | 2 +- var/spack/repos/builtin/packages/pcma/package.py | 2 +- var/spack/repos/builtin/packages/pcre/package.py | 2 +- var/spack/repos/builtin/packages/pcre2/package.py | 2 +- var/spack/repos/builtin/packages/pdsh/package.py | 2 +- var/spack/repos/builtin/packages/pdt/package.py | 2 +- var/spack/repos/builtin/packages/pennant/package.py | 2 +- var/spack/repos/builtin/packages/perl-dbfile/package.py | 2 +- var/spack/repos/builtin/packages/perl-dbi/package.py | 2 +- var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py | 2 +- var/spack/repos/builtin/packages/perl-intervaltree/package.py | 2 +- var/spack/repos/builtin/packages/perl-math-cdf/package.py | 2 +- var/spack/repos/builtin/packages/perl-module-build/package.py | 2 +- var/spack/repos/builtin/packages/perl-star-fusion/package.py | 2 +- var/spack/repos/builtin/packages/perl-term-readkey/package.py | 2 +- var/spack/repos/builtin/packages/perl-uri-escape/package.py | 2 +- var/spack/repos/builtin/packages/perl-xml-parser/package.py | 2 +- var/spack/repos/builtin/packages/perl/package.py | 2 +- var/spack/repos/builtin/packages/petsc/package.py | 2 +- var/spack/repos/builtin/packages/pexsi/package.py | 2 +- var/spack/repos/builtin/packages/pfft/package.py | 2 +- var/spack/repos/builtin/packages/pflotran/package.py | 2 +- var/spack/repos/builtin/packages/pgdspider/package.py | 2 +- var/spack/repos/builtin/packages/pgi/package.py | 2 +- var/spack/repos/builtin/packages/phasta/package.py | 2 +- var/spack/repos/builtin/packages/phylip/package.py | 2 +- var/spack/repos/builtin/packages/picard/package.py | 2 +- var/spack/repos/builtin/packages/pidx/package.py | 2 +- var/spack/repos/builtin/packages/pigz/package.py | 2 +- var/spack/repos/builtin/packages/piranha/package.py | 2 +- var/spack/repos/builtin/packages/pixman/package.py | 2 +- var/spack/repos/builtin/packages/pkg-config/package.py | 2 +- var/spack/repos/builtin/packages/planck-likelihood/package.py | 2 +- var/spack/repos/builtin/packages/plink/package.py | 2 +- var/spack/repos/builtin/packages/plumed/package.py | 2 +- var/spack/repos/builtin/packages/pmgr-collective/package.py | 2 +- var/spack/repos/builtin/packages/pnfft/package.py | 2 +- var/spack/repos/builtin/packages/pngwriter/package.py | 2 +- var/spack/repos/builtin/packages/poamsa/package.py | 2 +- var/spack/repos/builtin/packages/pocl/package.py | 2 +- var/spack/repos/builtin/packages/polymake/package.py | 2 +- var/spack/repos/builtin/packages/porta/package.py | 2 +- var/spack/repos/builtin/packages/postgresql/package.py | 2 +- var/spack/repos/builtin/packages/ppl/package.py | 2 +- var/spack/repos/builtin/packages/prank/package.py | 2 +- var/spack/repos/builtin/packages/presentproto/package.py | 2 +- var/spack/repos/builtin/packages/preseq/package.py | 2 +- var/spack/repos/builtin/packages/price/package.py | 2 +- var/spack/repos/builtin/packages/primer3/package.py | 2 +- var/spack/repos/builtin/packages/printproto/package.py | 2 +- var/spack/repos/builtin/packages/probconsrna/package.py | 2 +- var/spack/repos/builtin/packages/proj/package.py | 2 +- var/spack/repos/builtin/packages/protobuf/package.py | 2 +- var/spack/repos/builtin/packages/proxymngr/package.py | 2 +- var/spack/repos/builtin/packages/pruners-ninja/package.py | 2 +- var/spack/repos/builtin/packages/psi4/package.py | 2 +- var/spack/repos/builtin/packages/pumi/package.py | 2 +- var/spack/repos/builtin/packages/pvm/package.py | 2 +- var/spack/repos/builtin/packages/py-3to2/package.py | 2 +- var/spack/repos/builtin/packages/py-4suite-xml/package.py | 2 +- var/spack/repos/builtin/packages/py-abipy/package.py | 2 +- var/spack/repos/builtin/packages/py-alabaster/package.py | 2 +- var/spack/repos/builtin/packages/py-apache-libcloud/package.py | 2 +- var/spack/repos/builtin/packages/py-apipkg/package.py | 2 +- var/spack/repos/builtin/packages/py-appdirs/package.py | 2 +- var/spack/repos/builtin/packages/py-appnope/package.py | 2 +- var/spack/repos/builtin/packages/py-apscheduler/package.py | 2 +- var/spack/repos/builtin/packages/py-argcomplete/package.py | 2 +- var/spack/repos/builtin/packages/py-argparse/package.py | 2 +- var/spack/repos/builtin/packages/py-ase/package.py | 2 +- var/spack/repos/builtin/packages/py-asn1crypto/package.py | 2 +- var/spack/repos/builtin/packages/py-astroid/package.py | 2 +- var/spack/repos/builtin/packages/py-astropy/package.py | 2 +- var/spack/repos/builtin/packages/py-attrs/package.py | 2 +- var/spack/repos/builtin/packages/py-autopep8/package.py | 2 +- var/spack/repos/builtin/packages/py-babel/package.py | 2 +- var/spack/repos/builtin/packages/py-backports-abc/package.py | 2 +- .../builtin/packages/py-backports-shutil-get-terminal-size/package.py | 2 +- .../repos/builtin/packages/py-backports-ssl-match-hostname/package.py | 2 +- var/spack/repos/builtin/packages/py-basemap/package.py | 2 +- var/spack/repos/builtin/packages/py-beautifulsoup4/package.py | 2 +- var/spack/repos/builtin/packages/py-binwalk/package.py | 2 +- var/spack/repos/builtin/packages/py-biom-format/package.py | 2 +- var/spack/repos/builtin/packages/py-biopython/package.py | 2 +- var/spack/repos/builtin/packages/py-bleach/package.py | 2 +- var/spack/repos/builtin/packages/py-blessings/package.py | 2 +- var/spack/repos/builtin/packages/py-bokeh/package.py | 2 +- var/spack/repos/builtin/packages/py-boltons/package.py | 2 +- var/spack/repos/builtin/packages/py-bottleneck/package.py | 2 +- var/spack/repos/builtin/packages/py-brian/package.py | 2 +- var/spack/repos/builtin/packages/py-brian2/package.py | 2 +- var/spack/repos/builtin/packages/py-cclib/package.py | 2 +- var/spack/repos/builtin/packages/py-cdat-lite/package.py | 2 +- var/spack/repos/builtin/packages/py-cdo/package.py | 2 +- var/spack/repos/builtin/packages/py-certifi/package.py | 2 +- var/spack/repos/builtin/packages/py-cffi/package.py | 2 +- var/spack/repos/builtin/packages/py-chardet/package.py | 2 +- var/spack/repos/builtin/packages/py-click/package.py | 2 +- var/spack/repos/builtin/packages/py-colorama/package.py | 2 +- var/spack/repos/builtin/packages/py-colormath/package.py | 2 +- var/spack/repos/builtin/packages/py-configparser/package.py | 2 +- var/spack/repos/builtin/packages/py-counter/package.py | 2 +- var/spack/repos/builtin/packages/py-coverage/package.py | 2 +- var/spack/repos/builtin/packages/py-cpuinfo/package.py | 2 +- var/spack/repos/builtin/packages/py-cryptography/package.py | 2 +- var/spack/repos/builtin/packages/py-csvkit/package.py | 2 +- var/spack/repos/builtin/packages/py-current/package.py | 2 +- var/spack/repos/builtin/packages/py-cutadapt/package.py | 2 +- var/spack/repos/builtin/packages/py-cycler/package.py | 2 +- var/spack/repos/builtin/packages/py-cython/package.py | 2 +- var/spack/repos/builtin/packages/py-dask/package.py | 2 +- var/spack/repos/builtin/packages/py-dateutil/package.py | 2 +- var/spack/repos/builtin/packages/py-dbf/package.py | 2 +- var/spack/repos/builtin/packages/py-decorator/package.py | 2 +- var/spack/repos/builtin/packages/py-deeptools/package.py | 2 +- var/spack/repos/builtin/packages/py-dev/package.py | 2 +- var/spack/repos/builtin/packages/py-dill/package.py | 2 +- var/spack/repos/builtin/packages/py-docutils/package.py | 2 +- var/spack/repos/builtin/packages/py-doxypy/package.py | 2 +- var/spack/repos/builtin/packages/py-doxypypy/package.py | 2 +- var/spack/repos/builtin/packages/py-dryscrape/package.py | 2 +- var/spack/repos/builtin/packages/py-dxchange/package.py | 2 +- var/spack/repos/builtin/packages/py-dxfile/package.py | 2 +- var/spack/repos/builtin/packages/py-edffile/package.py | 2 +- var/spack/repos/builtin/packages/py-elasticsearch/package.py | 2 +- var/spack/repos/builtin/packages/py-elephant/package.py | 2 +- var/spack/repos/builtin/packages/py-emcee/package.py | 2 +- var/spack/repos/builtin/packages/py-entrypoints/package.py | 2 +- var/spack/repos/builtin/packages/py-enum34/package.py | 2 +- var/spack/repos/builtin/packages/py-epydoc/package.py | 2 +- var/spack/repos/builtin/packages/py-et-xmlfile/package.py | 2 +- var/spack/repos/builtin/packages/py-execnet/package.py | 2 +- var/spack/repos/builtin/packages/py-fastaindex/package.py | 2 +- var/spack/repos/builtin/packages/py-fasteners/package.py | 2 +- var/spack/repos/builtin/packages/py-faststructure/package.py | 2 +- var/spack/repos/builtin/packages/py-fiscalyear/package.py | 2 +- var/spack/repos/builtin/packages/py-flake8/package.py | 2 +- var/spack/repos/builtin/packages/py-flask/package.py | 2 +- var/spack/repos/builtin/packages/py-flexx/package.py | 2 +- var/spack/repos/builtin/packages/py-funcsigs/package.py | 2 +- var/spack/repos/builtin/packages/py-functools32/package.py | 2 +- var/spack/repos/builtin/packages/py-future/package.py | 2 +- var/spack/repos/builtin/packages/py-futures/package.py | 2 +- var/spack/repos/builtin/packages/py-genders/package.py | 2 +- var/spack/repos/builtin/packages/py-genshi/package.py | 2 +- var/spack/repos/builtin/packages/py-git-review/package.py | 2 +- var/spack/repos/builtin/packages/py-git2/package.py | 2 +- var/spack/repos/builtin/packages/py-gnuplot/package.py | 2 +- var/spack/repos/builtin/packages/py-griddataformats/package.py | 2 +- var/spack/repos/builtin/packages/py-guidata/package.py | 2 +- var/spack/repos/builtin/packages/py-guiqwt/package.py | 2 +- var/spack/repos/builtin/packages/py-h5py/package.py | 2 +- var/spack/repos/builtin/packages/py-html2text/package.py | 2 +- var/spack/repos/builtin/packages/py-html5lib/package.py | 2 +- var/spack/repos/builtin/packages/py-httpbin/package.py | 2 +- var/spack/repos/builtin/packages/py-hypothesis/package.py | 2 +- var/spack/repos/builtin/packages/py-idna/package.py | 2 +- var/spack/repos/builtin/packages/py-igraph/package.py | 2 +- var/spack/repos/builtin/packages/py-imagesize/package.py | 2 +- var/spack/repos/builtin/packages/py-iminuit/package.py | 2 +- var/spack/repos/builtin/packages/py-importlib/package.py | 2 +- var/spack/repos/builtin/packages/py-ipaddress/package.py | 2 +- var/spack/repos/builtin/packages/py-ipdb/package.py | 2 +- var/spack/repos/builtin/packages/py-ipykernel/package.py | 2 +- var/spack/repos/builtin/packages/py-ipython-genutils/package.py | 2 +- var/spack/repos/builtin/packages/py-ipython/package.py | 2 +- var/spack/repos/builtin/packages/py-ipywidgets/package.py | 2 +- var/spack/repos/builtin/packages/py-itsdangerous/package.py | 2 +- var/spack/repos/builtin/packages/py-jdcal/package.py | 2 +- var/spack/repos/builtin/packages/py-jedi/package.py | 2 +- var/spack/repos/builtin/packages/py-jinja2/package.py | 2 +- var/spack/repos/builtin/packages/py-joblib/package.py | 2 +- var/spack/repos/builtin/packages/py-jpype/package.py | 2 +- var/spack/repos/builtin/packages/py-jsonschema/package.py | 2 +- var/spack/repos/builtin/packages/py-junit-xml/package.py | 2 +- var/spack/repos/builtin/packages/py-jupyter-client/package.py | 2 +- var/spack/repos/builtin/packages/py-jupyter-console/package.py | 2 +- var/spack/repos/builtin/packages/py-jupyter-core/package.py | 2 +- var/spack/repos/builtin/packages/py-jupyter-notebook/package.py | 2 +- var/spack/repos/builtin/packages/py-keras/package.py | 2 +- var/spack/repos/builtin/packages/py-latexcodec/package.py | 2 +- var/spack/repos/builtin/packages/py-lazy/package.py | 2 +- var/spack/repos/builtin/packages/py-lazyarray/package.py | 2 +- var/spack/repos/builtin/packages/py-libconf/package.py | 2 +- var/spack/repos/builtin/packages/py-lit/package.py | 2 +- var/spack/repos/builtin/packages/py-lmfit/package.py | 2 +- var/spack/repos/builtin/packages/py-lockfile/package.py | 2 +- var/spack/repos/builtin/packages/py-logilab-common/package.py | 2 +- var/spack/repos/builtin/packages/py-lxml/package.py | 2 +- var/spack/repos/builtin/packages/py-lzstring/package.py | 2 +- var/spack/repos/builtin/packages/py-macholib/package.py | 2 +- var/spack/repos/builtin/packages/py-machotools/package.py | 2 +- var/spack/repos/builtin/packages/py-macs2/package.py | 2 +- var/spack/repos/builtin/packages/py-mako/package.py | 2 +- var/spack/repos/builtin/packages/py-markdown/package.py | 2 +- var/spack/repos/builtin/packages/py-markupsafe/package.py | 2 +- var/spack/repos/builtin/packages/py-matplotlib/package.py | 2 +- var/spack/repos/builtin/packages/py-mccabe/package.py | 2 +- var/spack/repos/builtin/packages/py-mdanalysis/package.py | 2 +- var/spack/repos/builtin/packages/py-meep/package.py | 2 +- var/spack/repos/builtin/packages/py-misopy/package.py | 2 +- var/spack/repos/builtin/packages/py-mistune/package.py | 2 +- var/spack/repos/builtin/packages/py-mock/package.py | 2 +- var/spack/repos/builtin/packages/py-mongo/package.py | 2 +- var/spack/repos/builtin/packages/py-monotonic/package.py | 2 +- var/spack/repos/builtin/packages/py-monty/package.py | 2 +- var/spack/repos/builtin/packages/py-mpi4py/package.py | 2 +- var/spack/repos/builtin/packages/py-mpmath/package.py | 2 +- var/spack/repos/builtin/packages/py-multiprocess/package.py | 2 +- var/spack/repos/builtin/packages/py-multiqc/package.py | 2 +- var/spack/repos/builtin/packages/py-mx/package.py | 2 +- var/spack/repos/builtin/packages/py-myhdl/package.py | 2 +- var/spack/repos/builtin/packages/py-mysqldb1/package.py | 2 +- var/spack/repos/builtin/packages/py-nbconvert/package.py | 2 +- var/spack/repos/builtin/packages/py-nbformat/package.py | 2 +- var/spack/repos/builtin/packages/py-neo/package.py | 2 +- var/spack/repos/builtin/packages/py-nestle/package.py | 2 +- var/spack/repos/builtin/packages/py-netcdf4/package.py | 2 +- var/spack/repos/builtin/packages/py-netifaces/package.py | 2 +- var/spack/repos/builtin/packages/py-networkx/package.py | 2 +- var/spack/repos/builtin/packages/py-nose/package.py | 2 +- var/spack/repos/builtin/packages/py-nosexcover/package.py | 2 +- var/spack/repos/builtin/packages/py-numexpr/package.py | 2 +- var/spack/repos/builtin/packages/py-numpy/package.py | 2 +- var/spack/repos/builtin/packages/py-numpydoc/package.py | 2 +- var/spack/repos/builtin/packages/py-olefile/package.py | 2 +- var/spack/repos/builtin/packages/py-ont-fast5-api/package.py | 2 +- var/spack/repos/builtin/packages/py-openpyxl/package.py | 2 +- var/spack/repos/builtin/packages/py-ordereddict/package.py | 2 +- var/spack/repos/builtin/packages/py-oset/package.py | 2 +- var/spack/repos/builtin/packages/py-packaging/package.py | 2 +- var/spack/repos/builtin/packages/py-palettable/package.py | 2 +- var/spack/repos/builtin/packages/py-pandas/package.py | 2 +- var/spack/repos/builtin/packages/py-paramiko/package.py | 2 +- var/spack/repos/builtin/packages/py-pathlib2/package.py | 2 +- var/spack/repos/builtin/packages/py-pathos/package.py | 2 +- var/spack/repos/builtin/packages/py-pathspec/package.py | 2 +- var/spack/repos/builtin/packages/py-patsy/package.py | 2 +- var/spack/repos/builtin/packages/py-pbr/package.py | 2 +- var/spack/repos/builtin/packages/py-periodictable/package.py | 2 +- var/spack/repos/builtin/packages/py-petsc4py/package.py | 2 +- var/spack/repos/builtin/packages/py-pexpect/package.py | 2 +- var/spack/repos/builtin/packages/py-phonopy/package.py | 2 +- var/spack/repos/builtin/packages/py-pickleshare/package.py | 2 +- var/spack/repos/builtin/packages/py-pil/package.py | 2 +- var/spack/repos/builtin/packages/py-pillow/package.py | 2 +- var/spack/repos/builtin/packages/py-pip/package.py | 2 +- var/spack/repos/builtin/packages/py-pipits/package.py | 2 +- var/spack/repos/builtin/packages/py-pkgconfig/package.py | 2 +- var/spack/repos/builtin/packages/py-ply/package.py | 2 +- var/spack/repos/builtin/packages/py-pmw/package.py | 2 +- var/spack/repos/builtin/packages/py-pox/package.py | 2 +- var/spack/repos/builtin/packages/py-ppft/package.py | 2 +- var/spack/repos/builtin/packages/py-prettytable/package.py | 2 +- var/spack/repos/builtin/packages/py-proj/package.py | 2 +- var/spack/repos/builtin/packages/py-prompt-toolkit/package.py | 2 +- var/spack/repos/builtin/packages/py-protobuf/package.py | 2 +- var/spack/repos/builtin/packages/py-psutil/package.py | 2 +- var/spack/repos/builtin/packages/py-ptyprocess/package.py | 2 +- var/spack/repos/builtin/packages/py-pudb/package.py | 2 +- var/spack/repos/builtin/packages/py-py/package.py | 2 +- var/spack/repos/builtin/packages/py-py2bit/package.py | 2 +- var/spack/repos/builtin/packages/py-py2cairo/package.py | 2 +- var/spack/repos/builtin/packages/py-py2neo/package.py | 2 +- var/spack/repos/builtin/packages/py-py4j/package.py | 2 +- var/spack/repos/builtin/packages/py-pyasn1/package.py | 2 +- var/spack/repos/builtin/packages/py-pybigwig/package.py | 2 +- var/spack/repos/builtin/packages/py-pybind11/package.py | 2 +- var/spack/repos/builtin/packages/py-pybtex-docutils/package.py | 2 +- var/spack/repos/builtin/packages/py-pybtex/package.py | 2 +- var/spack/repos/builtin/packages/py-pychecker/package.py | 2 +- var/spack/repos/builtin/packages/py-pycodestyle/package.py | 2 +- var/spack/repos/builtin/packages/py-pycparser/package.py | 2 +- var/spack/repos/builtin/packages/py-pycrypto/package.py | 2 +- var/spack/repos/builtin/packages/py-pycurl/package.py | 2 +- var/spack/repos/builtin/packages/py-pydatalog/package.py | 2 +- var/spack/repos/builtin/packages/py-pydispatcher/package.py | 2 +- var/spack/repos/builtin/packages/py-pydot/package.py | 2 +- var/spack/repos/builtin/packages/py-pyelftools/package.py | 2 +- var/spack/repos/builtin/packages/py-pyfftw/package.py | 2 +- var/spack/repos/builtin/packages/py-pyflakes/package.py | 2 +- var/spack/repos/builtin/packages/py-pygments/package.py | 2 +- var/spack/repos/builtin/packages/py-pygobject/package.py | 2 +- var/spack/repos/builtin/packages/py-pygtk/package.py | 2 +- var/spack/repos/builtin/packages/py-pylint/package.py | 2 +- var/spack/repos/builtin/packages/py-pymatgen/package.py | 2 +- var/spack/repos/builtin/packages/py-pyminifier/package.py | 2 +- var/spack/repos/builtin/packages/py-pympler/package.py | 2 +- var/spack/repos/builtin/packages/py-pynn/package.py | 2 +- var/spack/repos/builtin/packages/py-pypar/package.py | 2 +- var/spack/repos/builtin/packages/py-pyparsing/package.py | 2 +- var/spack/repos/builtin/packages/py-pypeflow/package.py | 2 +- var/spack/repos/builtin/packages/py-pyprof2html/package.py | 2 +- var/spack/repos/builtin/packages/py-pyqt/package.py | 2 +- var/spack/repos/builtin/packages/py-pyrad/package.py | 2 +- var/spack/repos/builtin/packages/py-pysam/package.py | 2 +- var/spack/repos/builtin/packages/py-pyscaf/package.py | 2 +- var/spack/repos/builtin/packages/py-pyserial/package.py | 2 +- var/spack/repos/builtin/packages/py-pyside/package.py | 2 +- var/spack/repos/builtin/packages/py-pysocks/package.py | 2 +- var/spack/repos/builtin/packages/py-pytables/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest-cov/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest-flake8/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest-httpbin/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest-mock/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest-runner/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest-xdist/package.py | 2 +- var/spack/repos/builtin/packages/py-pytest/package.py | 2 +- var/spack/repos/builtin/packages/py-python-daemon/package.py | 2 +- var/spack/repos/builtin/packages/py-python-gitlab/package.py | 2 +- var/spack/repos/builtin/packages/py-pythonqwt/package.py | 2 +- var/spack/repos/builtin/packages/py-pytz/package.py | 2 +- var/spack/repos/builtin/packages/py-pywavelets/package.py | 2 +- var/spack/repos/builtin/packages/py-pyyaml/package.py | 2 +- var/spack/repos/builtin/packages/py-qtawesome/package.py | 2 +- var/spack/repos/builtin/packages/py-qtconsole/package.py | 2 +- var/spack/repos/builtin/packages/py-qtpy/package.py | 2 +- var/spack/repos/builtin/packages/py-quantities/package.py | 2 +- var/spack/repos/builtin/packages/py-radical-utils/package.py | 2 +- var/spack/repos/builtin/packages/py-ranger/package.py | 2 +- var/spack/repos/builtin/packages/py-readme-renderer/package.py | 2 +- var/spack/repos/builtin/packages/py-regex/package.py | 2 +- var/spack/repos/builtin/packages/py-requests/package.py | 2 +- var/spack/repos/builtin/packages/py-restview/package.py | 2 +- var/spack/repos/builtin/packages/py-rope/package.py | 2 +- var/spack/repos/builtin/packages/py-rpy2/package.py | 2 +- var/spack/repos/builtin/packages/py-rsa/package.py | 2 +- var/spack/repos/builtin/packages/py-rtree/package.py | 2 +- var/spack/repos/builtin/packages/py-saga-python/package.py | 2 +- var/spack/repos/builtin/packages/py-scientificpython/package.py | 2 +- var/spack/repos/builtin/packages/py-scikit-image/package.py | 2 +- var/spack/repos/builtin/packages/py-scikit-learn/package.py | 2 +- var/spack/repos/builtin/packages/py-scipy/package.py | 2 +- var/spack/repos/builtin/packages/py-seaborn/package.py | 2 +- var/spack/repos/builtin/packages/py-setuptools/package.py | 2 +- var/spack/repos/builtin/packages/py-sh/package.py | 2 +- var/spack/repos/builtin/packages/py-shiboken/package.py | 2 +- var/spack/repos/builtin/packages/py-simplegeneric/package.py | 2 +- var/spack/repos/builtin/packages/py-simplejson/package.py | 2 +- var/spack/repos/builtin/packages/py-singledispatch/package.py | 2 +- var/spack/repos/builtin/packages/py-sip/package.py | 2 +- var/spack/repos/builtin/packages/py-six/package.py | 2 +- var/spack/repos/builtin/packages/py-slepc4py/package.py | 2 +- var/spack/repos/builtin/packages/py-sncosmo/package.py | 2 +- var/spack/repos/builtin/packages/py-snowballstemmer/package.py | 2 +- var/spack/repos/builtin/packages/py-spectra/package.py | 2 +- var/spack/repos/builtin/packages/py-spefile/package.py | 2 +- var/spack/repos/builtin/packages/py-spglib/package.py | 2 +- var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py | 2 +- var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py | 2 +- var/spack/repos/builtin/packages/py-sphinx/package.py | 2 +- var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py | 2 +- .../repos/builtin/packages/py-sphinxcontrib-programoutput/package.py | 2 +- var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py | 2 +- var/spack/repos/builtin/packages/py-spyder/package.py | 2 +- var/spack/repos/builtin/packages/py-spykeutils/package.py | 2 +- var/spack/repos/builtin/packages/py-sqlalchemy/package.py | 2 +- var/spack/repos/builtin/packages/py-statsmodels/package.py | 2 +- var/spack/repos/builtin/packages/py-storm/package.py | 2 +- var/spack/repos/builtin/packages/py-subprocess32/package.py | 2 +- var/spack/repos/builtin/packages/py-symengine/package.py | 2 +- var/spack/repos/builtin/packages/py-symfit/package.py | 2 +- var/spack/repos/builtin/packages/py-sympy/package.py | 2 +- var/spack/repos/builtin/packages/py-tabulate/package.py | 2 +- var/spack/repos/builtin/packages/py-tappy/package.py | 2 +- var/spack/repos/builtin/packages/py-terminado/package.py | 2 +- var/spack/repos/builtin/packages/py-theano/package.py | 2 +- var/spack/repos/builtin/packages/py-tifffile/package.py | 2 +- var/spack/repos/builtin/packages/py-tomopy/package.py | 2 +- var/spack/repos/builtin/packages/py-tornado/package.py | 2 +- var/spack/repos/builtin/packages/py-tqdm/package.py | 2 +- var/spack/repos/builtin/packages/py-traitlets/package.py | 2 +- var/spack/repos/builtin/packages/py-tuiview/package.py | 2 +- var/spack/repos/builtin/packages/py-twisted/package.py | 2 +- var/spack/repos/builtin/packages/py-typing/package.py | 2 +- var/spack/repos/builtin/packages/py-tzlocal/package.py | 2 +- var/spack/repos/builtin/packages/py-unittest2/package.py | 2 +- var/spack/repos/builtin/packages/py-unittest2py3k/package.py | 2 +- var/spack/repos/builtin/packages/py-urllib3/package.py | 2 +- var/spack/repos/builtin/packages/py-urwid/package.py | 2 +- var/spack/repos/builtin/packages/py-vcversioner/package.py | 2 +- var/spack/repos/builtin/packages/py-virtualenv/package.py | 2 +- var/spack/repos/builtin/packages/py-wcsaxes/package.py | 2 +- var/spack/repos/builtin/packages/py-wcwidth/package.py | 2 +- var/spack/repos/builtin/packages/py-webkit-server/package.py | 2 +- var/spack/repos/builtin/packages/py-werkzeug/package.py | 2 +- var/spack/repos/builtin/packages/py-wheel/package.py | 2 +- var/spack/repos/builtin/packages/py-widgetsnbextension/package.py | 2 +- var/spack/repos/builtin/packages/py-wrapt/package.py | 2 +- var/spack/repos/builtin/packages/py-xarray/package.py | 2 +- var/spack/repos/builtin/packages/py-xlrd/package.py | 2 +- var/spack/repos/builtin/packages/py-xmlrunner/package.py | 2 +- var/spack/repos/builtin/packages/py-xopen/package.py | 2 +- var/spack/repos/builtin/packages/py-xpyb/package.py | 2 +- var/spack/repos/builtin/packages/py-xvfbwrapper/package.py | 2 +- var/spack/repos/builtin/packages/py-yapf/package.py | 2 +- var/spack/repos/builtin/packages/py-yt/package.py | 2 +- var/spack/repos/builtin/packages/py-zmq/package.py | 2 +- var/spack/repos/builtin/packages/python/package.py | 2 +- var/spack/repos/builtin/packages/qbank/package.py | 2 +- var/spack/repos/builtin/packages/qbox/package.py | 2 +- var/spack/repos/builtin/packages/qhull/package.py | 2 +- var/spack/repos/builtin/packages/qrupdate/package.py | 2 +- var/spack/repos/builtin/packages/qt-creator/package.py | 2 +- var/spack/repos/builtin/packages/qt/package.py | 2 +- var/spack/repos/builtin/packages/qthreads/package.py | 2 +- var/spack/repos/builtin/packages/qwt/package.py | 2 +- var/spack/repos/builtin/packages/r-abind/package.py | 2 +- var/spack/repos/builtin/packages/r-ada/package.py | 2 +- var/spack/repos/builtin/packages/r-adabag/package.py | 2 +- var/spack/repos/builtin/packages/r-ade4/package.py | 2 +- var/spack/repos/builtin/packages/r-adegenet/package.py | 2 +- var/spack/repos/builtin/packages/r-ape/package.py | 2 +- var/spack/repos/builtin/packages/r-assertthat/package.py | 2 +- var/spack/repos/builtin/packages/r-base64enc/package.py | 2 +- var/spack/repos/builtin/packages/r-bh/package.py | 2 +- var/spack/repos/builtin/packages/r-biocgenerics/package.py | 2 +- var/spack/repos/builtin/packages/r-biocinstaller/package.py | 2 +- var/spack/repos/builtin/packages/r-bitops/package.py | 2 +- var/spack/repos/builtin/packages/r-boot/package.py | 2 +- var/spack/repos/builtin/packages/r-brew/package.py | 2 +- var/spack/repos/builtin/packages/r-c50/package.py | 2 +- var/spack/repos/builtin/packages/r-car/package.py | 2 +- var/spack/repos/builtin/packages/r-caret/package.py | 2 +- var/spack/repos/builtin/packages/r-catools/package.py | 2 +- var/spack/repos/builtin/packages/r-checkpoint/package.py | 2 +- var/spack/repos/builtin/packages/r-chron/package.py | 2 +- var/spack/repos/builtin/packages/r-class/package.py | 2 +- var/spack/repos/builtin/packages/r-cluster/package.py | 2 +- var/spack/repos/builtin/packages/r-coda/package.py | 2 +- var/spack/repos/builtin/packages/r-codetools/package.py | 2 +- var/spack/repos/builtin/packages/r-coin/package.py | 2 +- var/spack/repos/builtin/packages/r-colorspace/package.py | 2 +- var/spack/repos/builtin/packages/r-corpcor/package.py | 2 +- var/spack/repos/builtin/packages/r-corrplot/package.py | 2 +- var/spack/repos/builtin/packages/r-crayon/package.py | 2 +- var/spack/repos/builtin/packages/r-cubature/package.py | 2 +- var/spack/repos/builtin/packages/r-cubist/package.py | 2 +- var/spack/repos/builtin/packages/r-curl/package.py | 2 +- var/spack/repos/builtin/packages/r-data-table/package.py | 2 +- var/spack/repos/builtin/packages/r-dbi/package.py | 2 +- var/spack/repos/builtin/packages/r-deldir/package.py | 2 +- var/spack/repos/builtin/packages/r-dendextend/package.py | 2 +- var/spack/repos/builtin/packages/r-deoptim/package.py | 2 +- var/spack/repos/builtin/packages/r-deoptimr/package.py | 2 +- var/spack/repos/builtin/packages/r-devtools/package.py | 2 +- var/spack/repos/builtin/packages/r-diagrammer/package.py | 2 +- var/spack/repos/builtin/packages/r-dichromat/package.py | 2 +- var/spack/repos/builtin/packages/r-digest/package.py | 2 +- var/spack/repos/builtin/packages/r-diptest/package.py | 2 +- var/spack/repos/builtin/packages/r-domc/package.py | 2 +- var/spack/repos/builtin/packages/r-doparallel/package.py | 2 +- var/spack/repos/builtin/packages/r-dplyr/package.py | 2 +- var/spack/repos/builtin/packages/r-dt/package.py | 2 +- var/spack/repos/builtin/packages/r-dygraphs/package.py | 2 +- var/spack/repos/builtin/packages/r-e1071/package.py | 2 +- var/spack/repos/builtin/packages/r-ellipse/package.py | 2 +- var/spack/repos/builtin/packages/r-ergm/package.py | 2 +- var/spack/repos/builtin/packages/r-evaluate/package.py | 2 +- var/spack/repos/builtin/packages/r-expm/package.py | 2 +- var/spack/repos/builtin/packages/r-factoextra/package.py | 2 +- var/spack/repos/builtin/packages/r-factominer/package.py | 2 +- var/spack/repos/builtin/packages/r-filehash/package.py | 2 +- var/spack/repos/builtin/packages/r-flashclust/package.py | 2 +- var/spack/repos/builtin/packages/r-flexmix/package.py | 2 +- var/spack/repos/builtin/packages/r-foreach/package.py | 2 +- var/spack/repos/builtin/packages/r-foreign/package.py | 2 +- var/spack/repos/builtin/packages/r-formatr/package.py | 2 +- var/spack/repos/builtin/packages/r-formula/package.py | 2 +- var/spack/repos/builtin/packages/r-fpc/package.py | 2 +- var/spack/repos/builtin/packages/r-gdata/package.py | 2 +- var/spack/repos/builtin/packages/r-geosphere/package.py | 2 +- var/spack/repos/builtin/packages/r-ggmap/package.py | 2 +- var/spack/repos/builtin/packages/r-ggplot2/package.py | 2 +- var/spack/repos/builtin/packages/r-ggpubr/package.py | 2 +- var/spack/repos/builtin/packages/r-ggrepel/package.py | 2 +- var/spack/repos/builtin/packages/r-ggsci/package.py | 2 +- var/spack/repos/builtin/packages/r-ggvis/package.py | 2 +- var/spack/repos/builtin/packages/r-gistr/package.py | 2 +- var/spack/repos/builtin/packages/r-git2r/package.py | 2 +- var/spack/repos/builtin/packages/r-glmnet/package.py | 2 +- var/spack/repos/builtin/packages/r-gmodels/package.py | 2 +- var/spack/repos/builtin/packages/r-gmp/package.py | 2 +- var/spack/repos/builtin/packages/r-googlevis/package.py | 2 +- var/spack/repos/builtin/packages/r-gridbase/package.py | 2 +- var/spack/repos/builtin/packages/r-gridextra/package.py | 2 +- var/spack/repos/builtin/packages/r-gtable/package.py | 2 +- var/spack/repos/builtin/packages/r-gtools/package.py | 2 +- var/spack/repos/builtin/packages/r-hexbin/package.py | 2 +- var/spack/repos/builtin/packages/r-highr/package.py | 2 +- var/spack/repos/builtin/packages/r-htmltools/package.py | 2 +- var/spack/repos/builtin/packages/r-htmlwidgets/package.py | 2 +- var/spack/repos/builtin/packages/r-httpuv/package.py | 2 +- var/spack/repos/builtin/packages/r-httr/package.py | 2 +- var/spack/repos/builtin/packages/r-igraph/package.py | 2 +- var/spack/repos/builtin/packages/r-influencer/package.py | 2 +- var/spack/repos/builtin/packages/r-inline/package.py | 2 +- var/spack/repos/builtin/packages/r-ipred/package.py | 2 +- var/spack/repos/builtin/packages/r-irdisplay/package.py | 2 +- var/spack/repos/builtin/packages/r-irkernel/package.py | 2 +- var/spack/repos/builtin/packages/r-irlba/package.py | 2 +- var/spack/repos/builtin/packages/r-iterators/package.py | 2 +- var/spack/repos/builtin/packages/r-jpeg/package.py | 2 +- var/spack/repos/builtin/packages/r-jsonlite/package.py | 2 +- var/spack/repos/builtin/packages/r-kernlab/package.py | 2 +- var/spack/repos/builtin/packages/r-kernsmooth/package.py | 2 +- var/spack/repos/builtin/packages/r-kknn/package.py | 2 +- var/spack/repos/builtin/packages/r-knitr/package.py | 2 +- var/spack/repos/builtin/packages/r-labeling/package.py | 2 +- var/spack/repos/builtin/packages/r-laplacesdemon/package.py | 2 +- var/spack/repos/builtin/packages/r-lattice/package.py | 2 +- var/spack/repos/builtin/packages/r-lava/package.py | 2 +- var/spack/repos/builtin/packages/r-lazyeval/package.py | 2 +- var/spack/repos/builtin/packages/r-leaflet/package.py | 2 +- var/spack/repos/builtin/packages/r-leaps/package.py | 2 +- var/spack/repos/builtin/packages/r-learnbayes/package.py | 2 +- var/spack/repos/builtin/packages/r-lme4/package.py | 2 +- var/spack/repos/builtin/packages/r-lmtest/package.py | 2 +- var/spack/repos/builtin/packages/r-lpsolve/package.py | 2 +- var/spack/repos/builtin/packages/r-lubridate/package.py | 2 +- var/spack/repos/builtin/packages/r-magic/package.py | 2 +- var/spack/repos/builtin/packages/r-magrittr/package.py | 2 +- var/spack/repos/builtin/packages/r-mapproj/package.py | 2 +- var/spack/repos/builtin/packages/r-maps/package.py | 2 +- var/spack/repos/builtin/packages/r-maptools/package.py | 2 +- var/spack/repos/builtin/packages/r-markdown/package.py | 2 +- var/spack/repos/builtin/packages/r-mass/package.py | 2 +- var/spack/repos/builtin/packages/r-matrix/package.py | 2 +- var/spack/repos/builtin/packages/r-matrixmodels/package.py | 2 +- var/spack/repos/builtin/packages/r-mclust/package.py | 2 +- var/spack/repos/builtin/packages/r-mda/package.py | 2 +- var/spack/repos/builtin/packages/r-memoise/package.py | 2 +- var/spack/repos/builtin/packages/r-mgcv/package.py | 2 +- var/spack/repos/builtin/packages/r-mime/package.py | 2 +- var/spack/repos/builtin/packages/r-minqa/package.py | 2 +- var/spack/repos/builtin/packages/r-mlbench/package.py | 2 +- var/spack/repos/builtin/packages/r-modelmetrics/package.py | 2 +- var/spack/repos/builtin/packages/r-modeltools/package.py | 2 +- var/spack/repos/builtin/packages/r-multcomp/package.py | 2 +- var/spack/repos/builtin/packages/r-munsell/package.py | 2 +- var/spack/repos/builtin/packages/r-mvtnorm/package.py | 2 +- var/spack/repos/builtin/packages/r-ncdf4/package.py | 2 +- var/spack/repos/builtin/packages/r-network/package.py | 2 +- var/spack/repos/builtin/packages/r-networkd3/package.py | 2 +- var/spack/repos/builtin/packages/r-nlme/package.py | 2 +- var/spack/repos/builtin/packages/r-nloptr/package.py | 2 +- var/spack/repos/builtin/packages/r-nmf/package.py | 2 +- var/spack/repos/builtin/packages/r-nnet/package.py | 2 +- var/spack/repos/builtin/packages/r-np/package.py | 2 +- var/spack/repos/builtin/packages/r-numderiv/package.py | 2 +- var/spack/repos/builtin/packages/r-openssl/package.py | 2 +- var/spack/repos/builtin/packages/r-packrat/package.py | 2 +- var/spack/repos/builtin/packages/r-pacman/package.py | 2 +- var/spack/repos/builtin/packages/r-party/package.py | 2 +- var/spack/repos/builtin/packages/r-partykit/package.py | 2 +- var/spack/repos/builtin/packages/r-pbdzmq/package.py | 2 +- var/spack/repos/builtin/packages/r-pbkrtest/package.py | 2 +- var/spack/repos/builtin/packages/r-permute/package.py | 2 +- var/spack/repos/builtin/packages/r-pkgmaker/package.py | 2 +- var/spack/repos/builtin/packages/r-plotrix/package.py | 2 +- var/spack/repos/builtin/packages/r-pls/package.py | 2 +- var/spack/repos/builtin/packages/r-plyr/package.py | 2 +- var/spack/repos/builtin/packages/r-png/package.py | 2 +- var/spack/repos/builtin/packages/r-prabclus/package.py | 2 +- var/spack/repos/builtin/packages/r-praise/package.py | 2 +- var/spack/repos/builtin/packages/r-prodlim/package.py | 2 +- var/spack/repos/builtin/packages/r-proto/package.py | 2 +- var/spack/repos/builtin/packages/r-pryr/package.py | 2 +- var/spack/repos/builtin/packages/r-quadprog/package.py | 2 +- var/spack/repos/builtin/packages/r-quantmod/package.py | 2 +- var/spack/repos/builtin/packages/r-quantreg/package.py | 2 +- var/spack/repos/builtin/packages/r-r6/package.py | 2 +- var/spack/repos/builtin/packages/r-randomforest/package.py | 2 +- var/spack/repos/builtin/packages/r-raster/package.py | 2 +- var/spack/repos/builtin/packages/r-rbokeh/package.py | 2 +- var/spack/repos/builtin/packages/r-rcolorbrewer/package.py | 2 +- var/spack/repos/builtin/packages/r-rcpp/package.py | 2 +- var/spack/repos/builtin/packages/r-rcppeigen/package.py | 2 +- var/spack/repos/builtin/packages/r-registry/package.py | 2 +- var/spack/repos/builtin/packages/r-repr/package.py | 2 +- var/spack/repos/builtin/packages/r-reshape2/package.py | 2 +- var/spack/repos/builtin/packages/r-rgl/package.py | 2 +- var/spack/repos/builtin/packages/r-rgooglemaps/package.py | 2 +- var/spack/repos/builtin/packages/r-rinside/package.py | 2 +- var/spack/repos/builtin/packages/r-rjava/package.py | 2 +- var/spack/repos/builtin/packages/r-rjson/package.py | 2 +- var/spack/repos/builtin/packages/r-rjsonio/package.py | 2 +- var/spack/repos/builtin/packages/r-rmarkdown/package.py | 2 +- var/spack/repos/builtin/packages/r-rminer/package.py | 2 +- var/spack/repos/builtin/packages/r-rmpfr/package.py | 2 +- var/spack/repos/builtin/packages/r-rmpi/package.py | 2 +- var/spack/repos/builtin/packages/r-rmysql/package.py | 2 +- var/spack/repos/builtin/packages/r-rngtools/package.py | 2 +- var/spack/repos/builtin/packages/r-robustbase/package.py | 2 +- var/spack/repos/builtin/packages/r-rodbc/package.py | 2 +- var/spack/repos/builtin/packages/r-roxygen2/package.py | 2 +- var/spack/repos/builtin/packages/r-rpart-plot/package.py | 2 +- var/spack/repos/builtin/packages/r-rpart/package.py | 2 +- var/spack/repos/builtin/packages/r-rpostgresql/package.py | 2 +- var/spack/repos/builtin/packages/r-rsnns/package.py | 2 +- var/spack/repos/builtin/packages/r-rsqlite/package.py | 2 +- var/spack/repos/builtin/packages/r-rstan/package.py | 2 +- var/spack/repos/builtin/packages/r-rstudioapi/package.py | 2 +- var/spack/repos/builtin/packages/r-rzmq/package.py | 2 +- var/spack/repos/builtin/packages/r-sandwich/package.py | 2 +- var/spack/repos/builtin/packages/r-scales/package.py | 2 +- var/spack/repos/builtin/packages/r-scatterplot3d/package.py | 2 +- var/spack/repos/builtin/packages/r-segmented/package.py | 2 +- var/spack/repos/builtin/packages/r-seqinr/package.py | 2 +- var/spack/repos/builtin/packages/r-shiny/package.py | 2 +- var/spack/repos/builtin/packages/r-snow/package.py | 2 +- var/spack/repos/builtin/packages/r-sp/package.py | 2 +- var/spack/repos/builtin/packages/r-sparsem/package.py | 2 +- var/spack/repos/builtin/packages/r-spdep/package.py | 2 +- var/spack/repos/builtin/packages/r-stanheaders/package.py | 2 +- var/spack/repos/builtin/packages/r-statnet-common/package.py | 2 +- var/spack/repos/builtin/packages/r-stringi/package.py | 2 +- var/spack/repos/builtin/packages/r-stringr/package.py | 2 +- var/spack/repos/builtin/packages/r-strucchange/package.py | 2 +- var/spack/repos/builtin/packages/r-survey/package.py | 2 +- var/spack/repos/builtin/packages/r-survival/package.py | 2 +- var/spack/repos/builtin/packages/r-tarifx/package.py | 2 +- var/spack/repos/builtin/packages/r-testit/package.py | 2 +- var/spack/repos/builtin/packages/r-testthat/package.py | 2 +- var/spack/repos/builtin/packages/r-th-data/package.py | 2 +- var/spack/repos/builtin/packages/r-threejs/package.py | 2 +- var/spack/repos/builtin/packages/r-tibble/package.py | 2 +- var/spack/repos/builtin/packages/r-tidyr/package.py | 2 +- var/spack/repos/builtin/packages/r-trimcluster/package.py | 2 +- var/spack/repos/builtin/packages/r-trust/package.py | 2 +- var/spack/repos/builtin/packages/r-ttr/package.py | 2 +- var/spack/repos/builtin/packages/r-uuid/package.py | 2 +- var/spack/repos/builtin/packages/r-vcd/package.py | 2 +- var/spack/repos/builtin/packages/r-vegan/package.py | 2 +- var/spack/repos/builtin/packages/r-viridis/package.py | 2 +- var/spack/repos/builtin/packages/r-viridislite/package.py | 2 +- var/spack/repos/builtin/packages/r-visnetwork/package.py | 2 +- var/spack/repos/builtin/packages/r-whisker/package.py | 2 +- var/spack/repos/builtin/packages/r-withr/package.py | 2 +- var/spack/repos/builtin/packages/r-xgboost/package.py | 2 +- var/spack/repos/builtin/packages/r-xlconnect/package.py | 2 +- var/spack/repos/builtin/packages/r-xlconnectjars/package.py | 2 +- var/spack/repos/builtin/packages/r-xlsx/package.py | 2 +- var/spack/repos/builtin/packages/r-xlsxjars/package.py | 2 +- var/spack/repos/builtin/packages/r-xml/package.py | 2 +- var/spack/repos/builtin/packages/r-xtable/package.py | 2 +- var/spack/repos/builtin/packages/r-xts/package.py | 2 +- var/spack/repos/builtin/packages/r-yaml/package.py | 2 +- var/spack/repos/builtin/packages/r-zoo/package.py | 2 +- var/spack/repos/builtin/packages/r/package.py | 2 +- var/spack/repos/builtin/packages/raft/package.py | 2 +- var/spack/repos/builtin/packages/raja/package.py | 2 +- var/spack/repos/builtin/packages/random123/package.py | 2 +- var/spack/repos/builtin/packages/randrproto/package.py | 2 +- var/spack/repos/builtin/packages/ravel/package.py | 2 +- var/spack/repos/builtin/packages/raxml/package.py | 2 +- var/spack/repos/builtin/packages/ray/package.py | 2 +- var/spack/repos/builtin/packages/rdp-classifier/package.py | 2 +- var/spack/repos/builtin/packages/readline/package.py | 2 +- var/spack/repos/builtin/packages/recordproto/package.py | 2 +- var/spack/repos/builtin/packages/redundans/package.py | 2 +- var/spack/repos/builtin/packages/relion/package.py | 2 +- var/spack/repos/builtin/packages/rempi/package.py | 2 +- var/spack/repos/builtin/packages/rename/package.py | 2 +- var/spack/repos/builtin/packages/rendercheck/package.py | 2 +- var/spack/repos/builtin/packages/renderproto/package.py | 2 +- var/spack/repos/builtin/packages/resourceproto/package.py | 2 +- var/spack/repos/builtin/packages/revbayes/package.py | 2 +- var/spack/repos/builtin/packages/rgb/package.py | 2 +- var/spack/repos/builtin/packages/rhash/package.py | 2 +- var/spack/repos/builtin/packages/rockstar/package.py | 2 +- var/spack/repos/builtin/packages/root/package.py | 2 +- var/spack/repos/builtin/packages/rose/package.py | 2 +- var/spack/repos/builtin/packages/rr/package.py | 2 +- var/spack/repos/builtin/packages/rsbench/package.py | 2 +- var/spack/repos/builtin/packages/rsem/package.py | 2 +- var/spack/repos/builtin/packages/rstart/package.py | 2 +- var/spack/repos/builtin/packages/rsync/package.py | 2 +- var/spack/repos/builtin/packages/rtags/package.py | 2 +- var/spack/repos/builtin/packages/rtax/package.py | 2 +- var/spack/repos/builtin/packages/ruby/package.py | 2 +- var/spack/repos/builtin/packages/rust-bindgen/package.py | 2 +- var/spack/repos/builtin/packages/rust/package.py | 2 +- var/spack/repos/builtin/packages/sabre/package.py | 2 +- var/spack/repos/builtin/packages/salmon/package.py | 2 +- var/spack/repos/builtin/packages/samrai/package.py | 2 +- var/spack/repos/builtin/packages/samtools/package.py | 2 +- var/spack/repos/builtin/packages/sas/package.py | 2 +- var/spack/repos/builtin/packages/satsuma2/package.py | 2 +- var/spack/repos/builtin/packages/savanna/package.py | 2 +- var/spack/repos/builtin/packages/saws/package.py | 2 +- var/spack/repos/builtin/packages/sbt/package.py | 2 +- var/spack/repos/builtin/packages/scala/package.py | 2 +- var/spack/repos/builtin/packages/scalasca/package.py | 2 +- var/spack/repos/builtin/packages/scons/package.py | 2 +- var/spack/repos/builtin/packages/scorec-core/package.py | 2 +- var/spack/repos/builtin/packages/scorep/package.py | 2 +- var/spack/repos/builtin/packages/scotch/package.py | 2 +- var/spack/repos/builtin/packages/scr/package.py | 2 +- var/spack/repos/builtin/packages/screen/package.py | 2 +- var/spack/repos/builtin/packages/scripts/package.py | 2 +- var/spack/repos/builtin/packages/scrnsaverproto/package.py | 2 +- var/spack/repos/builtin/packages/sctk/package.py | 2 +- var/spack/repos/builtin/packages/sdl2-image/package.py | 2 +- var/spack/repos/builtin/packages/sdl2/package.py | 2 +- var/spack/repos/builtin/packages/sed/package.py | 2 +- var/spack/repos/builtin/packages/seqprep/package.py | 2 +- var/spack/repos/builtin/packages/seqtk/package.py | 2 +- var/spack/repos/builtin/packages/serf/package.py | 2 +- var/spack/repos/builtin/packages/sessreg/package.py | 2 +- var/spack/repos/builtin/packages/setxkbmap/package.py | 2 +- var/spack/repos/builtin/packages/sga/package.py | 2 +- var/spack/repos/builtin/packages/shapeit/package.py | 2 +- var/spack/repos/builtin/packages/shared-mime-info/package.py | 2 +- var/spack/repos/builtin/packages/shiny-server/package.py | 2 +- var/spack/repos/builtin/packages/shortstack/package.py | 2 +- var/spack/repos/builtin/packages/showfont/package.py | 2 +- var/spack/repos/builtin/packages/sickle/package.py | 2 +- var/spack/repos/builtin/packages/signalp/package.py | 2 +- var/spack/repos/builtin/packages/silo/package.py | 2 +- var/spack/repos/builtin/packages/simplemoc/package.py | 2 +- var/spack/repos/builtin/packages/simul/package.py | 2 +- var/spack/repos/builtin/packages/simulationio/package.py | 2 +- var/spack/repos/builtin/packages/singularity/package.py | 2 +- var/spack/repos/builtin/packages/slepc/package.py | 2 +- var/spack/repos/builtin/packages/slurm/package.py | 2 +- var/spack/repos/builtin/packages/smalt/package.py | 2 +- var/spack/repos/builtin/packages/smc/package.py | 2 +- var/spack/repos/builtin/packages/smproxy/package.py | 2 +- var/spack/repos/builtin/packages/snakemake/package.py | 2 +- var/spack/repos/builtin/packages/snap-berkeley/package.py | 2 +- var/spack/repos/builtin/packages/snap/package.py | 2 +- var/spack/repos/builtin/packages/snappy/package.py | 2 +- var/spack/repos/builtin/packages/snbone/package.py | 2 +- var/spack/repos/builtin/packages/sniffles/package.py | 2 +- var/spack/repos/builtin/packages/snptest/package.py | 2 +- var/spack/repos/builtin/packages/soap2/package.py | 2 +- var/spack/repos/builtin/packages/soapindel/package.py | 2 +- var/spack/repos/builtin/packages/soapsnp/package.py | 2 +- var/spack/repos/builtin/packages/somatic-sniper/package.py | 2 +- var/spack/repos/builtin/packages/sortmerna/package.py | 2 +- var/spack/repos/builtin/packages/sowing/package.py | 2 +- var/spack/repos/builtin/packages/sox/package.py | 2 +- var/spack/repos/builtin/packages/spades/package.py | 2 +- var/spack/repos/builtin/packages/spark/package.py | 2 +- var/spack/repos/builtin/packages/sparsehash/package.py | 2 +- var/spack/repos/builtin/packages/sparta/package.py | 2 +- var/spack/repos/builtin/packages/spdlog/package.py | 2 +- var/spack/repos/builtin/packages/spectrum-mpi/package.py | 2 +- var/spack/repos/builtin/packages/speex/package.py | 2 +- var/spack/repos/builtin/packages/sph2pipe/package.py | 2 +- var/spack/repos/builtin/packages/spherepack/package.py | 2 +- var/spack/repos/builtin/packages/spindle/package.py | 2 +- var/spack/repos/builtin/packages/spot/package.py | 2 +- var/spack/repos/builtin/packages/sqlite/package.py | 2 +- var/spack/repos/builtin/packages/sspace-longread/package.py | 2 +- var/spack/repos/builtin/packages/sspace-standard/package.py | 2 +- var/spack/repos/builtin/packages/sst-dumpi/package.py | 2 +- var/spack/repos/builtin/packages/sst-macro/package.py | 2 +- var/spack/repos/builtin/packages/stacks/package.py | 2 +- var/spack/repos/builtin/packages/staden-io-lib/package.py | 2 +- var/spack/repos/builtin/packages/star-ccm-plus/package.py | 2 +- var/spack/repos/builtin/packages/star/package.py | 2 +- var/spack/repos/builtin/packages/stat/package.py | 2 +- var/spack/repos/builtin/packages/stc/package.py | 2 +- var/spack/repos/builtin/packages/stream/package.py | 2 +- var/spack/repos/builtin/packages/stress/package.py | 2 +- var/spack/repos/builtin/packages/stringtie/package.py | 2 +- var/spack/repos/builtin/packages/structure/package.py | 2 +- var/spack/repos/builtin/packages/sublime-text/package.py | 2 +- var/spack/repos/builtin/packages/subread/package.py | 2 +- var/spack/repos/builtin/packages/subversion/package.py | 2 +- var/spack/repos/builtin/packages/suite-sparse/package.py | 2 +- var/spack/repos/builtin/packages/sumaclust/package.py | 2 +- var/spack/repos/builtin/packages/sundials/package.py | 2 +- var/spack/repos/builtin/packages/superlu-dist/package.py | 2 +- var/spack/repos/builtin/packages/superlu-mt/package.py | 2 +- var/spack/repos/builtin/packages/superlu/package.py | 2 +- var/spack/repos/builtin/packages/swarm/package.py | 2 +- var/spack/repos/builtin/packages/swiftsim/package.py | 2 +- var/spack/repos/builtin/packages/swig/package.py | 2 +- var/spack/repos/builtin/packages/symengine/package.py | 2 +- var/spack/repos/builtin/packages/sympol/package.py | 2 +- var/spack/repos/builtin/packages/sz/package.py | 2 +- var/spack/repos/builtin/packages/tabix/package.py | 2 +- var/spack/repos/builtin/packages/talloc/package.py | 2 +- var/spack/repos/builtin/packages/tar/package.py | 2 +- var/spack/repos/builtin/packages/task/package.py | 2 +- var/spack/repos/builtin/packages/taskd/package.py | 2 +- var/spack/repos/builtin/packages/tau/package.py | 2 +- var/spack/repos/builtin/packages/tcl/package.py | 2 +- var/spack/repos/builtin/packages/tcoffee/package.py | 2 +- var/spack/repos/builtin/packages/tealeaf/package.py | 2 +- var/spack/repos/builtin/packages/tetgen/package.py | 2 +- var/spack/repos/builtin/packages/tethex/package.py | 2 +- var/spack/repos/builtin/packages/texinfo/package.py | 2 +- var/spack/repos/builtin/packages/texlive/package.py | 2 +- var/spack/repos/builtin/packages/the-platinum-searcher/package.py | 2 +- var/spack/repos/builtin/packages/the-silver-searcher/package.py | 2 +- var/spack/repos/builtin/packages/thrift/package.py | 2 +- var/spack/repos/builtin/packages/tig/package.py | 2 +- var/spack/repos/builtin/packages/tinyxml/package.py | 2 +- var/spack/repos/builtin/packages/tinyxml2/package.py | 2 +- var/spack/repos/builtin/packages/tk/package.py | 2 +- var/spack/repos/builtin/packages/tmalign/package.py | 2 +- var/spack/repos/builtin/packages/tmux/package.py | 2 +- var/spack/repos/builtin/packages/tmuxinator/package.py | 2 +- var/spack/repos/builtin/packages/tophat/package.py | 2 +- var/spack/repos/builtin/packages/tppred/package.py | 2 +- var/spack/repos/builtin/packages/transabyss/package.py | 2 +- var/spack/repos/builtin/packages/transdecoder/package.py | 2 +- var/spack/repos/builtin/packages/transposome/package.py | 2 +- var/spack/repos/builtin/packages/transset/package.py | 2 +- var/spack/repos/builtin/packages/trapproto/package.py | 2 +- var/spack/repos/builtin/packages/tree/package.py | 2 +- var/spack/repos/builtin/packages/triangle/package.py | 2 +- var/spack/repos/builtin/packages/trilinos/package.py | 2 +- var/spack/repos/builtin/packages/trimgalore/package.py | 2 +- var/spack/repos/builtin/packages/trimmomatic/package.py | 2 +- var/spack/repos/builtin/packages/turbine/package.py | 2 +- var/spack/repos/builtin/packages/turbomole/package.py | 2 +- var/spack/repos/builtin/packages/twm/package.py | 2 +- var/spack/repos/builtin/packages/uberftp/package.py | 2 +- var/spack/repos/builtin/packages/udunits2/package.py | 2 +- var/spack/repos/builtin/packages/uncrustify/package.py | 2 +- var/spack/repos/builtin/packages/unibilium/package.py | 2 +- var/spack/repos/builtin/packages/unison/package.py | 2 +- var/spack/repos/builtin/packages/units/package.py | 2 +- var/spack/repos/builtin/packages/unixodbc/package.py | 2 +- var/spack/repos/builtin/packages/usearch/package.py | 2 +- var/spack/repos/builtin/packages/util-linux/package.py | 2 +- var/spack/repos/builtin/packages/util-macros/package.py | 2 +- var/spack/repos/builtin/packages/uuid/package.py | 2 +- var/spack/repos/builtin/packages/valgrind/package.py | 2 +- var/spack/repos/builtin/packages/vampirtrace/package.py | 2 +- var/spack/repos/builtin/packages/varscan/package.py | 2 +- var/spack/repos/builtin/packages/vc/package.py | 2 +- var/spack/repos/builtin/packages/vcftools/package.py | 2 +- var/spack/repos/builtin/packages/vcsh/package.py | 2 +- var/spack/repos/builtin/packages/vdt/package.py | 2 +- var/spack/repos/builtin/packages/vecgeom/package.py | 2 +- var/spack/repos/builtin/packages/veclibfort/package.py | 2 +- var/spack/repos/builtin/packages/vegas2/package.py | 2 +- var/spack/repos/builtin/packages/velvet/package.py | 2 +- var/spack/repos/builtin/packages/videoproto/package.py | 2 +- var/spack/repos/builtin/packages/viennarna/package.py | 2 +- var/spack/repos/builtin/packages/viewres/package.py | 2 +- var/spack/repos/builtin/packages/vim/package.py | 2 +- var/spack/repos/builtin/packages/virtualgl/package.py | 2 +- var/spack/repos/builtin/packages/visit/package.py | 2 +- var/spack/repos/builtin/packages/vizglow/package.py | 2 +- var/spack/repos/builtin/packages/vmatch/package.py | 2 +- var/spack/repos/builtin/packages/voropp/package.py | 2 +- var/spack/repos/builtin/packages/vpfft/package.py | 2 +- var/spack/repos/builtin/packages/vsearch/package.py | 2 +- var/spack/repos/builtin/packages/vtk/package.py | 2 +- var/spack/repos/builtin/packages/wannier90/package.py | 2 +- var/spack/repos/builtin/packages/wget/package.py | 2 +- var/spack/repos/builtin/packages/windowswmproto/package.py | 2 +- var/spack/repos/builtin/packages/wx/package.py | 2 +- var/spack/repos/builtin/packages/wxpropgrid/package.py | 2 +- var/spack/repos/builtin/packages/x11perf/package.py | 2 +- var/spack/repos/builtin/packages/xapian-core/package.py | 2 +- var/spack/repos/builtin/packages/xauth/package.py | 2 +- var/spack/repos/builtin/packages/xbacklight/package.py | 2 +- var/spack/repos/builtin/packages/xbiff/package.py | 2 +- var/spack/repos/builtin/packages/xbitmaps/package.py | 2 +- var/spack/repos/builtin/packages/xcalc/package.py | 2 +- var/spack/repos/builtin/packages/xcb-demo/package.py | 2 +- var/spack/repos/builtin/packages/xcb-proto/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util-cursor/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util-errors/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util-image/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util-keysyms/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util-renderutil/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util-wm/package.py | 2 +- var/spack/repos/builtin/packages/xcb-util/package.py | 2 +- var/spack/repos/builtin/packages/xclipboard/package.py | 2 +- var/spack/repos/builtin/packages/xclock/package.py | 2 +- var/spack/repos/builtin/packages/xcmiscproto/package.py | 2 +- var/spack/repos/builtin/packages/xcmsdb/package.py | 2 +- var/spack/repos/builtin/packages/xcompmgr/package.py | 2 +- var/spack/repos/builtin/packages/xconsole/package.py | 2 +- var/spack/repos/builtin/packages/xcursor-themes/package.py | 2 +- var/spack/repos/builtin/packages/xcursorgen/package.py | 2 +- var/spack/repos/builtin/packages/xdbedizzy/package.py | 2 +- var/spack/repos/builtin/packages/xditview/package.py | 2 +- var/spack/repos/builtin/packages/xdm/package.py | 2 +- var/spack/repos/builtin/packages/xdpyinfo/package.py | 2 +- var/spack/repos/builtin/packages/xdriinfo/package.py | 2 +- var/spack/repos/builtin/packages/xedit/package.py | 2 +- var/spack/repos/builtin/packages/xerces-c/package.py | 2 +- var/spack/repos/builtin/packages/xev/package.py | 2 +- var/spack/repos/builtin/packages/xextproto/package.py | 2 +- var/spack/repos/builtin/packages/xeyes/package.py | 2 +- var/spack/repos/builtin/packages/xf86bigfontproto/package.py | 2 +- var/spack/repos/builtin/packages/xf86dga/package.py | 2 +- var/spack/repos/builtin/packages/xf86dgaproto/package.py | 2 +- var/spack/repos/builtin/packages/xf86driproto/package.py | 2 +- var/spack/repos/builtin/packages/xf86miscproto/package.py | 2 +- var/spack/repos/builtin/packages/xf86rushproto/package.py | 2 +- var/spack/repos/builtin/packages/xf86vidmodeproto/package.py | 2 +- var/spack/repos/builtin/packages/xfd/package.py | 2 +- var/spack/repos/builtin/packages/xfindproxy/package.py | 2 +- var/spack/repos/builtin/packages/xfontsel/package.py | 2 +- var/spack/repos/builtin/packages/xfs/package.py | 2 +- var/spack/repos/builtin/packages/xfsinfo/package.py | 2 +- var/spack/repos/builtin/packages/xfwp/package.py | 2 +- var/spack/repos/builtin/packages/xgamma/package.py | 2 +- var/spack/repos/builtin/packages/xgc/package.py | 2 +- var/spack/repos/builtin/packages/xhost/package.py | 2 +- var/spack/repos/builtin/packages/xineramaproto/package.py | 2 +- var/spack/repos/builtin/packages/xinit/package.py | 2 +- var/spack/repos/builtin/packages/xinput/package.py | 2 +- var/spack/repos/builtin/packages/xkbcomp/package.py | 2 +- var/spack/repos/builtin/packages/xkbdata/package.py | 2 +- var/spack/repos/builtin/packages/xkbevd/package.py | 2 +- var/spack/repos/builtin/packages/xkbprint/package.py | 2 +- var/spack/repos/builtin/packages/xkbutils/package.py | 2 +- var/spack/repos/builtin/packages/xkeyboard-config/package.py | 2 +- var/spack/repos/builtin/packages/xkill/package.py | 2 +- var/spack/repos/builtin/packages/xload/package.py | 2 +- var/spack/repos/builtin/packages/xlogo/package.py | 2 +- var/spack/repos/builtin/packages/xlsatoms/package.py | 2 +- var/spack/repos/builtin/packages/xlsclients/package.py | 2 +- var/spack/repos/builtin/packages/xlsfonts/package.py | 2 +- var/spack/repos/builtin/packages/xmag/package.py | 2 +- var/spack/repos/builtin/packages/xman/package.py | 2 +- var/spack/repos/builtin/packages/xmessage/package.py | 2 +- var/spack/repos/builtin/packages/xmh/package.py | 2 +- var/spack/repos/builtin/packages/xmlto/package.py | 2 +- var/spack/repos/builtin/packages/xmodmap/package.py | 2 +- var/spack/repos/builtin/packages/xmore/package.py | 2 +- var/spack/repos/builtin/packages/xorg-cf-files/package.py | 2 +- var/spack/repos/builtin/packages/xorg-docs/package.py | 2 +- var/spack/repos/builtin/packages/xorg-gtest/package.py | 2 +- var/spack/repos/builtin/packages/xorg-server/package.py | 2 +- var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py | 2 +- var/spack/repos/builtin/packages/xphelloworld/package.py | 2 +- var/spack/repos/builtin/packages/xplor-nih/package.py | 2 +- var/spack/repos/builtin/packages/xplsprinters/package.py | 2 +- var/spack/repos/builtin/packages/xpr/package.py | 2 +- var/spack/repos/builtin/packages/xprehashprinterlist/package.py | 2 +- var/spack/repos/builtin/packages/xprop/package.py | 2 +- var/spack/repos/builtin/packages/xproto/package.py | 2 +- var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py | 2 +- var/spack/repos/builtin/packages/xqilla/package.py | 2 +- var/spack/repos/builtin/packages/xrandr/package.py | 2 +- var/spack/repos/builtin/packages/xrdb/package.py | 2 +- var/spack/repos/builtin/packages/xrefresh/package.py | 2 +- var/spack/repos/builtin/packages/xrootd/package.py | 2 +- var/spack/repos/builtin/packages/xrx/package.py | 2 +- var/spack/repos/builtin/packages/xsbench/package.py | 2 +- var/spack/repos/builtin/packages/xscope/package.py | 2 +- var/spack/repos/builtin/packages/xsdk/package.py | 2 +- var/spack/repos/builtin/packages/xsdktrilinos/package.py | 2 +- var/spack/repos/builtin/packages/xset/package.py | 2 +- var/spack/repos/builtin/packages/xsetmode/package.py | 2 +- var/spack/repos/builtin/packages/xsetpointer/package.py | 2 +- var/spack/repos/builtin/packages/xsetroot/package.py | 2 +- var/spack/repos/builtin/packages/xsm/package.py | 2 +- var/spack/repos/builtin/packages/xstdcmap/package.py | 2 +- var/spack/repos/builtin/packages/xterm/package.py | 2 +- var/spack/repos/builtin/packages/xtrans/package.py | 2 +- var/spack/repos/builtin/packages/xtrap/package.py | 2 +- var/spack/repos/builtin/packages/xts/package.py | 2 +- var/spack/repos/builtin/packages/xvidtune/package.py | 2 +- var/spack/repos/builtin/packages/xvinfo/package.py | 2 +- var/spack/repos/builtin/packages/xwd/package.py | 2 +- var/spack/repos/builtin/packages/xwininfo/package.py | 2 +- var/spack/repos/builtin/packages/xwud/package.py | 2 +- var/spack/repos/builtin/packages/xz/package.py | 2 +- var/spack/repos/builtin/packages/yaml-cpp/package.py | 2 +- var/spack/repos/builtin/packages/yasm/package.py | 2 +- var/spack/repos/builtin/packages/yorick/package.py | 2 +- var/spack/repos/builtin/packages/z3/package.py | 2 +- var/spack/repos/builtin/packages/zeromq/package.py | 2 +- var/spack/repos/builtin/packages/zfp/package.py | 2 +- var/spack/repos/builtin/packages/zip/package.py | 2 +- var/spack/repos/builtin/packages/zlib/package.py | 2 +- var/spack/repos/builtin/packages/zoltan/package.py | 2 +- var/spack/repos/builtin/packages/zsh/package.py | 2 +- var/spack/repos/builtin/packages/zstd/package.py | 2 +- 2060 files changed, 2060 insertions(+), 2060 deletions(-) (limited to 'lib') diff --git a/bin/sbang b/bin/sbang index ce4df4327c..bd9c4e6506 100755 --- a/bin/sbang +++ b/bin/sbang @@ -1,6 +1,6 @@ #!/bin/bash ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/bin/spack b/bin/spack index d95c07844c..3a74f0b1ba 100755 --- a/bin/spack +++ b/bin/spack @@ -1,6 +1,6 @@ #!/usr/bin/env python ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/bin/spack-python b/bin/spack-python index f79f859717..dbb6ddf2f5 100755 --- a/bin/spack-python +++ b/bin/spack-python @@ -1,6 +1,6 @@ #!/bin/sh ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/docs/tutorial/examples/0.package.py b/lib/spack/docs/tutorial/examples/0.package.py index 691f364df6..3a627e5007 100644 --- a/lib/spack/docs/tutorial/examples/0.package.py +++ b/lib/spack/docs/tutorial/examples/0.package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/docs/tutorial/examples/1.package.py b/lib/spack/docs/tutorial/examples/1.package.py index ec2f23d5ea..de9fbd7049 100644 --- a/lib/spack/docs/tutorial/examples/1.package.py +++ b/lib/spack/docs/tutorial/examples/1.package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/docs/tutorial/examples/2.package.py b/lib/spack/docs/tutorial/examples/2.package.py index 8dfb149ca4..5cb51b21fc 100644 --- a/lib/spack/docs/tutorial/examples/2.package.py +++ b/lib/spack/docs/tutorial/examples/2.package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/docs/tutorial/examples/3.package.py b/lib/spack/docs/tutorial/examples/3.package.py index 58208a26a4..9279a05f9a 100644 --- a/lib/spack/docs/tutorial/examples/3.package.py +++ b/lib/spack/docs/tutorial/examples/3.package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/docs/tutorial/examples/4.package.py b/lib/spack/docs/tutorial/examples/4.package.py index 05735cf3d0..35ed1d32ff 100644 --- a/lib/spack/docs/tutorial/examples/4.package.py +++ b/lib/spack/docs/tutorial/examples/4.package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/env/cc b/lib/spack/env/cc index e63c371318..3d118d8d7c 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -1,6 +1,6 @@ #!/bin/bash ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/external/__init__.py b/lib/spack/external/__init__.py index d3d085eee3..2c4b19b6c8 100644 --- a/lib/spack/external/__init__.py +++ b/lib/spack/external/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/__init__.py b/lib/spack/llnl/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/llnl/__init__.py +++ b/lib/spack/llnl/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/__init__.py b/lib/spack/llnl/util/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/llnl/util/__init__.py +++ b/lib/spack/llnl/util/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index bedc7c9de2..554ae25230 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/lang.py b/lib/spack/llnl/util/lang.py index 563835ecfc..667572dd8d 100644 --- a/lib/spack/llnl/util/lang.py +++ b/lib/spack/llnl/util/lang.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/link_tree.py b/lib/spack/llnl/util/link_tree.py index 7e77cd738c..6f6dabe430 100644 --- a/lib/spack/llnl/util/link_tree.py +++ b/lib/spack/llnl/util/link_tree.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/lock.py b/lib/spack/llnl/util/lock.py index 55837c371e..be87c8ff6c 100644 --- a/lib/spack/llnl/util/lock.py +++ b/lib/spack/llnl/util/lock.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/tty/__init__.py b/lib/spack/llnl/util/tty/__init__.py index 59e20ebfe3..9a0f1c8438 100644 --- a/lib/spack/llnl/util/tty/__init__.py +++ b/lib/spack/llnl/util/tty/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/tty/colify.py b/lib/spack/llnl/util/tty/colify.py index fff449a51c..66e9f7abfb 100644 --- a/lib/spack/llnl/util/tty/colify.py +++ b/lib/spack/llnl/util/tty/colify.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/tty/color.py b/lib/spack/llnl/util/tty/color.py index 1081acd0f1..40962461d7 100644 --- a/lib/spack/llnl/util/tty/color.py +++ b/lib/spack/llnl/util/tty/color.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/llnl/util/tty/log.py b/lib/spack/llnl/util/tty/log.py index e102e63d4b..02084cc382 100644 --- a/lib/spack/llnl/util/tty/log.py +++ b/lib/spack/llnl/util/tty/log.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py index 21280f0001..8c363bd12e 100644 --- a/lib/spack/spack/__init__.py +++ b/lib/spack/spack/__init__.py @@ -1,6 +1,6 @@ # flake8: noqa ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/abi.py b/lib/spack/spack/abi.py index 4354a8b5c8..b57a1426dd 100644 --- a/lib/spack/spack/abi.py +++ b/lib/spack/spack/abi.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/architecture.py b/lib/spack/spack/architecture.py index 27092fb344..925b6acd54 100644 --- a/lib/spack/spack/architecture.py +++ b/lib/spack/spack/architecture.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py index 2de14938a4..9693a75c39 100644 --- a/lib/spack/spack/binary_distribution.py +++ b/lib/spack/spack/binary_distribution.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/__init__.py b/lib/spack/spack/build_systems/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/build_systems/__init__.py +++ b/lib/spack/spack/build_systems/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index e11127e4ed..afabb90820 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 9160390a06..026cf7903a 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/intel.py b/lib/spack/spack/build_systems/intel.py index a97f15d62c..10e87484e6 100644 --- a/lib/spack/spack/build_systems/intel.py +++ b/lib/spack/spack/build_systems/intel.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index b1f55e5ed6..5ffb88f43d 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/perl.py b/lib/spack/spack/build_systems/perl.py index aabb53d589..6d0922ed6b 100644 --- a/lib/spack/spack/build_systems/perl.py +++ b/lib/spack/spack/build_systems/perl.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index 63dd67d400..190620d7a2 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/qmake.py b/lib/spack/spack/build_systems/qmake.py index c1a3193b7f..60a02eba54 100644 --- a/lib/spack/spack/build_systems/qmake.py +++ b/lib/spack/spack/build_systems/qmake.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/r.py b/lib/spack/spack/build_systems/r.py index 8f7af8cd32..bb2a0e72de 100644 --- a/lib/spack/spack/build_systems/r.py +++ b/lib/spack/spack/build_systems/r.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/scons.py b/lib/spack/spack/build_systems/scons.py index 694ed936cc..4e37578162 100644 --- a/lib/spack/spack/build_systems/scons.py +++ b/lib/spack/spack/build_systems/scons.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/build_systems/waf.py b/lib/spack/spack/build_systems/waf.py index afe019028b..8c979f5204 100644 --- a/lib/spack/spack/build_systems/waf.py +++ b/lib/spack/spack/build_systems/waf.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/__init__.py b/lib/spack/spack/cmd/__init__.py index f432fbf585..08dbf55dc2 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/activate.py b/lib/spack/spack/cmd/activate.py index 73faa83f08..d30485ab82 100644 --- a/lib/spack/spack/cmd/activate.py +++ b/lib/spack/spack/cmd/activate.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/arch.py b/lib/spack/spack/cmd/arch.py index 1d02847826..ee0c8eb397 100644 --- a/lib/spack/spack/cmd/arch.py +++ b/lib/spack/spack/cmd/arch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index 135dd66d39..b0550644f8 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/build.py b/lib/spack/spack/cmd/build.py index a4821214d6..760aa5e339 100644 --- a/lib/spack/spack/cmd/build.py +++ b/lib/spack/spack/cmd/build.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/buildcache.py b/lib/spack/spack/cmd/buildcache.py index 213442acef..71386a221c 100644 --- a/lib/spack/spack/cmd/buildcache.py +++ b/lib/spack/spack/cmd/buildcache.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/cd.py b/lib/spack/spack/cmd/cd.py index 4ee671d8b9..62a336d6a3 100644 --- a/lib/spack/spack/cmd/cd.py +++ b/lib/spack/spack/cmd/cd.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/checksum.py b/lib/spack/spack/cmd/checksum.py index 858ecdf54f..0d56f971c8 100644 --- a/lib/spack/spack/cmd/checksum.py +++ b/lib/spack/spack/cmd/checksum.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py index 634e20b4e4..ba56fd81bf 100644 --- a/lib/spack/spack/cmd/clean.py +++ b/lib/spack/spack/cmd/clean.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/common/__init__.py b/lib/spack/spack/cmd/common/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/cmd/common/__init__.py +++ b/lib/spack/spack/cmd/common/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/common/arguments.py b/lib/spack/spack/cmd/common/arguments.py index 46be346837..7d78158038 100644 --- a/lib/spack/spack/cmd/common/arguments.py +++ b/lib/spack/spack/cmd/common/arguments.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/compiler.py b/lib/spack/spack/cmd/compiler.py index 356161d3b3..125af5bdf3 100644 --- a/lib/spack/spack/cmd/compiler.py +++ b/lib/spack/spack/cmd/compiler.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/compilers.py b/lib/spack/spack/cmd/compilers.py index 1cac261aff..7fa89b8cb5 100644 --- a/lib/spack/spack/cmd/compilers.py +++ b/lib/spack/spack/cmd/compilers.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index 09cb9a900e..50cdcbffa3 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/configure.py b/lib/spack/spack/cmd/configure.py index c8588334a5..795340630e 100644 --- a/lib/spack/spack/cmd/configure.py +++ b/lib/spack/spack/cmd/configure.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py index e68b20a6ac..29f888fd59 100644 --- a/lib/spack/spack/cmd/create.py +++ b/lib/spack/spack/cmd/create.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/deactivate.py b/lib/spack/spack/cmd/deactivate.py index d58555afad..db0d717120 100644 --- a/lib/spack/spack/cmd/deactivate.py +++ b/lib/spack/spack/cmd/deactivate.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/debug.py b/lib/spack/spack/cmd/debug.py index 33c866e962..01ebd20a7b 100644 --- a/lib/spack/spack/cmd/debug.py +++ b/lib/spack/spack/cmd/debug.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/dependencies.py b/lib/spack/spack/cmd/dependencies.py index b35c324fc7..81957f67f9 100644 --- a/lib/spack/spack/cmd/dependencies.py +++ b/lib/spack/spack/cmd/dependencies.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/dependents.py b/lib/spack/spack/cmd/dependents.py index 3413ac3227..e4c999d53f 100644 --- a/lib/spack/spack/cmd/dependents.py +++ b/lib/spack/spack/cmd/dependents.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/diy.py b/lib/spack/spack/cmd/diy.py index 16a6f4c7a0..79888d8264 100644 --- a/lib/spack/spack/cmd/diy.py +++ b/lib/spack/spack/cmd/diy.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/edit.py b/lib/spack/spack/cmd/edit.py index bd7fb773ec..ae117c26df 100644 --- a/lib/spack/spack/cmd/edit.py +++ b/lib/spack/spack/cmd/edit.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/env.py b/lib/spack/spack/cmd/env.py index 343717a191..11c8e32fcf 100644 --- a/lib/spack/spack/cmd/env.py +++ b/lib/spack/spack/cmd/env.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py index 03130820de..bda20b9e1c 100644 --- a/lib/spack/spack/cmd/extensions.py +++ b/lib/spack/spack/cmd/extensions.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/fetch.py b/lib/spack/spack/cmd/fetch.py index 15fd22d606..971cd00af5 100644 --- a/lib/spack/spack/cmd/fetch.py +++ b/lib/spack/spack/cmd/fetch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index b7aa390c59..9b78c52e1f 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/flake8.py b/lib/spack/spack/cmd/flake8.py index fee03b4f5d..9691ed138b 100644 --- a/lib/spack/spack/cmd/flake8.py +++ b/lib/spack/spack/cmd/flake8.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/gpg.py b/lib/spack/spack/cmd/gpg.py index 3ec6094cac..6073212c86 100644 --- a/lib/spack/spack/cmd/gpg.py +++ b/lib/spack/spack/cmd/gpg.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/graph.py b/lib/spack/spack/cmd/graph.py index e750e5a959..a258d5faac 100644 --- a/lib/spack/spack/cmd/graph.py +++ b/lib/spack/spack/cmd/graph.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/help.py b/lib/spack/spack/cmd/help.py index 7522499dab..0af5b471cd 100644 --- a/lib/spack/spack/cmd/help.py +++ b/lib/spack/spack/cmd/help.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/info.py b/lib/spack/spack/cmd/info.py index 3236998710..b3b95aa3df 100644 --- a/lib/spack/spack/cmd/info.py +++ b/lib/spack/spack/cmd/info.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 83ebe71787..ee752222db 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index 730ad8d9d9..2550a6d052 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/load.py b/lib/spack/spack/cmd/load.py index 2a5d14a1bf..514bf2f878 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/location.py b/lib/spack/spack/cmd/location.py index e150a28238..51048a2f08 100644 --- a/lib/spack/spack/cmd/location.py +++ b/lib/spack/spack/cmd/location.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/md5.py b/lib/spack/spack/cmd/md5.py index 0c341e5bad..6f6a4af237 100644 --- a/lib/spack/spack/cmd/md5.py +++ b/lib/spack/spack/cmd/md5.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py index b89ac4121d..08b6603da4 100644 --- a/lib/spack/spack/cmd/mirror.py +++ b/lib/spack/spack/cmd/mirror.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/module.py b/lib/spack/spack/cmd/module.py index d59d4433b7..22d1815c89 100644 --- a/lib/spack/spack/cmd/module.py +++ b/lib/spack/spack/cmd/module.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/patch.py b/lib/spack/spack/cmd/patch.py index 9c26f385fb..b19429a0cb 100644 --- a/lib/spack/spack/cmd/patch.py +++ b/lib/spack/spack/cmd/patch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/pkg.py b/lib/spack/spack/cmd/pkg.py index 42fecf23df..7673955db5 100644 --- a/lib/spack/spack/cmd/pkg.py +++ b/lib/spack/spack/cmd/pkg.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/providers.py b/lib/spack/spack/cmd/providers.py index 51566eb26d..0a4f98467b 100644 --- a/lib/spack/spack/cmd/providers.py +++ b/lib/spack/spack/cmd/providers.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/python.py b/lib/spack/spack/cmd/python.py index c0a056007a..bf4eb628b1 100644 --- a/lib/spack/spack/cmd/python.py +++ b/lib/spack/spack/cmd/python.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/reindex.py b/lib/spack/spack/cmd/reindex.py index 1fb9392c2f..317a4b128c 100644 --- a/lib/spack/spack/cmd/reindex.py +++ b/lib/spack/spack/cmd/reindex.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/repo.py b/lib/spack/spack/cmd/repo.py index 6dc8833f86..ac0ae32c92 100644 --- a/lib/spack/spack/cmd/repo.py +++ b/lib/spack/spack/cmd/repo.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/restage.py b/lib/spack/spack/cmd/restage.py index 637ff95699..3fd7405f95 100644 --- a/lib/spack/spack/cmd/restage.py +++ b/lib/spack/spack/cmd/restage.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/setup.py b/lib/spack/spack/cmd/setup.py index 8f5a4fd015..e4ca38ba94 100644 --- a/lib/spack/spack/cmd/setup.py +++ b/lib/spack/spack/cmd/setup.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index b4740b4ece..b10df46ad0 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/stage.py b/lib/spack/spack/cmd/stage.py index 99c2db8a56..dbae925d62 100644 --- a/lib/spack/spack/cmd/stage.py +++ b/lib/spack/spack/cmd/stage.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py index 70aa1865af..54970f1ea2 100644 --- a/lib/spack/spack/cmd/test.py +++ b/lib/spack/spack/cmd/test.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/uninstall.py b/lib/spack/spack/cmd/uninstall.py index e95a5f3430..77029cf02c 100644 --- a/lib/spack/spack/cmd/uninstall.py +++ b/lib/spack/spack/cmd/uninstall.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/unload.py b/lib/spack/spack/cmd/unload.py index e5bf8f093e..b95c0a3d93 100644 --- a/lib/spack/spack/cmd/unload.py +++ b/lib/spack/spack/cmd/unload.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/unuse.py b/lib/spack/spack/cmd/unuse.py index 326553e0bd..613f653a18 100644 --- a/lib/spack/spack/cmd/unuse.py +++ b/lib/spack/spack/cmd/unuse.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/url.py b/lib/spack/spack/cmd/url.py index 633e345640..e4419a5252 100644 --- a/lib/spack/spack/cmd/url.py +++ b/lib/spack/spack/cmd/url.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/use.py b/lib/spack/spack/cmd/use.py index da3ded0d5a..3dbda20270 100644 --- a/lib/spack/spack/cmd/use.py +++ b/lib/spack/spack/cmd/use.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py index 0678fed8af..412a3b09a9 100644 --- a/lib/spack/spack/cmd/versions.py +++ b/lib/spack/spack/cmd/versions.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/cmd/view.py b/lib/spack/spack/cmd/view.py index 325fb0af96..a2e663366c 100644 --- a/lib/spack/spack/cmd/view.py +++ b/lib/spack/spack/cmd/view.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py index c547275d6b..362013436c 100644 --- a/lib/spack/spack/compiler.py +++ b/lib/spack/spack/compiler.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 517a0bd5e8..f3a159d6b9 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/cce.py b/lib/spack/spack/compilers/cce.py index 2a5858f4e8..038d9dfe5a 100644 --- a/lib/spack/spack/compilers/cce.py +++ b/lib/spack/spack/compilers/cce.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/clang.py b/lib/spack/spack/compilers/clang.py index dd26c5e13b..81e0babc1d 100644 --- a/lib/spack/spack/compilers/clang.py +++ b/lib/spack/spack/compilers/clang.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/gcc.py b/lib/spack/spack/compilers/gcc.py index a6c91c6ed2..70501b447f 100644 --- a/lib/spack/spack/compilers/gcc.py +++ b/lib/spack/spack/compilers/gcc.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/intel.py b/lib/spack/spack/compilers/intel.py index fb286a69d7..1959c9a661 100644 --- a/lib/spack/spack/compilers/intel.py +++ b/lib/spack/spack/compilers/intel.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/nag.py b/lib/spack/spack/compilers/nag.py index 7fb8a23e96..0b568da8ed 100644 --- a/lib/spack/spack/compilers/nag.py +++ b/lib/spack/spack/compilers/nag.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/pgi.py b/lib/spack/spack/compilers/pgi.py index 2226023954..9f0c6ce685 100644 --- a/lib/spack/spack/compilers/pgi.py +++ b/lib/spack/spack/compilers/pgi.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py index 96e9e8b4ca..1a4df820f6 100644 --- a/lib/spack/spack/compilers/xl.py +++ b/lib/spack/spack/compilers/xl.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py index b938346001..884a3c381a 100644 --- a/lib/spack/spack/concretize.py +++ b/lib/spack/spack/concretize.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py index 8b7fcf334c..4f58f7667c 100644 --- a/lib/spack/spack/config.py +++ b/lib/spack/spack/config.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/database.py b/lib/spack/spack/database.py index 6b54dc5939..2458fb412d 100644 --- a/lib/spack/spack/database.py +++ b/lib/spack/spack/database.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/directives.py b/lib/spack/spack/directives.py index 7b9a3aa953..05014fb31f 100644 --- a/lib/spack/spack/directives.py +++ b/lib/spack/spack/directives.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 5b430224d6..54fffeabfb 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py index 567e54e356..c6634849fb 100644 --- a/lib/spack/spack/environment.py +++ b/lib/spack/spack/environment.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/error.py b/lib/spack/spack/error.py index 8f54e82b11..645864822f 100644 --- a/lib/spack/spack/error.py +++ b/lib/spack/spack/error.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/fetch_strategy.py b/lib/spack/spack/fetch_strategy.py index baba038c6c..e140579d2c 100644 --- a/lib/spack/spack/fetch_strategy.py +++ b/lib/spack/spack/fetch_strategy.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/file_cache.py b/lib/spack/spack/file_cache.py index 6a6d59942e..1f21531131 100644 --- a/lib/spack/spack/file_cache.py +++ b/lib/spack/spack/file_cache.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/graph.py b/lib/spack/spack/graph.py index 09c39e75f3..4f4ef9a304 100644 --- a/lib/spack/spack/graph.py +++ b/lib/spack/spack/graph.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/__init__.py b/lib/spack/spack/hooks/__init__.py index 1dce48fdf0..ce998fb3d0 100644 --- a/lib/spack/spack/hooks/__init__.py +++ b/lib/spack/spack/hooks/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/case_consistency.py b/lib/spack/spack/hooks/case_consistency.py index f6246f6008..48f9606444 100644 --- a/lib/spack/spack/hooks/case_consistency.py +++ b/lib/spack/spack/hooks/case_consistency.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/extensions.py b/lib/spack/spack/hooks/extensions.py index f915768dd0..56c0f35376 100644 --- a/lib/spack/spack/hooks/extensions.py +++ b/lib/spack/spack/hooks/extensions.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/licensing.py b/lib/spack/spack/hooks/licensing.py index b3b379c606..da7d86ffcf 100644 --- a/lib/spack/spack/hooks/licensing.py +++ b/lib/spack/spack/hooks/licensing.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/module_file_generation.py b/lib/spack/spack/hooks/module_file_generation.py index decec3438d..0ddf79a1d3 100644 --- a/lib/spack/spack/hooks/module_file_generation.py +++ b/lib/spack/spack/hooks/module_file_generation.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/sbang.py b/lib/spack/spack/hooks/sbang.py index cd3529dbb8..653b28f60b 100644 --- a/lib/spack/spack/hooks/sbang.py +++ b/lib/spack/spack/hooks/sbang.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/hooks/yaml_version_check.py b/lib/spack/spack/hooks/yaml_version_check.py index 7264ee1e6f..74c76c9fc4 100644 --- a/lib/spack/spack/hooks/yaml_version_check.py +++ b/lib/spack/spack/hooks/yaml_version_check.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py index bfa7b858d2..06bde4de1f 100644 --- a/lib/spack/spack/mirror.py +++ b/lib/spack/spack/mirror.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py index f23baa7204..8be5842691 100644 --- a/lib/spack/spack/modules.py +++ b/lib/spack/spack/modules.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/multimethod.py b/lib/spack/spack/multimethod.py index 9b4c481326..c439141683 100644 --- a/lib/spack/spack/multimethod.py +++ b/lib/spack/spack/multimethod.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/operating_systems/__init__.py b/lib/spack/spack/operating_systems/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/operating_systems/__init__.py +++ b/lib/spack/spack/operating_systems/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/operating_systems/cnk.py b/lib/spack/spack/operating_systems/cnk.py index abd252ddcb..08a6496d86 100644 --- a/lib/spack/spack/operating_systems/cnk.py +++ b/lib/spack/spack/operating_systems/cnk.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/operating_systems/cnl.py b/lib/spack/spack/operating_systems/cnl.py index 61d50b4011..be6a9db60c 100644 --- a/lib/spack/spack/operating_systems/cnl.py +++ b/lib/spack/spack/operating_systems/cnl.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/operating_systems/cray_frontend.py b/lib/spack/spack/operating_systems/cray_frontend.py index bf3b76faf2..7328e58627 100644 --- a/lib/spack/spack/operating_systems/cray_frontend.py +++ b/lib/spack/spack/operating_systems/cray_frontend.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/operating_systems/linux_distro.py b/lib/spack/spack/operating_systems/linux_distro.py index 276235d18b..7d1e3ca00f 100644 --- a/lib/spack/spack/operating_systems/linux_distro.py +++ b/lib/spack/spack/operating_systems/linux_distro.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/operating_systems/mac_os.py b/lib/spack/spack/operating_systems/mac_os.py index ab1eb6a64b..6c02ba5528 100644 --- a/lib/spack/spack/operating_systems/mac_os.py +++ b/lib/spack/spack/operating_systems/mac_os.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index b3d619f6f3..86223688fa 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 56efb604b1..a79408df43 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/package_test.py b/lib/spack/spack/package_test.py index 3e04125e78..32c6318a0d 100644 --- a/lib/spack/spack/package_test.py +++ b/lib/spack/spack/package_test.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/parse.py b/lib/spack/spack/parse.py index 3df268d259..45b3c2d417 100644 --- a/lib/spack/spack/parse.py +++ b/lib/spack/spack/parse.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index 5742f312ce..308ad2d633 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/platforms/__init__.py b/lib/spack/spack/platforms/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/platforms/__init__.py +++ b/lib/spack/spack/platforms/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/platforms/bgq.py b/lib/spack/spack/platforms/bgq.py index 5978f20acf..7a4146cfdd 100644 --- a/lib/spack/spack/platforms/bgq.py +++ b/lib/spack/spack/platforms/bgq.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/platforms/cray.py b/lib/spack/spack/platforms/cray.py index 411eb32b1c..4ecb72d8a9 100644 --- a/lib/spack/spack/platforms/cray.py +++ b/lib/spack/spack/platforms/cray.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/platforms/darwin.py b/lib/spack/spack/platforms/darwin.py index f33b268833..b60f77b1b7 100644 --- a/lib/spack/spack/platforms/darwin.py +++ b/lib/spack/spack/platforms/darwin.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/platforms/linux.py b/lib/spack/spack/platforms/linux.py index ffbe32ddeb..1fa599ac1b 100644 --- a/lib/spack/spack/platforms/linux.py +++ b/lib/spack/spack/platforms/linux.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/platforms/test.py b/lib/spack/spack/platforms/test.py index d299508c97..3b5225b5c1 100644 --- a/lib/spack/spack/platforms/test.py +++ b/lib/spack/spack/platforms/test.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/provider_index.py b/lib/spack/spack/provider_index.py index 9e6d53e8ac..054f1ca807 100644 --- a/lib/spack/spack/provider_index.py +++ b/lib/spack/spack/provider_index.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/relocate.py b/lib/spack/spack/relocate.py index b4251d05ca..999dc23a02 100644 --- a/lib/spack/spack/relocate.py +++ b/lib/spack/spack/relocate.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/repository.py b/lib/spack/spack/repository.py index fbca9474fb..226d69748c 100644 --- a/lib/spack/spack/repository.py +++ b/lib/spack/spack/repository.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/resource.py b/lib/spack/spack/resource.py index be36216e9d..71cb8a50a9 100644 --- a/lib/spack/spack/resource.py +++ b/lib/spack/spack/resource.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/__init__.py b/lib/spack/spack/schema/__init__.py index e793ae7376..a5fc7b475c 100644 --- a/lib/spack/spack/schema/__init__.py +++ b/lib/spack/spack/schema/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/compilers.py b/lib/spack/spack/schema/compilers.py index 8ddba1fb22..9b19d7c3db 100644 --- a/lib/spack/spack/schema/compilers.py +++ b/lib/spack/spack/schema/compilers.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/config.py b/lib/spack/spack/schema/config.py index 73b59ea3c7..1049e06925 100644 --- a/lib/spack/spack/schema/config.py +++ b/lib/spack/spack/schema/config.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/mirrors.py b/lib/spack/spack/schema/mirrors.py index db3d1163db..4038075237 100644 --- a/lib/spack/spack/schema/mirrors.py +++ b/lib/spack/spack/schema/mirrors.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/modules.py b/lib/spack/spack/schema/modules.py index 4f7cedf53f..f0adafc714 100644 --- a/lib/spack/spack/schema/modules.py +++ b/lib/spack/spack/schema/modules.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/packages.py b/lib/spack/spack/schema/packages.py index 8662a43a84..b5699ad163 100644 --- a/lib/spack/spack/schema/packages.py +++ b/lib/spack/spack/schema/packages.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/schema/repos.py b/lib/spack/spack/schema/repos.py index a189941989..d831230636 100644 --- a/lib/spack/spack/schema/repos.py +++ b/lib/spack/spack/schema/repos.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 7bc0dce12a..cd4922cf53 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py index f9995bce6c..c8309124bc 100644 --- a/lib/spack/spack/stage.py +++ b/lib/spack/spack/stage.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/store.py b/lib/spack/spack/store.py index f30e06849a..06178adbd6 100644 --- a/lib/spack/spack/store.py +++ b/lib/spack/spack/store.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/__init__.py b/lib/spack/spack/test/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/test/__init__.py +++ b/lib/spack/spack/test/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py index 70cdc62685..1736c3aa9d 100644 --- a/lib/spack/spack/test/architecture.py +++ b/lib/spack/spack/test/architecture.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/build_system_guess.py b/lib/spack/spack/test/build_system_guess.py index 54431e0020..0e2cbceec3 100644 --- a/lib/spack/spack/test/build_system_guess.py +++ b/lib/spack/spack/test/build_system_guess.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/build_systems.py b/lib/spack/spack/test/build_systems.py index 3b93ed006d..114497bccd 100644 --- a/lib/spack/spack/test/build_systems.py +++ b/lib/spack/spack/test/build_systems.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cc.py b/lib/spack/spack/test/cc.py index 4b01fa3499..48f35873cb 100644 --- a/lib/spack/spack/test/cc.py +++ b/lib/spack/spack/test/cc.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/__init__.py b/lib/spack/spack/test/cmd/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/test/cmd/__init__.py +++ b/lib/spack/spack/test/cmd/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/find.py b/lib/spack/spack/test/cmd/find.py index 57dd688362..1782c7a2e2 100644 --- a/lib/spack/spack/test/cmd/find.py +++ b/lib/spack/spack/test/cmd/find.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/flake8.py b/lib/spack/spack/test/cmd/flake8.py index 65f9e509ba..8556a0a036 100644 --- a/lib/spack/spack/test/cmd/flake8.py +++ b/lib/spack/spack/test/cmd/flake8.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/gpg.py b/lib/spack/spack/test/cmd/gpg.py index 111436f24f..2ceb0852e9 100644 --- a/lib/spack/spack/test/cmd/gpg.py +++ b/lib/spack/spack/test/cmd/gpg.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 2886aa5d6a..10dedeac68 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/list.py b/lib/spack/spack/test/cmd/list.py index 244ae5fcbc..d68f4ddc73 100644 --- a/lib/spack/spack/test/cmd/list.py +++ b/lib/spack/spack/test/cmd/list.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/module.py b/lib/spack/spack/test/cmd/module.py index b8f24856be..f2847ddcef 100644 --- a/lib/spack/spack/test/cmd/module.py +++ b/lib/spack/spack/test/cmd/module.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/python.py b/lib/spack/spack/test/cmd/python.py index db9d9c5e41..3cc1ae2012 100644 --- a/lib/spack/spack/test/cmd/python.py +++ b/lib/spack/spack/test/cmd/python.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/test_compiler_cmd.py b/lib/spack/spack/test/cmd/test_compiler_cmd.py index 39898980d9..ac24df6b55 100644 --- a/lib/spack/spack/test/cmd/test_compiler_cmd.py +++ b/lib/spack/spack/test/cmd/test_compiler_cmd.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/uninstall.py b/lib/spack/spack/test/cmd/uninstall.py index 72dda23f93..df7c04dba9 100644 --- a/lib/spack/spack/test/cmd/uninstall.py +++ b/lib/spack/spack/test/cmd/uninstall.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/cmd/url.py b/lib/spack/spack/test/cmd/url.py index ab2d750dee..49b0732288 100644 --- a/lib/spack/spack/test/cmd/url.py +++ b/lib/spack/spack/test/cmd/url.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/compilers.py b/lib/spack/spack/test/compilers.py index 1bb6b41ffc..050f2118e5 100644 --- a/lib/spack/spack/test/compilers.py +++ b/lib/spack/spack/test/compilers.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 572436a4b2..8959c7459b 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index 45c037eec7..2dcc36ff27 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/config.py b/lib/spack/spack/test/config.py index d00dc64bb3..42143c3099 100644 --- a/lib/spack/spack/test/config.py +++ b/lib/spack/spack/test/config.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index f407943326..2dfcc08d91 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/data/sourceme_first.sh b/lib/spack/spack/test/data/sourceme_first.sh index 8fcec2fa3a..c50c5b7335 100644 --- a/lib/spack/spack/test/data/sourceme_first.sh +++ b/lib/spack/spack/test/data/sourceme_first.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/data/sourceme_parameters.sh b/lib/spack/spack/test/data/sourceme_parameters.sh index 5f76c62435..95ddc45722 100644 --- a/lib/spack/spack/test/data/sourceme_parameters.sh +++ b/lib/spack/spack/test/data/sourceme_parameters.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/data/sourceme_second.sh b/lib/spack/spack/test/data/sourceme_second.sh index 07c814740e..70b929c27d 100644 --- a/lib/spack/spack/test/data/sourceme_second.sh +++ b/lib/spack/spack/test/data/sourceme_second.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/data/sourceme_unicode.sh b/lib/spack/spack/test/data/sourceme_unicode.sh index 0080ee7337..2d58d50e56 100644 --- a/lib/spack/spack/test/data/sourceme_unicode.sh +++ b/lib/spack/spack/test/data/sourceme_unicode.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py index 19a7141fa3..131730e40f 100644 --- a/lib/spack/spack/test/database.py +++ b/lib/spack/spack/test/database.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index 3119f0ebed..a2609c8162 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/environment.py b/lib/spack/spack/test/environment.py index d07223221c..e94e80048f 100644 --- a/lib/spack/spack/test/environment.py +++ b/lib/spack/spack/test/environment.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/file_cache.py b/lib/spack/spack/test/file_cache.py index 6f0020f042..7c944b7165 100644 --- a/lib/spack/spack/test/file_cache.py +++ b/lib/spack/spack/test/file_cache.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/file_list.py b/lib/spack/spack/test/file_list.py index f9ae331597..66f71b4190 100644 --- a/lib/spack/spack/test/file_list.py +++ b/lib/spack/spack/test/file_list.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/git_fetch.py b/lib/spack/spack/test/git_fetch.py index 098115371f..a23177b946 100644 --- a/lib/spack/spack/test/git_fetch.py +++ b/lib/spack/spack/test/git_fetch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/graph.py b/lib/spack/spack/test/graph.py index 420c8f1180..1a4534774c 100644 --- a/lib/spack/spack/test/graph.py +++ b/lib/spack/spack/test/graph.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/hg_fetch.py b/lib/spack/spack/test/hg_fetch.py index ff1ed8862f..65ec0941d3 100644 --- a/lib/spack/spack/test/hg_fetch.py +++ b/lib/spack/spack/test/hg_fetch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py index 278b2efb70..8887de8584 100644 --- a/lib/spack/spack/test/install.py +++ b/lib/spack/spack/test/install.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/link_tree.py b/lib/spack/spack/test/link_tree.py index ae293b6e67..64836a86f3 100644 --- a/lib/spack/spack/test/link_tree.py +++ b/lib/spack/spack/test/link_tree.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/lock.py b/lib/spack/spack/test/lock.py index 347b72b575..208777ae51 100644 --- a/lib/spack/spack/test/lock.py +++ b/lib/spack/spack/test/lock.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/log.py b/lib/spack/spack/test/log.py index 9c05ed002d..4a43350f99 100644 --- a/lib/spack/spack/test/log.py +++ b/lib/spack/spack/test/log.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/make_executable.py b/lib/spack/spack/test/make_executable.py index 8eb5057fb7..f47bc1e6a3 100644 --- a/lib/spack/spack/test/make_executable.py +++ b/lib/spack/spack/test/make_executable.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/mirror.py b/lib/spack/spack/test/mirror.py index 16ea04434d..cdaef6dd30 100644 --- a/lib/spack/spack/test/mirror.py +++ b/lib/spack/spack/test/mirror.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/module_parsing.py b/lib/spack/spack/test/module_parsing.py index e563953478..63eafcca26 100644 --- a/lib/spack/spack/test/module_parsing.py +++ b/lib/spack/spack/test/module_parsing.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/modules.py b/lib/spack/spack/test/modules.py index 40841f15a7..a0af95c0a4 100644 --- a/lib/spack/spack/test/modules.py +++ b/lib/spack/spack/test/modules.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/multimethod.py b/lib/spack/spack/test/multimethod.py index 404bfe5c8b..4f6dce1ea7 100644 --- a/lib/spack/spack/test/multimethod.py +++ b/lib/spack/spack/test/multimethod.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/namespace_trie.py b/lib/spack/spack/test/namespace_trie.py index 62812856a9..194d28b891 100644 --- a/lib/spack/spack/test/namespace_trie.py +++ b/lib/spack/spack/test/namespace_trie.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/optional_deps.py b/lib/spack/spack/test/optional_deps.py index 0023fce52d..559d73a2e2 100644 --- a/lib/spack/spack/test/optional_deps.py +++ b/lib/spack/spack/test/optional_deps.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py index e8cc9571da..2cb41aa3cd 100644 --- a/lib/spack/spack/test/package_sanity.py +++ b/lib/spack/spack/test/package_sanity.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/packages.py b/lib/spack/spack/test/packages.py index 681060aad3..2fcac53201 100644 --- a/lib/spack/spack/test/packages.py +++ b/lib/spack/spack/test/packages.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/packaging.py b/lib/spack/spack/test/packaging.py index bac8bf980f..2277ec891d 100644 --- a/lib/spack/spack/test/packaging.py +++ b/lib/spack/spack/test/packaging.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/pattern.py b/lib/spack/spack/test/pattern.py index e4475546ae..409982ae54 100644 --- a/lib/spack/spack/test/pattern.py +++ b/lib/spack/spack/test/pattern.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/provider_index.py b/lib/spack/spack/test/provider_index.py index 08abea857d..54aedc527f 100644 --- a/lib/spack/spack/test/provider_index.py +++ b/lib/spack/spack/test/provider_index.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/sbang.py b/lib/spack/spack/test/sbang.py index 0962f508cc..09fcdab652 100644 --- a/lib/spack/spack/test/sbang.py +++ b/lib/spack/spack/test/sbang.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/spack_yaml.py b/lib/spack/spack/test/spack_yaml.py index 742d934e76..441e83028c 100644 --- a/lib/spack/spack/test/spack_yaml.py +++ b/lib/spack/spack/test/spack_yaml.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py index 0d04cb5b0c..90c7b89c5f 100644 --- a/lib/spack/spack/test/spec_dag.py +++ b/lib/spack/spack/test/spec_dag.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 2c7c1d22ed..e2219e3270 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/spec_syntax.py b/lib/spack/spack/test/spec_syntax.py index 5d1ace6b86..0985078eee 100644 --- a/lib/spack/spack/test/spec_syntax.py +++ b/lib/spack/spack/test/spec_syntax.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py index 52007383c6..b19611b61c 100644 --- a/lib/spack/spack/test/spec_yaml.py +++ b/lib/spack/spack/test/spec_yaml.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/stage.py b/lib/spack/spack/test/stage.py index 62605452c6..d6d2eeb506 100644 --- a/lib/spack/spack/test/stage.py +++ b/lib/spack/spack/test/stage.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/svn_fetch.py b/lib/spack/spack/test/svn_fetch.py index bef5db76de..2b13d2b4f1 100644 --- a/lib/spack/spack/test/svn_fetch.py +++ b/lib/spack/spack/test/svn_fetch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/url_fetch.py b/lib/spack/spack/test/url_fetch.py index ff9f96070c..c51037a254 100644 --- a/lib/spack/spack/test/url_fetch.py +++ b/lib/spack/spack/test/url_fetch.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/url_parse.py b/lib/spack/spack/test/url_parse.py index 5749ff2d6e..3798221cef 100644 --- a/lib/spack/spack/test/url_parse.py +++ b/lib/spack/spack/test/url_parse.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/url_substitution.py b/lib/spack/spack/test/url_substitution.py index 1a54af1e3c..1a28a10413 100644 --- a/lib/spack/spack/test/url_substitution.py +++ b/lib/spack/spack/test/url_substitution.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/util/prefix.py b/lib/spack/spack/test/util/prefix.py index 8e8f7c84f9..c01405b5c2 100644 --- a/lib/spack/spack/test/util/prefix.py +++ b/lib/spack/spack/test/util/prefix.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/variant.py b/lib/spack/spack/test/variant.py index 6fb08bff13..b7117f02ce 100644 --- a/lib/spack/spack/test/variant.py +++ b/lib/spack/spack/test/variant.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py index 72292e4dcd..4298cdc2b0 100644 --- a/lib/spack/spack/test/versions.py +++ b/lib/spack/spack/test/versions.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/test/web.py b/lib/spack/spack/test/web.py index d50e0e3d54..80a8cc036d 100644 --- a/lib/spack/spack/test/web.py +++ b/lib/spack/spack/test/web.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py index 67a58cdd12..7c8024c986 100644 --- a/lib/spack/spack/url.py +++ b/lib/spack/spack/url.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/__init__.py b/lib/spack/spack/util/__init__.py index 445b6fdbd7..5f81c93825 100644 --- a/lib/spack/spack/util/__init__.py +++ b/lib/spack/spack/util/__init__.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/compression.py b/lib/spack/spack/util/compression.py index bfff66fb07..020776a98d 100644 --- a/lib/spack/spack/util/compression.py +++ b/lib/spack/spack/util/compression.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/crypto.py b/lib/spack/spack/util/crypto.py index 65ffa40963..af7e8e7184 100644 --- a/lib/spack/spack/util/crypto.py +++ b/lib/spack/spack/util/crypto.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/debug.py b/lib/spack/spack/util/debug.py index 2b7e540fd3..f72a99486b 100644 --- a/lib/spack/spack/util/debug.py +++ b/lib/spack/spack/util/debug.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index 6bd5c61e79..276f8d63f3 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/executable.py b/lib/spack/spack/util/executable.py index 5fd40790ed..157d4a21e4 100644 --- a/lib/spack/spack/util/executable.py +++ b/lib/spack/spack/util/executable.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/gpg.py b/lib/spack/spack/util/gpg.py index ebb14a71f6..fa6be5b8c7 100644 --- a/lib/spack/spack/util/gpg.py +++ b/lib/spack/spack/util/gpg.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/module_cmd.py b/lib/spack/spack/util/module_cmd.py index 87ccd79fd6..c2448aa278 100644 --- a/lib/spack/spack/util/module_cmd.py +++ b/lib/spack/spack/util/module_cmd.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/multiproc.py b/lib/spack/spack/util/multiproc.py index 559ed19eec..2f34f9b810 100644 --- a/lib/spack/spack/util/multiproc.py +++ b/lib/spack/spack/util/multiproc.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/naming.py b/lib/spack/spack/util/naming.py index d7ff920559..d7a0a098c7 100644 --- a/lib/spack/spack/util/naming.py +++ b/lib/spack/spack/util/naming.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/path.py b/lib/spack/spack/util/path.py index edfd915c65..99d4cd68e3 100644 --- a/lib/spack/spack/util/path.py +++ b/lib/spack/spack/util/path.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/pattern.py b/lib/spack/spack/util/pattern.py index 7400ba73aa..ac61c36fa0 100644 --- a/lib/spack/spack/util/pattern.py +++ b/lib/spack/spack/util/pattern.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/prefix.py b/lib/spack/spack/util/prefix.py index 479956b1c5..e582212718 100644 --- a/lib/spack/spack/util/prefix.py +++ b/lib/spack/spack/util/prefix.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/spack_json.py b/lib/spack/spack/util/spack_json.py index 50d3f7005d..3ea045de0e 100644 --- a/lib/spack/spack/util/spack_json.py +++ b/lib/spack/spack/util/spack_json.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/spack_yaml.py b/lib/spack/spack/util/spack_yaml.py index 58e82f6508..f0a0f20856 100644 --- a/lib/spack/spack/util/spack_yaml.py +++ b/lib/spack/spack/util/spack_yaml.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/string.py b/lib/spack/spack/util/string.py index 9f3fd63702..3b33db9333 100644 --- a/lib/spack/spack/util/string.py +++ b/lib/spack/spack/util/string.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/util/web.py b/lib/spack/spack/util/web.py index 3fd38c22cf..842a3db07e 100644 --- a/lib/spack/spack/util/web.py +++ b/lib/spack/spack/util/web.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index 1361fb5152..0d75b83ebc 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py index 3414c9c8d9..ec77f4d386 100644 --- a/lib/spack/spack/version.py +++ b/lib/spack/spack/version.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/share/spack/setup-env.csh b/share/spack/setup-env.csh index 7d933315a6..c0f82bd0ae 100755 --- a/share/spack/setup-env.csh +++ b/share/spack/setup-env.csh @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh index 232d824170..c9a3858621 100755 --- a/share/spack/setup-env.sh +++ b/share/spack/setup-env.sh @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 4eb1c1c038..044ea448fd 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index 037b322f10..dc078d2434 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/b/package.py b/var/spack/repos/builtin.mock/packages/b/package.py index f89481d70b..818d87e770 100644 --- a/var/spack/repos/builtin.mock/packages/b/package.py +++ b/var/spack/repos/builtin.mock/packages/b/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/boost/package.py b/var/spack/repos/builtin.mock/packages/boost/package.py index 60cc915e2e..ed048509ca 100644 --- a/var/spack/repos/builtin.mock/packages/boost/package.py +++ b/var/spack/repos/builtin.mock/packages/boost/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/c/package.py b/var/spack/repos/builtin.mock/packages/c/package.py index 1037861b93..a4fc7ab8b6 100644 --- a/var/spack/repos/builtin.mock/packages/c/package.py +++ b/var/spack/repos/builtin.mock/packages/c/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/callpath/package.py b/var/spack/repos/builtin.mock/packages/callpath/package.py index 40c8565ab6..c60621a9da 100644 --- a/var/spack/repos/builtin.mock/packages/callpath/package.py +++ b/var/spack/repos/builtin.mock/packages/callpath/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/canfail/package.py b/var/spack/repos/builtin.mock/packages/canfail/package.py index 5b4135b33f..60272a529d 100644 --- a/var/spack/repos/builtin.mock/packages/canfail/package.py +++ b/var/spack/repos/builtin.mock/packages/canfail/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/cmake-client/package.py b/var/spack/repos/builtin.mock/packages/cmake-client/package.py index 8b09422487..c889900ead 100644 --- a/var/spack/repos/builtin.mock/packages/cmake-client/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake-client/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/cmake/package.py b/var/spack/repos/builtin.mock/packages/cmake/package.py index 8dc1397fc8..c3674cea64 100644 --- a/var/spack/repos/builtin.mock/packages/cmake/package.py +++ b/var/spack/repos/builtin.mock/packages/cmake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py index a5865a90e3..7cbcc218f3 100644 --- a/var/spack/repos/builtin.mock/packages/conflict-parent/package.py +++ b/var/spack/repos/builtin.mock/packages/conflict-parent/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/conflict/package.py b/var/spack/repos/builtin.mock/packages/conflict/package.py index e13b34dcc5..0b45018872 100644 --- a/var/spack/repos/builtin.mock/packages/conflict/package.py +++ b/var/spack/repos/builtin.mock/packages/conflict/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/develop-test/package.py b/var/spack/repos/builtin.mock/packages/develop-test/package.py index b9c9dad852..8ce6cfa3c3 100644 --- a/var/spack/repos/builtin.mock/packages/develop-test/package.py +++ b/var/spack/repos/builtin.mock/packages/develop-test/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/direct-mpich/package.py b/var/spack/repos/builtin.mock/packages/direct-mpich/package.py index 4c02338bc2..fb4c9c2620 100644 --- a/var/spack/repos/builtin.mock/packages/direct-mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/direct-mpich/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py index 1b7ba0e2d7..534f0e64a5 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-bottom/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py index 6096d552d8..9203e2d1d1 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-left/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py index 6b77ec5a0a..fbb77d6588 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond-right/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dt-diamond/package.py b/var/spack/repos/builtin.mock/packages/dt-diamond/package.py index 19530360ad..bc479fb3ba 100644 --- a/var/spack/repos/builtin.mock/packages/dt-diamond/package.py +++ b/var/spack/repos/builtin.mock/packages/dt-diamond/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtbuild1/package.py b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py index 7416718ce8..05932ef39b 100644 --- a/var/spack/repos/builtin.mock/packages/dtbuild1/package.py +++ b/var/spack/repos/builtin.mock/packages/dtbuild1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtbuild2/package.py b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py index 5f22364447..51a05a15a3 100644 --- a/var/spack/repos/builtin.mock/packages/dtbuild2/package.py +++ b/var/spack/repos/builtin.mock/packages/dtbuild2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtbuild3/package.py b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py index 070dac9d45..96ae094b44 100644 --- a/var/spack/repos/builtin.mock/packages/dtbuild3/package.py +++ b/var/spack/repos/builtin.mock/packages/dtbuild3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtlink1/package.py b/var/spack/repos/builtin.mock/packages/dtlink1/package.py index 4cd5b24394..7c03b0fa62 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink1/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtlink2/package.py b/var/spack/repos/builtin.mock/packages/dtlink2/package.py index a34317c364..7c76191d12 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink2/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtlink3/package.py b/var/spack/repos/builtin.mock/packages/dtlink3/package.py index 433ceeeec2..d5a779267a 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink3/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtlink4/package.py b/var/spack/repos/builtin.mock/packages/dtlink4/package.py index f694b7882f..27c3df6433 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink4/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtlink5/package.py b/var/spack/repos/builtin.mock/packages/dtlink5/package.py index f03556a428..85d0ba5cc2 100644 --- a/var/spack/repos/builtin.mock/packages/dtlink5/package.py +++ b/var/spack/repos/builtin.mock/packages/dtlink5/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtrun1/package.py b/var/spack/repos/builtin.mock/packages/dtrun1/package.py index a0a29804db..01ee04185f 100644 --- a/var/spack/repos/builtin.mock/packages/dtrun1/package.py +++ b/var/spack/repos/builtin.mock/packages/dtrun1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtrun2/package.py b/var/spack/repos/builtin.mock/packages/dtrun2/package.py index 15bfa4aed7..826393c2f3 100644 --- a/var/spack/repos/builtin.mock/packages/dtrun2/package.py +++ b/var/spack/repos/builtin.mock/packages/dtrun2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtrun3/package.py b/var/spack/repos/builtin.mock/packages/dtrun3/package.py index e4519286b5..1221a02a5f 100644 --- a/var/spack/repos/builtin.mock/packages/dtrun3/package.py +++ b/var/spack/repos/builtin.mock/packages/dtrun3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dttop/package.py b/var/spack/repos/builtin.mock/packages/dttop/package.py index be29daeb30..4d9ec5b2ee 100644 --- a/var/spack/repos/builtin.mock/packages/dttop/package.py +++ b/var/spack/repos/builtin.mock/packages/dttop/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dtuse/package.py b/var/spack/repos/builtin.mock/packages/dtuse/package.py index 8c2a85c126..8469ce2b0d 100644 --- a/var/spack/repos/builtin.mock/packages/dtuse/package.py +++ b/var/spack/repos/builtin.mock/packages/dtuse/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/dyninst/package.py b/var/spack/repos/builtin.mock/packages/dyninst/package.py index 009fdb7c2c..ad17edc886 100644 --- a/var/spack/repos/builtin.mock/packages/dyninst/package.py +++ b/var/spack/repos/builtin.mock/packages/dyninst/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/e/package.py b/var/spack/repos/builtin.mock/packages/e/package.py index 6edc27f903..c15c852dc4 100644 --- a/var/spack/repos/builtin.mock/packages/e/package.py +++ b/var/spack/repos/builtin.mock/packages/e/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/extendee/package.py b/var/spack/repos/builtin.mock/packages/extendee/package.py index fc2ae16ae6..fe55462360 100644 --- a/var/spack/repos/builtin.mock/packages/extendee/package.py +++ b/var/spack/repos/builtin.mock/packages/extendee/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/extension1/package.py b/var/spack/repos/builtin.mock/packages/extension1/package.py index ea07e08119..3fc291f584 100644 --- a/var/spack/repos/builtin.mock/packages/extension1/package.py +++ b/var/spack/repos/builtin.mock/packages/extension1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/extension2/package.py b/var/spack/repos/builtin.mock/packages/extension2/package.py index ab959a20a8..f3d1a39294 100644 --- a/var/spack/repos/builtin.mock/packages/extension2/package.py +++ b/var/spack/repos/builtin.mock/packages/extension2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/externalmodule/package.py b/var/spack/repos/builtin.mock/packages/externalmodule/package.py index 1fc59f67bc..28c1a03a74 100644 --- a/var/spack/repos/builtin.mock/packages/externalmodule/package.py +++ b/var/spack/repos/builtin.mock/packages/externalmodule/package.py @@ -1,6 +1,6 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/externalprereq/package.py b/var/spack/repos/builtin.mock/packages/externalprereq/package.py index caf44e1ba8..4859134cbb 100644 --- a/var/spack/repos/builtin.mock/packages/externalprereq/package.py +++ b/var/spack/repos/builtin.mock/packages/externalprereq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/externaltest/package.py b/var/spack/repos/builtin.mock/packages/externaltest/package.py index bbf47cedfd..923a371c1d 100644 --- a/var/spack/repos/builtin.mock/packages/externaltest/package.py +++ b/var/spack/repos/builtin.mock/packages/externaltest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/externaltool/package.py b/var/spack/repos/builtin.mock/packages/externaltool/package.py index 925188a646..049f82d98f 100644 --- a/var/spack/repos/builtin.mock/packages/externaltool/package.py +++ b/var/spack/repos/builtin.mock/packages/externaltool/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/externalvirtual/package.py b/var/spack/repos/builtin.mock/packages/externalvirtual/package.py index 292ff9de41..3e0f1d49ce 100644 --- a/var/spack/repos/builtin.mock/packages/externalvirtual/package.py +++ b/var/spack/repos/builtin.mock/packages/externalvirtual/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/failing-build/package.py b/var/spack/repos/builtin.mock/packages/failing-build/package.py index d7d16db78e..237e9d2b6f 100644 --- a/var/spack/repos/builtin.mock/packages/failing-build/package.py +++ b/var/spack/repos/builtin.mock/packages/failing-build/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/fake/package.py b/var/spack/repos/builtin.mock/packages/fake/package.py index e1cc33dbf2..55adeb0c28 100644 --- a/var/spack/repos/builtin.mock/packages/fake/package.py +++ b/var/spack/repos/builtin.mock/packages/fake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/flake8/package.py b/var/spack/repos/builtin.mock/packages/flake8/package.py index db425e82ee..09356c4210 100644 --- a/var/spack/repos/builtin.mock/packages/flake8/package.py +++ b/var/spack/repos/builtin.mock/packages/flake8/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/git-test/package.py b/var/spack/repos/builtin.mock/packages/git-test/package.py index 83b94c0d65..4993176107 100644 --- a/var/spack/repos/builtin.mock/packages/git-test/package.py +++ b/var/spack/repos/builtin.mock/packages/git-test/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/hg-test/package.py b/var/spack/repos/builtin.mock/packages/hg-test/package.py index 50f6fef0a6..6a674979a8 100644 --- a/var/spack/repos/builtin.mock/packages/hg-test/package.py +++ b/var/spack/repos/builtin.mock/packages/hg-test/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/hypre/package.py b/var/spack/repos/builtin.mock/packages/hypre/package.py index a620b1b14c..301975e87b 100644 --- a/var/spack/repos/builtin.mock/packages/hypre/package.py +++ b/var/spack/repos/builtin.mock/packages/hypre/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py b/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py index 1a56a260f3..4d2898f48a 100644 --- a/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/indirect-mpich/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/libdwarf/package.py b/var/spack/repos/builtin.mock/packages/libdwarf/package.py index 0cdbaf2a33..6fb0933792 100644 --- a/var/spack/repos/builtin.mock/packages/libdwarf/package.py +++ b/var/spack/repos/builtin.mock/packages/libdwarf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/libelf/package.py b/var/spack/repos/builtin.mock/packages/libelf/package.py index 0390963081..898f9b1f0e 100644 --- a/var/spack/repos/builtin.mock/packages/libelf/package.py +++ b/var/spack/repos/builtin.mock/packages/libelf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/mixedversions/package.py b/var/spack/repos/builtin.mock/packages/mixedversions/package.py index 5b56eb004d..108c1feb07 100644 --- a/var/spack/repos/builtin.mock/packages/mixedversions/package.py +++ b/var/spack/repos/builtin.mock/packages/mixedversions/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/mpich/package.py b/var/spack/repos/builtin.mock/packages/mpich/package.py index 844cfb940c..6568cffc6a 100644 --- a/var/spack/repos/builtin.mock/packages/mpich/package.py +++ b/var/spack/repos/builtin.mock/packages/mpich/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/mpich2/package.py b/var/spack/repos/builtin.mock/packages/mpich2/package.py index aabd5232d7..ecf1bfda5c 100644 --- a/var/spack/repos/builtin.mock/packages/mpich2/package.py +++ b/var/spack/repos/builtin.mock/packages/mpich2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/mpileaks/package.py b/var/spack/repos/builtin.mock/packages/mpileaks/package.py index 31cf0bd2b9..2fd5dc0e71 100644 --- a/var/spack/repos/builtin.mock/packages/mpileaks/package.py +++ b/var/spack/repos/builtin.mock/packages/mpileaks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py b/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py index a2425eaaa1..c22c025a84 100644 --- a/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py +++ b/var/spack/repos/builtin.mock/packages/multi-provider-mpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/multimethod/package.py b/var/spack/repos/builtin.mock/packages/multimethod/package.py index fa8d4b0342..ee3e313986 100644 --- a/var/spack/repos/builtin.mock/packages/multimethod/package.py +++ b/var/spack/repos/builtin.mock/packages/multimethod/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py index 946b9893d8..d85416c354 100644 --- a/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py +++ b/var/spack/repos/builtin.mock/packages/multivalue_variant/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/netlib-blas/package.py b/var/spack/repos/builtin.mock/packages/netlib-blas/package.py index a1f3cfcb2b..f818b9142a 100644 --- a/var/spack/repos/builtin.mock/packages/netlib-blas/package.py +++ b/var/spack/repos/builtin.mock/packages/netlib-blas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py b/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py index 820a6b681e..216802fb00 100644 --- a/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py +++ b/var/spack/repos/builtin.mock/packages/netlib-lapack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py b/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py index 5e47081641..3e37e67ed0 100644 --- a/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py +++ b/var/spack/repos/builtin.mock/packages/openblas-with-lapack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/openblas/package.py b/var/spack/repos/builtin.mock/packages/openblas/package.py index 58c6ec78d2..fb4893e3f2 100644 --- a/var/spack/repos/builtin.mock/packages/openblas/package.py +++ b/var/spack/repos/builtin.mock/packages/openblas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py index 5838ffb792..e28e8a47cb 100644 --- a/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py +++ b/var/spack/repos/builtin.mock/packages/optional-dep-test-2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py index 51b7fa028a..6712c5d3af 100644 --- a/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py +++ b/var/spack/repos/builtin.mock/packages/optional-dep-test-3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py b/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py index 165adec23a..7f54058354 100644 --- a/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py +++ b/var/spack/repos/builtin.mock/packages/optional-dep-test/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/othervirtual/package.py b/var/spack/repos/builtin.mock/packages/othervirtual/package.py index 5b019cfdb2..16f7539312 100644 --- a/var/spack/repos/builtin.mock/packages/othervirtual/package.py +++ b/var/spack/repos/builtin.mock/packages/othervirtual/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/patchelf/package.py b/var/spack/repos/builtin.mock/packages/patchelf/package.py index 915f3df0c6..db1b981085 100644 --- a/var/spack/repos/builtin.mock/packages/patchelf/package.py +++ b/var/spack/repos/builtin.mock/packages/patchelf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/python/package.py b/var/spack/repos/builtin.mock/packages/python/package.py index da33e66f87..3dce9ab3b7 100644 --- a/var/spack/repos/builtin.mock/packages/python/package.py +++ b/var/spack/repos/builtin.mock/packages/python/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py b/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py index c6630927c7..e21a72a23a 100644 --- a/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py +++ b/var/spack/repos/builtin.mock/packages/singlevalue-variant-dependent/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/svn-test/package.py b/var/spack/repos/builtin.mock/packages/svn-test/package.py index a24057f089..9c5bb356f8 100644 --- a/var/spack/repos/builtin.mock/packages/svn-test/package.py +++ b/var/spack/repos/builtin.mock/packages/svn-test/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py b/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py index 58c52ec892..1609ad1086 100644 --- a/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py +++ b/var/spack/repos/builtin.mock/packages/trivial-install-test-package/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin.mock/packages/zmpi/package.py b/var/spack/repos/builtin.mock/packages/zmpi/package.py index 1e5b0a6706..4add0f3737 100644 --- a/var/spack/repos/builtin.mock/packages/zmpi/package.py +++ b/var/spack/repos/builtin.mock/packages/zmpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py index 66157b3546..de9d466053 100644 --- a/var/spack/repos/builtin/packages/abinit/package.py +++ b/var/spack/repos/builtin/packages/abinit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/abyss/package.py b/var/spack/repos/builtin/packages/abyss/package.py index f3a9f27748..24bef9f799 100644 --- a/var/spack/repos/builtin/packages/abyss/package.py +++ b/var/spack/repos/builtin/packages/abyss/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ack/package.py b/var/spack/repos/builtin/packages/ack/package.py index 7a81177814..9aacab1b3c 100644 --- a/var/spack/repos/builtin/packages/ack/package.py +++ b/var/spack/repos/builtin/packages/ack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/activeharmony/package.py b/var/spack/repos/builtin/packages/activeharmony/package.py index 25720e8bcb..ece7c8b4dc 100644 --- a/var/spack/repos/builtin/packages/activeharmony/package.py +++ b/var/spack/repos/builtin/packages/activeharmony/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/adept-utils/package.py b/var/spack/repos/builtin/packages/adept-utils/package.py index ab1a4ca861..b4790391bb 100644 --- a/var/spack/repos/builtin/packages/adept-utils/package.py +++ b/var/spack/repos/builtin/packages/adept-utils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/adios/package.py b/var/spack/repos/builtin/packages/adios/package.py index cebd90144f..74e1166e96 100644 --- a/var/spack/repos/builtin/packages/adios/package.py +++ b/var/spack/repos/builtin/packages/adios/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/adlbx/package.py b/var/spack/repos/builtin/packages/adlbx/package.py index 6793d68c33..2f9b924ca4 100644 --- a/var/spack/repos/builtin/packages/adlbx/package.py +++ b/var/spack/repos/builtin/packages/adlbx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/adol-c/package.py b/var/spack/repos/builtin/packages/adol-c/package.py index 1f9850b4c8..af7cf4b933 100644 --- a/var/spack/repos/builtin/packages/adol-c/package.py +++ b/var/spack/repos/builtin/packages/adol-c/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/albert/package.py b/var/spack/repos/builtin/packages/albert/package.py index 7375e512a9..686a73e9df 100644 --- a/var/spack/repos/builtin/packages/albert/package.py +++ b/var/spack/repos/builtin/packages/albert/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/alglib/package.py b/var/spack/repos/builtin/packages/alglib/package.py index d617290e62..9a9149fe70 100644 --- a/var/spack/repos/builtin/packages/alglib/package.py +++ b/var/spack/repos/builtin/packages/alglib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/allinea-forge/package.py b/var/spack/repos/builtin/packages/allinea-forge/package.py index a415418923..f0d9466f74 100644 --- a/var/spack/repos/builtin/packages/allinea-forge/package.py +++ b/var/spack/repos/builtin/packages/allinea-forge/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/allinea-reports/package.py b/var/spack/repos/builtin/packages/allinea-reports/package.py index c4fd278648..1994dc7e34 100644 --- a/var/spack/repos/builtin/packages/allinea-reports/package.py +++ b/var/spack/repos/builtin/packages/allinea-reports/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/allpaths-lg/package.py b/var/spack/repos/builtin/packages/allpaths-lg/package.py index cba8002d15..89f502d3ce 100644 --- a/var/spack/repos/builtin/packages/allpaths-lg/package.py +++ b/var/spack/repos/builtin/packages/allpaths-lg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/alquimia/package.py b/var/spack/repos/builtin/packages/alquimia/package.py index cadea3cb3c..aed0098aba 100644 --- a/var/spack/repos/builtin/packages/alquimia/package.py +++ b/var/spack/repos/builtin/packages/alquimia/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/alsa-lib/package.py b/var/spack/repos/builtin/packages/alsa-lib/package.py index 8d92b398e8..66f5c2176a 100644 --- a/var/spack/repos/builtin/packages/alsa-lib/package.py +++ b/var/spack/repos/builtin/packages/alsa-lib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/amg2013/package.py b/var/spack/repos/builtin/packages/amg2013/package.py index 5e1ef46df8..de5e7f4d76 100644 --- a/var/spack/repos/builtin/packages/amg2013/package.py +++ b/var/spack/repos/builtin/packages/amg2013/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ampliconnoise/package.py b/var/spack/repos/builtin/packages/ampliconnoise/package.py index 7051ae0008..72b592e986 100644 --- a/var/spack/repos/builtin/packages/ampliconnoise/package.py +++ b/var/spack/repos/builtin/packages/ampliconnoise/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/amr-exp-parabolic/package.py b/var/spack/repos/builtin/packages/amr-exp-parabolic/package.py index 47e400e18f..199f859098 100644 --- a/var/spack/repos/builtin/packages/amr-exp-parabolic/package.py +++ b/var/spack/repos/builtin/packages/amr-exp-parabolic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/amrex/package.py b/var/spack/repos/builtin/packages/amrex/package.py index 772bbce3a5..0cf62dc5e5 100644 --- a/var/spack/repos/builtin/packages/amrex/package.py +++ b/var/spack/repos/builtin/packages/amrex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/andi/package.py b/var/spack/repos/builtin/packages/andi/package.py index 092f5021cc..0f9360d0ba 100644 --- a/var/spack/repos/builtin/packages/andi/package.py +++ b/var/spack/repos/builtin/packages/andi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/angsd/package.py b/var/spack/repos/builtin/packages/angsd/package.py index 21ad31c957..f3ddfbcaaa 100644 --- a/var/spack/repos/builtin/packages/angsd/package.py +++ b/var/spack/repos/builtin/packages/angsd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ant/package.py b/var/spack/repos/builtin/packages/ant/package.py index a2ba25f3ac..acedf64f5d 100644 --- a/var/spack/repos/builtin/packages/ant/package.py +++ b/var/spack/repos/builtin/packages/ant/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/antlr/package.py b/var/spack/repos/builtin/packages/antlr/package.py index b2e2b0a6a5..06a18cbe29 100644 --- a/var/spack/repos/builtin/packages/antlr/package.py +++ b/var/spack/repos/builtin/packages/antlr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ape/package.py b/var/spack/repos/builtin/packages/ape/package.py index 05a08257a1..29fd5bf2ed 100644 --- a/var/spack/repos/builtin/packages/ape/package.py +++ b/var/spack/repos/builtin/packages/ape/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/apex/package.py b/var/spack/repos/builtin/packages/apex/package.py index 0c04968a67..d9918803a4 100644 --- a/var/spack/repos/builtin/packages/apex/package.py +++ b/var/spack/repos/builtin/packages/apex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/applewmproto/package.py b/var/spack/repos/builtin/packages/applewmproto/package.py index 805eeb33cc..4ca4a1f9b3 100644 --- a/var/spack/repos/builtin/packages/applewmproto/package.py +++ b/var/spack/repos/builtin/packages/applewmproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/appres/package.py b/var/spack/repos/builtin/packages/appres/package.py index e98004ce9a..f4517a6b3d 100644 --- a/var/spack/repos/builtin/packages/appres/package.py +++ b/var/spack/repos/builtin/packages/appres/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/apr-util/package.py b/var/spack/repos/builtin/packages/apr-util/package.py index 6330daa4d7..3e3c1cf77e 100644 --- a/var/spack/repos/builtin/packages/apr-util/package.py +++ b/var/spack/repos/builtin/packages/apr-util/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/apr/package.py b/var/spack/repos/builtin/packages/apr/package.py index 45b000854e..8ec05fe5fd 100644 --- a/var/spack/repos/builtin/packages/apr/package.py +++ b/var/spack/repos/builtin/packages/apr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/archer/package.py b/var/spack/repos/builtin/packages/archer/package.py index f5e4fbf8c1..6b9464fc2f 100644 --- a/var/spack/repos/builtin/packages/archer/package.py +++ b/var/spack/repos/builtin/packages/archer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/argtable/package.py b/var/spack/repos/builtin/packages/argtable/package.py index a7ffb886da..1da9f8fe22 100644 --- a/var/spack/repos/builtin/packages/argtable/package.py +++ b/var/spack/repos/builtin/packages/argtable/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/armadillo/package.py b/var/spack/repos/builtin/packages/armadillo/package.py index a3c9c2bf3f..2658171925 100644 --- a/var/spack/repos/builtin/packages/armadillo/package.py +++ b/var/spack/repos/builtin/packages/armadillo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/arpack-ng/package.py b/var/spack/repos/builtin/packages/arpack-ng/package.py index 6b6f6271c4..790a4d5e9f 100644 --- a/var/spack/repos/builtin/packages/arpack-ng/package.py +++ b/var/spack/repos/builtin/packages/arpack-ng/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/arpack/package.py b/var/spack/repos/builtin/packages/arpack/package.py index 67ab050236..3e03d0cfd7 100644 --- a/var/spack/repos/builtin/packages/arpack/package.py +++ b/var/spack/repos/builtin/packages/arpack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/asciidoc/package.py b/var/spack/repos/builtin/packages/asciidoc/package.py index 9d8de2b763..2ce219ac7e 100644 --- a/var/spack/repos/builtin/packages/asciidoc/package.py +++ b/var/spack/repos/builtin/packages/asciidoc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/aspa/package.py b/var/spack/repos/builtin/packages/aspa/package.py index 3b0e0e4c26..3a6bf6867f 100644 --- a/var/spack/repos/builtin/packages/aspa/package.py +++ b/var/spack/repos/builtin/packages/aspa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/astra/package.py b/var/spack/repos/builtin/packages/astra/package.py index 1358657f83..df5b8dec6e 100644 --- a/var/spack/repos/builtin/packages/astra/package.py +++ b/var/spack/repos/builtin/packages/astra/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/astral/package.py b/var/spack/repos/builtin/packages/astral/package.py index 79feeca07a..e48ccfed97 100644 --- a/var/spack/repos/builtin/packages/astral/package.py +++ b/var/spack/repos/builtin/packages/astral/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/astyle/package.py b/var/spack/repos/builtin/packages/astyle/package.py index 3bc31ddfdf..2bd131dfe1 100644 --- a/var/spack/repos/builtin/packages/astyle/package.py +++ b/var/spack/repos/builtin/packages/astyle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/atk/package.py b/var/spack/repos/builtin/packages/atk/package.py index 1cccca2668..db8a66c46f 100644 --- a/var/spack/repos/builtin/packages/atk/package.py +++ b/var/spack/repos/builtin/packages/atk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/atlas/package.py b/var/spack/repos/builtin/packages/atlas/package.py index af2d0ff111..d3865f6156 100644 --- a/var/spack/repos/builtin/packages/atlas/package.py +++ b/var/spack/repos/builtin/packages/atlas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/atompaw/package.py b/var/spack/repos/builtin/packages/atompaw/package.py index 016681bf49..e9d8dec553 100644 --- a/var/spack/repos/builtin/packages/atompaw/package.py +++ b/var/spack/repos/builtin/packages/atompaw/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/atop/package.py b/var/spack/repos/builtin/packages/atop/package.py index 396220962c..30f508f150 100644 --- a/var/spack/repos/builtin/packages/atop/package.py +++ b/var/spack/repos/builtin/packages/atop/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/augustus/package.py b/var/spack/repos/builtin/packages/augustus/package.py index 8a90de639e..69e72a062f 100644 --- a/var/spack/repos/builtin/packages/augustus/package.py +++ b/var/spack/repos/builtin/packages/augustus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/autoconf/package.py b/var/spack/repos/builtin/packages/autoconf/package.py index 9d7aed4c00..c576056d38 100644 --- a/var/spack/repos/builtin/packages/autoconf/package.py +++ b/var/spack/repos/builtin/packages/autoconf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/autogen/package.py b/var/spack/repos/builtin/packages/autogen/package.py index 39fc6a4cc6..5946dc95e2 100644 --- a/var/spack/repos/builtin/packages/autogen/package.py +++ b/var/spack/repos/builtin/packages/autogen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/automaded/package.py b/var/spack/repos/builtin/packages/automaded/package.py index 1d84a4f6f4..64ddbf1659 100644 --- a/var/spack/repos/builtin/packages/automaded/package.py +++ b/var/spack/repos/builtin/packages/automaded/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/automake/package.py b/var/spack/repos/builtin/packages/automake/package.py index 4a38712db9..deaf363b20 100644 --- a/var/spack/repos/builtin/packages/automake/package.py +++ b/var/spack/repos/builtin/packages/automake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bamtools/package.py b/var/spack/repos/builtin/packages/bamtools/package.py index f29af2618d..250c211c9e 100644 --- a/var/spack/repos/builtin/packages/bamtools/package.py +++ b/var/spack/repos/builtin/packages/bamtools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bamutil/package.py b/var/spack/repos/builtin/packages/bamutil/package.py index 164e0438de..a8f273d8c7 100644 --- a/var/spack/repos/builtin/packages/bamutil/package.py +++ b/var/spack/repos/builtin/packages/bamutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bash-completion/package.py b/var/spack/repos/builtin/packages/bash-completion/package.py index 680ac71ad1..a45a1172b2 100644 --- a/var/spack/repos/builtin/packages/bash-completion/package.py +++ b/var/spack/repos/builtin/packages/bash-completion/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bash/package.py b/var/spack/repos/builtin/packages/bash/package.py index 86675fc4bf..f83e78b8c5 100644 --- a/var/spack/repos/builtin/packages/bash/package.py +++ b/var/spack/repos/builtin/packages/bash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bats/package.py b/var/spack/repos/builtin/packages/bats/package.py index bcbb55bf16..27ecda4650 100644 --- a/var/spack/repos/builtin/packages/bats/package.py +++ b/var/spack/repos/builtin/packages/bats/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bazel/package.py b/var/spack/repos/builtin/packages/bazel/package.py index a9573dbe2b..50154c6434 100644 --- a/var/spack/repos/builtin/packages/bazel/package.py +++ b/var/spack/repos/builtin/packages/bazel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bbcp/package.py b/var/spack/repos/builtin/packages/bbcp/package.py index 76aef3d20c..f7b255ab8d 100644 --- a/var/spack/repos/builtin/packages/bbcp/package.py +++ b/var/spack/repos/builtin/packages/bbcp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bcftools/package.py b/var/spack/repos/builtin/packages/bcftools/package.py index 6555692fab..2add3e781a 100644 --- a/var/spack/repos/builtin/packages/bcftools/package.py +++ b/var/spack/repos/builtin/packages/bcftools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bcl2fastq2/package.py b/var/spack/repos/builtin/packages/bcl2fastq2/package.py index 64060c2b9b..67302c4324 100644 --- a/var/spack/repos/builtin/packages/bcl2fastq2/package.py +++ b/var/spack/repos/builtin/packages/bcl2fastq2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bdftopcf/package.py b/var/spack/repos/builtin/packages/bdftopcf/package.py index 68590c5a08..f8d8d7514c 100644 --- a/var/spack/repos/builtin/packages/bdftopcf/package.py +++ b/var/spack/repos/builtin/packages/bdftopcf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bdw-gc/package.py b/var/spack/repos/builtin/packages/bdw-gc/package.py index a0606e78b1..4787659652 100644 --- a/var/spack/repos/builtin/packages/bdw-gc/package.py +++ b/var/spack/repos/builtin/packages/bdw-gc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bear/package.py b/var/spack/repos/builtin/packages/bear/package.py index eed95ebf89..eb20cecb14 100644 --- a/var/spack/repos/builtin/packages/bear/package.py +++ b/var/spack/repos/builtin/packages/bear/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/beast2/package.py b/var/spack/repos/builtin/packages/beast2/package.py index 77acaa01f3..795312abbd 100644 --- a/var/spack/repos/builtin/packages/beast2/package.py +++ b/var/spack/repos/builtin/packages/beast2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bedtools2/package.py b/var/spack/repos/builtin/packages/bedtools2/package.py index a16f0cb203..57d71c4ea7 100644 --- a/var/spack/repos/builtin/packages/bedtools2/package.py +++ b/var/spack/repos/builtin/packages/bedtools2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/beforelight/package.py b/var/spack/repos/builtin/packages/beforelight/package.py index 51341e6998..9863c80dc1 100644 --- a/var/spack/repos/builtin/packages/beforelight/package.py +++ b/var/spack/repos/builtin/packages/beforelight/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/benchmark/package.py b/var/spack/repos/builtin/packages/benchmark/package.py index 3969781112..0efbf8829b 100644 --- a/var/spack/repos/builtin/packages/benchmark/package.py +++ b/var/spack/repos/builtin/packages/benchmark/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bertini/package.py b/var/spack/repos/builtin/packages/bertini/package.py index 4e1ac87e57..425a455c93 100644 --- a/var/spack/repos/builtin/packages/bertini/package.py +++ b/var/spack/repos/builtin/packages/bertini/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bib2xhtml/package.py b/var/spack/repos/builtin/packages/bib2xhtml/package.py index 99bd1ce4c9..abd9e92011 100644 --- a/var/spack/repos/builtin/packages/bib2xhtml/package.py +++ b/var/spack/repos/builtin/packages/bib2xhtml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bigreqsproto/package.py b/var/spack/repos/builtin/packages/bigreqsproto/package.py index 4fdfe1e7f2..bdc5b68924 100644 --- a/var/spack/repos/builtin/packages/bigreqsproto/package.py +++ b/var/spack/repos/builtin/packages/bigreqsproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/binutils/package.py b/var/spack/repos/builtin/packages/binutils/package.py index de1f23520f..b809d811d4 100644 --- a/var/spack/repos/builtin/packages/binutils/package.py +++ b/var/spack/repos/builtin/packages/binutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bison/package.py b/var/spack/repos/builtin/packages/bison/package.py index 10a8967178..868268d42b 100644 --- a/var/spack/repos/builtin/packages/bison/package.py +++ b/var/spack/repos/builtin/packages/bison/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bitmap/package.py b/var/spack/repos/builtin/packages/bitmap/package.py index c656ab31df..7bfe00aaba 100644 --- a/var/spack/repos/builtin/packages/bitmap/package.py +++ b/var/spack/repos/builtin/packages/bitmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/blast-plus/package.py b/var/spack/repos/builtin/packages/blast-plus/package.py index 23c47bcec9..28e29bcbae 100644 --- a/var/spack/repos/builtin/packages/blast-plus/package.py +++ b/var/spack/repos/builtin/packages/blast-plus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/blat/package.py b/var/spack/repos/builtin/packages/blat/package.py index 6d55f14f1e..3872465a80 100644 --- a/var/spack/repos/builtin/packages/blat/package.py +++ b/var/spack/repos/builtin/packages/blat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/blaze/package.py b/var/spack/repos/builtin/packages/blaze/package.py index 509f6ab986..c5826389e4 100644 --- a/var/spack/repos/builtin/packages/blaze/package.py +++ b/var/spack/repos/builtin/packages/blaze/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bliss/package.py b/var/spack/repos/builtin/packages/bliss/package.py index 9abb7143a2..45fae3da93 100644 --- a/var/spack/repos/builtin/packages/bliss/package.py +++ b/var/spack/repos/builtin/packages/bliss/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/blitz/package.py b/var/spack/repos/builtin/packages/blitz/package.py index 7fc7e64e76..b5bb3c42cd 100644 --- a/var/spack/repos/builtin/packages/blitz/package.py +++ b/var/spack/repos/builtin/packages/blitz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index b3dc0b396b..b83bfb6818 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bowtie/package.py b/var/spack/repos/builtin/packages/bowtie/package.py index 05f9140edb..f339f24451 100644 --- a/var/spack/repos/builtin/packages/bowtie/package.py +++ b/var/spack/repos/builtin/packages/bowtie/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bowtie2/package.py b/var/spack/repos/builtin/packages/bowtie2/package.py index 564e2d27f8..bd6e956b80 100644 --- a/var/spack/repos/builtin/packages/bowtie2/package.py +++ b/var/spack/repos/builtin/packages/bowtie2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/boxlib/package.py b/var/spack/repos/builtin/packages/boxlib/package.py index 75030e925c..2d97c1ce3f 100644 --- a/var/spack/repos/builtin/packages/boxlib/package.py +++ b/var/spack/repos/builtin/packages/boxlib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bpp-core/package.py b/var/spack/repos/builtin/packages/bpp-core/package.py index df2c09b3ae..9c49ab1e3e 100644 --- a/var/spack/repos/builtin/packages/bpp-core/package.py +++ b/var/spack/repos/builtin/packages/bpp-core/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bpp-phyl/package.py b/var/spack/repos/builtin/packages/bpp-phyl/package.py index 1e1a2a393f..c028cc4f23 100644 --- a/var/spack/repos/builtin/packages/bpp-phyl/package.py +++ b/var/spack/repos/builtin/packages/bpp-phyl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bpp-seq/package.py b/var/spack/repos/builtin/packages/bpp-seq/package.py index d89d029d26..0ebf87437a 100644 --- a/var/spack/repos/builtin/packages/bpp-seq/package.py +++ b/var/spack/repos/builtin/packages/bpp-seq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bpp-suite/package.py b/var/spack/repos/builtin/packages/bpp-suite/package.py index f52f76b822..a0aeea8e3e 100644 --- a/var/spack/repos/builtin/packages/bpp-suite/package.py +++ b/var/spack/repos/builtin/packages/bpp-suite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/braker/package.py b/var/spack/repos/builtin/packages/braker/package.py index cfc1f16025..2a2385357e 100644 --- a/var/spack/repos/builtin/packages/braker/package.py +++ b/var/spack/repos/builtin/packages/braker/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/brigand/package.py b/var/spack/repos/builtin/packages/brigand/package.py index ff379e096b..8f4e36de50 100644 --- a/var/spack/repos/builtin/packages/brigand/package.py +++ b/var/spack/repos/builtin/packages/brigand/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bsseeker2/package.py b/var/spack/repos/builtin/packages/bsseeker2/package.py index aca1e70b01..731c12dede 100644 --- a/var/spack/repos/builtin/packages/bsseeker2/package.py +++ b/var/spack/repos/builtin/packages/bsseeker2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bucky/package.py b/var/spack/repos/builtin/packages/bucky/package.py index d74e8784e5..d0cc4e5679 100644 --- a/var/spack/repos/builtin/packages/bucky/package.py +++ b/var/spack/repos/builtin/packages/bucky/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/busco/package.py b/var/spack/repos/builtin/packages/busco/package.py index ad0f06ca91..198db2a255 100644 --- a/var/spack/repos/builtin/packages/busco/package.py +++ b/var/spack/repos/builtin/packages/busco/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/butter/package.py b/var/spack/repos/builtin/packages/butter/package.py index 4bd1607097..56ca218d99 100644 --- a/var/spack/repos/builtin/packages/butter/package.py +++ b/var/spack/repos/builtin/packages/butter/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bwa/package.py b/var/spack/repos/builtin/packages/bwa/package.py index c4cd0d6665..2ef202736a 100644 --- a/var/spack/repos/builtin/packages/bwa/package.py +++ b/var/spack/repos/builtin/packages/bwa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py index 532c670a0b..d42f7c2bb6 100644 --- a/var/spack/repos/builtin/packages/bzip2/package.py +++ b/var/spack/repos/builtin/packages/bzip2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/c-blosc/package.py b/var/spack/repos/builtin/packages/c-blosc/package.py index 636657bf8d..948ec8b195 100644 --- a/var/spack/repos/builtin/packages/c-blosc/package.py +++ b/var/spack/repos/builtin/packages/c-blosc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/caffe/package.py b/var/spack/repos/builtin/packages/caffe/package.py index 021814c7fd..bf34ffcf83 100644 --- a/var/spack/repos/builtin/packages/caffe/package.py +++ b/var/spack/repos/builtin/packages/caffe/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cairo/package.py b/var/spack/repos/builtin/packages/cairo/package.py index f02c26a8f1..a4ca1438dc 100644 --- a/var/spack/repos/builtin/packages/cairo/package.py +++ b/var/spack/repos/builtin/packages/cairo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/caliper/package.py b/var/spack/repos/builtin/packages/caliper/package.py index 7758b20328..5d555e6d9f 100644 --- a/var/spack/repos/builtin/packages/caliper/package.py +++ b/var/spack/repos/builtin/packages/caliper/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/callpath/package.py b/var/spack/repos/builtin/packages/callpath/package.py index bc72bb50bd..2a109c5ed5 100644 --- a/var/spack/repos/builtin/packages/callpath/package.py +++ b/var/spack/repos/builtin/packages/callpath/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cantera/package.py b/var/spack/repos/builtin/packages/cantera/package.py index 36c796e45d..acccf79e7e 100644 --- a/var/spack/repos/builtin/packages/cantera/package.py +++ b/var/spack/repos/builtin/packages/cantera/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/canu/package.py b/var/spack/repos/builtin/packages/canu/package.py index fd6acfec0f..3d991027a2 100644 --- a/var/spack/repos/builtin/packages/canu/package.py +++ b/var/spack/repos/builtin/packages/canu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cap3/package.py b/var/spack/repos/builtin/packages/cap3/package.py index 8f4a180cbd..7b9b89230b 100644 --- a/var/spack/repos/builtin/packages/cap3/package.py +++ b/var/spack/repos/builtin/packages/cap3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cares/package.py b/var/spack/repos/builtin/packages/cares/package.py index 2c944104fd..f640ceef71 100644 --- a/var/spack/repos/builtin/packages/cares/package.py +++ b/var/spack/repos/builtin/packages/cares/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cask/package.py b/var/spack/repos/builtin/packages/cask/package.py index e259dae8c2..2e272ed725 100644 --- a/var/spack/repos/builtin/packages/cask/package.py +++ b/var/spack/repos/builtin/packages/cask/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/catch/package.py b/var/spack/repos/builtin/packages/catch/package.py index f65f7aeb25..22a2bf06cd 100644 --- a/var/spack/repos/builtin/packages/catch/package.py +++ b/var/spack/repos/builtin/packages/catch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cbench/package.py b/var/spack/repos/builtin/packages/cbench/package.py index f2cf386a29..ac566142ae 100644 --- a/var/spack/repos/builtin/packages/cbench/package.py +++ b/var/spack/repos/builtin/packages/cbench/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cblas/package.py b/var/spack/repos/builtin/packages/cblas/package.py index 2ac5f820ec..3818182da5 100644 --- a/var/spack/repos/builtin/packages/cblas/package.py +++ b/var/spack/repos/builtin/packages/cblas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ccache/package.py b/var/spack/repos/builtin/packages/ccache/package.py index 78a7059913..1046c05c85 100644 --- a/var/spack/repos/builtin/packages/ccache/package.py +++ b/var/spack/repos/builtin/packages/ccache/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cctools/package.py b/var/spack/repos/builtin/packages/cctools/package.py index ad9e3763c2..ff43aab88d 100644 --- a/var/spack/repos/builtin/packages/cctools/package.py +++ b/var/spack/repos/builtin/packages/cctools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cdbfasta/package.py b/var/spack/repos/builtin/packages/cdbfasta/package.py index 9fa0c62442..746242bc81 100644 --- a/var/spack/repos/builtin/packages/cdbfasta/package.py +++ b/var/spack/repos/builtin/packages/cdbfasta/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cdd/package.py b/var/spack/repos/builtin/packages/cdd/package.py index 4f4d59785e..eff7c4ff16 100644 --- a/var/spack/repos/builtin/packages/cdd/package.py +++ b/var/spack/repos/builtin/packages/cdd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cddlib/package.py b/var/spack/repos/builtin/packages/cddlib/package.py index 7c38abd28d..c21f867ce0 100644 --- a/var/spack/repos/builtin/packages/cddlib/package.py +++ b/var/spack/repos/builtin/packages/cddlib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cdhit/package.py b/var/spack/repos/builtin/packages/cdhit/package.py index 8651466ef5..6a58befb9c 100644 --- a/var/spack/repos/builtin/packages/cdhit/package.py +++ b/var/spack/repos/builtin/packages/cdhit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cdo/package.py b/var/spack/repos/builtin/packages/cdo/package.py index 162d18892d..d8fb99d620 100644 --- a/var/spack/repos/builtin/packages/cdo/package.py +++ b/var/spack/repos/builtin/packages/cdo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cereal/package.py b/var/spack/repos/builtin/packages/cereal/package.py index fc7aba4955..9e779cd99c 100644 --- a/var/spack/repos/builtin/packages/cereal/package.py +++ b/var/spack/repos/builtin/packages/cereal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cfitsio/package.py b/var/spack/repos/builtin/packages/cfitsio/package.py index 40c85413c7..2d394e1a17 100644 --- a/var/spack/repos/builtin/packages/cfitsio/package.py +++ b/var/spack/repos/builtin/packages/cfitsio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cgal/package.py b/var/spack/repos/builtin/packages/cgal/package.py index 381eb493e5..cc5d94dba1 100644 --- a/var/spack/repos/builtin/packages/cgal/package.py +++ b/var/spack/repos/builtin/packages/cgal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cgm/package.py b/var/spack/repos/builtin/packages/cgm/package.py index 80e47cbd27..a1a7770b1e 100644 --- a/var/spack/repos/builtin/packages/cgm/package.py +++ b/var/spack/repos/builtin/packages/cgm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cgns/package.py b/var/spack/repos/builtin/packages/cgns/package.py index e3a4f89ff6..eed884df39 100644 --- a/var/spack/repos/builtin/packages/cgns/package.py +++ b/var/spack/repos/builtin/packages/cgns/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/charm/package.py b/var/spack/repos/builtin/packages/charm/package.py index fd869f4c60..944b46889f 100644 --- a/var/spack/repos/builtin/packages/charm/package.py +++ b/var/spack/repos/builtin/packages/charm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/check/package.py b/var/spack/repos/builtin/packages/check/package.py index 53b03d28cd..a367ba2c5a 100644 --- a/var/spack/repos/builtin/packages/check/package.py +++ b/var/spack/repos/builtin/packages/check/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/chlorop/package.py b/var/spack/repos/builtin/packages/chlorop/package.py index bd5ceda4f7..be2f9c050d 100644 --- a/var/spack/repos/builtin/packages/chlorop/package.py +++ b/var/spack/repos/builtin/packages/chlorop/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/chombo/package.py b/var/spack/repos/builtin/packages/chombo/package.py index 3b3cb1e624..345203883d 100644 --- a/var/spack/repos/builtin/packages/chombo/package.py +++ b/var/spack/repos/builtin/packages/chombo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cityhash/package.py b/var/spack/repos/builtin/packages/cityhash/package.py index 4564d49531..ef3001c8fc 100644 --- a/var/spack/repos/builtin/packages/cityhash/package.py +++ b/var/spack/repos/builtin/packages/cityhash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/clamr/package.py b/var/spack/repos/builtin/packages/clamr/package.py index d1eee12d1c..65a3f3fe01 100644 --- a/var/spack/repos/builtin/packages/clamr/package.py +++ b/var/spack/repos/builtin/packages/clamr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cleaveland4/package.py b/var/spack/repos/builtin/packages/cleaveland4/package.py index 505f800ac7..0956ee2b48 100644 --- a/var/spack/repos/builtin/packages/cleaveland4/package.py +++ b/var/spack/repos/builtin/packages/cleaveland4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cleverleaf/package.py b/var/spack/repos/builtin/packages/cleverleaf/package.py index 62907533ac..59dd6b5ec3 100644 --- a/var/spack/repos/builtin/packages/cleverleaf/package.py +++ b/var/spack/repos/builtin/packages/cleverleaf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/clhep/package.py b/var/spack/repos/builtin/packages/clhep/package.py index 2f4f5b1579..54c2f2613f 100644 --- a/var/spack/repos/builtin/packages/clhep/package.py +++ b/var/spack/repos/builtin/packages/clhep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cloog/package.py b/var/spack/repos/builtin/packages/cloog/package.py index 601806d204..14e75dfc99 100644 --- a/var/spack/repos/builtin/packages/cloog/package.py +++ b/var/spack/repos/builtin/packages/cloog/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cloverleaf/package.py b/var/spack/repos/builtin/packages/cloverleaf/package.py index bc54ef61ea..5f755f3206 100644 --- a/var/spack/repos/builtin/packages/cloverleaf/package.py +++ b/var/spack/repos/builtin/packages/cloverleaf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cloverleaf3d/package.py b/var/spack/repos/builtin/packages/cloverleaf3d/package.py index 5616912255..0aae9cfdbd 100644 --- a/var/spack/repos/builtin/packages/cloverleaf3d/package.py +++ b/var/spack/repos/builtin/packages/cloverleaf3d/package.py @@ -1,5 +1,5 @@ ############################################################################# -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/clustalo/package.py b/var/spack/repos/builtin/packages/clustalo/package.py index d46b7d467c..a57b6aa6fe 100644 --- a/var/spack/repos/builtin/packages/clustalo/package.py +++ b/var/spack/repos/builtin/packages/clustalo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/clustalw/package.py b/var/spack/repos/builtin/packages/clustalw/package.py index 959a11963b..10592a4bfc 100644 --- a/var/spack/repos/builtin/packages/clustalw/package.py +++ b/var/spack/repos/builtin/packages/clustalw/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cmake/package.py b/var/spack/repos/builtin/packages/cmake/package.py index 079d214c4a..9ce4887343 100644 --- a/var/spack/repos/builtin/packages/cmake/package.py +++ b/var/spack/repos/builtin/packages/cmake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cmocka/package.py b/var/spack/repos/builtin/packages/cmocka/package.py index 944295a036..de16a56bc7 100644 --- a/var/spack/repos/builtin/packages/cmocka/package.py +++ b/var/spack/repos/builtin/packages/cmocka/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cmor/package.py b/var/spack/repos/builtin/packages/cmor/package.py index 8c85875672..7be30e614e 100644 --- a/var/spack/repos/builtin/packages/cmor/package.py +++ b/var/spack/repos/builtin/packages/cmor/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cnmem/package.py b/var/spack/repos/builtin/packages/cnmem/package.py index fc4df89e09..31adffaa16 100644 --- a/var/spack/repos/builtin/packages/cnmem/package.py +++ b/var/spack/repos/builtin/packages/cnmem/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cnpy/package.py b/var/spack/repos/builtin/packages/cnpy/package.py index b62df10c2e..14c21809af 100644 --- a/var/spack/repos/builtin/packages/cnpy/package.py +++ b/var/spack/repos/builtin/packages/cnpy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cns-nospec/package.py b/var/spack/repos/builtin/packages/cns-nospec/package.py index 30b760ff80..e3cd2e1c9c 100644 --- a/var/spack/repos/builtin/packages/cns-nospec/package.py +++ b/var/spack/repos/builtin/packages/cns-nospec/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cntk/package.py b/var/spack/repos/builtin/packages/cntk/package.py index dfc515730b..c79c0df8fb 100644 --- a/var/spack/repos/builtin/packages/cntk/package.py +++ b/var/spack/repos/builtin/packages/cntk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cntk1bitsgd/package.py b/var/spack/repos/builtin/packages/cntk1bitsgd/package.py index e6faddf276..3db291a04a 100644 --- a/var/spack/repos/builtin/packages/cntk1bitsgd/package.py +++ b/var/spack/repos/builtin/packages/cntk1bitsgd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/codar-cheetah/package.py b/var/spack/repos/builtin/packages/codar-cheetah/package.py index b70c929ca8..f767cd7bc7 100644 --- a/var/spack/repos/builtin/packages/codar-cheetah/package.py +++ b/var/spack/repos/builtin/packages/codar-cheetah/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cohmm/package.py b/var/spack/repos/builtin/packages/cohmm/package.py index 2e033c4594..803d48a68d 100644 --- a/var/spack/repos/builtin/packages/cohmm/package.py +++ b/var/spack/repos/builtin/packages/cohmm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/coinhsl/package.py b/var/spack/repos/builtin/packages/coinhsl/package.py index 4af87380b6..903223f153 100644 --- a/var/spack/repos/builtin/packages/coinhsl/package.py +++ b/var/spack/repos/builtin/packages/coinhsl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/comd/package.py b/var/spack/repos/builtin/packages/comd/package.py index 4a4c1133c6..f8fd8da634 100644 --- a/var/spack/repos/builtin/packages/comd/package.py +++ b/var/spack/repos/builtin/packages/comd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/compiz/package.py b/var/spack/repos/builtin/packages/compiz/package.py index 19ceb8f65a..37b21c3b58 100644 --- a/var/spack/repos/builtin/packages/compiz/package.py +++ b/var/spack/repos/builtin/packages/compiz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/compositeproto/package.py b/var/spack/repos/builtin/packages/compositeproto/package.py index 8ba249536c..b610572096 100644 --- a/var/spack/repos/builtin/packages/compositeproto/package.py +++ b/var/spack/repos/builtin/packages/compositeproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/conduit/package.py b/var/spack/repos/builtin/packages/conduit/package.py index f59d1835b5..8cf481398f 100644 --- a/var/spack/repos/builtin/packages/conduit/package.py +++ b/var/spack/repos/builtin/packages/conduit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/constype/package.py b/var/spack/repos/builtin/packages/constype/package.py index 4efcb5bcd0..3be301d166 100644 --- a/var/spack/repos/builtin/packages/constype/package.py +++ b/var/spack/repos/builtin/packages/constype/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/converge/package.py b/var/spack/repos/builtin/packages/converge/package.py index 96b6c24a0a..6d5461fe6b 100644 --- a/var/spack/repos/builtin/packages/converge/package.py +++ b/var/spack/repos/builtin/packages/converge/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/coreutils/package.py b/var/spack/repos/builtin/packages/coreutils/package.py index beea64a5ee..3758611001 100644 --- a/var/spack/repos/builtin/packages/coreutils/package.py +++ b/var/spack/repos/builtin/packages/coreutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/corset/package.py b/var/spack/repos/builtin/packages/corset/package.py index b09a062b35..b377516444 100644 --- a/var/spack/repos/builtin/packages/corset/package.py +++ b/var/spack/repos/builtin/packages/corset/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cosmomc/package.py b/var/spack/repos/builtin/packages/cosmomc/package.py index acbaa82202..97f0898376 100644 --- a/var/spack/repos/builtin/packages/cosmomc/package.py +++ b/var/spack/repos/builtin/packages/cosmomc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cosp2/package.py b/var/spack/repos/builtin/packages/cosp2/package.py index 3ed89d5a19..4161658a23 100644 --- a/var/spack/repos/builtin/packages/cosp2/package.py +++ b/var/spack/repos/builtin/packages/cosp2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cp2k/package.py b/var/spack/repos/builtin/packages/cp2k/package.py index ca4c783142..0f06fb450c 100644 --- a/var/spack/repos/builtin/packages/cp2k/package.py +++ b/var/spack/repos/builtin/packages/cp2k/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cppad/package.py b/var/spack/repos/builtin/packages/cppad/package.py index 11e0dda2d2..6ab7a0b1ed 100644 --- a/var/spack/repos/builtin/packages/cppad/package.py +++ b/var/spack/repos/builtin/packages/cppad/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cppcheck/package.py b/var/spack/repos/builtin/packages/cppcheck/package.py index cbdfc0ef0d..adc092db7b 100644 --- a/var/spack/repos/builtin/packages/cppcheck/package.py +++ b/var/spack/repos/builtin/packages/cppcheck/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cpprestsdk/package.py b/var/spack/repos/builtin/packages/cpprestsdk/package.py index b5d96ff480..3192aa7c7a 100644 --- a/var/spack/repos/builtin/packages/cpprestsdk/package.py +++ b/var/spack/repos/builtin/packages/cpprestsdk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cppunit/package.py b/var/spack/repos/builtin/packages/cppunit/package.py index 283175e0bd..5cd471d120 100644 --- a/var/spack/repos/builtin/packages/cppunit/package.py +++ b/var/spack/repos/builtin/packages/cppunit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cram/package.py b/var/spack/repos/builtin/packages/cram/package.py index 25427292cb..515bdae0ff 100644 --- a/var/spack/repos/builtin/packages/cram/package.py +++ b/var/spack/repos/builtin/packages/cram/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cryptopp/package.py b/var/spack/repos/builtin/packages/cryptopp/package.py index 7ba7a87a0d..f511712903 100644 --- a/var/spack/repos/builtin/packages/cryptopp/package.py +++ b/var/spack/repos/builtin/packages/cryptopp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cscope/package.py b/var/spack/repos/builtin/packages/cscope/package.py index bbd93976c6..9cf98da97e 100644 --- a/var/spack/repos/builtin/packages/cscope/package.py +++ b/var/spack/repos/builtin/packages/cscope/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/csdp/package.py b/var/spack/repos/builtin/packages/csdp/package.py index e459df0054..9d8ecdf55c 100644 --- a/var/spack/repos/builtin/packages/csdp/package.py +++ b/var/spack/repos/builtin/packages/csdp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cub/package.py b/var/spack/repos/builtin/packages/cub/package.py index 7460bc799b..428916daa9 100644 --- a/var/spack/repos/builtin/packages/cub/package.py +++ b/var/spack/repos/builtin/packages/cub/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cube/package.py b/var/spack/repos/builtin/packages/cube/package.py index 841f737e41..d83b225f4f 100644 --- a/var/spack/repos/builtin/packages/cube/package.py +++ b/var/spack/repos/builtin/packages/cube/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cuda-memtest/package.py b/var/spack/repos/builtin/packages/cuda-memtest/package.py index 16d68d1a19..fbcd48ffc2 100644 --- a/var/spack/repos/builtin/packages/cuda-memtest/package.py +++ b/var/spack/repos/builtin/packages/cuda-memtest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cuda/package.py b/var/spack/repos/builtin/packages/cuda/package.py index fd59bbe485..a034aabf3f 100644 --- a/var/spack/repos/builtin/packages/cuda/package.py +++ b/var/spack/repos/builtin/packages/cuda/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cudnn/package.py b/var/spack/repos/builtin/packages/cudnn/package.py index dcb26af73d..f0614afc5b 100644 --- a/var/spack/repos/builtin/packages/cudnn/package.py +++ b/var/spack/repos/builtin/packages/cudnn/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cufflinks/package.py b/var/spack/repos/builtin/packages/cufflinks/package.py index c0d331439b..eb98dfdd5e 100644 --- a/var/spack/repos/builtin/packages/cufflinks/package.py +++ b/var/spack/repos/builtin/packages/cufflinks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cups/package.py b/var/spack/repos/builtin/packages/cups/package.py index 311e779b8c..0984965a75 100644 --- a/var/spack/repos/builtin/packages/cups/package.py +++ b/var/spack/repos/builtin/packages/cups/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/curl/package.py b/var/spack/repos/builtin/packages/curl/package.py index 56cc27de64..ec5df4bc5a 100644 --- a/var/spack/repos/builtin/packages/curl/package.py +++ b/var/spack/repos/builtin/packages/curl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/cvs/package.py b/var/spack/repos/builtin/packages/cvs/package.py index e0a5cfdd88..d34e82bfb5 100644 --- a/var/spack/repos/builtin/packages/cvs/package.py +++ b/var/spack/repos/builtin/packages/cvs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/czmq/package.py b/var/spack/repos/builtin/packages/czmq/package.py index dba2871c4d..f2c309604e 100644 --- a/var/spack/repos/builtin/packages/czmq/package.py +++ b/var/spack/repos/builtin/packages/czmq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dakota/package.py b/var/spack/repos/builtin/packages/dakota/package.py index ebc303a193..2ac22b4738 100644 --- a/var/spack/repos/builtin/packages/dakota/package.py +++ b/var/spack/repos/builtin/packages/dakota/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/daligner/package.py b/var/spack/repos/builtin/packages/daligner/package.py index e6be60264c..88658f4b36 100644 --- a/var/spack/repos/builtin/packages/daligner/package.py +++ b/var/spack/repos/builtin/packages/daligner/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/damageproto/package.py b/var/spack/repos/builtin/packages/damageproto/package.py index 8092a33ba5..ca27afe41e 100644 --- a/var/spack/repos/builtin/packages/damageproto/package.py +++ b/var/spack/repos/builtin/packages/damageproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/damselfly/package.py b/var/spack/repos/builtin/packages/damselfly/package.py index 05cbee4a4e..39494e8c34 100644 --- a/var/spack/repos/builtin/packages/damselfly/package.py +++ b/var/spack/repos/builtin/packages/damselfly/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/darshan-runtime/package.py b/var/spack/repos/builtin/packages/darshan-runtime/package.py index e18ad1de98..b67e5b568c 100644 --- a/var/spack/repos/builtin/packages/darshan-runtime/package.py +++ b/var/spack/repos/builtin/packages/darshan-runtime/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/darshan-util/package.py b/var/spack/repos/builtin/packages/darshan-util/package.py index 968ad669f0..0b48b06492 100644 --- a/var/spack/repos/builtin/packages/darshan-util/package.py +++ b/var/spack/repos/builtin/packages/darshan-util/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dash/package.py b/var/spack/repos/builtin/packages/dash/package.py index 3d9b6c823d..c359c47aca 100644 --- a/var/spack/repos/builtin/packages/dash/package.py +++ b/var/spack/repos/builtin/packages/dash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/datamash/package.py b/var/spack/repos/builtin/packages/datamash/package.py index 422920ec86..05669c7c3a 100644 --- a/var/spack/repos/builtin/packages/datamash/package.py +++ b/var/spack/repos/builtin/packages/datamash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dataspaces/package.py b/var/spack/repos/builtin/packages/dataspaces/package.py index 860866f81e..4f3fa0c54d 100644 --- a/var/spack/repos/builtin/packages/dataspaces/package.py +++ b/var/spack/repos/builtin/packages/dataspaces/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # diff --git a/var/spack/repos/builtin/packages/dbus/package.py b/var/spack/repos/builtin/packages/dbus/package.py index 44f6868318..fbfa7978b9 100644 --- a/var/spack/repos/builtin/packages/dbus/package.py +++ b/var/spack/repos/builtin/packages/dbus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index c4e999afe9..2441796bf5 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dejagnu/package.py b/var/spack/repos/builtin/packages/dejagnu/package.py index 73b97aaa52..331471fb73 100644 --- a/var/spack/repos/builtin/packages/dejagnu/package.py +++ b/var/spack/repos/builtin/packages/dejagnu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dia/package.py b/var/spack/repos/builtin/packages/dia/package.py index ec1583bd26..2e28346e14 100644 --- a/var/spack/repos/builtin/packages/dia/package.py +++ b/var/spack/repos/builtin/packages/dia/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dialign-tx/package.py b/var/spack/repos/builtin/packages/dialign-tx/package.py index 29a0c800da..76abe681d9 100644 --- a/var/spack/repos/builtin/packages/dialign-tx/package.py +++ b/var/spack/repos/builtin/packages/dialign-tx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/direnv/package.py b/var/spack/repos/builtin/packages/direnv/package.py index e1fbd861dc..289c7669e8 100644 --- a/var/spack/repos/builtin/packages/direnv/package.py +++ b/var/spack/repos/builtin/packages/direnv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/discovar/package.py b/var/spack/repos/builtin/packages/discovar/package.py index fcce9263cc..5080b48008 100644 --- a/var/spack/repos/builtin/packages/discovar/package.py +++ b/var/spack/repos/builtin/packages/discovar/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dmxproto/package.py b/var/spack/repos/builtin/packages/dmxproto/package.py index 2483ccac95..2d880b4ab0 100644 --- a/var/spack/repos/builtin/packages/dmxproto/package.py +++ b/var/spack/repos/builtin/packages/dmxproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/docbook-xml/package.py b/var/spack/repos/builtin/packages/docbook-xml/package.py index 65dd37ceae..a3d4b0b1b0 100644 --- a/var/spack/repos/builtin/packages/docbook-xml/package.py +++ b/var/spack/repos/builtin/packages/docbook-xml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/docbook-xsl/package.py b/var/spack/repos/builtin/packages/docbook-xsl/package.py index 3ff1aebab0..b0d5df5268 100644 --- a/var/spack/repos/builtin/packages/docbook-xsl/package.py +++ b/var/spack/repos/builtin/packages/docbook-xsl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dos2unix/package.py b/var/spack/repos/builtin/packages/dos2unix/package.py index a76cff21b2..8e90e818de 100644 --- a/var/spack/repos/builtin/packages/dos2unix/package.py +++ b/var/spack/repos/builtin/packages/dos2unix/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/double-conversion/package.py b/var/spack/repos/builtin/packages/double-conversion/package.py index be4dccdff6..043ac11dc6 100644 --- a/var/spack/repos/builtin/packages/double-conversion/package.py +++ b/var/spack/repos/builtin/packages/double-conversion/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/doxygen/package.py b/var/spack/repos/builtin/packages/doxygen/package.py index 7817c2a8d8..bf67bca1ca 100644 --- a/var/spack/repos/builtin/packages/doxygen/package.py +++ b/var/spack/repos/builtin/packages/doxygen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dri2proto/package.py b/var/spack/repos/builtin/packages/dri2proto/package.py index 2ccbbd209f..10de15eae2 100644 --- a/var/spack/repos/builtin/packages/dri2proto/package.py +++ b/var/spack/repos/builtin/packages/dri2proto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dri3proto/package.py b/var/spack/repos/builtin/packages/dri3proto/package.py index 60a5d5de6c..353e9ff607 100644 --- a/var/spack/repos/builtin/packages/dri3proto/package.py +++ b/var/spack/repos/builtin/packages/dri3proto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dtcmp/package.py b/var/spack/repos/builtin/packages/dtcmp/package.py index b8aaa07b65..84cdd4d611 100644 --- a/var/spack/repos/builtin/packages/dtcmp/package.py +++ b/var/spack/repos/builtin/packages/dtcmp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/dyninst/package.py b/var/spack/repos/builtin/packages/dyninst/package.py index fa6a31a7c0..bdb519ce28 100644 --- a/var/spack/repos/builtin/packages/dyninst/package.py +++ b/var/spack/repos/builtin/packages/dyninst/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ea-utils/package.py b/var/spack/repos/builtin/packages/ea-utils/package.py index 296b05eaf2..0d40df3ed7 100644 --- a/var/spack/repos/builtin/packages/ea-utils/package.py +++ b/var/spack/repos/builtin/packages/ea-utils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ebms/package.py b/var/spack/repos/builtin/packages/ebms/package.py index db3970814f..a6afe334a4 100644 --- a/var/spack/repos/builtin/packages/ebms/package.py +++ b/var/spack/repos/builtin/packages/ebms/package.py @@ -1,5 +1,5 @@ ############################################################################# -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/eccodes/package.py b/var/spack/repos/builtin/packages/eccodes/package.py index 40539e19c9..157bbb92d7 100644 --- a/var/spack/repos/builtin/packages/eccodes/package.py +++ b/var/spack/repos/builtin/packages/eccodes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/editres/package.py b/var/spack/repos/builtin/packages/editres/package.py index 2cbb4053e6..e497f4aa92 100644 --- a/var/spack/repos/builtin/packages/editres/package.py +++ b/var/spack/repos/builtin/packages/editres/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/eigen/package.py b/var/spack/repos/builtin/packages/eigen/package.py index 569af17c61..62ac1981b2 100644 --- a/var/spack/repos/builtin/packages/eigen/package.py +++ b/var/spack/repos/builtin/packages/eigen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/elemental/package.py b/var/spack/repos/builtin/packages/elemental/package.py index 657f185c7f..c356c9f717 100644 --- a/var/spack/repos/builtin/packages/elemental/package.py +++ b/var/spack/repos/builtin/packages/elemental/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/elfutils/package.py b/var/spack/repos/builtin/packages/elfutils/package.py index c7e614cad5..9291a1b48d 100644 --- a/var/spack/repos/builtin/packages/elfutils/package.py +++ b/var/spack/repos/builtin/packages/elfutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/elk/package.py b/var/spack/repos/builtin/packages/elk/package.py index 63893fad69..59c29298db 100644 --- a/var/spack/repos/builtin/packages/elk/package.py +++ b/var/spack/repos/builtin/packages/elk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/elpa/package.py b/var/spack/repos/builtin/packages/elpa/package.py index 61e957c0c9..35a77fc834 100644 --- a/var/spack/repos/builtin/packages/elpa/package.py +++ b/var/spack/repos/builtin/packages/elpa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/emacs/package.py b/var/spack/repos/builtin/packages/emacs/package.py index ff94145578..f8f07e9185 100644 --- a/var/spack/repos/builtin/packages/emacs/package.py +++ b/var/spack/repos/builtin/packages/emacs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/emboss/package.py b/var/spack/repos/builtin/packages/emboss/package.py index d21f86a7b5..7a96077138 100644 --- a/var/spack/repos/builtin/packages/emboss/package.py +++ b/var/spack/repos/builtin/packages/emboss/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/encodings/package.py b/var/spack/repos/builtin/packages/encodings/package.py index de6e8913b8..0daf7f36a5 100644 --- a/var/spack/repos/builtin/packages/encodings/package.py +++ b/var/spack/repos/builtin/packages/encodings/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/environment-modules/package.py b/var/spack/repos/builtin/packages/environment-modules/package.py index 293816734f..2774402605 100644 --- a/var/spack/repos/builtin/packages/environment-modules/package.py +++ b/var/spack/repos/builtin/packages/environment-modules/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/es/package.py b/var/spack/repos/builtin/packages/es/package.py index 3db13d7f7a..55ed9179ba 100644 --- a/var/spack/repos/builtin/packages/es/package.py +++ b/var/spack/repos/builtin/packages/es/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/esmf/package.py b/var/spack/repos/builtin/packages/esmf/package.py index 0866dacdb6..050e6380a5 100644 --- a/var/spack/repos/builtin/packages/esmf/package.py +++ b/var/spack/repos/builtin/packages/esmf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/espresso/package.py b/var/spack/repos/builtin/packages/espresso/package.py index 26cbf8fd88..a39fd859c1 100644 --- a/var/spack/repos/builtin/packages/espresso/package.py +++ b/var/spack/repos/builtin/packages/espresso/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/espressopp/package.py b/var/spack/repos/builtin/packages/espressopp/package.py index f1752b3b5e..e8ae1f6121 100644 --- a/var/spack/repos/builtin/packages/espressopp/package.py +++ b/var/spack/repos/builtin/packages/espressopp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/etsf-io/package.py b/var/spack/repos/builtin/packages/etsf-io/package.py index 89ba87c81e..6f8e405cc7 100644 --- a/var/spack/repos/builtin/packages/etsf-io/package.py +++ b/var/spack/repos/builtin/packages/etsf-io/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/everytrace-example/package.py b/var/spack/repos/builtin/packages/everytrace-example/package.py index 08d3b2fa67..a492705346 100644 --- a/var/spack/repos/builtin/packages/everytrace-example/package.py +++ b/var/spack/repos/builtin/packages/everytrace-example/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/everytrace/package.py b/var/spack/repos/builtin/packages/everytrace/package.py index 413bf2a944..c23a9a9ef5 100644 --- a/var/spack/repos/builtin/packages/everytrace/package.py +++ b/var/spack/repos/builtin/packages/everytrace/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/evieext/package.py b/var/spack/repos/builtin/packages/evieext/package.py index 30ae66c33a..a1cfdc4518 100644 --- a/var/spack/repos/builtin/packages/evieext/package.py +++ b/var/spack/repos/builtin/packages/evieext/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/exabayes/package.py b/var/spack/repos/builtin/packages/exabayes/package.py index 85148474a2..b44e7bfe5c 100644 --- a/var/spack/repos/builtin/packages/exabayes/package.py +++ b/var/spack/repos/builtin/packages/exabayes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/exmcutils/package.py b/var/spack/repos/builtin/packages/exmcutils/package.py index 85d30c48c2..cbf56e8f6e 100644 --- a/var/spack/repos/builtin/packages/exmcutils/package.py +++ b/var/spack/repos/builtin/packages/exmcutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/exodusii/package.py b/var/spack/repos/builtin/packages/exodusii/package.py index 84f2b49843..5078b63cec 100644 --- a/var/spack/repos/builtin/packages/exodusii/package.py +++ b/var/spack/repos/builtin/packages/exodusii/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/exonerate/package.py b/var/spack/repos/builtin/packages/exonerate/package.py index 3821617a70..ef96029916 100644 --- a/var/spack/repos/builtin/packages/exonerate/package.py +++ b/var/spack/repos/builtin/packages/exonerate/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/expat/package.py b/var/spack/repos/builtin/packages/expat/package.py index 68e8ed4c08..4d4ec3d80f 100644 --- a/var/spack/repos/builtin/packages/expat/package.py +++ b/var/spack/repos/builtin/packages/expat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/expect/package.py b/var/spack/repos/builtin/packages/expect/package.py index fa89a64c9c..c777ce7eeb 100644 --- a/var/spack/repos/builtin/packages/expect/package.py +++ b/var/spack/repos/builtin/packages/expect/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/extrae/package.py b/var/spack/repos/builtin/packages/extrae/package.py index b68276bae4..8a581aa56d 100644 --- a/var/spack/repos/builtin/packages/extrae/package.py +++ b/var/spack/repos/builtin/packages/extrae/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/exuberant-ctags/package.py b/var/spack/repos/builtin/packages/exuberant-ctags/package.py index 8086850809..2cb606568b 100644 --- a/var/spack/repos/builtin/packages/exuberant-ctags/package.py +++ b/var/spack/repos/builtin/packages/exuberant-ctags/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/falcon/package.py b/var/spack/repos/builtin/packages/falcon/package.py index 7532e6e8b4..5c32764059 100644 --- a/var/spack/repos/builtin/packages/falcon/package.py +++ b/var/spack/repos/builtin/packages/falcon/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/farmhash/package.py b/var/spack/repos/builtin/packages/farmhash/package.py index 90b0cf256f..517b73398d 100644 --- a/var/spack/repos/builtin/packages/farmhash/package.py +++ b/var/spack/repos/builtin/packages/farmhash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fastjar/package.py b/var/spack/repos/builtin/packages/fastjar/package.py index 86ad4b2d68..436f380e2d 100644 --- a/var/spack/repos/builtin/packages/fastjar/package.py +++ b/var/spack/repos/builtin/packages/fastjar/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fastmath/package.py b/var/spack/repos/builtin/packages/fastmath/package.py index 1a483057d3..84c98fb299 100644 --- a/var/spack/repos/builtin/packages/fastmath/package.py +++ b/var/spack/repos/builtin/packages/fastmath/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fastphase/package.py b/var/spack/repos/builtin/packages/fastphase/package.py index 69ba89022c..1e6dd71b9c 100644 --- a/var/spack/repos/builtin/packages/fastphase/package.py +++ b/var/spack/repos/builtin/packages/fastphase/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fastqc/package.py b/var/spack/repos/builtin/packages/fastqc/package.py index d4abd8aceb..bc232431b1 100644 --- a/var/spack/repos/builtin/packages/fastqc/package.py +++ b/var/spack/repos/builtin/packages/fastqc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fastx-toolkit/package.py b/var/spack/repos/builtin/packages/fastx-toolkit/package.py index 4f40ffe64e..d08f21b875 100644 --- a/var/spack/repos/builtin/packages/fastx-toolkit/package.py +++ b/var/spack/repos/builtin/packages/fastx-toolkit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fenics/package.py b/var/spack/repos/builtin/packages/fenics/package.py index 5aa3b17d73..aa4994ef3e 100644 --- a/var/spack/repos/builtin/packages/fenics/package.py +++ b/var/spack/repos/builtin/packages/fenics/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ferret/package.py b/var/spack/repos/builtin/packages/ferret/package.py index 6a4c0902f6..74c9265a5f 100644 --- a/var/spack/repos/builtin/packages/ferret/package.py +++ b/var/spack/repos/builtin/packages/ferret/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ffmpeg/package.py b/var/spack/repos/builtin/packages/ffmpeg/package.py index 9a6f6c18ad..4e749151ca 100644 --- a/var/spack/repos/builtin/packages/ffmpeg/package.py +++ b/var/spack/repos/builtin/packages/ffmpeg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fftw/package.py b/var/spack/repos/builtin/packages/fftw/package.py index 19e818028a..defd1d710b 100644 --- a/var/spack/repos/builtin/packages/fftw/package.py +++ b/var/spack/repos/builtin/packages/fftw/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fimpute/package.py b/var/spack/repos/builtin/packages/fimpute/package.py index bc18419923..4054263601 100644 --- a/var/spack/repos/builtin/packages/fimpute/package.py +++ b/var/spack/repos/builtin/packages/fimpute/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/findutils/package.py b/var/spack/repos/builtin/packages/findutils/package.py index 74237bc6be..4e802020d2 100644 --- a/var/spack/repos/builtin/packages/findutils/package.py +++ b/var/spack/repos/builtin/packages/findutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fio/package.py b/var/spack/repos/builtin/packages/fio/package.py index 0b99ff9cd3..c5047f94a0 100644 --- a/var/spack/repos/builtin/packages/fio/package.py +++ b/var/spack/repos/builtin/packages/fio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fish/package.py b/var/spack/repos/builtin/packages/fish/package.py index 474b31d005..4f52796ac0 100644 --- a/var/spack/repos/builtin/packages/fish/package.py +++ b/var/spack/repos/builtin/packages/fish/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fixesproto/package.py b/var/spack/repos/builtin/packages/fixesproto/package.py index b3fb0a872b..496f356263 100644 --- a/var/spack/repos/builtin/packages/fixesproto/package.py +++ b/var/spack/repos/builtin/packages/fixesproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/flac/package.py b/var/spack/repos/builtin/packages/flac/package.py index 54584224e3..456e359151 100644 --- a/var/spack/repos/builtin/packages/flac/package.py +++ b/var/spack/repos/builtin/packages/flac/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/flann/package.py b/var/spack/repos/builtin/packages/flann/package.py index 6505a643d5..ca79d3fe33 100644 --- a/var/spack/repos/builtin/packages/flann/package.py +++ b/var/spack/repos/builtin/packages/flann/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/flash/package.py b/var/spack/repos/builtin/packages/flash/package.py index 7f4cd8e27d..5428eb815b 100644 --- a/var/spack/repos/builtin/packages/flash/package.py +++ b/var/spack/repos/builtin/packages/flash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/flex/package.py b/var/spack/repos/builtin/packages/flex/package.py index 6718569586..2f033e96b1 100644 --- a/var/spack/repos/builtin/packages/flex/package.py +++ b/var/spack/repos/builtin/packages/flex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/flint/package.py b/var/spack/repos/builtin/packages/flint/package.py index 641b96ace4..f9b6021b1e 100644 --- a/var/spack/repos/builtin/packages/flint/package.py +++ b/var/spack/repos/builtin/packages/flint/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fltk/package.py b/var/spack/repos/builtin/packages/fltk/package.py index 95ec978024..5fdf25d5a2 100644 --- a/var/spack/repos/builtin/packages/fltk/package.py +++ b/var/spack/repos/builtin/packages/fltk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/flux/package.py b/var/spack/repos/builtin/packages/flux/package.py index 4c80fb1dcc..39956fc10c 100644 --- a/var/spack/repos/builtin/packages/flux/package.py +++ b/var/spack/repos/builtin/packages/flux/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fmt/package.py b/var/spack/repos/builtin/packages/fmt/package.py index eea62f2a6a..2894c76b49 100644 --- a/var/spack/repos/builtin/packages/fmt/package.py +++ b/var/spack/repos/builtin/packages/fmt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/foam-extend/package.py b/var/spack/repos/builtin/packages/foam-extend/package.py index 9e4a6c4d0b..550cdc1bff 100644 --- a/var/spack/repos/builtin/packages/foam-extend/package.py +++ b/var/spack/repos/builtin/packages/foam-extend/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/folly/package.py b/var/spack/repos/builtin/packages/folly/package.py index 1be879ee80..af524abe8f 100644 --- a/var/spack/repos/builtin/packages/folly/package.py +++ b/var/spack/repos/builtin/packages/folly/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py index c39b6d3ef2..378bcbb4e1 100644 --- a/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-100dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py index 9da16e5712..c0bc127934 100644 --- a/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-75dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py index c2c4bb3646..dc23518fb0 100644 --- a/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-utopia-100dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py b/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py index 300d299d69..00c99025c2 100644 --- a/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-utopia-75dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py b/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py index 2d5f4745ce..37c7d054da 100644 --- a/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py +++ b/var/spack/repos/builtin/packages/font-adobe-utopia-type1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-alias/package.py b/var/spack/repos/builtin/packages/font-alias/package.py index 4a75c7b731..190fee37e9 100644 --- a/var/spack/repos/builtin/packages/font-alias/package.py +++ b/var/spack/repos/builtin/packages/font-alias/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-arabic-misc/package.py b/var/spack/repos/builtin/packages/font-arabic-misc/package.py index f34109c491..155095e076 100644 --- a/var/spack/repos/builtin/packages/font-arabic-misc/package.py +++ b/var/spack/repos/builtin/packages/font-arabic-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bh-100dpi/package.py b/var/spack/repos/builtin/packages/font-bh-100dpi/package.py index 23305a489b..55a021cbe3 100644 --- a/var/spack/repos/builtin/packages/font-bh-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-100dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bh-75dpi/package.py b/var/spack/repos/builtin/packages/font-bh-75dpi/package.py index 18d2726de2..80d94555fe 100644 --- a/var/spack/repos/builtin/packages/font-bh-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-75dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py index 5eb2fbb378..229185db96 100644 --- a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-100dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py index 4db1ec4978..7ec896f9df 100644 --- a/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bh-lucidatypewriter-75dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bh-ttf/package.py b/var/spack/repos/builtin/packages/font-bh-ttf/package.py index f571700b29..038d8be740 100644 --- a/var/spack/repos/builtin/packages/font-bh-ttf/package.py +++ b/var/spack/repos/builtin/packages/font-bh-ttf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bh-type1/package.py b/var/spack/repos/builtin/packages/font-bh-type1/package.py index 60d41103a3..c8f00673fa 100644 --- a/var/spack/repos/builtin/packages/font-bh-type1/package.py +++ b/var/spack/repos/builtin/packages/font-bh-type1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py b/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py index 495c371d0d..8bce44962c 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-100dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py b/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py index fd57c53d4f..5c44f901ed 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-75dpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py b/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py index 040632a4c2..210a61af8b 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-speedo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-bitstream-type1/package.py b/var/spack/repos/builtin/packages/font-bitstream-type1/package.py index c8d26b3e03..067ecae7ce 100644 --- a/var/spack/repos/builtin/packages/font-bitstream-type1/package.py +++ b/var/spack/repos/builtin/packages/font-bitstream-type1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py b/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py index b1c65250b4..78270ee0c3 100644 --- a/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-cronyx-cyrillic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-cursor-misc/package.py b/var/spack/repos/builtin/packages/font-cursor-misc/package.py index f96ec0f713..b447d8681f 100644 --- a/var/spack/repos/builtin/packages/font-cursor-misc/package.py +++ b/var/spack/repos/builtin/packages/font-cursor-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-daewoo-misc/package.py b/var/spack/repos/builtin/packages/font-daewoo-misc/package.py index 2b092259ac..ade01534fd 100644 --- a/var/spack/repos/builtin/packages/font-daewoo-misc/package.py +++ b/var/spack/repos/builtin/packages/font-daewoo-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-dec-misc/package.py b/var/spack/repos/builtin/packages/font-dec-misc/package.py index 1537e6f569..c69aaa1e84 100644 --- a/var/spack/repos/builtin/packages/font-dec-misc/package.py +++ b/var/spack/repos/builtin/packages/font-dec-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-ibm-type1/package.py b/var/spack/repos/builtin/packages/font-ibm-type1/package.py index 3b51051a4a..7aa47dba81 100644 --- a/var/spack/repos/builtin/packages/font-ibm-type1/package.py +++ b/var/spack/repos/builtin/packages/font-ibm-type1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-isas-misc/package.py b/var/spack/repos/builtin/packages/font-isas-misc/package.py index b12a01a14a..6b7ba9bf02 100644 --- a/var/spack/repos/builtin/packages/font-isas-misc/package.py +++ b/var/spack/repos/builtin/packages/font-isas-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-jis-misc/package.py b/var/spack/repos/builtin/packages/font-jis-misc/package.py index 5d347231db..7df4b90b82 100644 --- a/var/spack/repos/builtin/packages/font-jis-misc/package.py +++ b/var/spack/repos/builtin/packages/font-jis-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-micro-misc/package.py b/var/spack/repos/builtin/packages/font-micro-misc/package.py index 206bf596a2..d1fb155197 100644 --- a/var/spack/repos/builtin/packages/font-micro-misc/package.py +++ b/var/spack/repos/builtin/packages/font-micro-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py b/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py index 6cef597778..2b05b75a2c 100644 --- a/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-misc-cyrillic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py b/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py index 66bca90d9b..f85c3ea2fc 100644 --- a/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py +++ b/var/spack/repos/builtin/packages/font-misc-ethiopic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-misc-meltho/package.py b/var/spack/repos/builtin/packages/font-misc-meltho/package.py index 2c93678765..128651d66b 100644 --- a/var/spack/repos/builtin/packages/font-misc-meltho/package.py +++ b/var/spack/repos/builtin/packages/font-misc-meltho/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-misc-misc/package.py b/var/spack/repos/builtin/packages/font-misc-misc/package.py index 79ce98c2c1..6cee8c584e 100644 --- a/var/spack/repos/builtin/packages/font-misc-misc/package.py +++ b/var/spack/repos/builtin/packages/font-misc-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-mutt-misc/package.py b/var/spack/repos/builtin/packages/font-mutt-misc/package.py index 39c3e256bd..3975279834 100644 --- a/var/spack/repos/builtin/packages/font-mutt-misc/package.py +++ b/var/spack/repos/builtin/packages/font-mutt-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-schumacher-misc/package.py b/var/spack/repos/builtin/packages/font-schumacher-misc/package.py index d209c0d734..c434177e18 100644 --- a/var/spack/repos/builtin/packages/font-schumacher-misc/package.py +++ b/var/spack/repos/builtin/packages/font-schumacher-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py b/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py index 66db505a10..67f4f2f22d 100644 --- a/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-screen-cyrillic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-sony-misc/package.py b/var/spack/repos/builtin/packages/font-sony-misc/package.py index 792b7556d8..77e4a6cd92 100644 --- a/var/spack/repos/builtin/packages/font-sony-misc/package.py +++ b/var/spack/repos/builtin/packages/font-sony-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-sun-misc/package.py b/var/spack/repos/builtin/packages/font-sun-misc/package.py index 3fe3dfb511..a819884102 100644 --- a/var/spack/repos/builtin/packages/font-sun-misc/package.py +++ b/var/spack/repos/builtin/packages/font-sun-misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-util/package.py b/var/spack/repos/builtin/packages/font-util/package.py index 5aac7cd59e..999c6fc453 100644 --- a/var/spack/repos/builtin/packages/font-util/package.py +++ b/var/spack/repos/builtin/packages/font-util/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py b/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py index 1ee6210641..78ef156cbb 100644 --- a/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py +++ b/var/spack/repos/builtin/packages/font-winitzki-cyrillic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/font-xfree86-type1/package.py b/var/spack/repos/builtin/packages/font-xfree86-type1/package.py index b20c1c4194..27cb7fc799 100644 --- a/var/spack/repos/builtin/packages/font-xfree86-type1/package.py +++ b/var/spack/repos/builtin/packages/font-xfree86-type1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fontcacheproto/package.py b/var/spack/repos/builtin/packages/fontcacheproto/package.py index d385ab353d..3809457f79 100644 --- a/var/spack/repos/builtin/packages/fontcacheproto/package.py +++ b/var/spack/repos/builtin/packages/fontcacheproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fontconfig/package.py b/var/spack/repos/builtin/packages/fontconfig/package.py index e7d1068496..6aebf014fb 100644 --- a/var/spack/repos/builtin/packages/fontconfig/package.py +++ b/var/spack/repos/builtin/packages/fontconfig/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fontsproto/package.py b/var/spack/repos/builtin/packages/fontsproto/package.py index e584a81ce9..235567bd06 100644 --- a/var/spack/repos/builtin/packages/fontsproto/package.py +++ b/var/spack/repos/builtin/packages/fontsproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fonttosfnt/package.py b/var/spack/repos/builtin/packages/fonttosfnt/package.py index 37f2dfe923..d1d0d23491 100644 --- a/var/spack/repos/builtin/packages/fonttosfnt/package.py +++ b/var/spack/repos/builtin/packages/fonttosfnt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/freebayes/package.py b/var/spack/repos/builtin/packages/freebayes/package.py index 9fb7fd1161..d67e50f05c 100644 --- a/var/spack/repos/builtin/packages/freebayes/package.py +++ b/var/spack/repos/builtin/packages/freebayes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/freetype/package.py b/var/spack/repos/builtin/packages/freetype/package.py index 9d3211f83b..f317e3efad 100644 --- a/var/spack/repos/builtin/packages/freetype/package.py +++ b/var/spack/repos/builtin/packages/freetype/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fseq/package.py b/var/spack/repos/builtin/packages/fseq/package.py index 71f450ec42..8fd0344928 100644 --- a/var/spack/repos/builtin/packages/fseq/package.py +++ b/var/spack/repos/builtin/packages/fseq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fslsfonts/package.py b/var/spack/repos/builtin/packages/fslsfonts/package.py index febba4d6f8..c29b6558c5 100644 --- a/var/spack/repos/builtin/packages/fslsfonts/package.py +++ b/var/spack/repos/builtin/packages/fslsfonts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/fstobdf/package.py b/var/spack/repos/builtin/packages/fstobdf/package.py index 5fd3ba837f..42fc81b950 100644 --- a/var/spack/repos/builtin/packages/fstobdf/package.py +++ b/var/spack/repos/builtin/packages/fstobdf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/funhpc/package.py b/var/spack/repos/builtin/packages/funhpc/package.py index 3526118c9e..45170003bb 100644 --- a/var/spack/repos/builtin/packages/funhpc/package.py +++ b/var/spack/repos/builtin/packages/funhpc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gapcloser/package.py b/var/spack/repos/builtin/packages/gapcloser/package.py index 4505234756..a8286e3838 100644 --- a/var/spack/repos/builtin/packages/gapcloser/package.py +++ b/var/spack/repos/builtin/packages/gapcloser/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gapfiller/package.py b/var/spack/repos/builtin/packages/gapfiller/package.py index 766c51d42d..744cef8db3 100644 --- a/var/spack/repos/builtin/packages/gapfiller/package.py +++ b/var/spack/repos/builtin/packages/gapfiller/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gasnet/package.py b/var/spack/repos/builtin/packages/gasnet/package.py index a27cf25dd6..da4aa514df 100644 --- a/var/spack/repos/builtin/packages/gasnet/package.py +++ b/var/spack/repos/builtin/packages/gasnet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gaussian/package.py b/var/spack/repos/builtin/packages/gaussian/package.py index d2fcee438f..580d365c23 100644 --- a/var/spack/repos/builtin/packages/gaussian/package.py +++ b/var/spack/repos/builtin/packages/gaussian/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gawk/package.py b/var/spack/repos/builtin/packages/gawk/package.py index bb331527e6..0a428b20ed 100644 --- a/var/spack/repos/builtin/packages/gawk/package.py +++ b/var/spack/repos/builtin/packages/gawk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gblocks/package.py b/var/spack/repos/builtin/packages/gblocks/package.py index a03fc81509..49d5eddc58 100644 --- a/var/spack/repos/builtin/packages/gblocks/package.py +++ b/var/spack/repos/builtin/packages/gblocks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index aef1158971..d690e63683 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gccmakedep/package.py b/var/spack/repos/builtin/packages/gccmakedep/package.py index a3af53be2d..990f55400b 100644 --- a/var/spack/repos/builtin/packages/gccmakedep/package.py +++ b/var/spack/repos/builtin/packages/gccmakedep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gconf/package.py b/var/spack/repos/builtin/packages/gconf/package.py index 5bd0c9c37b..a0af4d9c8b 100644 --- a/var/spack/repos/builtin/packages/gconf/package.py +++ b/var/spack/repos/builtin/packages/gconf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gdal/package.py b/var/spack/repos/builtin/packages/gdal/package.py index 9d0c7cf4e0..d578bd674c 100644 --- a/var/spack/repos/builtin/packages/gdal/package.py +++ b/var/spack/repos/builtin/packages/gdal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gdb/package.py b/var/spack/repos/builtin/packages/gdb/package.py index 36c1af35fe..04a6901220 100644 --- a/var/spack/repos/builtin/packages/gdb/package.py +++ b/var/spack/repos/builtin/packages/gdb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gdbm/package.py b/var/spack/repos/builtin/packages/gdbm/package.py index fea4aa4b15..643750858d 100644 --- a/var/spack/repos/builtin/packages/gdbm/package.py +++ b/var/spack/repos/builtin/packages/gdbm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py index b3f881cc85..f9bd242cde 100644 --- a/var/spack/repos/builtin/packages/gdk-pixbuf/package.py +++ b/var/spack/repos/builtin/packages/gdk-pixbuf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/geant4/package.py b/var/spack/repos/builtin/packages/geant4/package.py index 95d3eb9d55..62c0d7f6d2 100644 --- a/var/spack/repos/builtin/packages/geant4/package.py +++ b/var/spack/repos/builtin/packages/geant4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gemmlowp/package.py b/var/spack/repos/builtin/packages/gemmlowp/package.py index 98bb69b1ba..1f705a47b8 100644 --- a/var/spack/repos/builtin/packages/gemmlowp/package.py +++ b/var/spack/repos/builtin/packages/gemmlowp/package.py @@ -1,5 +1,5 @@ ############################################################################# -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/genemark-et/package.py b/var/spack/repos/builtin/packages/genemark-et/package.py index 352f728290..166e56c302 100644 --- a/var/spack/repos/builtin/packages/genemark-et/package.py +++ b/var/spack/repos/builtin/packages/genemark-et/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/genometools/package.py b/var/spack/repos/builtin/packages/genometools/package.py index afb45bdd84..ebbbfb9f76 100644 --- a/var/spack/repos/builtin/packages/genometools/package.py +++ b/var/spack/repos/builtin/packages/genometools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/geos/package.py b/var/spack/repos/builtin/packages/geos/package.py index bbd712fa2d..529862f63c 100644 --- a/var/spack/repos/builtin/packages/geos/package.py +++ b/var/spack/repos/builtin/packages/geos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gettext/package.py b/var/spack/repos/builtin/packages/gettext/package.py index 7fff421952..d8d5fdf7b5 100644 --- a/var/spack/repos/builtin/packages/gettext/package.py +++ b/var/spack/repos/builtin/packages/gettext/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gflags/package.py b/var/spack/repos/builtin/packages/gflags/package.py index b96ee7a706..4bc7a5f315 100644 --- a/var/spack/repos/builtin/packages/gflags/package.py +++ b/var/spack/repos/builtin/packages/gflags/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ghostscript-fonts/package.py b/var/spack/repos/builtin/packages/ghostscript-fonts/package.py index 69b1194322..068aea2cb6 100644 --- a/var/spack/repos/builtin/packages/ghostscript-fonts/package.py +++ b/var/spack/repos/builtin/packages/ghostscript-fonts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ghostscript/package.py b/var/spack/repos/builtin/packages/ghostscript/package.py index 8463dcea0e..6e8c6d3801 100644 --- a/var/spack/repos/builtin/packages/ghostscript/package.py +++ b/var/spack/repos/builtin/packages/ghostscript/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/giflib/package.py b/var/spack/repos/builtin/packages/giflib/package.py index 50077c93f6..436eed2388 100644 --- a/var/spack/repos/builtin/packages/giflib/package.py +++ b/var/spack/repos/builtin/packages/giflib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/git-lfs/package.py b/var/spack/repos/builtin/packages/git-lfs/package.py index 5711366ea0..d202e3cfd0 100644 --- a/var/spack/repos/builtin/packages/git-lfs/package.py +++ b/var/spack/repos/builtin/packages/git-lfs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/git/package.py b/var/spack/repos/builtin/packages/git/package.py index 9dc9e460af..31c6f01e77 100644 --- a/var/spack/repos/builtin/packages/git/package.py +++ b/var/spack/repos/builtin/packages/git/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gl2ps/package.py b/var/spack/repos/builtin/packages/gl2ps/package.py index eff6402552..e56e916d1d 100644 --- a/var/spack/repos/builtin/packages/gl2ps/package.py +++ b/var/spack/repos/builtin/packages/gl2ps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/glew/package.py b/var/spack/repos/builtin/packages/glew/package.py index 68ca924de6..8e522ca4c6 100644 --- a/var/spack/repos/builtin/packages/glew/package.py +++ b/var/spack/repos/builtin/packages/glew/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/glib/package.py b/var/spack/repos/builtin/packages/glib/package.py index b4b888a487..8b882f1310 100644 --- a/var/spack/repos/builtin/packages/glib/package.py +++ b/var/spack/repos/builtin/packages/glib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/glm/package.py b/var/spack/repos/builtin/packages/glm/package.py index 507c9606e3..9c26589f93 100644 --- a/var/spack/repos/builtin/packages/glm/package.py +++ b/var/spack/repos/builtin/packages/glm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/global/package.py b/var/spack/repos/builtin/packages/global/package.py index a137dd7dd3..09eb223de7 100644 --- a/var/spack/repos/builtin/packages/global/package.py +++ b/var/spack/repos/builtin/packages/global/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/globus-toolkit/package.py b/var/spack/repos/builtin/packages/globus-toolkit/package.py index 856223ee74..e30b11fbce 100644 --- a/var/spack/repos/builtin/packages/globus-toolkit/package.py +++ b/var/spack/repos/builtin/packages/globus-toolkit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/glog/package.py b/var/spack/repos/builtin/packages/glog/package.py index 551f36037a..d46271f956 100644 --- a/var/spack/repos/builtin/packages/glog/package.py +++ b/var/spack/repos/builtin/packages/glog/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/glpk/package.py b/var/spack/repos/builtin/packages/glpk/package.py index 15941b4211..7e31fe6e83 100644 --- a/var/spack/repos/builtin/packages/glpk/package.py +++ b/var/spack/repos/builtin/packages/glpk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/glproto/package.py b/var/spack/repos/builtin/packages/glproto/package.py index 7013baff38..d7617af673 100644 --- a/var/spack/repos/builtin/packages/glproto/package.py +++ b/var/spack/repos/builtin/packages/glproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gmake/package.py b/var/spack/repos/builtin/packages/gmake/package.py index 0c215a4e82..c8e7111fa5 100644 --- a/var/spack/repos/builtin/packages/gmake/package.py +++ b/var/spack/repos/builtin/packages/gmake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gmap-gsnap/package.py b/var/spack/repos/builtin/packages/gmap-gsnap/package.py index e2c79848a0..e9ff419557 100644 --- a/var/spack/repos/builtin/packages/gmap-gsnap/package.py +++ b/var/spack/repos/builtin/packages/gmap-gsnap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gmime/package.py b/var/spack/repos/builtin/packages/gmime/package.py index 1882fad2e7..196401a341 100644 --- a/var/spack/repos/builtin/packages/gmime/package.py +++ b/var/spack/repos/builtin/packages/gmime/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gmp/package.py b/var/spack/repos/builtin/packages/gmp/package.py index b7a9fa74cf..a869fcbe0f 100644 --- a/var/spack/repos/builtin/packages/gmp/package.py +++ b/var/spack/repos/builtin/packages/gmp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gmsh/package.py b/var/spack/repos/builtin/packages/gmsh/package.py index 977bf6c3d6..a36e11aa9f 100644 --- a/var/spack/repos/builtin/packages/gmsh/package.py +++ b/var/spack/repos/builtin/packages/gmsh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gnat/package.py b/var/spack/repos/builtin/packages/gnat/package.py index e6fb814c08..b3b9f46213 100644 --- a/var/spack/repos/builtin/packages/gnat/package.py +++ b/var/spack/repos/builtin/packages/gnat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gnu-prolog/package.py b/var/spack/repos/builtin/packages/gnu-prolog/package.py index 4300d581d2..e6ade17130 100644 --- a/var/spack/repos/builtin/packages/gnu-prolog/package.py +++ b/var/spack/repos/builtin/packages/gnu-prolog/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gnupg/package.py b/var/spack/repos/builtin/packages/gnupg/package.py index 51987e2dd8..31314b7135 100644 --- a/var/spack/repos/builtin/packages/gnupg/package.py +++ b/var/spack/repos/builtin/packages/gnupg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gnuplot/package.py b/var/spack/repos/builtin/packages/gnuplot/package.py index c5d8f315c5..155316ce60 100644 --- a/var/spack/repos/builtin/packages/gnuplot/package.py +++ b/var/spack/repos/builtin/packages/gnuplot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gnutls/package.py b/var/spack/repos/builtin/packages/gnutls/package.py index 9dfb0713fd..cb4ea80c9d 100644 --- a/var/spack/repos/builtin/packages/gnutls/package.py +++ b/var/spack/repos/builtin/packages/gnutls/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/go-bootstrap/package.py b/var/spack/repos/builtin/packages/go-bootstrap/package.py index 74cdbf348d..c759cb88b8 100644 --- a/var/spack/repos/builtin/packages/go-bootstrap/package.py +++ b/var/spack/repos/builtin/packages/go-bootstrap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py index 77f6470693..f5c7657c00 100644 --- a/var/spack/repos/builtin/packages/go/package.py +++ b/var/spack/repos/builtin/packages/go/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gobject-introspection/package.py b/var/spack/repos/builtin/packages/gobject-introspection/package.py index 26e5da3d56..1433898919 100644 --- a/var/spack/repos/builtin/packages/gobject-introspection/package.py +++ b/var/spack/repos/builtin/packages/gobject-introspection/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/googletest/package.py b/var/spack/repos/builtin/packages/googletest/package.py index 517655fced..48dfcabb2f 100644 --- a/var/spack/repos/builtin/packages/googletest/package.py +++ b/var/spack/repos/builtin/packages/googletest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gource/package.py b/var/spack/repos/builtin/packages/gource/package.py index 5118169c7c..497bb6f29f 100644 --- a/var/spack/repos/builtin/packages/gource/package.py +++ b/var/spack/repos/builtin/packages/gource/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gperf/package.py b/var/spack/repos/builtin/packages/gperf/package.py index 7e19221e40..af3f5edd9c 100644 --- a/var/spack/repos/builtin/packages/gperf/package.py +++ b/var/spack/repos/builtin/packages/gperf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gperftools/package.py b/var/spack/repos/builtin/packages/gperftools/package.py index 1c208595ad..05c20fb5bf 100644 --- a/var/spack/repos/builtin/packages/gperftools/package.py +++ b/var/spack/repos/builtin/packages/gperftools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/grackle/package.py b/var/spack/repos/builtin/packages/grackle/package.py index 02f6f17611..3cf4e849bb 100644 --- a/var/spack/repos/builtin/packages/grackle/package.py +++ b/var/spack/repos/builtin/packages/grackle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gradle/package.py b/var/spack/repos/builtin/packages/gradle/package.py index 1eef10463e..86837fa3bf 100644 --- a/var/spack/repos/builtin/packages/gradle/package.py +++ b/var/spack/repos/builtin/packages/gradle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/grandr/package.py b/var/spack/repos/builtin/packages/grandr/package.py index e8910b519e..1035dd82ad 100644 --- a/var/spack/repos/builtin/packages/grandr/package.py +++ b/var/spack/repos/builtin/packages/grandr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/graphlib/package.py b/var/spack/repos/builtin/packages/graphlib/package.py index 5d4582c365..b99fc83379 100644 --- a/var/spack/repos/builtin/packages/graphlib/package.py +++ b/var/spack/repos/builtin/packages/graphlib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/graphmap/package.py b/var/spack/repos/builtin/packages/graphmap/package.py index 954fc7622a..63d2ac74d7 100644 --- a/var/spack/repos/builtin/packages/graphmap/package.py +++ b/var/spack/repos/builtin/packages/graphmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/graphviz/package.py b/var/spack/repos/builtin/packages/graphviz/package.py index 2f39c8ce1f..8ac1b66278 100644 --- a/var/spack/repos/builtin/packages/graphviz/package.py +++ b/var/spack/repos/builtin/packages/graphviz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/grib-api/package.py b/var/spack/repos/builtin/packages/grib-api/package.py index d3f971d737..78ed6d36b2 100644 --- a/var/spack/repos/builtin/packages/grib-api/package.py +++ b/var/spack/repos/builtin/packages/grib-api/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/groff/package.py b/var/spack/repos/builtin/packages/groff/package.py index 1cef3040e0..a4aa4b868d 100644 --- a/var/spack/repos/builtin/packages/groff/package.py +++ b/var/spack/repos/builtin/packages/groff/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gromacs/package.py b/var/spack/repos/builtin/packages/gromacs/package.py index ae17193139..e6b3aff65f 100644 --- a/var/spack/repos/builtin/packages/gromacs/package.py +++ b/var/spack/repos/builtin/packages/gromacs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gsl/package.py b/var/spack/repos/builtin/packages/gsl/package.py index 4c95612d6d..17ec619a7c 100644 --- a/var/spack/repos/builtin/packages/gsl/package.py +++ b/var/spack/repos/builtin/packages/gsl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gtkorvo-atl/package.py b/var/spack/repos/builtin/packages/gtkorvo-atl/package.py index 2dc96ca1f1..e6bc30191a 100644 --- a/var/spack/repos/builtin/packages/gtkorvo-atl/package.py +++ b/var/spack/repos/builtin/packages/gtkorvo-atl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gtkorvo-cercs-env/package.py b/var/spack/repos/builtin/packages/gtkorvo-cercs-env/package.py index 1287c1f91d..80081a818c 100644 --- a/var/spack/repos/builtin/packages/gtkorvo-cercs-env/package.py +++ b/var/spack/repos/builtin/packages/gtkorvo-cercs-env/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gtkorvo-dill/package.py b/var/spack/repos/builtin/packages/gtkorvo-dill/package.py index f32539e43e..59c3974448 100644 --- a/var/spack/repos/builtin/packages/gtkorvo-dill/package.py +++ b/var/spack/repos/builtin/packages/gtkorvo-dill/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gtkorvo-enet/package.py b/var/spack/repos/builtin/packages/gtkorvo-enet/package.py index 5c63a5ab23..88af085220 100644 --- a/var/spack/repos/builtin/packages/gtkorvo-enet/package.py +++ b/var/spack/repos/builtin/packages/gtkorvo-enet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gtkplus/package.py b/var/spack/repos/builtin/packages/gtkplus/package.py index 1b85bb0a4c..84eb21d865 100644 --- a/var/spack/repos/builtin/packages/gtkplus/package.py +++ b/var/spack/repos/builtin/packages/gtkplus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/gts/package.py b/var/spack/repos/builtin/packages/gts/package.py index adac0e1d05..3133227097 100644 --- a/var/spack/repos/builtin/packages/gts/package.py +++ b/var/spack/repos/builtin/packages/gts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/guile/package.py b/var/spack/repos/builtin/packages/guile/package.py index ff3ca84b00..90f79a1501 100644 --- a/var/spack/repos/builtin/packages/guile/package.py +++ b/var/spack/repos/builtin/packages/guile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/h5hut/package.py b/var/spack/repos/builtin/packages/h5hut/package.py index 5b0a9fa5a2..f04ebc2344 100644 --- a/var/spack/repos/builtin/packages/h5hut/package.py +++ b/var/spack/repos/builtin/packages/h5hut/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/h5utils/package.py b/var/spack/repos/builtin/packages/h5utils/package.py index 0ed9516f34..4718f35dd0 100644 --- a/var/spack/repos/builtin/packages/h5utils/package.py +++ b/var/spack/repos/builtin/packages/h5utils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/h5z-zfp/package.py b/var/spack/repos/builtin/packages/h5z-zfp/package.py index ddb03c64e0..d5d2bfa4fc 100644 --- a/var/spack/repos/builtin/packages/h5z-zfp/package.py +++ b/var/spack/repos/builtin/packages/h5z-zfp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hadoop/package.py b/var/spack/repos/builtin/packages/hadoop/package.py index 3aa632b9df..702bac43d6 100644 --- a/var/spack/repos/builtin/packages/hadoop/package.py +++ b/var/spack/repos/builtin/packages/hadoop/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hapcut2/package.py b/var/spack/repos/builtin/packages/hapcut2/package.py index 1e91d1d541..282214fdf1 100644 --- a/var/spack/repos/builtin/packages/hapcut2/package.py +++ b/var/spack/repos/builtin/packages/hapcut2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/haploview/package.py b/var/spack/repos/builtin/packages/haploview/package.py index 9ffe6898b5..ab6874455c 100644 --- a/var/spack/repos/builtin/packages/haploview/package.py +++ b/var/spack/repos/builtin/packages/haploview/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/harfbuzz/package.py b/var/spack/repos/builtin/packages/harfbuzz/package.py index 5323607fb8..5b1f207849 100644 --- a/var/spack/repos/builtin/packages/harfbuzz/package.py +++ b/var/spack/repos/builtin/packages/harfbuzz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/harminv/package.py b/var/spack/repos/builtin/packages/harminv/package.py index d96e31b3c3..82b762bbb0 100644 --- a/var/spack/repos/builtin/packages/harminv/package.py +++ b/var/spack/repos/builtin/packages/harminv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hdf/package.py b/var/spack/repos/builtin/packages/hdf/package.py index 87309ed65e..7919ac796a 100644 --- a/var/spack/repos/builtin/packages/hdf/package.py +++ b/var/spack/repos/builtin/packages/hdf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hdf5-blosc/package.py b/var/spack/repos/builtin/packages/hdf5-blosc/package.py index f8b1c5e363..a12fb14d6d 100644 --- a/var/spack/repos/builtin/packages/hdf5-blosc/package.py +++ b/var/spack/repos/builtin/packages/hdf5-blosc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index cf8f00d797..4cc2ecbd65 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/help2man/package.py b/var/spack/repos/builtin/packages/help2man/package.py index d4a8ba9fe4..07d573a9c4 100644 --- a/var/spack/repos/builtin/packages/help2man/package.py +++ b/var/spack/repos/builtin/packages/help2man/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hepmc/package.py b/var/spack/repos/builtin/packages/hepmc/package.py index 711daa88f8..f49de2e0f4 100644 --- a/var/spack/repos/builtin/packages/hepmc/package.py +++ b/var/spack/repos/builtin/packages/hepmc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/heppdt/package.py b/var/spack/repos/builtin/packages/heppdt/package.py index 4a534a8c8a..c5a0ca8572 100644 --- a/var/spack/repos/builtin/packages/heppdt/package.py +++ b/var/spack/repos/builtin/packages/heppdt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/highfive/package.py b/var/spack/repos/builtin/packages/highfive/package.py index 2a071d7958..97b0741aa7 100644 --- a/var/spack/repos/builtin/packages/highfive/package.py +++ b/var/spack/repos/builtin/packages/highfive/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/highwayhash/package.py b/var/spack/repos/builtin/packages/highwayhash/package.py index 031f526cdb..b4a789f5f8 100644 --- a/var/spack/repos/builtin/packages/highwayhash/package.py +++ b/var/spack/repos/builtin/packages/highwayhash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hmmer/package.py b/var/spack/repos/builtin/packages/hmmer/package.py index 6f152d85d6..10a2183c1f 100644 --- a/var/spack/repos/builtin/packages/hmmer/package.py +++ b/var/spack/repos/builtin/packages/hmmer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hoomd-blue/package.py b/var/spack/repos/builtin/packages/hoomd-blue/package.py index 9c1ad387b2..fda068dc30 100644 --- a/var/spack/repos/builtin/packages/hoomd-blue/package.py +++ b/var/spack/repos/builtin/packages/hoomd-blue/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hpccg/package.py b/var/spack/repos/builtin/packages/hpccg/package.py index 7e9514ce0b..e6a6f5e23c 100644 --- a/var/spack/repos/builtin/packages/hpccg/package.py +++ b/var/spack/repos/builtin/packages/hpccg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py b/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py index dfc4529642..95e42f981d 100644 --- a/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py +++ b/var/spack/repos/builtin/packages/hpctoolkit-externals/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hpctoolkit/package.py b/var/spack/repos/builtin/packages/hpctoolkit/package.py index 8239f51a0b..d2fc86a7fb 100644 --- a/var/spack/repos/builtin/packages/hpctoolkit/package.py +++ b/var/spack/repos/builtin/packages/hpctoolkit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hpl/package.py b/var/spack/repos/builtin/packages/hpl/package.py index 460f131e6a..e621b18298 100644 --- a/var/spack/repos/builtin/packages/hpl/package.py +++ b/var/spack/repos/builtin/packages/hpl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hpx5/package.py b/var/spack/repos/builtin/packages/hpx5/package.py index 12e5c80016..9966bb14fa 100644 --- a/var/spack/repos/builtin/packages/hpx5/package.py +++ b/var/spack/repos/builtin/packages/hpx5/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hsakmt/package.py b/var/spack/repos/builtin/packages/hsakmt/package.py index 2adb852a60..098eca4874 100644 --- a/var/spack/repos/builtin/packages/hsakmt/package.py +++ b/var/spack/repos/builtin/packages/hsakmt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hstr/package.py b/var/spack/repos/builtin/packages/hstr/package.py index ce0650e5e8..681f1f65ed 100644 --- a/var/spack/repos/builtin/packages/hstr/package.py +++ b/var/spack/repos/builtin/packages/hstr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/htop/package.py b/var/spack/repos/builtin/packages/htop/package.py index d88a6fe3c9..d971dac945 100644 --- a/var/spack/repos/builtin/packages/htop/package.py +++ b/var/spack/repos/builtin/packages/htop/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/htslib/package.py b/var/spack/repos/builtin/packages/htslib/package.py index 4c033c4272..2921aee14b 100644 --- a/var/spack/repos/builtin/packages/htslib/package.py +++ b/var/spack/repos/builtin/packages/htslib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/httpie/package.py b/var/spack/repos/builtin/packages/httpie/package.py index 8068ffc9b5..c187a1f4bb 100644 --- a/var/spack/repos/builtin/packages/httpie/package.py +++ b/var/spack/repos/builtin/packages/httpie/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hub/package.py b/var/spack/repos/builtin/packages/hub/package.py index c038a67761..1ee420871c 100644 --- a/var/spack/repos/builtin/packages/hub/package.py +++ b/var/spack/repos/builtin/packages/hub/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hunspell/package.py b/var/spack/repos/builtin/packages/hunspell/package.py index 15c1079e4d..21bbac3825 100644 --- a/var/spack/repos/builtin/packages/hunspell/package.py +++ b/var/spack/repos/builtin/packages/hunspell/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hwloc/package.py b/var/spack/repos/builtin/packages/hwloc/package.py index f7ccaa4f38..c5de3da6b1 100644 --- a/var/spack/repos/builtin/packages/hwloc/package.py +++ b/var/spack/repos/builtin/packages/hwloc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hybpiper/package.py b/var/spack/repos/builtin/packages/hybpiper/package.py index a9e49cef90..0d0be0c247 100644 --- a/var/spack/repos/builtin/packages/hybpiper/package.py +++ b/var/spack/repos/builtin/packages/hybpiper/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hydra/package.py b/var/spack/repos/builtin/packages/hydra/package.py index 1c1632d418..be3cca5b23 100644 --- a/var/spack/repos/builtin/packages/hydra/package.py +++ b/var/spack/repos/builtin/packages/hydra/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/hypre/package.py b/var/spack/repos/builtin/packages/hypre/package.py index 8dca02d4dd..e59997a44b 100644 --- a/var/spack/repos/builtin/packages/hypre/package.py +++ b/var/spack/repos/builtin/packages/hypre/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ibmisc/package.py b/var/spack/repos/builtin/packages/ibmisc/package.py index 8640e5d3c5..07a051473c 100644 --- a/var/spack/repos/builtin/packages/ibmisc/package.py +++ b/var/spack/repos/builtin/packages/ibmisc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/iceauth/package.py b/var/spack/repos/builtin/packages/iceauth/package.py index bd2493347b..65962b2ee1 100644 --- a/var/spack/repos/builtin/packages/iceauth/package.py +++ b/var/spack/repos/builtin/packages/iceauth/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/icedtea/package.py b/var/spack/repos/builtin/packages/icedtea/package.py index 7fd096cc77..243cf19a6a 100644 --- a/var/spack/repos/builtin/packages/icedtea/package.py +++ b/var/spack/repos/builtin/packages/icedtea/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/icet/package.py b/var/spack/repos/builtin/packages/icet/package.py index b2ff89ac69..688974ca9d 100644 --- a/var/spack/repos/builtin/packages/icet/package.py +++ b/var/spack/repos/builtin/packages/icet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ico/package.py b/var/spack/repos/builtin/packages/ico/package.py index a81f004a2e..f2e39718e7 100644 --- a/var/spack/repos/builtin/packages/ico/package.py +++ b/var/spack/repos/builtin/packages/ico/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/icu4c/package.py b/var/spack/repos/builtin/packages/icu4c/package.py index f5f75931b6..a050edf437 100644 --- a/var/spack/repos/builtin/packages/icu4c/package.py +++ b/var/spack/repos/builtin/packages/icu4c/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/id3lib/package.py b/var/spack/repos/builtin/packages/id3lib/package.py index 65030085de..96a44742b0 100644 --- a/var/spack/repos/builtin/packages/id3lib/package.py +++ b/var/spack/repos/builtin/packages/id3lib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/idba/package.py b/var/spack/repos/builtin/packages/idba/package.py index 25a3e029aa..e46f56fa72 100644 --- a/var/spack/repos/builtin/packages/idba/package.py +++ b/var/spack/repos/builtin/packages/idba/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/igraph/package.py b/var/spack/repos/builtin/packages/igraph/package.py index 030ef1f604..641f6bc733 100644 --- a/var/spack/repos/builtin/packages/igraph/package.py +++ b/var/spack/repos/builtin/packages/igraph/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ilmbase/package.py b/var/spack/repos/builtin/packages/ilmbase/package.py index 23e77ccfa3..9bc5813740 100644 --- a/var/spack/repos/builtin/packages/ilmbase/package.py +++ b/var/spack/repos/builtin/packages/ilmbase/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/image-magick/package.py b/var/spack/repos/builtin/packages/image-magick/package.py index 77f7f795e7..9ff9bfa420 100644 --- a/var/spack/repos/builtin/packages/image-magick/package.py +++ b/var/spack/repos/builtin/packages/image-magick/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/imake/package.py b/var/spack/repos/builtin/packages/imake/package.py index 23dbd45723..4ce031345f 100644 --- a/var/spack/repos/builtin/packages/imake/package.py +++ b/var/spack/repos/builtin/packages/imake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/impute2/package.py b/var/spack/repos/builtin/packages/impute2/package.py index b4b0cb20d2..62dd4a61d0 100644 --- a/var/spack/repos/builtin/packages/impute2/package.py +++ b/var/spack/repos/builtin/packages/impute2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/infernal/package.py b/var/spack/repos/builtin/packages/infernal/package.py index 8719d0a227..37fad6245f 100644 --- a/var/spack/repos/builtin/packages/infernal/package.py +++ b/var/spack/repos/builtin/packages/infernal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/inputproto/package.py b/var/spack/repos/builtin/packages/inputproto/package.py index b2ece2fb14..4eb64e6b90 100644 --- a/var/spack/repos/builtin/packages/inputproto/package.py +++ b/var/spack/repos/builtin/packages/inputproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-daal/package.py b/var/spack/repos/builtin/packages/intel-daal/package.py index 1713218ad3..68af105038 100644 --- a/var/spack/repos/builtin/packages/intel-daal/package.py +++ b/var/spack/repos/builtin/packages/intel-daal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-gpu-tools/package.py b/var/spack/repos/builtin/packages/intel-gpu-tools/package.py index 004d91e7de..7f6de2d5c1 100644 --- a/var/spack/repos/builtin/packages/intel-gpu-tools/package.py +++ b/var/spack/repos/builtin/packages/intel-gpu-tools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-ipp/package.py b/var/spack/repos/builtin/packages/intel-ipp/package.py index 4ca20a9906..a243d16c57 100644 --- a/var/spack/repos/builtin/packages/intel-ipp/package.py +++ b/var/spack/repos/builtin/packages/intel-ipp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-mkl/package.py b/var/spack/repos/builtin/packages/intel-mkl/package.py index 1cc3c00af2..9c9a25fabd 100644 --- a/var/spack/repos/builtin/packages/intel-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-mkl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-mpi/package.py b/var/spack/repos/builtin/packages/intel-mpi/package.py index b9aaf12c1c..88a68e57ec 100644 --- a/var/spack/repos/builtin/packages/intel-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-mpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py index 12a3f15f26..b4d620c0d7 100644 --- a/var/spack/repos/builtin/packages/intel-parallel-studio/package.py +++ b/var/spack/repos/builtin/packages/intel-parallel-studio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel-tbb/package.py b/var/spack/repos/builtin/packages/intel-tbb/package.py index 6d5c2bbbb0..766a9cb92e 100644 --- a/var/spack/repos/builtin/packages/intel-tbb/package.py +++ b/var/spack/repos/builtin/packages/intel-tbb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intel/package.py b/var/spack/repos/builtin/packages/intel/package.py index 8024a5ebea..35ad91c095 100644 --- a/var/spack/repos/builtin/packages/intel/package.py +++ b/var/spack/repos/builtin/packages/intel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/intltool/package.py b/var/spack/repos/builtin/packages/intltool/package.py index c54cae1323..068fc16e70 100644 --- a/var/spack/repos/builtin/packages/intltool/package.py +++ b/var/spack/repos/builtin/packages/intltool/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ior/package.py b/var/spack/repos/builtin/packages/ior/package.py index ef5fa5b7be..63c7db1225 100644 --- a/var/spack/repos/builtin/packages/ior/package.py +++ b/var/spack/repos/builtin/packages/ior/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/iozone/package.py b/var/spack/repos/builtin/packages/iozone/package.py index 9278b881b0..d17eac4d95 100644 --- a/var/spack/repos/builtin/packages/iozone/package.py +++ b/var/spack/repos/builtin/packages/iozone/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ipopt/package.py b/var/spack/repos/builtin/packages/ipopt/package.py index 77faeb8051..cf015be49c 100644 --- a/var/spack/repos/builtin/packages/ipopt/package.py +++ b/var/spack/repos/builtin/packages/ipopt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/isl/package.py b/var/spack/repos/builtin/packages/isl/package.py index bc7c240e1d..ba5108674a 100644 --- a/var/spack/repos/builtin/packages/isl/package.py +++ b/var/spack/repos/builtin/packages/isl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/itstool/package.py b/var/spack/repos/builtin/packages/itstool/package.py index 3aa2885006..24cb4d8829 100644 --- a/var/spack/repos/builtin/packages/itstool/package.py +++ b/var/spack/repos/builtin/packages/itstool/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/itsx/package.py b/var/spack/repos/builtin/packages/itsx/package.py index 41b0d9a6a2..f83d16ab68 100644 --- a/var/spack/repos/builtin/packages/itsx/package.py +++ b/var/spack/repos/builtin/packages/itsx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jags/package.py b/var/spack/repos/builtin/packages/jags/package.py index 2909f24e9d..6597ca8152 100644 --- a/var/spack/repos/builtin/packages/jags/package.py +++ b/var/spack/repos/builtin/packages/jags/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jansson/package.py b/var/spack/repos/builtin/packages/jansson/package.py index f6c9d8b799..f29b17f4ba 100644 --- a/var/spack/repos/builtin/packages/jansson/package.py +++ b/var/spack/repos/builtin/packages/jansson/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jasper/package.py b/var/spack/repos/builtin/packages/jasper/package.py index bf7bf91995..2d87fa9057 100644 --- a/var/spack/repos/builtin/packages/jasper/package.py +++ b/var/spack/repos/builtin/packages/jasper/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jdk/package.py b/var/spack/repos/builtin/packages/jdk/package.py index 65dad76ce2..b3d4115542 100644 --- a/var/spack/repos/builtin/packages/jdk/package.py +++ b/var/spack/repos/builtin/packages/jdk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jemalloc/package.py b/var/spack/repos/builtin/packages/jemalloc/package.py index 82f0fbc998..aac8c39c28 100644 --- a/var/spack/repos/builtin/packages/jemalloc/package.py +++ b/var/spack/repos/builtin/packages/jemalloc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jmol/package.py b/var/spack/repos/builtin/packages/jmol/package.py index f07e07f866..aeab002a56 100644 --- a/var/spack/repos/builtin/packages/jmol/package.py +++ b/var/spack/repos/builtin/packages/jmol/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jq/package.py b/var/spack/repos/builtin/packages/jq/package.py index 06abcd461f..c906987962 100644 --- a/var/spack/repos/builtin/packages/jq/package.py +++ b/var/spack/repos/builtin/packages/jq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/json-c/package.py b/var/spack/repos/builtin/packages/json-c/package.py index 986538c445..c61fcc4180 100644 --- a/var/spack/repos/builtin/packages/json-c/package.py +++ b/var/spack/repos/builtin/packages/json-c/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/jsoncpp/package.py b/var/spack/repos/builtin/packages/jsoncpp/package.py index 1889bffc1e..c30d143d38 100644 --- a/var/spack/repos/builtin/packages/jsoncpp/package.py +++ b/var/spack/repos/builtin/packages/jsoncpp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/judy/package.py b/var/spack/repos/builtin/packages/judy/package.py index 7e62ca3e99..9d436f0f3c 100644 --- a/var/spack/repos/builtin/packages/judy/package.py +++ b/var/spack/repos/builtin/packages/judy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/julia/package.py b/var/spack/repos/builtin/packages/julia/package.py index 61ffd2efc6..a7d043aa37 100644 --- a/var/spack/repos/builtin/packages/julia/package.py +++ b/var/spack/repos/builtin/packages/julia/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kaldi/package.py b/var/spack/repos/builtin/packages/kaldi/package.py index c149c944ce..343d99a2c4 100644 --- a/var/spack/repos/builtin/packages/kaldi/package.py +++ b/var/spack/repos/builtin/packages/kaldi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kallisto/package.py b/var/spack/repos/builtin/packages/kallisto/package.py index c0f70aa1c0..247dbbace1 100644 --- a/var/spack/repos/builtin/packages/kallisto/package.py +++ b/var/spack/repos/builtin/packages/kallisto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kbproto/package.py b/var/spack/repos/builtin/packages/kbproto/package.py index 9a141cc7f3..f6d9ad56cf 100644 --- a/var/spack/repos/builtin/packages/kbproto/package.py +++ b/var/spack/repos/builtin/packages/kbproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kdiff3/package.py b/var/spack/repos/builtin/packages/kdiff3/package.py index f03d9d00b9..431e5c7e8d 100644 --- a/var/spack/repos/builtin/packages/kdiff3/package.py +++ b/var/spack/repos/builtin/packages/kdiff3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kealib/package.py b/var/spack/repos/builtin/packages/kealib/package.py index 296090ef28..0f7b63dcc9 100644 --- a/var/spack/repos/builtin/packages/kealib/package.py +++ b/var/spack/repos/builtin/packages/kealib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kentutils/package.py b/var/spack/repos/builtin/packages/kentutils/package.py index 65d46f563d..6eb442aae9 100644 --- a/var/spack/repos/builtin/packages/kentutils/package.py +++ b/var/spack/repos/builtin/packages/kentutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kmergenie/package.py b/var/spack/repos/builtin/packages/kmergenie/package.py index 9e6d0e5312..87ebd1b5aa 100644 --- a/var/spack/repos/builtin/packages/kmergenie/package.py +++ b/var/spack/repos/builtin/packages/kmergenie/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kokkos/package.py b/var/spack/repos/builtin/packages/kokkos/package.py index 2a82a4c5d6..8547621a14 100644 --- a/var/spack/repos/builtin/packages/kokkos/package.py +++ b/var/spack/repos/builtin/packages/kokkos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/kripke/package.py b/var/spack/repos/builtin/packages/kripke/package.py index e8b63476da..615f870744 100644 --- a/var/spack/repos/builtin/packages/kripke/package.py +++ b/var/spack/repos/builtin/packages/kripke/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lammps/package.py b/var/spack/repos/builtin/packages/lammps/package.py index b66712d02e..bf9293ae7c 100644 --- a/var/spack/repos/builtin/packages/lammps/package.py +++ b/var/spack/repos/builtin/packages/lammps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/last/package.py b/var/spack/repos/builtin/packages/last/package.py index 49d561f89b..c1e79a64c1 100644 --- a/var/spack/repos/builtin/packages/last/package.py +++ b/var/spack/repos/builtin/packages/last/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/launchmon/package.py b/var/spack/repos/builtin/packages/launchmon/package.py index 7362a68050..effa1cfea1 100644 --- a/var/spack/repos/builtin/packages/launchmon/package.py +++ b/var/spack/repos/builtin/packages/launchmon/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lbann/package.py b/var/spack/repos/builtin/packages/lbann/package.py index 9b0e249314..a1f1a19948 100644 --- a/var/spack/repos/builtin/packages/lbann/package.py +++ b/var/spack/repos/builtin/packages/lbann/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lbxproxy/package.py b/var/spack/repos/builtin/packages/lbxproxy/package.py index b7c65d72c0..64b22f4ad2 100644 --- a/var/spack/repos/builtin/packages/lbxproxy/package.py +++ b/var/spack/repos/builtin/packages/lbxproxy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lcals/package.py b/var/spack/repos/builtin/packages/lcals/package.py index c34907472a..052eab91c8 100644 --- a/var/spack/repos/builtin/packages/lcals/package.py +++ b/var/spack/repos/builtin/packages/lcals/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lcms/package.py b/var/spack/repos/builtin/packages/lcms/package.py index a7b8f86d5f..7bff73a7da 100644 --- a/var/spack/repos/builtin/packages/lcms/package.py +++ b/var/spack/repos/builtin/packages/lcms/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/leveldb/package.py b/var/spack/repos/builtin/packages/leveldb/package.py index ec52161b64..f12866c246 100644 --- a/var/spack/repos/builtin/packages/leveldb/package.py +++ b/var/spack/repos/builtin/packages/leveldb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lftp/package.py b/var/spack/repos/builtin/packages/lftp/package.py index c369a91863..46f92d3b28 100644 --- a/var/spack/repos/builtin/packages/lftp/package.py +++ b/var/spack/repos/builtin/packages/lftp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libaec/package.py b/var/spack/repos/builtin/packages/libaec/package.py index 87bca8d54a..6b0f7d637c 100644 --- a/var/spack/repos/builtin/packages/libaec/package.py +++ b/var/spack/repos/builtin/packages/libaec/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libaio/package.py b/var/spack/repos/builtin/packages/libaio/package.py index e7f2a7487b..63f5fd6725 100644 --- a/var/spack/repos/builtin/packages/libaio/package.py +++ b/var/spack/repos/builtin/packages/libaio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libapplewm/package.py b/var/spack/repos/builtin/packages/libapplewm/package.py index 053555b572..9e9a4a5914 100644 --- a/var/spack/repos/builtin/packages/libapplewm/package.py +++ b/var/spack/repos/builtin/packages/libapplewm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libarchive/package.py b/var/spack/repos/builtin/packages/libarchive/package.py index cc99e77278..8fe6d806ab 100644 --- a/var/spack/repos/builtin/packages/libarchive/package.py +++ b/var/spack/repos/builtin/packages/libarchive/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libassuan/package.py b/var/spack/repos/builtin/packages/libassuan/package.py index 53a3bc69e5..2c5557fb6f 100644 --- a/var/spack/repos/builtin/packages/libassuan/package.py +++ b/var/spack/repos/builtin/packages/libassuan/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libatomic-ops/package.py b/var/spack/repos/builtin/packages/libatomic-ops/package.py index 5600509212..e1fba85fc3 100644 --- a/var/spack/repos/builtin/packages/libatomic-ops/package.py +++ b/var/spack/repos/builtin/packages/libatomic-ops/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libbeagle/package.py b/var/spack/repos/builtin/packages/libbeagle/package.py index f459c5f738..c29b2dde54 100644 --- a/var/spack/repos/builtin/packages/libbeagle/package.py +++ b/var/spack/repos/builtin/packages/libbeagle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libbsd/package.py b/var/spack/repos/builtin/packages/libbsd/package.py index 1f0edc090b..9b38a51e14 100644 --- a/var/spack/repos/builtin/packages/libbsd/package.py +++ b/var/spack/repos/builtin/packages/libbsd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libbson/package.py b/var/spack/repos/builtin/packages/libbson/package.py index f78ff4544a..28f7f020eb 100644 --- a/var/spack/repos/builtin/packages/libbson/package.py +++ b/var/spack/repos/builtin/packages/libbson/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libcanberra/package.py b/var/spack/repos/builtin/packages/libcanberra/package.py index 840cdc4de3..934ebb6d0a 100644 --- a/var/spack/repos/builtin/packages/libcanberra/package.py +++ b/var/spack/repos/builtin/packages/libcanberra/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libcap/package.py b/var/spack/repos/builtin/packages/libcap/package.py index b5b25069a3..3160ba8a62 100644 --- a/var/spack/repos/builtin/packages/libcap/package.py +++ b/var/spack/repos/builtin/packages/libcap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libcerf/package.py b/var/spack/repos/builtin/packages/libcerf/package.py index 8d75ab3a28..94023e8752 100644 --- a/var/spack/repos/builtin/packages/libcerf/package.py +++ b/var/spack/repos/builtin/packages/libcerf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libcircle/package.py b/var/spack/repos/builtin/packages/libcircle/package.py index ec9eb76238..b82a3e9046 100644 --- a/var/spack/repos/builtin/packages/libcircle/package.py +++ b/var/spack/repos/builtin/packages/libcircle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libconfig/package.py b/var/spack/repos/builtin/packages/libconfig/package.py index 76bf314f09..1b5be50c34 100644 --- a/var/spack/repos/builtin/packages/libconfig/package.py +++ b/var/spack/repos/builtin/packages/libconfig/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libctl/package.py b/var/spack/repos/builtin/packages/libctl/package.py index 1364b5de0e..b29ba2ccad 100644 --- a/var/spack/repos/builtin/packages/libctl/package.py +++ b/var/spack/repos/builtin/packages/libctl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libdivsufsort/package.py b/var/spack/repos/builtin/packages/libdivsufsort/package.py index df51b7c37e..26cbac7fe9 100644 --- a/var/spack/repos/builtin/packages/libdivsufsort/package.py +++ b/var/spack/repos/builtin/packages/libdivsufsort/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libdmx/package.py b/var/spack/repos/builtin/packages/libdmx/package.py index 5c4106ca64..a18c7c8580 100644 --- a/var/spack/repos/builtin/packages/libdmx/package.py +++ b/var/spack/repos/builtin/packages/libdmx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libdrm/package.py b/var/spack/repos/builtin/packages/libdrm/package.py index b0715e2dba..d06a3a430e 100644 --- a/var/spack/repos/builtin/packages/libdrm/package.py +++ b/var/spack/repos/builtin/packages/libdrm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libdwarf/package.py b/var/spack/repos/builtin/packages/libdwarf/package.py index cb672dddc4..16df4110db 100644 --- a/var/spack/repos/builtin/packages/libdwarf/package.py +++ b/var/spack/repos/builtin/packages/libdwarf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libedit/package.py b/var/spack/repos/builtin/packages/libedit/package.py index 4fd61ec6c8..2f0398eb6b 100644 --- a/var/spack/repos/builtin/packages/libedit/package.py +++ b/var/spack/repos/builtin/packages/libedit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libelf/package.py b/var/spack/repos/builtin/packages/libelf/package.py index 965c611049..56c4f19bab 100644 --- a/var/spack/repos/builtin/packages/libelf/package.py +++ b/var/spack/repos/builtin/packages/libelf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libemos/package.py b/var/spack/repos/builtin/packages/libemos/package.py index b8840e526d..ed26d25cf0 100644 --- a/var/spack/repos/builtin/packages/libemos/package.py +++ b/var/spack/repos/builtin/packages/libemos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libepoxy/package.py b/var/spack/repos/builtin/packages/libepoxy/package.py index 705d82890a..42e5907d5d 100644 --- a/var/spack/repos/builtin/packages/libepoxy/package.py +++ b/var/spack/repos/builtin/packages/libepoxy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libevent/package.py b/var/spack/repos/builtin/packages/libevent/package.py index 93711491fa..09e2355526 100644 --- a/var/spack/repos/builtin/packages/libevent/package.py +++ b/var/spack/repos/builtin/packages/libevent/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libevpath/package.py b/var/spack/repos/builtin/packages/libevpath/package.py index 40ed3eeb99..0cb4200eae 100644 --- a/var/spack/repos/builtin/packages/libevpath/package.py +++ b/var/spack/repos/builtin/packages/libevpath/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libfabric/package.py b/var/spack/repos/builtin/packages/libfabric/package.py index b90e2fa262..574c03743f 100644 --- a/var/spack/repos/builtin/packages/libfabric/package.py +++ b/var/spack/repos/builtin/packages/libfabric/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libffi/package.py b/var/spack/repos/builtin/packages/libffi/package.py index 67369447c9..e65f9de95c 100644 --- a/var/spack/repos/builtin/packages/libffi/package.py +++ b/var/spack/repos/builtin/packages/libffi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libffs/package.py b/var/spack/repos/builtin/packages/libffs/package.py index 9513e146bc..665c637b71 100644 --- a/var/spack/repos/builtin/packages/libffs/package.py +++ b/var/spack/repos/builtin/packages/libffs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libfontenc/package.py b/var/spack/repos/builtin/packages/libfontenc/package.py index d80c5bde6e..d9665beb01 100644 --- a/var/spack/repos/builtin/packages/libfontenc/package.py +++ b/var/spack/repos/builtin/packages/libfontenc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libfs/package.py b/var/spack/repos/builtin/packages/libfs/package.py index 462d925a35..e72094e65d 100644 --- a/var/spack/repos/builtin/packages/libfs/package.py +++ b/var/spack/repos/builtin/packages/libfs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libgcrypt/package.py b/var/spack/repos/builtin/packages/libgcrypt/package.py index 31ab85c0ee..8fdce188ae 100644 --- a/var/spack/repos/builtin/packages/libgcrypt/package.py +++ b/var/spack/repos/builtin/packages/libgcrypt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libgd/package.py b/var/spack/repos/builtin/packages/libgd/package.py index 6f6c43d9f0..42787fa06a 100644 --- a/var/spack/repos/builtin/packages/libgd/package.py +++ b/var/spack/repos/builtin/packages/libgd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libgit2/package.py b/var/spack/repos/builtin/packages/libgit2/package.py index ae53612ce6..5665663f34 100644 --- a/var/spack/repos/builtin/packages/libgit2/package.py +++ b/var/spack/repos/builtin/packages/libgit2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libgpg-error/package.py b/var/spack/repos/builtin/packages/libgpg-error/package.py index 3d12c235d3..c88840294c 100644 --- a/var/spack/repos/builtin/packages/libgpg-error/package.py +++ b/var/spack/repos/builtin/packages/libgpg-error/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libgpuarray/package.py b/var/spack/repos/builtin/packages/libgpuarray/package.py index 0c42e90f16..b1f4efa10a 100644 --- a/var/spack/repos/builtin/packages/libgpuarray/package.py +++ b/var/spack/repos/builtin/packages/libgpuarray/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libgtextutils/package.py b/var/spack/repos/builtin/packages/libgtextutils/package.py index 830e441316..f623bc49b1 100644 --- a/var/spack/repos/builtin/packages/libgtextutils/package.py +++ b/var/spack/repos/builtin/packages/libgtextutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libhio/package.py b/var/spack/repos/builtin/packages/libhio/package.py index 12ef32cd90..11f9f4281b 100644 --- a/var/spack/repos/builtin/packages/libhio/package.py +++ b/var/spack/repos/builtin/packages/libhio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libice/package.py b/var/spack/repos/builtin/packages/libice/package.py index b11bca16b4..64ac146cf6 100644 --- a/var/spack/repos/builtin/packages/libice/package.py +++ b/var/spack/repos/builtin/packages/libice/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libiconv/package.py b/var/spack/repos/builtin/packages/libiconv/package.py index 4bc2f52649..52b4d1f7a5 100644 --- a/var/spack/repos/builtin/packages/libiconv/package.py +++ b/var/spack/repos/builtin/packages/libiconv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libint/package.py b/var/spack/repos/builtin/packages/libint/package.py index 34600e742a..4b228c265e 100644 --- a/var/spack/repos/builtin/packages/libint/package.py +++ b/var/spack/repos/builtin/packages/libint/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py index e0eca52a41..dcf622284b 100644 --- a/var/spack/repos/builtin/packages/libjpeg-turbo/package.py +++ b/var/spack/repos/builtin/packages/libjpeg-turbo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libjpeg/package.py b/var/spack/repos/builtin/packages/libjpeg/package.py index 9829b30547..0acb120460 100644 --- a/var/spack/repos/builtin/packages/libjpeg/package.py +++ b/var/spack/repos/builtin/packages/libjpeg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libksba/package.py b/var/spack/repos/builtin/packages/libksba/package.py index b796e7a562..dd6297a93a 100644 --- a/var/spack/repos/builtin/packages/libksba/package.py +++ b/var/spack/repos/builtin/packages/libksba/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/liblbxutil/package.py b/var/spack/repos/builtin/packages/liblbxutil/package.py index 0cd4c5767b..46a8179567 100644 --- a/var/spack/repos/builtin/packages/liblbxutil/package.py +++ b/var/spack/repos/builtin/packages/liblbxutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libmatheval/package.py b/var/spack/repos/builtin/packages/libmatheval/package.py index a13c9000de..b9b0066bdf 100644 --- a/var/spack/repos/builtin/packages/libmatheval/package.py +++ b/var/spack/repos/builtin/packages/libmatheval/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libmesh/package.py b/var/spack/repos/builtin/packages/libmesh/package.py index 5cad209597..af6fccad8d 100644 --- a/var/spack/repos/builtin/packages/libmesh/package.py +++ b/var/spack/repos/builtin/packages/libmesh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libmng/package.py b/var/spack/repos/builtin/packages/libmng/package.py index dca8c03aa0..e69f5131ef 100644 --- a/var/spack/repos/builtin/packages/libmng/package.py +++ b/var/spack/repos/builtin/packages/libmng/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libmongoc/package.py b/var/spack/repos/builtin/packages/libmongoc/package.py index 0fc6bd632d..e2d4cf6607 100644 --- a/var/spack/repos/builtin/packages/libmongoc/package.py +++ b/var/spack/repos/builtin/packages/libmongoc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libmonitor/package.py b/var/spack/repos/builtin/packages/libmonitor/package.py index 42410de82d..1f69291cfe 100644 --- a/var/spack/repos/builtin/packages/libmonitor/package.py +++ b/var/spack/repos/builtin/packages/libmonitor/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libnbc/package.py b/var/spack/repos/builtin/packages/libnbc/package.py index 0fdd0d9234..9d3484f9cb 100644 --- a/var/spack/repos/builtin/packages/libnbc/package.py +++ b/var/spack/repos/builtin/packages/libnbc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libogg/package.py b/var/spack/repos/builtin/packages/libogg/package.py index 2b53900f49..cc17357c2a 100644 --- a/var/spack/repos/builtin/packages/libogg/package.py +++ b/var/spack/repos/builtin/packages/libogg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/liboldx/package.py b/var/spack/repos/builtin/packages/liboldx/package.py index d89af8d70f..60120eed41 100644 --- a/var/spack/repos/builtin/packages/liboldx/package.py +++ b/var/spack/repos/builtin/packages/liboldx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libpciaccess/package.py b/var/spack/repos/builtin/packages/libpciaccess/package.py index 7cbeebd2fc..11e0e5e7aa 100644 --- a/var/spack/repos/builtin/packages/libpciaccess/package.py +++ b/var/spack/repos/builtin/packages/libpciaccess/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libpfm4/package.py b/var/spack/repos/builtin/packages/libpfm4/package.py index 858a68b953..a9c9132803 100644 --- a/var/spack/repos/builtin/packages/libpfm4/package.py +++ b/var/spack/repos/builtin/packages/libpfm4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libpipeline/package.py b/var/spack/repos/builtin/packages/libpipeline/package.py index 2d51755633..d0db624743 100644 --- a/var/spack/repos/builtin/packages/libpipeline/package.py +++ b/var/spack/repos/builtin/packages/libpipeline/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libpng/package.py b/var/spack/repos/builtin/packages/libpng/package.py index a78f964841..e0ac977468 100644 --- a/var/spack/repos/builtin/packages/libpng/package.py +++ b/var/spack/repos/builtin/packages/libpng/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libpsl/package.py b/var/spack/repos/builtin/packages/libpsl/package.py index b3c029b78c..f43388dcd0 100644 --- a/var/spack/repos/builtin/packages/libpsl/package.py +++ b/var/spack/repos/builtin/packages/libpsl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libpthread-stubs/package.py b/var/spack/repos/builtin/packages/libpthread-stubs/package.py index 536f80471d..9ba66fc6e6 100644 --- a/var/spack/repos/builtin/packages/libpthread-stubs/package.py +++ b/var/spack/repos/builtin/packages/libpthread-stubs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libquo/package.py b/var/spack/repos/builtin/packages/libquo/package.py index 653e033459..bcf78607b6 100644 --- a/var/spack/repos/builtin/packages/libquo/package.py +++ b/var/spack/repos/builtin/packages/libquo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libsigsegv/package.py b/var/spack/repos/builtin/packages/libsigsegv/package.py index 67a94b2895..78ab2cfa93 100644 --- a/var/spack/repos/builtin/packages/libsigsegv/package.py +++ b/var/spack/repos/builtin/packages/libsigsegv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libsm/package.py b/var/spack/repos/builtin/packages/libsm/package.py index 2a8be06486..8302fa5113 100644 --- a/var/spack/repos/builtin/packages/libsm/package.py +++ b/var/spack/repos/builtin/packages/libsm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libsodium/package.py b/var/spack/repos/builtin/packages/libsodium/package.py index d8d6b4d7bb..c0f52f9b31 100644 --- a/var/spack/repos/builtin/packages/libsodium/package.py +++ b/var/spack/repos/builtin/packages/libsodium/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libspatialindex/package.py b/var/spack/repos/builtin/packages/libspatialindex/package.py index 7790c8dab2..447c75eae9 100644 --- a/var/spack/repos/builtin/packages/libspatialindex/package.py +++ b/var/spack/repos/builtin/packages/libspatialindex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libsplash/package.py b/var/spack/repos/builtin/packages/libsplash/package.py index c2d8bc1881..c3b01497cb 100644 --- a/var/spack/repos/builtin/packages/libsplash/package.py +++ b/var/spack/repos/builtin/packages/libsplash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libssh2/package.py b/var/spack/repos/builtin/packages/libssh2/package.py index c5978f0688..40d3273648 100644 --- a/var/spack/repos/builtin/packages/libssh2/package.py +++ b/var/spack/repos/builtin/packages/libssh2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libsvm/package.py b/var/spack/repos/builtin/packages/libsvm/package.py index 3a52d4f3ef..25624f526f 100644 --- a/var/spack/repos/builtin/packages/libsvm/package.py +++ b/var/spack/repos/builtin/packages/libsvm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libszip/package.py b/var/spack/repos/builtin/packages/libszip/package.py index 838b81b63b..cc203b65f0 100644 --- a/var/spack/repos/builtin/packages/libszip/package.py +++ b/var/spack/repos/builtin/packages/libszip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libtermkey/package.py b/var/spack/repos/builtin/packages/libtermkey/package.py index 40a17c1c3e..bc01480c3a 100644 --- a/var/spack/repos/builtin/packages/libtermkey/package.py +++ b/var/spack/repos/builtin/packages/libtermkey/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libtiff/package.py b/var/spack/repos/builtin/packages/libtiff/package.py index 2fcccad739..66243d7f7d 100644 --- a/var/spack/repos/builtin/packages/libtiff/package.py +++ b/var/spack/repos/builtin/packages/libtiff/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libtool/package.py b/var/spack/repos/builtin/packages/libtool/package.py index 662859d52e..fb1c862353 100644 --- a/var/spack/repos/builtin/packages/libtool/package.py +++ b/var/spack/repos/builtin/packages/libtool/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libunistring/package.py b/var/spack/repos/builtin/packages/libunistring/package.py index 296788a2c3..ddd3152d80 100644 --- a/var/spack/repos/builtin/packages/libunistring/package.py +++ b/var/spack/repos/builtin/packages/libunistring/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libunwind/package.py b/var/spack/repos/builtin/packages/libunwind/package.py index 79e5d35061..f123e898f1 100644 --- a/var/spack/repos/builtin/packages/libunwind/package.py +++ b/var/spack/repos/builtin/packages/libunwind/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libuuid/package.py b/var/spack/repos/builtin/packages/libuuid/package.py index b7eefdb1f0..de5dd4643a 100644 --- a/var/spack/repos/builtin/packages/libuuid/package.py +++ b/var/spack/repos/builtin/packages/libuuid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libuv/package.py b/var/spack/repos/builtin/packages/libuv/package.py index 784034d96c..1be764326a 100644 --- a/var/spack/repos/builtin/packages/libuv/package.py +++ b/var/spack/repos/builtin/packages/libuv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libvorbis/package.py b/var/spack/repos/builtin/packages/libvorbis/package.py index 2e25a5c230..6493a30f4b 100644 --- a/var/spack/repos/builtin/packages/libvorbis/package.py +++ b/var/spack/repos/builtin/packages/libvorbis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libvterm/package.py b/var/spack/repos/builtin/packages/libvterm/package.py index 651b59be53..b50344b833 100644 --- a/var/spack/repos/builtin/packages/libvterm/package.py +++ b/var/spack/repos/builtin/packages/libvterm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libwebsockets/package.py b/var/spack/repos/builtin/packages/libwebsockets/package.py index b840c9d0f0..018fc6014b 100644 --- a/var/spack/repos/builtin/packages/libwebsockets/package.py +++ b/var/spack/repos/builtin/packages/libwebsockets/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libwindowswm/package.py b/var/spack/repos/builtin/packages/libwindowswm/package.py index 82cc3f84b0..8ad9c99dde 100644 --- a/var/spack/repos/builtin/packages/libwindowswm/package.py +++ b/var/spack/repos/builtin/packages/libwindowswm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libx11/package.py b/var/spack/repos/builtin/packages/libx11/package.py index 74f9618212..8510556717 100644 --- a/var/spack/repos/builtin/packages/libx11/package.py +++ b/var/spack/repos/builtin/packages/libx11/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxau/package.py b/var/spack/repos/builtin/packages/libxau/package.py index 546f25171e..0a80e3ce42 100644 --- a/var/spack/repos/builtin/packages/libxau/package.py +++ b/var/spack/repos/builtin/packages/libxau/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxaw/package.py b/var/spack/repos/builtin/packages/libxaw/package.py index a160444b38..6bd1e6aa58 100644 --- a/var/spack/repos/builtin/packages/libxaw/package.py +++ b/var/spack/repos/builtin/packages/libxaw/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxaw3d/package.py b/var/spack/repos/builtin/packages/libxaw3d/package.py index aa76aef674..9c9ba54f28 100644 --- a/var/spack/repos/builtin/packages/libxaw3d/package.py +++ b/var/spack/repos/builtin/packages/libxaw3d/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxc/package.py b/var/spack/repos/builtin/packages/libxc/package.py index e2fe25c455..ef36014ccc 100644 --- a/var/spack/repos/builtin/packages/libxc/package.py +++ b/var/spack/repos/builtin/packages/libxc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxcb/package.py b/var/spack/repos/builtin/packages/libxcb/package.py index 73a3f718c6..0c4a7fd010 100644 --- a/var/spack/repos/builtin/packages/libxcb/package.py +++ b/var/spack/repos/builtin/packages/libxcb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxcomposite/package.py b/var/spack/repos/builtin/packages/libxcomposite/package.py index c540c35f26..b8c2b0257c 100644 --- a/var/spack/repos/builtin/packages/libxcomposite/package.py +++ b/var/spack/repos/builtin/packages/libxcomposite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxcursor/package.py b/var/spack/repos/builtin/packages/libxcursor/package.py index 1c931b4d72..27b14f7086 100644 --- a/var/spack/repos/builtin/packages/libxcursor/package.py +++ b/var/spack/repos/builtin/packages/libxcursor/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxdamage/package.py b/var/spack/repos/builtin/packages/libxdamage/package.py index 95f6dd498e..2fcaa6cb46 100644 --- a/var/spack/repos/builtin/packages/libxdamage/package.py +++ b/var/spack/repos/builtin/packages/libxdamage/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxdmcp/package.py b/var/spack/repos/builtin/packages/libxdmcp/package.py index 9ff35638f3..c60ecd0bf5 100644 --- a/var/spack/repos/builtin/packages/libxdmcp/package.py +++ b/var/spack/repos/builtin/packages/libxdmcp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxevie/package.py b/var/spack/repos/builtin/packages/libxevie/package.py index 8c9e0049de..c3d60e0bb3 100644 --- a/var/spack/repos/builtin/packages/libxevie/package.py +++ b/var/spack/repos/builtin/packages/libxevie/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxext/package.py b/var/spack/repos/builtin/packages/libxext/package.py index 36c712b153..ed103cedc3 100644 --- a/var/spack/repos/builtin/packages/libxext/package.py +++ b/var/spack/repos/builtin/packages/libxext/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxfixes/package.py b/var/spack/repos/builtin/packages/libxfixes/package.py index 87e037286e..faa179e4b7 100644 --- a/var/spack/repos/builtin/packages/libxfixes/package.py +++ b/var/spack/repos/builtin/packages/libxfixes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxfont/package.py b/var/spack/repos/builtin/packages/libxfont/package.py index eee73dde01..bd78141aca 100644 --- a/var/spack/repos/builtin/packages/libxfont/package.py +++ b/var/spack/repos/builtin/packages/libxfont/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxfont2/package.py b/var/spack/repos/builtin/packages/libxfont2/package.py index 9b4e7e463d..8a1193e034 100644 --- a/var/spack/repos/builtin/packages/libxfont2/package.py +++ b/var/spack/repos/builtin/packages/libxfont2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxfontcache/package.py b/var/spack/repos/builtin/packages/libxfontcache/package.py index ad4bfceb77..885d37bba2 100644 --- a/var/spack/repos/builtin/packages/libxfontcache/package.py +++ b/var/spack/repos/builtin/packages/libxfontcache/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxft/package.py b/var/spack/repos/builtin/packages/libxft/package.py index 405c29883c..7e8cf5fd69 100644 --- a/var/spack/repos/builtin/packages/libxft/package.py +++ b/var/spack/repos/builtin/packages/libxft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxi/package.py b/var/spack/repos/builtin/packages/libxi/package.py index c6821c00aa..7df039eb2f 100644 --- a/var/spack/repos/builtin/packages/libxi/package.py +++ b/var/spack/repos/builtin/packages/libxi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxinerama/package.py b/var/spack/repos/builtin/packages/libxinerama/package.py index 2deb6df2f2..df0ef9ca47 100644 --- a/var/spack/repos/builtin/packages/libxinerama/package.py +++ b/var/spack/repos/builtin/packages/libxinerama/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxkbfile/package.py b/var/spack/repos/builtin/packages/libxkbfile/package.py index 5a15ebe7a4..93b832dd08 100644 --- a/var/spack/repos/builtin/packages/libxkbfile/package.py +++ b/var/spack/repos/builtin/packages/libxkbfile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxkbui/package.py b/var/spack/repos/builtin/packages/libxkbui/package.py index 4782783111..4328cf07e4 100644 --- a/var/spack/repos/builtin/packages/libxkbui/package.py +++ b/var/spack/repos/builtin/packages/libxkbui/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxml2/package.py b/var/spack/repos/builtin/packages/libxml2/package.py index f3601aa2b5..2ec64006c9 100644 --- a/var/spack/repos/builtin/packages/libxml2/package.py +++ b/var/spack/repos/builtin/packages/libxml2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxmu/package.py b/var/spack/repos/builtin/packages/libxmu/package.py index a18cf34563..fd9573e11e 100644 --- a/var/spack/repos/builtin/packages/libxmu/package.py +++ b/var/spack/repos/builtin/packages/libxmu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxp/package.py b/var/spack/repos/builtin/packages/libxp/package.py index bf405e9ace..5b1ff6517a 100644 --- a/var/spack/repos/builtin/packages/libxp/package.py +++ b/var/spack/repos/builtin/packages/libxp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxpm/package.py b/var/spack/repos/builtin/packages/libxpm/package.py index 40234b1b2d..3431a2cd09 100644 --- a/var/spack/repos/builtin/packages/libxpm/package.py +++ b/var/spack/repos/builtin/packages/libxpm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxpresent/package.py b/var/spack/repos/builtin/packages/libxpresent/package.py index eb2e037af2..dbc29aa521 100644 --- a/var/spack/repos/builtin/packages/libxpresent/package.py +++ b/var/spack/repos/builtin/packages/libxpresent/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxprintapputil/package.py b/var/spack/repos/builtin/packages/libxprintapputil/package.py index 4a5b7f29a9..a09b4d6e71 100644 --- a/var/spack/repos/builtin/packages/libxprintapputil/package.py +++ b/var/spack/repos/builtin/packages/libxprintapputil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxprintutil/package.py b/var/spack/repos/builtin/packages/libxprintutil/package.py index d464c430a4..e7e1ae88df 100644 --- a/var/spack/repos/builtin/packages/libxprintutil/package.py +++ b/var/spack/repos/builtin/packages/libxprintutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxrandr/package.py b/var/spack/repos/builtin/packages/libxrandr/package.py index a9709ff90c..045e54e338 100644 --- a/var/spack/repos/builtin/packages/libxrandr/package.py +++ b/var/spack/repos/builtin/packages/libxrandr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxrender/package.py b/var/spack/repos/builtin/packages/libxrender/package.py index 9ef9e1a78a..58416eb600 100644 --- a/var/spack/repos/builtin/packages/libxrender/package.py +++ b/var/spack/repos/builtin/packages/libxrender/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxres/package.py b/var/spack/repos/builtin/packages/libxres/package.py index f6593fad0b..2ffa79c934 100644 --- a/var/spack/repos/builtin/packages/libxres/package.py +++ b/var/spack/repos/builtin/packages/libxres/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxscrnsaver/package.py b/var/spack/repos/builtin/packages/libxscrnsaver/package.py index 97b293796f..6bd2bc6927 100644 --- a/var/spack/repos/builtin/packages/libxscrnsaver/package.py +++ b/var/spack/repos/builtin/packages/libxscrnsaver/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxshmfence/package.py b/var/spack/repos/builtin/packages/libxshmfence/package.py index c8b2e60a7c..ade08c12a2 100644 --- a/var/spack/repos/builtin/packages/libxshmfence/package.py +++ b/var/spack/repos/builtin/packages/libxshmfence/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxslt/package.py b/var/spack/repos/builtin/packages/libxslt/package.py index a87ae7ffee..f38c3ef12b 100644 --- a/var/spack/repos/builtin/packages/libxslt/package.py +++ b/var/spack/repos/builtin/packages/libxslt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxstream/package.py b/var/spack/repos/builtin/packages/libxstream/package.py index ab0c07edbe..9fb24707ea 100644 --- a/var/spack/repos/builtin/packages/libxstream/package.py +++ b/var/spack/repos/builtin/packages/libxstream/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxt/package.py b/var/spack/repos/builtin/packages/libxt/package.py index 0dbe2dc45e..612dc8b8ef 100644 --- a/var/spack/repos/builtin/packages/libxt/package.py +++ b/var/spack/repos/builtin/packages/libxt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxtrap/package.py b/var/spack/repos/builtin/packages/libxtrap/package.py index e678b3ae1d..456201eaa6 100644 --- a/var/spack/repos/builtin/packages/libxtrap/package.py +++ b/var/spack/repos/builtin/packages/libxtrap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxtst/package.py b/var/spack/repos/builtin/packages/libxtst/package.py index c815af7d2c..21c08d1b98 100644 --- a/var/spack/repos/builtin/packages/libxtst/package.py +++ b/var/spack/repos/builtin/packages/libxtst/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxv/package.py b/var/spack/repos/builtin/packages/libxv/package.py index 220171ef3b..f22a88878c 100644 --- a/var/spack/repos/builtin/packages/libxv/package.py +++ b/var/spack/repos/builtin/packages/libxv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxvmc/package.py b/var/spack/repos/builtin/packages/libxvmc/package.py index 6ce97ed625..2377e16eac 100644 --- a/var/spack/repos/builtin/packages/libxvmc/package.py +++ b/var/spack/repos/builtin/packages/libxvmc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxxf86dga/package.py b/var/spack/repos/builtin/packages/libxxf86dga/package.py index 4650264aed..dd27fc9bd6 100644 --- a/var/spack/repos/builtin/packages/libxxf86dga/package.py +++ b/var/spack/repos/builtin/packages/libxxf86dga/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxxf86misc/package.py b/var/spack/repos/builtin/packages/libxxf86misc/package.py index 5a6c1f33f6..60137783b1 100644 --- a/var/spack/repos/builtin/packages/libxxf86misc/package.py +++ b/var/spack/repos/builtin/packages/libxxf86misc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libxxf86vm/package.py b/var/spack/repos/builtin/packages/libxxf86vm/package.py index b85eb07862..f3a9471890 100644 --- a/var/spack/repos/builtin/packages/libxxf86vm/package.py +++ b/var/spack/repos/builtin/packages/libxxf86vm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libyogrt/package.py b/var/spack/repos/builtin/packages/libyogrt/package.py index 1ad98ebaa0..1795cc52e6 100644 --- a/var/spack/repos/builtin/packages/libyogrt/package.py +++ b/var/spack/repos/builtin/packages/libyogrt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/libzip/package.py b/var/spack/repos/builtin/packages/libzip/package.py index 073b8df36f..40b4d70fc7 100644 --- a/var/spack/repos/builtin/packages/libzip/package.py +++ b/var/spack/repos/builtin/packages/libzip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/likwid/package.py b/var/spack/repos/builtin/packages/likwid/package.py index be48201115..843259e8da 100644 --- a/var/spack/repos/builtin/packages/likwid/package.py +++ b/var/spack/repos/builtin/packages/likwid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/linux-headers/package.py b/var/spack/repos/builtin/packages/linux-headers/package.py index b996192e67..0235270179 100644 --- a/var/spack/repos/builtin/packages/linux-headers/package.py +++ b/var/spack/repos/builtin/packages/linux-headers/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/listres/package.py b/var/spack/repos/builtin/packages/listres/package.py index c654945728..7ee0eb708e 100644 --- a/var/spack/repos/builtin/packages/listres/package.py +++ b/var/spack/repos/builtin/packages/listres/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/llvm-lld/package.py b/var/spack/repos/builtin/packages/llvm-lld/package.py index 5619f1132d..290fec8029 100644 --- a/var/spack/repos/builtin/packages/llvm-lld/package.py +++ b/var/spack/repos/builtin/packages/llvm-lld/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py index edbd9f04e1..ee1c28fbee 100644 --- a/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py +++ b/var/spack/repos/builtin/packages/llvm-openmp-ompt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index c09dbe1571..c9319cdcfc 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lmdb/package.py b/var/spack/repos/builtin/packages/lmdb/package.py index aae962db15..5aeae301bc 100644 --- a/var/spack/repos/builtin/packages/lmdb/package.py +++ b/var/spack/repos/builtin/packages/lmdb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lmod/package.py b/var/spack/repos/builtin/packages/lmod/package.py index 08a01647a4..dc720a257a 100644 --- a/var/spack/repos/builtin/packages/lmod/package.py +++ b/var/spack/repos/builtin/packages/lmod/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lndir/package.py b/var/spack/repos/builtin/packages/lndir/package.py index 51b0a09228..49e302df9e 100644 --- a/var/spack/repos/builtin/packages/lndir/package.py +++ b/var/spack/repos/builtin/packages/lndir/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/log4cxx/package.py b/var/spack/repos/builtin/packages/log4cxx/package.py index 14715f36cf..570ab84cf9 100644 --- a/var/spack/repos/builtin/packages/log4cxx/package.py +++ b/var/spack/repos/builtin/packages/log4cxx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lrslib/package.py b/var/spack/repos/builtin/packages/lrslib/package.py index 19e44b911f..83046ea862 100644 --- a/var/spack/repos/builtin/packages/lrslib/package.py +++ b/var/spack/repos/builtin/packages/lrslib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lrzip/package.py b/var/spack/repos/builtin/packages/lrzip/package.py index 73941adf8d..fd5a03dc00 100644 --- a/var/spack/repos/builtin/packages/lrzip/package.py +++ b/var/spack/repos/builtin/packages/lrzip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lua-jit/package.py b/var/spack/repos/builtin/packages/lua-jit/package.py index c32226dd12..052cc3d4e6 100644 --- a/var/spack/repos/builtin/packages/lua-jit/package.py +++ b/var/spack/repos/builtin/packages/lua-jit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lua-luafilesystem/package.py b/var/spack/repos/builtin/packages/lua-luafilesystem/package.py index 806d0d2cd7..0a97df38b9 100644 --- a/var/spack/repos/builtin/packages/lua-luafilesystem/package.py +++ b/var/spack/repos/builtin/packages/lua-luafilesystem/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lua-luaposix/package.py b/var/spack/repos/builtin/packages/lua-luaposix/package.py index 120a871e26..158e5761f3 100644 --- a/var/spack/repos/builtin/packages/lua-luaposix/package.py +++ b/var/spack/repos/builtin/packages/lua-luaposix/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lua/package.py b/var/spack/repos/builtin/packages/lua/package.py index ecb2a8b543..0db2cb21fc 100644 --- a/var/spack/repos/builtin/packages/lua/package.py +++ b/var/spack/repos/builtin/packages/lua/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/luit/package.py b/var/spack/repos/builtin/packages/luit/package.py index b016d0eaa7..c75f77fd70 100644 --- a/var/spack/repos/builtin/packages/luit/package.py +++ b/var/spack/repos/builtin/packages/luit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lulesh/package.py b/var/spack/repos/builtin/packages/lulesh/package.py index 2dd4a4edd2..eb6aa076b3 100644 --- a/var/spack/repos/builtin/packages/lulesh/package.py +++ b/var/spack/repos/builtin/packages/lulesh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lwgrp/package.py b/var/spack/repos/builtin/packages/lwgrp/package.py index de44693098..440634004c 100644 --- a/var/spack/repos/builtin/packages/lwgrp/package.py +++ b/var/spack/repos/builtin/packages/lwgrp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lwm2/package.py b/var/spack/repos/builtin/packages/lwm2/package.py index d96a9e1c0d..e58f7d8ef2 100644 --- a/var/spack/repos/builtin/packages/lwm2/package.py +++ b/var/spack/repos/builtin/packages/lwm2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lz4/package.py b/var/spack/repos/builtin/packages/lz4/package.py index c7a46be3ff..e43e4f43ea 100644 --- a/var/spack/repos/builtin/packages/lz4/package.py +++ b/var/spack/repos/builtin/packages/lz4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lzma/package.py b/var/spack/repos/builtin/packages/lzma/package.py index 577f35e4cf..bb84e21ae2 100644 --- a/var/spack/repos/builtin/packages/lzma/package.py +++ b/var/spack/repos/builtin/packages/lzma/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/lzo/package.py b/var/spack/repos/builtin/packages/lzo/package.py index 98cbadbfb7..255a61e44f 100644 --- a/var/spack/repos/builtin/packages/lzo/package.py +++ b/var/spack/repos/builtin/packages/lzo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/m4/package.py b/var/spack/repos/builtin/packages/m4/package.py index 550e306712..5c9655d7e3 100644 --- a/var/spack/repos/builtin/packages/m4/package.py +++ b/var/spack/repos/builtin/packages/m4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mafft/package.py b/var/spack/repos/builtin/packages/mafft/package.py index 47d05af711..bc9d0fb1a0 100644 --- a/var/spack/repos/builtin/packages/mafft/package.py +++ b/var/spack/repos/builtin/packages/mafft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/magics/package.py b/var/spack/repos/builtin/packages/magics/package.py index 426695a3dd..552696417e 100644 --- a/var/spack/repos/builtin/packages/magics/package.py +++ b/var/spack/repos/builtin/packages/magics/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/magma/package.py b/var/spack/repos/builtin/packages/magma/package.py index 74f265e329..545f75d79c 100644 --- a/var/spack/repos/builtin/packages/magma/package.py +++ b/var/spack/repos/builtin/packages/magma/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/makedepend/package.py b/var/spack/repos/builtin/packages/makedepend/package.py index e1b254be1c..9e098cece7 100644 --- a/var/spack/repos/builtin/packages/makedepend/package.py +++ b/var/spack/repos/builtin/packages/makedepend/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/man-db/package.py b/var/spack/repos/builtin/packages/man-db/package.py index 9c038d03e2..afa60b8f45 100644 --- a/var/spack/repos/builtin/packages/man-db/package.py +++ b/var/spack/repos/builtin/packages/man-db/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mariadb/package.py b/var/spack/repos/builtin/packages/mariadb/package.py index 78332a05b4..35ef491eb8 100644 --- a/var/spack/repos/builtin/packages/mariadb/package.py +++ b/var/spack/repos/builtin/packages/mariadb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/matio/package.py b/var/spack/repos/builtin/packages/matio/package.py index eb8c517e63..cf04218e97 100644 --- a/var/spack/repos/builtin/packages/matio/package.py +++ b/var/spack/repos/builtin/packages/matio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/matlab/package.py b/var/spack/repos/builtin/packages/matlab/package.py index fbd272393e..4dd318c8e8 100644 --- a/var/spack/repos/builtin/packages/matlab/package.py +++ b/var/spack/repos/builtin/packages/matlab/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/maven/package.py b/var/spack/repos/builtin/packages/maven/package.py index 550ce467e2..340dd2c369 100644 --- a/var/spack/repos/builtin/packages/maven/package.py +++ b/var/spack/repos/builtin/packages/maven/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/maverick/package.py b/var/spack/repos/builtin/packages/maverick/package.py index b480e5fc48..c8ce9b91b9 100644 --- a/var/spack/repos/builtin/packages/maverick/package.py +++ b/var/spack/repos/builtin/packages/maverick/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mawk/package.py b/var/spack/repos/builtin/packages/mawk/package.py index 872fcbe101..16784d0ee4 100644 --- a/var/spack/repos/builtin/packages/mawk/package.py +++ b/var/spack/repos/builtin/packages/mawk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mbedtls/package.py b/var/spack/repos/builtin/packages/mbedtls/package.py index 09820321de..533455fb6a 100644 --- a/var/spack/repos/builtin/packages/mbedtls/package.py +++ b/var/spack/repos/builtin/packages/mbedtls/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mcl/package.py b/var/spack/repos/builtin/packages/mcl/package.py index af3116313e..9ee387fd0c 100644 --- a/var/spack/repos/builtin/packages/mcl/package.py +++ b/var/spack/repos/builtin/packages/mcl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mdtest/package.py b/var/spack/repos/builtin/packages/mdtest/package.py index a77494b9b6..e8ef88cb5b 100644 --- a/var/spack/repos/builtin/packages/mdtest/package.py +++ b/var/spack/repos/builtin/packages/mdtest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/meep/package.py b/var/spack/repos/builtin/packages/meep/package.py index f99e1506a3..bc0a38ef45 100644 --- a/var/spack/repos/builtin/packages/meep/package.py +++ b/var/spack/repos/builtin/packages/meep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/memaxes/package.py b/var/spack/repos/builtin/packages/memaxes/package.py index f426309b99..a92cf8d5f1 100644 --- a/var/spack/repos/builtin/packages/memaxes/package.py +++ b/var/spack/repos/builtin/packages/memaxes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/meme/package.py b/var/spack/repos/builtin/packages/meme/package.py index 05e88fec8b..9b523645c4 100644 --- a/var/spack/repos/builtin/packages/meme/package.py +++ b/var/spack/repos/builtin/packages/meme/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mercurial/package.py b/var/spack/repos/builtin/packages/mercurial/package.py index b6da9e6ea9..e0d10edd39 100644 --- a/var/spack/repos/builtin/packages/mercurial/package.py +++ b/var/spack/repos/builtin/packages/mercurial/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mesa-glu/package.py b/var/spack/repos/builtin/packages/mesa-glu/package.py index 54ad8992ec..6a8031b188 100644 --- a/var/spack/repos/builtin/packages/mesa-glu/package.py +++ b/var/spack/repos/builtin/packages/mesa-glu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mesa/package.py b/var/spack/repos/builtin/packages/mesa/package.py index de36acbb73..33d0501228 100644 --- a/var/spack/repos/builtin/packages/mesa/package.py +++ b/var/spack/repos/builtin/packages/mesa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/meshkit/package.py b/var/spack/repos/builtin/packages/meshkit/package.py index 121ba78bcb..b9f8d5d384 100644 --- a/var/spack/repos/builtin/packages/meshkit/package.py +++ b/var/spack/repos/builtin/packages/meshkit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/meson/package.py b/var/spack/repos/builtin/packages/meson/package.py index 26e4129b1d..3d771a6329 100644 --- a/var/spack/repos/builtin/packages/meson/package.py +++ b/var/spack/repos/builtin/packages/meson/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mesquite/package.py b/var/spack/repos/builtin/packages/mesquite/package.py index fd18d4ddae..ece147dec4 100644 --- a/var/spack/repos/builtin/packages/mesquite/package.py +++ b/var/spack/repos/builtin/packages/mesquite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py index 43feace931..122ae51d32 100644 --- a/var/spack/repos/builtin/packages/metis/package.py +++ b/var/spack/repos/builtin/packages/metis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index ffd3233a9f..da7da5cce4 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/microbiomeutil/package.py b/var/spack/repos/builtin/packages/microbiomeutil/package.py index 7be7a4ac0d..e414a916ae 100644 --- a/var/spack/repos/builtin/packages/microbiomeutil/package.py +++ b/var/spack/repos/builtin/packages/microbiomeutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/miniaero/package.py b/var/spack/repos/builtin/packages/miniaero/package.py index 471ecb9d0f..0d42204e03 100644 --- a/var/spack/repos/builtin/packages/miniaero/package.py +++ b/var/spack/repos/builtin/packages/miniaero/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/miniamr/package.py b/var/spack/repos/builtin/packages/miniamr/package.py index 7dc138ed44..9122dc86a5 100644 --- a/var/spack/repos/builtin/packages/miniamr/package.py +++ b/var/spack/repos/builtin/packages/miniamr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/miniconda2/package.py b/var/spack/repos/builtin/packages/miniconda2/package.py index aed9f8e08c..7f73cd09b0 100644 --- a/var/spack/repos/builtin/packages/miniconda2/package.py +++ b/var/spack/repos/builtin/packages/miniconda2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/miniconda3/package.py b/var/spack/repos/builtin/packages/miniconda3/package.py index bbe7df3acd..6584548e63 100644 --- a/var/spack/repos/builtin/packages/miniconda3/package.py +++ b/var/spack/repos/builtin/packages/miniconda3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/minife/package.py b/var/spack/repos/builtin/packages/minife/package.py index ced755d112..33aa83fdc5 100644 --- a/var/spack/repos/builtin/packages/minife/package.py +++ b/var/spack/repos/builtin/packages/minife/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/minighost/package.py b/var/spack/repos/builtin/packages/minighost/package.py index 59b0b33dc4..a24e202be4 100644 --- a/var/spack/repos/builtin/packages/minighost/package.py +++ b/var/spack/repos/builtin/packages/minighost/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/minigmg/package.py b/var/spack/repos/builtin/packages/minigmg/package.py index 799fb1ee6f..8b305e43c4 100644 --- a/var/spack/repos/builtin/packages/minigmg/package.py +++ b/var/spack/repos/builtin/packages/minigmg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/minimd/package.py b/var/spack/repos/builtin/packages/minimd/package.py index a8d72e7015..386fdd0f8b 100644 --- a/var/spack/repos/builtin/packages/minimd/package.py +++ b/var/spack/repos/builtin/packages/minimd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/minismac2d/package.py b/var/spack/repos/builtin/packages/minismac2d/package.py index b519128b19..acacaafca0 100644 --- a/var/spack/repos/builtin/packages/minismac2d/package.py +++ b/var/spack/repos/builtin/packages/minismac2d/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/minixyce/package.py b/var/spack/repos/builtin/packages/minixyce/package.py index 46d160d2da..7e31b58525 100644 --- a/var/spack/repos/builtin/packages/minixyce/package.py +++ b/var/spack/repos/builtin/packages/minixyce/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mitofates/package.py b/var/spack/repos/builtin/packages/mitofates/package.py index 0ca4ae58f2..4f97fdb803 100644 --- a/var/spack/repos/builtin/packages/mitofates/package.py +++ b/var/spack/repos/builtin/packages/mitofates/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mitos/package.py b/var/spack/repos/builtin/packages/mitos/package.py index 2c2177f968..3da5f77e07 100644 --- a/var/spack/repos/builtin/packages/mitos/package.py +++ b/var/spack/repos/builtin/packages/mitos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mkfontdir/package.py b/var/spack/repos/builtin/packages/mkfontdir/package.py index 40a22d2d4d..03462c7269 100644 --- a/var/spack/repos/builtin/packages/mkfontdir/package.py +++ b/var/spack/repos/builtin/packages/mkfontdir/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mkfontscale/package.py b/var/spack/repos/builtin/packages/mkfontscale/package.py index d2114c4dc5..934065ef4c 100644 --- a/var/spack/repos/builtin/packages/mkfontscale/package.py +++ b/var/spack/repos/builtin/packages/mkfontscale/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/moab/package.py b/var/spack/repos/builtin/packages/moab/package.py index 1bf81b34ea..e44a181dfa 100644 --- a/var/spack/repos/builtin/packages/moab/package.py +++ b/var/spack/repos/builtin/packages/moab/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/molcas/package.py b/var/spack/repos/builtin/packages/molcas/package.py index c5d92b9c50..1b08b0ce76 100644 --- a/var/spack/repos/builtin/packages/molcas/package.py +++ b/var/spack/repos/builtin/packages/molcas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mono/package.py b/var/spack/repos/builtin/packages/mono/package.py index a63ab9d622..e636d16e20 100644 --- a/var/spack/repos/builtin/packages/mono/package.py +++ b/var/spack/repos/builtin/packages/mono/package.py @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mosh/package.py b/var/spack/repos/builtin/packages/mosh/package.py index 2fb1fd5e99..367f5cb724 100644 --- a/var/spack/repos/builtin/packages/mosh/package.py +++ b/var/spack/repos/builtin/packages/mosh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mothur/package.py b/var/spack/repos/builtin/packages/mothur/package.py index 0caf0bc1f9..5f3f829fbd 100644 --- a/var/spack/repos/builtin/packages/mothur/package.py +++ b/var/spack/repos/builtin/packages/mothur/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mozjs/package.py b/var/spack/repos/builtin/packages/mozjs/package.py index 6fbb8133ce..2147c24c73 100644 --- a/var/spack/repos/builtin/packages/mozjs/package.py +++ b/var/spack/repos/builtin/packages/mozjs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpc/package.py b/var/spack/repos/builtin/packages/mpc/package.py index 5996b424b3..c33730b227 100644 --- a/var/spack/repos/builtin/packages/mpc/package.py +++ b/var/spack/repos/builtin/packages/mpc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpe2/package.py b/var/spack/repos/builtin/packages/mpe2/package.py index aa897f34fd..ef48132af1 100644 --- a/var/spack/repos/builtin/packages/mpe2/package.py +++ b/var/spack/repos/builtin/packages/mpe2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpest/package.py b/var/spack/repos/builtin/packages/mpest/package.py index a00eb37bb8..245de852ff 100644 --- a/var/spack/repos/builtin/packages/mpest/package.py +++ b/var/spack/repos/builtin/packages/mpest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpfr/package.py b/var/spack/repos/builtin/packages/mpfr/package.py index c809b6bbb4..3e531ef246 100644 --- a/var/spack/repos/builtin/packages/mpfr/package.py +++ b/var/spack/repos/builtin/packages/mpfr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpibash/package.py b/var/spack/repos/builtin/packages/mpibash/package.py index cfa8f30502..d93a092fa8 100644 --- a/var/spack/repos/builtin/packages/mpibash/package.py +++ b/var/spack/repos/builtin/packages/mpibash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpiblast/package.py b/var/spack/repos/builtin/packages/mpiblast/package.py index c5e283dbcf..d14a640aea 100644 --- a/var/spack/repos/builtin/packages/mpiblast/package.py +++ b/var/spack/repos/builtin/packages/mpiblast/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpich/package.py b/var/spack/repos/builtin/packages/mpich/package.py index 0663ce2b7b..4aba60940d 100644 --- a/var/spack/repos/builtin/packages/mpich/package.py +++ b/var/spack/repos/builtin/packages/mpich/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpileaks/package.py b/var/spack/repos/builtin/packages/mpileaks/package.py index d212019ddd..12caf7a91c 100644 --- a/var/spack/repos/builtin/packages/mpileaks/package.py +++ b/var/spack/repos/builtin/packages/mpileaks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpip/package.py b/var/spack/repos/builtin/packages/mpip/package.py index 4bc4b01ef0..4c74b1617d 100644 --- a/var/spack/repos/builtin/packages/mpip/package.py +++ b/var/spack/repos/builtin/packages/mpip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpir/package.py b/var/spack/repos/builtin/packages/mpir/package.py index 033bbcd925..e45f19d814 100644 --- a/var/spack/repos/builtin/packages/mpir/package.py +++ b/var/spack/repos/builtin/packages/mpir/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mpix-launch-swift/package.py b/var/spack/repos/builtin/packages/mpix-launch-swift/package.py index 72e93b7992..66c620a7c9 100644 --- a/var/spack/repos/builtin/packages/mpix-launch-swift/package.py +++ b/var/spack/repos/builtin/packages/mpix-launch-swift/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mrbayes/package.py b/var/spack/repos/builtin/packages/mrbayes/package.py index 05038b6931..8081ef7010 100644 --- a/var/spack/repos/builtin/packages/mrbayes/package.py +++ b/var/spack/repos/builtin/packages/mrbayes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mrnet/package.py b/var/spack/repos/builtin/packages/mrnet/package.py index 46e00fea58..7ad7b88436 100644 --- a/var/spack/repos/builtin/packages/mrnet/package.py +++ b/var/spack/repos/builtin/packages/mrnet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/msgpack-c/package.py b/var/spack/repos/builtin/packages/msgpack-c/package.py index a22fd0e312..5dc52d98c2 100644 --- a/var/spack/repos/builtin/packages/msgpack-c/package.py +++ b/var/spack/repos/builtin/packages/msgpack-c/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/multiverso/package.py b/var/spack/repos/builtin/packages/multiverso/package.py index 285f53ef3c..bfff91be54 100644 --- a/var/spack/repos/builtin/packages/multiverso/package.py +++ b/var/spack/repos/builtin/packages/multiverso/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mummer/package.py b/var/spack/repos/builtin/packages/mummer/package.py index 72450db537..58d3276cc5 100644 --- a/var/spack/repos/builtin/packages/mummer/package.py +++ b/var/spack/repos/builtin/packages/mummer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mumps/package.py b/var/spack/repos/builtin/packages/mumps/package.py index 60a46723c4..c8faf0bcd0 100644 --- a/var/spack/repos/builtin/packages/mumps/package.py +++ b/var/spack/repos/builtin/packages/mumps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/munge/package.py b/var/spack/repos/builtin/packages/munge/package.py index f26a041f06..1e6f6d4426 100644 --- a/var/spack/repos/builtin/packages/munge/package.py +++ b/var/spack/repos/builtin/packages/munge/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/muparser/package.py b/var/spack/repos/builtin/packages/muparser/package.py index 7c63973006..cebacc0a1a 100644 --- a/var/spack/repos/builtin/packages/muparser/package.py +++ b/var/spack/repos/builtin/packages/muparser/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/muscle/package.py b/var/spack/repos/builtin/packages/muscle/package.py index 3aac5fb5bb..4b02aa1a31 100644 --- a/var/spack/repos/builtin/packages/muscle/package.py +++ b/var/spack/repos/builtin/packages/muscle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/muse/package.py b/var/spack/repos/builtin/packages/muse/package.py index 54dcdf9d15..880efd84f2 100644 --- a/var/spack/repos/builtin/packages/muse/package.py +++ b/var/spack/repos/builtin/packages/muse/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/muster/package.py b/var/spack/repos/builtin/packages/muster/package.py index 4f61938a80..dc19311612 100644 --- a/var/spack/repos/builtin/packages/muster/package.py +++ b/var/spack/repos/builtin/packages/muster/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mvapich2/package.py b/var/spack/repos/builtin/packages/mvapich2/package.py index 675731146e..fe37d302b6 100644 --- a/var/spack/repos/builtin/packages/mvapich2/package.py +++ b/var/spack/repos/builtin/packages/mvapich2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/mxml/package.py b/var/spack/repos/builtin/packages/mxml/package.py index da5ef6437b..77833c4934 100644 --- a/var/spack/repos/builtin/packages/mxml/package.py +++ b/var/spack/repos/builtin/packages/mxml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nag/package.py b/var/spack/repos/builtin/packages/nag/package.py index d5dd8feb2d..7ebdb0bfb0 100644 --- a/var/spack/repos/builtin/packages/nag/package.py +++ b/var/spack/repos/builtin/packages/nag/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nalu/package.py b/var/spack/repos/builtin/packages/nalu/package.py index 3836c7a17f..a8eb4d4557 100644 --- a/var/spack/repos/builtin/packages/nalu/package.py +++ b/var/spack/repos/builtin/packages/nalu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/namd/package.py b/var/spack/repos/builtin/packages/namd/package.py index d7f77835a8..85b272d26b 100644 --- a/var/spack/repos/builtin/packages/namd/package.py +++ b/var/spack/repos/builtin/packages/namd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nano/package.py b/var/spack/repos/builtin/packages/nano/package.py index 3eef97039c..1884107281 100644 --- a/var/spack/repos/builtin/packages/nano/package.py +++ b/var/spack/repos/builtin/packages/nano/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nanoflann/package.py b/var/spack/repos/builtin/packages/nanoflann/package.py index da0ec728b0..1a94511718 100644 --- a/var/spack/repos/builtin/packages/nanoflann/package.py +++ b/var/spack/repos/builtin/packages/nanoflann/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nasm/package.py b/var/spack/repos/builtin/packages/nasm/package.py index 73a4e43a4f..8fe00867e3 100644 --- a/var/spack/repos/builtin/packages/nasm/package.py +++ b/var/spack/repos/builtin/packages/nasm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nauty/package.py b/var/spack/repos/builtin/packages/nauty/package.py index 1dc60a28ac..a85823d65a 100644 --- a/var/spack/repos/builtin/packages/nauty/package.py +++ b/var/spack/repos/builtin/packages/nauty/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nccl/package.py b/var/spack/repos/builtin/packages/nccl/package.py index 409a270971..0d8a9acf26 100644 --- a/var/spack/repos/builtin/packages/nccl/package.py +++ b/var/spack/repos/builtin/packages/nccl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nccmp/package.py b/var/spack/repos/builtin/packages/nccmp/package.py index 16a7467857..1bed4b78db 100644 --- a/var/spack/repos/builtin/packages/nccmp/package.py +++ b/var/spack/repos/builtin/packages/nccmp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ncdu/package.py b/var/spack/repos/builtin/packages/ncdu/package.py index 9adacc0f31..4f5d25cfa4 100644 --- a/var/spack/repos/builtin/packages/ncdu/package.py +++ b/var/spack/repos/builtin/packages/ncdu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ncftp/package.py b/var/spack/repos/builtin/packages/ncftp/package.py index 626045a19c..f84b23d040 100644 --- a/var/spack/repos/builtin/packages/ncftp/package.py +++ b/var/spack/repos/builtin/packages/ncftp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ncl/package.py b/var/spack/repos/builtin/packages/ncl/package.py index 21d9a0ca88..49ebbc8f47 100644 --- a/var/spack/repos/builtin/packages/ncl/package.py +++ b/var/spack/repos/builtin/packages/ncl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nco/package.py b/var/spack/repos/builtin/packages/nco/package.py index 85af71cbdf..7c9736f513 100644 --- a/var/spack/repos/builtin/packages/nco/package.py +++ b/var/spack/repos/builtin/packages/nco/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ncurses/package.py b/var/spack/repos/builtin/packages/ncurses/package.py index 6754a372cd..5f62ae1df0 100644 --- a/var/spack/repos/builtin/packages/ncurses/package.py +++ b/var/spack/repos/builtin/packages/ncurses/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ncview/package.py b/var/spack/repos/builtin/packages/ncview/package.py index 253f438b47..2845c7fc50 100644 --- a/var/spack/repos/builtin/packages/ncview/package.py +++ b/var/spack/repos/builtin/packages/ncview/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ndiff/package.py b/var/spack/repos/builtin/packages/ndiff/package.py index 66bf6d6994..f8806aa99a 100644 --- a/var/spack/repos/builtin/packages/ndiff/package.py +++ b/var/spack/repos/builtin/packages/ndiff/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nekbone/package.py b/var/spack/repos/builtin/packages/nekbone/package.py index 22d07661e5..e1c3220545 100644 --- a/var/spack/repos/builtin/packages/nekbone/package.py +++ b/var/spack/repos/builtin/packages/nekbone/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netcdf-cxx/package.py b/var/spack/repos/builtin/packages/netcdf-cxx/package.py index 120fa07a4c..89617e2dc1 100644 --- a/var/spack/repos/builtin/packages/netcdf-cxx/package.py +++ b/var/spack/repos/builtin/packages/netcdf-cxx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py index 2493a3e908..4fac7909c8 100644 --- a/var/spack/repos/builtin/packages/netcdf-cxx4/package.py +++ b/var/spack/repos/builtin/packages/netcdf-cxx4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netcdf-fortran/package.py b/var/spack/repos/builtin/packages/netcdf-fortran/package.py index 8c2d167000..87b342063a 100644 --- a/var/spack/repos/builtin/packages/netcdf-fortran/package.py +++ b/var/spack/repos/builtin/packages/netcdf-fortran/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netcdf/package.py b/var/spack/repos/builtin/packages/netcdf/package.py index 90dd4dd5d7..06d6ff37e8 100644 --- a/var/spack/repos/builtin/packages/netcdf/package.py +++ b/var/spack/repos/builtin/packages/netcdf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netgauge/package.py b/var/spack/repos/builtin/packages/netgauge/package.py index b1880733c9..685d0b1abf 100644 --- a/var/spack/repos/builtin/packages/netgauge/package.py +++ b/var/spack/repos/builtin/packages/netgauge/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netgen/package.py b/var/spack/repos/builtin/packages/netgen/package.py index ee96fac04d..0568694632 100644 --- a/var/spack/repos/builtin/packages/netgen/package.py +++ b/var/spack/repos/builtin/packages/netgen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netlib-lapack/package.py b/var/spack/repos/builtin/packages/netlib-lapack/package.py index f1274b5c29..3df4d3282c 100644 --- a/var/spack/repos/builtin/packages/netlib-lapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-lapack/package.py @@ -1,5 +1,5 @@ ############################################################################# -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py index 6c6114f011..e0cb90965c 100644 --- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py +++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nettle/package.py b/var/spack/repos/builtin/packages/nettle/package.py index 83cbcb80dc..6a8f867032 100644 --- a/var/spack/repos/builtin/packages/nettle/package.py +++ b/var/spack/repos/builtin/packages/nettle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nextflow/package.py b/var/spack/repos/builtin/packages/nextflow/package.py index 2917447a36..5acf1bea46 100644 --- a/var/spack/repos/builtin/packages/nextflow/package.py +++ b/var/spack/repos/builtin/packages/nextflow/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nfft/package.py b/var/spack/repos/builtin/packages/nfft/package.py index 771ed36cb2..a5f04d7370 100644 --- a/var/spack/repos/builtin/packages/nfft/package.py +++ b/var/spack/repos/builtin/packages/nfft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nginx/package.py b/var/spack/repos/builtin/packages/nginx/package.py index a18ad9b293..4d15bbcfd4 100644 --- a/var/spack/repos/builtin/packages/nginx/package.py +++ b/var/spack/repos/builtin/packages/nginx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ngmlr/package.py b/var/spack/repos/builtin/packages/ngmlr/package.py index 91780c2b05..96379ea74c 100644 --- a/var/spack/repos/builtin/packages/ngmlr/package.py +++ b/var/spack/repos/builtin/packages/ngmlr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ninja-fortran/package.py b/var/spack/repos/builtin/packages/ninja-fortran/package.py index 349b60bae9..f6b374ba1a 100644 --- a/var/spack/repos/builtin/packages/ninja-fortran/package.py +++ b/var/spack/repos/builtin/packages/ninja-fortran/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ninja/package.py b/var/spack/repos/builtin/packages/ninja/package.py index 7a53ae684c..e598ae2d84 100644 --- a/var/spack/repos/builtin/packages/ninja/package.py +++ b/var/spack/repos/builtin/packages/ninja/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nmap/package.py b/var/spack/repos/builtin/packages/nmap/package.py index 20204c0b06..e3504f533c 100644 --- a/var/spack/repos/builtin/packages/nmap/package.py +++ b/var/spack/repos/builtin/packages/nmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/node-js/package.py b/var/spack/repos/builtin/packages/node-js/package.py index 5a8772fbf8..3a891031a6 100644 --- a/var/spack/repos/builtin/packages/node-js/package.py +++ b/var/spack/repos/builtin/packages/node-js/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/notmuch/package.py b/var/spack/repos/builtin/packages/notmuch/package.py index 0462867f54..4752ea4566 100644 --- a/var/spack/repos/builtin/packages/notmuch/package.py +++ b/var/spack/repos/builtin/packages/notmuch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/npb/package.py b/var/spack/repos/builtin/packages/npb/package.py index 26d46c3090..05e8f5ad9d 100644 --- a/var/spack/repos/builtin/packages/npb/package.py +++ b/var/spack/repos/builtin/packages/npb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/npm/package.py b/var/spack/repos/builtin/packages/npm/package.py index 8e252e7b65..dffc74979b 100644 --- a/var/spack/repos/builtin/packages/npm/package.py +++ b/var/spack/repos/builtin/packages/npm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/npth/package.py b/var/spack/repos/builtin/packages/npth/package.py index fa166a45c1..451b1c56ea 100644 --- a/var/spack/repos/builtin/packages/npth/package.py +++ b/var/spack/repos/builtin/packages/npth/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nspr/package.py b/var/spack/repos/builtin/packages/nspr/package.py index bda5db551b..ed0e7cc022 100644 --- a/var/spack/repos/builtin/packages/nspr/package.py +++ b/var/spack/repos/builtin/packages/nspr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/numdiff/package.py b/var/spack/repos/builtin/packages/numdiff/package.py index fbaf5a2022..7a0eac3e89 100644 --- a/var/spack/repos/builtin/packages/numdiff/package.py +++ b/var/spack/repos/builtin/packages/numdiff/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nut/package.py b/var/spack/repos/builtin/packages/nut/package.py index 561e52f1a5..32a323cfd4 100644 --- a/var/spack/repos/builtin/packages/nut/package.py +++ b/var/spack/repos/builtin/packages/nut/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/nwchem/package.py b/var/spack/repos/builtin/packages/nwchem/package.py index f526dcda88..8148d385a3 100644 --- a/var/spack/repos/builtin/packages/nwchem/package.py +++ b/var/spack/repos/builtin/packages/nwchem/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ocaml/package.py b/var/spack/repos/builtin/packages/ocaml/package.py index dc1c0dde20..d547a507b0 100644 --- a/var/spack/repos/builtin/packages/ocaml/package.py +++ b/var/spack/repos/builtin/packages/ocaml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/oce/package.py b/var/spack/repos/builtin/packages/oce/package.py index 9f7fd8eef7..b6e016361e 100644 --- a/var/spack/repos/builtin/packages/oce/package.py +++ b/var/spack/repos/builtin/packages/oce/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/oclock/package.py b/var/spack/repos/builtin/packages/oclock/package.py index 3db0d63bbe..ae79f7fc75 100644 --- a/var/spack/repos/builtin/packages/oclock/package.py +++ b/var/spack/repos/builtin/packages/oclock/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/octave-splines/package.py b/var/spack/repos/builtin/packages/octave-splines/package.py index 51de0858ab..4bdd134f85 100644 --- a/var/spack/repos/builtin/packages/octave-splines/package.py +++ b/var/spack/repos/builtin/packages/octave-splines/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/octave/package.py b/var/spack/repos/builtin/packages/octave/package.py index 29896172b1..7bc5b2a6ef 100644 --- a/var/spack/repos/builtin/packages/octave/package.py +++ b/var/spack/repos/builtin/packages/octave/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/octopus/package.py b/var/spack/repos/builtin/packages/octopus/package.py index 9e70699d84..972d137714 100644 --- a/var/spack/repos/builtin/packages/octopus/package.py +++ b/var/spack/repos/builtin/packages/octopus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ompss/package.py b/var/spack/repos/builtin/packages/ompss/package.py index cf03bc6fde..11c4417c21 100644 --- a/var/spack/repos/builtin/packages/ompss/package.py +++ b/var/spack/repos/builtin/packages/ompss/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ompt-openmp/package.py b/var/spack/repos/builtin/packages/ompt-openmp/package.py index 387edd7c64..7bdc13b60c 100644 --- a/var/spack/repos/builtin/packages/ompt-openmp/package.py +++ b/var/spack/repos/builtin/packages/ompt-openmp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/oniguruma/package.py b/var/spack/repos/builtin/packages/oniguruma/package.py index 4a9bc7c12b..b4e01ed423 100644 --- a/var/spack/repos/builtin/packages/oniguruma/package.py +++ b/var/spack/repos/builtin/packages/oniguruma/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ont-albacore/package.py b/var/spack/repos/builtin/packages/ont-albacore/package.py index 812bd3294d..7ae92e6343 100644 --- a/var/spack/repos/builtin/packages/ont-albacore/package.py +++ b/var/spack/repos/builtin/packages/ont-albacore/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/opari2/package.py b/var/spack/repos/builtin/packages/opari2/package.py index bd79943c64..18d41dca44 100644 --- a/var/spack/repos/builtin/packages/opari2/package.py +++ b/var/spack/repos/builtin/packages/opari2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openbabel/package.py b/var/spack/repos/builtin/packages/openbabel/package.py index e67785eca8..38aad20d24 100644 --- a/var/spack/repos/builtin/packages/openbabel/package.py +++ b/var/spack/repos/builtin/packages/openbabel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index 73b89fcd23..74fbfc4531 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/opencoarrays/package.py b/var/spack/repos/builtin/packages/opencoarrays/package.py index 37ae236c0a..bf83f8e5de 100644 --- a/var/spack/repos/builtin/packages/opencoarrays/package.py +++ b/var/spack/repos/builtin/packages/opencoarrays/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/opencv/package.py b/var/spack/repos/builtin/packages/opencv/package.py index 5587a893dc..adddbc1857 100644 --- a/var/spack/repos/builtin/packages/opencv/package.py +++ b/var/spack/repos/builtin/packages/opencv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openexr/package.py b/var/spack/repos/builtin/packages/openexr/package.py index b82a305b18..2402126dd1 100644 --- a/var/spack/repos/builtin/packages/openexr/package.py +++ b/var/spack/repos/builtin/packages/openexr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openfst/package.py b/var/spack/repos/builtin/packages/openfst/package.py index f6fa7b5e56..ca834e684b 100644 --- a/var/spack/repos/builtin/packages/openfst/package.py +++ b/var/spack/repos/builtin/packages/openfst/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openjpeg/package.py b/var/spack/repos/builtin/packages/openjpeg/package.py index 977a7b687b..06a88ffb6b 100644 --- a/var/spack/repos/builtin/packages/openjpeg/package.py +++ b/var/spack/repos/builtin/packages/openjpeg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openmc/package.py b/var/spack/repos/builtin/packages/openmc/package.py index aed4f4b0e9..c5eb4a32f7 100644 --- a/var/spack/repos/builtin/packages/openmc/package.py +++ b/var/spack/repos/builtin/packages/openmc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index 7fc50928db..d62290e78f 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openscenegraph/package.py b/var/spack/repos/builtin/packages/openscenegraph/package.py index e90d010e83..96bbfc3488 100644 --- a/var/spack/repos/builtin/packages/openscenegraph/package.py +++ b/var/spack/repos/builtin/packages/openscenegraph/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/openssl/package.py b/var/spack/repos/builtin/packages/openssl/package.py index 35b8c4b030..3219d0b2a3 100644 --- a/var/spack/repos/builtin/packages/openssl/package.py +++ b/var/spack/repos/builtin/packages/openssl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/opium/package.py b/var/spack/repos/builtin/packages/opium/package.py index 2080fdb9d8..3656236cb0 100644 --- a/var/spack/repos/builtin/packages/opium/package.py +++ b/var/spack/repos/builtin/packages/opium/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/opus/package.py b/var/spack/repos/builtin/packages/opus/package.py index 6c579bca68..5df58d2fcb 100644 --- a/var/spack/repos/builtin/packages/opus/package.py +++ b/var/spack/repos/builtin/packages/opus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/orfm/package.py b/var/spack/repos/builtin/packages/orfm/package.py index 11ff3c4c7b..f83e900b68 100644 --- a/var/spack/repos/builtin/packages/orfm/package.py +++ b/var/spack/repos/builtin/packages/orfm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py b/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py index f32262f240..9454cc1293 100644 --- a/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py +++ b/var/spack/repos/builtin/packages/osu-micro-benchmarks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/otf/package.py b/var/spack/repos/builtin/packages/otf/package.py index 6ac85f4b10..43faffe9d8 100644 --- a/var/spack/repos/builtin/packages/otf/package.py +++ b/var/spack/repos/builtin/packages/otf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/otf2/package.py b/var/spack/repos/builtin/packages/otf2/package.py index cd338f06c6..272032ca86 100644 --- a/var/spack/repos/builtin/packages/otf2/package.py +++ b/var/spack/repos/builtin/packages/otf2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/p4est/package.py b/var/spack/repos/builtin/packages/p4est/package.py index 9f9c08611d..c042a691f4 100644 --- a/var/spack/repos/builtin/packages/p4est/package.py +++ b/var/spack/repos/builtin/packages/p4est/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pacbio-daligner/package.py b/var/spack/repos/builtin/packages/pacbio-daligner/package.py index 695c4717f7..8fec14780b 100644 --- a/var/spack/repos/builtin/packages/pacbio-daligner/package.py +++ b/var/spack/repos/builtin/packages/pacbio-daligner/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pacbio-damasker/package.py b/var/spack/repos/builtin/packages/pacbio-damasker/package.py index b2415fd340..769a6f3ad8 100644 --- a/var/spack/repos/builtin/packages/pacbio-damasker/package.py +++ b/var/spack/repos/builtin/packages/pacbio-damasker/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pacbio-dazz-db/package.py b/var/spack/repos/builtin/packages/pacbio-dazz-db/package.py index 1223c25f37..e24173daf3 100644 --- a/var/spack/repos/builtin/packages/pacbio-dazz-db/package.py +++ b/var/spack/repos/builtin/packages/pacbio-dazz-db/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pacbio-dextractor/package.py b/var/spack/repos/builtin/packages/pacbio-dextractor/package.py index 91a4e6f330..c9e6294782 100644 --- a/var/spack/repos/builtin/packages/pacbio-dextractor/package.py +++ b/var/spack/repos/builtin/packages/pacbio-dextractor/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pagit/package.py b/var/spack/repos/builtin/packages/pagit/package.py index 2e41d83da3..8a1660ce2a 100644 --- a/var/spack/repos/builtin/packages/pagit/package.py +++ b/var/spack/repos/builtin/packages/pagit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pagmo/package.py b/var/spack/repos/builtin/packages/pagmo/package.py index bb6136c6ec..1f822eeb87 100644 --- a/var/spack/repos/builtin/packages/pagmo/package.py +++ b/var/spack/repos/builtin/packages/pagmo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/paml/package.py b/var/spack/repos/builtin/packages/paml/package.py index 693d2b808b..899ae4db90 100644 --- a/var/spack/repos/builtin/packages/paml/package.py +++ b/var/spack/repos/builtin/packages/paml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/panda/package.py b/var/spack/repos/builtin/packages/panda/package.py index 5c905fb2d3..63c696af52 100644 --- a/var/spack/repos/builtin/packages/panda/package.py +++ b/var/spack/repos/builtin/packages/panda/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pango/package.py b/var/spack/repos/builtin/packages/pango/package.py index a95eecf041..9b6f40426e 100644 --- a/var/spack/repos/builtin/packages/pango/package.py +++ b/var/spack/repos/builtin/packages/pango/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/papi/package.py b/var/spack/repos/builtin/packages/papi/package.py index 8b0707b663..717511b5fa 100644 --- a/var/spack/repos/builtin/packages/papi/package.py +++ b/var/spack/repos/builtin/packages/papi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/paradiseo/package.py b/var/spack/repos/builtin/packages/paradiseo/package.py index fbcf8ca5e5..4e9223e20a 100644 --- a/var/spack/repos/builtin/packages/paradiseo/package.py +++ b/var/spack/repos/builtin/packages/paradiseo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/parallel-netcdf/package.py b/var/spack/repos/builtin/packages/parallel-netcdf/package.py index 757a336dd9..65860e596a 100644 --- a/var/spack/repos/builtin/packages/parallel-netcdf/package.py +++ b/var/spack/repos/builtin/packages/parallel-netcdf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/parallel/package.py b/var/spack/repos/builtin/packages/parallel/package.py index 5dfcc1b06f..81e4d51d25 100644 --- a/var/spack/repos/builtin/packages/parallel/package.py +++ b/var/spack/repos/builtin/packages/parallel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/paraver/package.py b/var/spack/repos/builtin/packages/paraver/package.py index a3847dc94d..f2f97f7e47 100644 --- a/var/spack/repos/builtin/packages/paraver/package.py +++ b/var/spack/repos/builtin/packages/paraver/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/paraview/package.py b/var/spack/repos/builtin/packages/paraview/package.py index fb491f58e2..9a80dd6771 100644 --- a/var/spack/repos/builtin/packages/paraview/package.py +++ b/var/spack/repos/builtin/packages/paraview/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/parmetis/package.py b/var/spack/repos/builtin/packages/parmetis/package.py index d7079d0468..99b7694ff7 100644 --- a/var/spack/repos/builtin/packages/parmetis/package.py +++ b/var/spack/repos/builtin/packages/parmetis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/parmgridgen/package.py b/var/spack/repos/builtin/packages/parmgridgen/package.py index 8630a139ec..140e266a7a 100644 --- a/var/spack/repos/builtin/packages/parmgridgen/package.py +++ b/var/spack/repos/builtin/packages/parmgridgen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/parpack/package.py b/var/spack/repos/builtin/packages/parpack/package.py index f3420cbb7a..3a1b6deafa 100644 --- a/var/spack/repos/builtin/packages/parpack/package.py +++ b/var/spack/repos/builtin/packages/parpack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/parsimonator/package.py b/var/spack/repos/builtin/packages/parsimonator/package.py index 5b979f23e3..b58d9215ba 100644 --- a/var/spack/repos/builtin/packages/parsimonator/package.py +++ b/var/spack/repos/builtin/packages/parsimonator/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/partitionfinder/package.py b/var/spack/repos/builtin/packages/partitionfinder/package.py index 523550a64b..ea00ac76c0 100644 --- a/var/spack/repos/builtin/packages/partitionfinder/package.py +++ b/var/spack/repos/builtin/packages/partitionfinder/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/patch/package.py b/var/spack/repos/builtin/packages/patch/package.py index 1b0e6389a6..69a3e676be 100644 --- a/var/spack/repos/builtin/packages/patch/package.py +++ b/var/spack/repos/builtin/packages/patch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/patchelf/package.py b/var/spack/repos/builtin/packages/patchelf/package.py index c25361b76e..6a6950617b 100644 --- a/var/spack/repos/builtin/packages/patchelf/package.py +++ b/var/spack/repos/builtin/packages/patchelf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pathfinder/package.py b/var/spack/repos/builtin/packages/pathfinder/package.py index 85432ffd49..516389a353 100644 --- a/var/spack/repos/builtin/packages/pathfinder/package.py +++ b/var/spack/repos/builtin/packages/pathfinder/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pbmpi/package.py b/var/spack/repos/builtin/packages/pbmpi/package.py index 548c67c358..56973cd319 100644 --- a/var/spack/repos/builtin/packages/pbmpi/package.py +++ b/var/spack/repos/builtin/packages/pbmpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pcma/package.py b/var/spack/repos/builtin/packages/pcma/package.py index 944c1ac37b..f024e4a0a6 100644 --- a/var/spack/repos/builtin/packages/pcma/package.py +++ b/var/spack/repos/builtin/packages/pcma/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pcre/package.py b/var/spack/repos/builtin/packages/pcre/package.py index 15c5b9854c..4175ab3f8b 100644 --- a/var/spack/repos/builtin/packages/pcre/package.py +++ b/var/spack/repos/builtin/packages/pcre/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pcre2/package.py b/var/spack/repos/builtin/packages/pcre2/package.py index 07b2a9085b..e904ec7052 100644 --- a/var/spack/repos/builtin/packages/pcre2/package.py +++ b/var/spack/repos/builtin/packages/pcre2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pdsh/package.py b/var/spack/repos/builtin/packages/pdsh/package.py index 06457ba38c..1e70221eb6 100644 --- a/var/spack/repos/builtin/packages/pdsh/package.py +++ b/var/spack/repos/builtin/packages/pdsh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pdt/package.py b/var/spack/repos/builtin/packages/pdt/package.py index 42cdfbc41b..6895fd0578 100644 --- a/var/spack/repos/builtin/packages/pdt/package.py +++ b/var/spack/repos/builtin/packages/pdt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pennant/package.py b/var/spack/repos/builtin/packages/pennant/package.py index b8e71c7f31..3438c4f83e 100644 --- a/var/spack/repos/builtin/packages/pennant/package.py +++ b/var/spack/repos/builtin/packages/pennant/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-dbfile/package.py b/var/spack/repos/builtin/packages/perl-dbfile/package.py index 7445d6e63a..e50c08631a 100644 --- a/var/spack/repos/builtin/packages/perl-dbfile/package.py +++ b/var/spack/repos/builtin/packages/perl-dbfile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-dbi/package.py b/var/spack/repos/builtin/packages/perl-dbi/package.py index d9de80edd0..61cb017877 100644 --- a/var/spack/repos/builtin/packages/perl-dbi/package.py +++ b/var/spack/repos/builtin/packages/perl-dbi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py b/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py index f8bc19cf35..9132542144 100644 --- a/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py +++ b/var/spack/repos/builtin/packages/perl-extutils-makemaker/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-intervaltree/package.py b/var/spack/repos/builtin/packages/perl-intervaltree/package.py index bcf1204c53..e4216b6599 100644 --- a/var/spack/repos/builtin/packages/perl-intervaltree/package.py +++ b/var/spack/repos/builtin/packages/perl-intervaltree/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-math-cdf/package.py b/var/spack/repos/builtin/packages/perl-math-cdf/package.py index 6d7d195dea..90a4eb5257 100644 --- a/var/spack/repos/builtin/packages/perl-math-cdf/package.py +++ b/var/spack/repos/builtin/packages/perl-math-cdf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-module-build/package.py b/var/spack/repos/builtin/packages/perl-module-build/package.py index 11f5580647..9a095127c9 100644 --- a/var/spack/repos/builtin/packages/perl-module-build/package.py +++ b/var/spack/repos/builtin/packages/perl-module-build/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-star-fusion/package.py b/var/spack/repos/builtin/packages/perl-star-fusion/package.py index 65d673bf3b..aa62b5f070 100644 --- a/var/spack/repos/builtin/packages/perl-star-fusion/package.py +++ b/var/spack/repos/builtin/packages/perl-star-fusion/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-term-readkey/package.py b/var/spack/repos/builtin/packages/perl-term-readkey/package.py index 51599011fa..2ab1ef1eab 100644 --- a/var/spack/repos/builtin/packages/perl-term-readkey/package.py +++ b/var/spack/repos/builtin/packages/perl-term-readkey/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-uri-escape/package.py b/var/spack/repos/builtin/packages/perl-uri-escape/package.py index ffeb06f979..b3e9e14fe3 100644 --- a/var/spack/repos/builtin/packages/perl-uri-escape/package.py +++ b/var/spack/repos/builtin/packages/perl-uri-escape/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl-xml-parser/package.py b/var/spack/repos/builtin/packages/perl-xml-parser/package.py index c8981e7d39..726added8d 100644 --- a/var/spack/repos/builtin/packages/perl-xml-parser/package.py +++ b/var/spack/repos/builtin/packages/perl-xml-parser/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/perl/package.py b/var/spack/repos/builtin/packages/perl/package.py index 1e5e93a2f4..cb7cbe07fc 100644 --- a/var/spack/repos/builtin/packages/perl/package.py +++ b/var/spack/repos/builtin/packages/perl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py index d4ea674577..ce16911dc9 100644 --- a/var/spack/repos/builtin/packages/petsc/package.py +++ b/var/spack/repos/builtin/packages/petsc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pexsi/package.py b/var/spack/repos/builtin/packages/pexsi/package.py index 0d4496c104..7a77b4e4e1 100644 --- a/var/spack/repos/builtin/packages/pexsi/package.py +++ b/var/spack/repos/builtin/packages/pexsi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pfft/package.py b/var/spack/repos/builtin/packages/pfft/package.py index a89a199efb..a69e29382b 100644 --- a/var/spack/repos/builtin/packages/pfft/package.py +++ b/var/spack/repos/builtin/packages/pfft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pflotran/package.py b/var/spack/repos/builtin/packages/pflotran/package.py index e18e6a7ea0..d4b0012ae2 100644 --- a/var/spack/repos/builtin/packages/pflotran/package.py +++ b/var/spack/repos/builtin/packages/pflotran/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pgdspider/package.py b/var/spack/repos/builtin/packages/pgdspider/package.py index 60dfdc12f4..28c9f370b9 100644 --- a/var/spack/repos/builtin/packages/pgdspider/package.py +++ b/var/spack/repos/builtin/packages/pgdspider/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pgi/package.py b/var/spack/repos/builtin/packages/pgi/package.py index e1c9b0130b..128a939b93 100644 --- a/var/spack/repos/builtin/packages/pgi/package.py +++ b/var/spack/repos/builtin/packages/pgi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/phasta/package.py b/var/spack/repos/builtin/packages/phasta/package.py index aa47214706..269d8174e7 100644 --- a/var/spack/repos/builtin/packages/phasta/package.py +++ b/var/spack/repos/builtin/packages/phasta/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/phylip/package.py b/var/spack/repos/builtin/packages/phylip/package.py index 39bcd3c1e5..58571940a9 100644 --- a/var/spack/repos/builtin/packages/phylip/package.py +++ b/var/spack/repos/builtin/packages/phylip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/picard/package.py b/var/spack/repos/builtin/packages/picard/package.py index f03561a5a7..8eaf1df6cd 100644 --- a/var/spack/repos/builtin/packages/picard/package.py +++ b/var/spack/repos/builtin/packages/picard/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pidx/package.py b/var/spack/repos/builtin/packages/pidx/package.py index e4be597f0f..caba2f2ddf 100644 --- a/var/spack/repos/builtin/packages/pidx/package.py +++ b/var/spack/repos/builtin/packages/pidx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pigz/package.py b/var/spack/repos/builtin/packages/pigz/package.py index 36afbaa9bf..9183a0b9f1 100644 --- a/var/spack/repos/builtin/packages/pigz/package.py +++ b/var/spack/repos/builtin/packages/pigz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/piranha/package.py b/var/spack/repos/builtin/packages/piranha/package.py index 4bc4d5f894..a290ec0713 100644 --- a/var/spack/repos/builtin/packages/piranha/package.py +++ b/var/spack/repos/builtin/packages/piranha/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pixman/package.py b/var/spack/repos/builtin/packages/pixman/package.py index fa01d21acb..dfd111dff6 100644 --- a/var/spack/repos/builtin/packages/pixman/package.py +++ b/var/spack/repos/builtin/packages/pixman/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pkg-config/package.py b/var/spack/repos/builtin/packages/pkg-config/package.py index 39306e33cd..087b09cbf5 100644 --- a/var/spack/repos/builtin/packages/pkg-config/package.py +++ b/var/spack/repos/builtin/packages/pkg-config/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/planck-likelihood/package.py b/var/spack/repos/builtin/packages/planck-likelihood/package.py index 9f66b9b41c..0af1fd3998 100644 --- a/var/spack/repos/builtin/packages/planck-likelihood/package.py +++ b/var/spack/repos/builtin/packages/planck-likelihood/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/plink/package.py b/var/spack/repos/builtin/packages/plink/package.py index a519f30184..a42f1db0b7 100644 --- a/var/spack/repos/builtin/packages/plink/package.py +++ b/var/spack/repos/builtin/packages/plink/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/plumed/package.py b/var/spack/repos/builtin/packages/plumed/package.py index fb655a9949..6896cbeb77 100644 --- a/var/spack/repos/builtin/packages/plumed/package.py +++ b/var/spack/repos/builtin/packages/plumed/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pmgr-collective/package.py b/var/spack/repos/builtin/packages/pmgr-collective/package.py index 0ba1cc5fd5..bf09e611c3 100644 --- a/var/spack/repos/builtin/packages/pmgr-collective/package.py +++ b/var/spack/repos/builtin/packages/pmgr-collective/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pnfft/package.py b/var/spack/repos/builtin/packages/pnfft/package.py index 7bb74859d6..3470419a02 100644 --- a/var/spack/repos/builtin/packages/pnfft/package.py +++ b/var/spack/repos/builtin/packages/pnfft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pngwriter/package.py b/var/spack/repos/builtin/packages/pngwriter/package.py index 1f7c20575f..d70ebc035d 100644 --- a/var/spack/repos/builtin/packages/pngwriter/package.py +++ b/var/spack/repos/builtin/packages/pngwriter/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/poamsa/package.py b/var/spack/repos/builtin/packages/poamsa/package.py index 3148a10bbd..9694b89fa9 100644 --- a/var/spack/repos/builtin/packages/poamsa/package.py +++ b/var/spack/repos/builtin/packages/poamsa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pocl/package.py b/var/spack/repos/builtin/packages/pocl/package.py index 33273ea9e6..79a7ebff0b 100644 --- a/var/spack/repos/builtin/packages/pocl/package.py +++ b/var/spack/repos/builtin/packages/pocl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/polymake/package.py b/var/spack/repos/builtin/packages/polymake/package.py index 693eac2895..7e2d55a4b9 100644 --- a/var/spack/repos/builtin/packages/polymake/package.py +++ b/var/spack/repos/builtin/packages/polymake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/porta/package.py b/var/spack/repos/builtin/packages/porta/package.py index b2b7076be3..052ba8503d 100644 --- a/var/spack/repos/builtin/packages/porta/package.py +++ b/var/spack/repos/builtin/packages/porta/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/postgresql/package.py b/var/spack/repos/builtin/packages/postgresql/package.py index 4142dda185..280b68a964 100644 --- a/var/spack/repos/builtin/packages/postgresql/package.py +++ b/var/spack/repos/builtin/packages/postgresql/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ppl/package.py b/var/spack/repos/builtin/packages/ppl/package.py index e059ee26d8..e52a6525fe 100644 --- a/var/spack/repos/builtin/packages/ppl/package.py +++ b/var/spack/repos/builtin/packages/ppl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/prank/package.py b/var/spack/repos/builtin/packages/prank/package.py index 7f8fe95634..7b66520165 100644 --- a/var/spack/repos/builtin/packages/prank/package.py +++ b/var/spack/repos/builtin/packages/prank/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/presentproto/package.py b/var/spack/repos/builtin/packages/presentproto/package.py index d6da6d6bea..d33aef11d0 100644 --- a/var/spack/repos/builtin/packages/presentproto/package.py +++ b/var/spack/repos/builtin/packages/presentproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/preseq/package.py b/var/spack/repos/builtin/packages/preseq/package.py index 87779bcbac..c8abb1ceae 100644 --- a/var/spack/repos/builtin/packages/preseq/package.py +++ b/var/spack/repos/builtin/packages/preseq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/price/package.py b/var/spack/repos/builtin/packages/price/package.py index df674f4f6e..ba27f8e4c6 100644 --- a/var/spack/repos/builtin/packages/price/package.py +++ b/var/spack/repos/builtin/packages/price/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/primer3/package.py b/var/spack/repos/builtin/packages/primer3/package.py index fbed680b33..87c6b1cc99 100644 --- a/var/spack/repos/builtin/packages/primer3/package.py +++ b/var/spack/repos/builtin/packages/primer3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/printproto/package.py b/var/spack/repos/builtin/packages/printproto/package.py index 66f978c89f..8f27b117ed 100644 --- a/var/spack/repos/builtin/packages/printproto/package.py +++ b/var/spack/repos/builtin/packages/printproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/probconsrna/package.py b/var/spack/repos/builtin/packages/probconsrna/package.py index 4973ced565..b48befc462 100644 --- a/var/spack/repos/builtin/packages/probconsrna/package.py +++ b/var/spack/repos/builtin/packages/probconsrna/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/proj/package.py b/var/spack/repos/builtin/packages/proj/package.py index 85bbf02ac6..dab37cf8f8 100644 --- a/var/spack/repos/builtin/packages/proj/package.py +++ b/var/spack/repos/builtin/packages/proj/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/protobuf/package.py b/var/spack/repos/builtin/packages/protobuf/package.py index f6272f3fe8..0628974fd2 100644 --- a/var/spack/repos/builtin/packages/protobuf/package.py +++ b/var/spack/repos/builtin/packages/protobuf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/proxymngr/package.py b/var/spack/repos/builtin/packages/proxymngr/package.py index e7a2a70dc4..7a59608ef5 100644 --- a/var/spack/repos/builtin/packages/proxymngr/package.py +++ b/var/spack/repos/builtin/packages/proxymngr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pruners-ninja/package.py b/var/spack/repos/builtin/packages/pruners-ninja/package.py index 558f59342b..b87e235c61 100644 --- a/var/spack/repos/builtin/packages/pruners-ninja/package.py +++ b/var/spack/repos/builtin/packages/pruners-ninja/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/psi4/package.py b/var/spack/repos/builtin/packages/psi4/package.py index 3c50a8413c..a003f08881 100644 --- a/var/spack/repos/builtin/packages/psi4/package.py +++ b/var/spack/repos/builtin/packages/psi4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pumi/package.py b/var/spack/repos/builtin/packages/pumi/package.py index 909dc85582..db82f269ae 100644 --- a/var/spack/repos/builtin/packages/pumi/package.py +++ b/var/spack/repos/builtin/packages/pumi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/pvm/package.py b/var/spack/repos/builtin/packages/pvm/package.py index ecbb4d21bd..91fdb0379c 100644 --- a/var/spack/repos/builtin/packages/pvm/package.py +++ b/var/spack/repos/builtin/packages/pvm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-3to2/package.py b/var/spack/repos/builtin/packages/py-3to2/package.py index cc2986a7b3..c9ac3daa37 100644 --- a/var/spack/repos/builtin/packages/py-3to2/package.py +++ b/var/spack/repos/builtin/packages/py-3to2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-4suite-xml/package.py b/var/spack/repos/builtin/packages/py-4suite-xml/package.py index 05c7d775ec..ae48c3f650 100644 --- a/var/spack/repos/builtin/packages/py-4suite-xml/package.py +++ b/var/spack/repos/builtin/packages/py-4suite-xml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-abipy/package.py b/var/spack/repos/builtin/packages/py-abipy/package.py index b43491b52f..8047aad77e 100644 --- a/var/spack/repos/builtin/packages/py-abipy/package.py +++ b/var/spack/repos/builtin/packages/py-abipy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-alabaster/package.py b/var/spack/repos/builtin/packages/py-alabaster/package.py index 39645a02e3..40067c89cd 100644 --- a/var/spack/repos/builtin/packages/py-alabaster/package.py +++ b/var/spack/repos/builtin/packages/py-alabaster/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-apache-libcloud/package.py b/var/spack/repos/builtin/packages/py-apache-libcloud/package.py index 2498a469f1..230e30a7ec 100644 --- a/var/spack/repos/builtin/packages/py-apache-libcloud/package.py +++ b/var/spack/repos/builtin/packages/py-apache-libcloud/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-apipkg/package.py b/var/spack/repos/builtin/packages/py-apipkg/package.py index 2e125cb1a9..68349f1866 100644 --- a/var/spack/repos/builtin/packages/py-apipkg/package.py +++ b/var/spack/repos/builtin/packages/py-apipkg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-appdirs/package.py b/var/spack/repos/builtin/packages/py-appdirs/package.py index 487ef261fe..7e0ad8a8d3 100644 --- a/var/spack/repos/builtin/packages/py-appdirs/package.py +++ b/var/spack/repos/builtin/packages/py-appdirs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-appnope/package.py b/var/spack/repos/builtin/packages/py-appnope/package.py index 49d3b2796d..7b5b7a0b27 100644 --- a/var/spack/repos/builtin/packages/py-appnope/package.py +++ b/var/spack/repos/builtin/packages/py-appnope/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-apscheduler/package.py b/var/spack/repos/builtin/packages/py-apscheduler/package.py index 163783be12..dceb6ce6c5 100644 --- a/var/spack/repos/builtin/packages/py-apscheduler/package.py +++ b/var/spack/repos/builtin/packages/py-apscheduler/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-argcomplete/package.py b/var/spack/repos/builtin/packages/py-argcomplete/package.py index ba9b9600d3..a56ec233df 100644 --- a/var/spack/repos/builtin/packages/py-argcomplete/package.py +++ b/var/spack/repos/builtin/packages/py-argcomplete/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-argparse/package.py b/var/spack/repos/builtin/packages/py-argparse/package.py index 94041c1c7f..e52c797308 100644 --- a/var/spack/repos/builtin/packages/py-argparse/package.py +++ b/var/spack/repos/builtin/packages/py-argparse/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ase/package.py b/var/spack/repos/builtin/packages/py-ase/package.py index 46175e8a72..22a0f2b1e6 100644 --- a/var/spack/repos/builtin/packages/py-ase/package.py +++ b/var/spack/repos/builtin/packages/py-ase/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-asn1crypto/package.py b/var/spack/repos/builtin/packages/py-asn1crypto/package.py index 9e72f29c36..30f3c1e997 100644 --- a/var/spack/repos/builtin/packages/py-asn1crypto/package.py +++ b/var/spack/repos/builtin/packages/py-asn1crypto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-astroid/package.py b/var/spack/repos/builtin/packages/py-astroid/package.py index 9ccbff6177..f212987531 100644 --- a/var/spack/repos/builtin/packages/py-astroid/package.py +++ b/var/spack/repos/builtin/packages/py-astroid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-astropy/package.py b/var/spack/repos/builtin/packages/py-astropy/package.py index d1d6fcc0e8..2464960d1f 100644 --- a/var/spack/repos/builtin/packages/py-astropy/package.py +++ b/var/spack/repos/builtin/packages/py-astropy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-attrs/package.py b/var/spack/repos/builtin/packages/py-attrs/package.py index bc9a557a52..bbd55941ab 100644 --- a/var/spack/repos/builtin/packages/py-attrs/package.py +++ b/var/spack/repos/builtin/packages/py-attrs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-autopep8/package.py b/var/spack/repos/builtin/packages/py-autopep8/package.py index 7db3658c02..6f0a16f7c8 100644 --- a/var/spack/repos/builtin/packages/py-autopep8/package.py +++ b/var/spack/repos/builtin/packages/py-autopep8/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-babel/package.py b/var/spack/repos/builtin/packages/py-babel/package.py index 4b9f6c7462..fb9b64974b 100644 --- a/var/spack/repos/builtin/packages/py-babel/package.py +++ b/var/spack/repos/builtin/packages/py-babel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-backports-abc/package.py b/var/spack/repos/builtin/packages/py-backports-abc/package.py index 6bdfd99eff..046984c103 100644 --- a/var/spack/repos/builtin/packages/py-backports-abc/package.py +++ b/var/spack/repos/builtin/packages/py-backports-abc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py b/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py index 5abe2d58cf..bce85888f8 100644 --- a/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py +++ b/var/spack/repos/builtin/packages/py-backports-shutil-get-terminal-size/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py b/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py index 994729081f..feebab7567 100644 --- a/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py +++ b/var/spack/repos/builtin/packages/py-backports-ssl-match-hostname/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-basemap/package.py b/var/spack/repos/builtin/packages/py-basemap/package.py index fd1d0c6092..bd63517cd2 100644 --- a/var/spack/repos/builtin/packages/py-basemap/package.py +++ b/var/spack/repos/builtin/packages/py-basemap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py b/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py index 740c753093..7d96259817 100644 --- a/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py +++ b/var/spack/repos/builtin/packages/py-beautifulsoup4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-binwalk/package.py b/var/spack/repos/builtin/packages/py-binwalk/package.py index a27c3462c0..f4d48d49a3 100644 --- a/var/spack/repos/builtin/packages/py-binwalk/package.py +++ b/var/spack/repos/builtin/packages/py-binwalk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-biom-format/package.py b/var/spack/repos/builtin/packages/py-biom-format/package.py index 2d61507bd0..b75277d56c 100644 --- a/var/spack/repos/builtin/packages/py-biom-format/package.py +++ b/var/spack/repos/builtin/packages/py-biom-format/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-biopython/package.py b/var/spack/repos/builtin/packages/py-biopython/package.py index 1c8c613002..dba722830b 100644 --- a/var/spack/repos/builtin/packages/py-biopython/package.py +++ b/var/spack/repos/builtin/packages/py-biopython/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-bleach/package.py b/var/spack/repos/builtin/packages/py-bleach/package.py index b469a12b60..29383e0c04 100644 --- a/var/spack/repos/builtin/packages/py-bleach/package.py +++ b/var/spack/repos/builtin/packages/py-bleach/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-blessings/package.py b/var/spack/repos/builtin/packages/py-blessings/package.py index d4d509f205..987a0b6bc4 100644 --- a/var/spack/repos/builtin/packages/py-blessings/package.py +++ b/var/spack/repos/builtin/packages/py-blessings/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-bokeh/package.py b/var/spack/repos/builtin/packages/py-bokeh/package.py index 04f0b84422..6477693200 100644 --- a/var/spack/repos/builtin/packages/py-bokeh/package.py +++ b/var/spack/repos/builtin/packages/py-bokeh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-boltons/package.py b/var/spack/repos/builtin/packages/py-boltons/package.py index e5e371db39..8f5188df82 100644 --- a/var/spack/repos/builtin/packages/py-boltons/package.py +++ b/var/spack/repos/builtin/packages/py-boltons/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-bottleneck/package.py b/var/spack/repos/builtin/packages/py-bottleneck/package.py index d8958e1208..ebfa15ee80 100644 --- a/var/spack/repos/builtin/packages/py-bottleneck/package.py +++ b/var/spack/repos/builtin/packages/py-bottleneck/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-brian/package.py b/var/spack/repos/builtin/packages/py-brian/package.py index aff3c4da1f..6c5292cd68 100644 --- a/var/spack/repos/builtin/packages/py-brian/package.py +++ b/var/spack/repos/builtin/packages/py-brian/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-brian2/package.py b/var/spack/repos/builtin/packages/py-brian2/package.py index 35b5bb59b9..95d33dd76f 100644 --- a/var/spack/repos/builtin/packages/py-brian2/package.py +++ b/var/spack/repos/builtin/packages/py-brian2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cclib/package.py b/var/spack/repos/builtin/packages/py-cclib/package.py index fd1decfed8..4334a02001 100644 --- a/var/spack/repos/builtin/packages/py-cclib/package.py +++ b/var/spack/repos/builtin/packages/py-cclib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cdat-lite/package.py b/var/spack/repos/builtin/packages/py-cdat-lite/package.py index 257abc33f8..16c6a772d7 100644 --- a/var/spack/repos/builtin/packages/py-cdat-lite/package.py +++ b/var/spack/repos/builtin/packages/py-cdat-lite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cdo/package.py b/var/spack/repos/builtin/packages/py-cdo/package.py index a843d06722..7a13784160 100644 --- a/var/spack/repos/builtin/packages/py-cdo/package.py +++ b/var/spack/repos/builtin/packages/py-cdo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-certifi/package.py b/var/spack/repos/builtin/packages/py-certifi/package.py index ec2db8cf62..0232cc01e1 100644 --- a/var/spack/repos/builtin/packages/py-certifi/package.py +++ b/var/spack/repos/builtin/packages/py-certifi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cffi/package.py b/var/spack/repos/builtin/packages/py-cffi/package.py index ca37b77446..1df28a37eb 100644 --- a/var/spack/repos/builtin/packages/py-cffi/package.py +++ b/var/spack/repos/builtin/packages/py-cffi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-chardet/package.py b/var/spack/repos/builtin/packages/py-chardet/package.py index 3276ed42bb..afe2afb23a 100644 --- a/var/spack/repos/builtin/packages/py-chardet/package.py +++ b/var/spack/repos/builtin/packages/py-chardet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-click/package.py b/var/spack/repos/builtin/packages/py-click/package.py index 2fabfb9fcf..7ed7c584c4 100644 --- a/var/spack/repos/builtin/packages/py-click/package.py +++ b/var/spack/repos/builtin/packages/py-click/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-colorama/package.py b/var/spack/repos/builtin/packages/py-colorama/package.py index f8ebfd70b2..2392b9fa03 100644 --- a/var/spack/repos/builtin/packages/py-colorama/package.py +++ b/var/spack/repos/builtin/packages/py-colorama/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-colormath/package.py b/var/spack/repos/builtin/packages/py-colormath/package.py index 578673a709..3b85dab2c4 100644 --- a/var/spack/repos/builtin/packages/py-colormath/package.py +++ b/var/spack/repos/builtin/packages/py-colormath/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-configparser/package.py b/var/spack/repos/builtin/packages/py-configparser/package.py index f728d41e74..eb6230ce71 100644 --- a/var/spack/repos/builtin/packages/py-configparser/package.py +++ b/var/spack/repos/builtin/packages/py-configparser/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-counter/package.py b/var/spack/repos/builtin/packages/py-counter/package.py index c36007800d..c368b452fb 100644 --- a/var/spack/repos/builtin/packages/py-counter/package.py +++ b/var/spack/repos/builtin/packages/py-counter/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-coverage/package.py b/var/spack/repos/builtin/packages/py-coverage/package.py index 596ae268c9..fe42e3762c 100644 --- a/var/spack/repos/builtin/packages/py-coverage/package.py +++ b/var/spack/repos/builtin/packages/py-coverage/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cpuinfo/package.py b/var/spack/repos/builtin/packages/py-cpuinfo/package.py index fddd648b47..4df3df31e8 100644 --- a/var/spack/repos/builtin/packages/py-cpuinfo/package.py +++ b/var/spack/repos/builtin/packages/py-cpuinfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cryptography/package.py b/var/spack/repos/builtin/packages/py-cryptography/package.py index 4a0d5a30fc..c3aec4b95c 100644 --- a/var/spack/repos/builtin/packages/py-cryptography/package.py +++ b/var/spack/repos/builtin/packages/py-cryptography/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-csvkit/package.py b/var/spack/repos/builtin/packages/py-csvkit/package.py index 4a41241d80..c0e42d514c 100644 --- a/var/spack/repos/builtin/packages/py-csvkit/package.py +++ b/var/spack/repos/builtin/packages/py-csvkit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-current/package.py b/var/spack/repos/builtin/packages/py-current/package.py index d710a31a7c..1c45962b32 100644 --- a/var/spack/repos/builtin/packages/py-current/package.py +++ b/var/spack/repos/builtin/packages/py-current/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cutadapt/package.py b/var/spack/repos/builtin/packages/py-cutadapt/package.py index f81f6d62c1..3a2afcae13 100644 --- a/var/spack/repos/builtin/packages/py-cutadapt/package.py +++ b/var/spack/repos/builtin/packages/py-cutadapt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cycler/package.py b/var/spack/repos/builtin/packages/py-cycler/package.py index ee18fc1214..99115aaacc 100644 --- a/var/spack/repos/builtin/packages/py-cycler/package.py +++ b/var/spack/repos/builtin/packages/py-cycler/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-cython/package.py b/var/spack/repos/builtin/packages/py-cython/package.py index f372e90e19..09d1b5d7ef 100644 --- a/var/spack/repos/builtin/packages/py-cython/package.py +++ b/var/spack/repos/builtin/packages/py-cython/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dask/package.py b/var/spack/repos/builtin/packages/py-dask/package.py index 0b27ab80a5..1961c4ef2d 100644 --- a/var/spack/repos/builtin/packages/py-dask/package.py +++ b/var/spack/repos/builtin/packages/py-dask/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dateutil/package.py b/var/spack/repos/builtin/packages/py-dateutil/package.py index deeb3197f5..91ed5129c6 100644 --- a/var/spack/repos/builtin/packages/py-dateutil/package.py +++ b/var/spack/repos/builtin/packages/py-dateutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dbf/package.py b/var/spack/repos/builtin/packages/py-dbf/package.py index c6b7ddfa99..ff3dc73e07 100644 --- a/var/spack/repos/builtin/packages/py-dbf/package.py +++ b/var/spack/repos/builtin/packages/py-dbf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-decorator/package.py b/var/spack/repos/builtin/packages/py-decorator/package.py index 854fe55e52..48fc21b402 100644 --- a/var/spack/repos/builtin/packages/py-decorator/package.py +++ b/var/spack/repos/builtin/packages/py-decorator/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-deeptools/package.py b/var/spack/repos/builtin/packages/py-deeptools/package.py index e4e1ec2583..a39a820fd3 100644 --- a/var/spack/repos/builtin/packages/py-deeptools/package.py +++ b/var/spack/repos/builtin/packages/py-deeptools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dev/package.py b/var/spack/repos/builtin/packages/py-dev/package.py index 6ebcb211de..0c0ce4f714 100644 --- a/var/spack/repos/builtin/packages/py-dev/package.py +++ b/var/spack/repos/builtin/packages/py-dev/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dill/package.py b/var/spack/repos/builtin/packages/py-dill/package.py index d574f9df19..06942c3f25 100644 --- a/var/spack/repos/builtin/packages/py-dill/package.py +++ b/var/spack/repos/builtin/packages/py-dill/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-docutils/package.py b/var/spack/repos/builtin/packages/py-docutils/package.py index c05100b324..d24e2d3499 100644 --- a/var/spack/repos/builtin/packages/py-docutils/package.py +++ b/var/spack/repos/builtin/packages/py-docutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-doxypy/package.py b/var/spack/repos/builtin/packages/py-doxypy/package.py index 91f4224916..171617d669 100644 --- a/var/spack/repos/builtin/packages/py-doxypy/package.py +++ b/var/spack/repos/builtin/packages/py-doxypy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-doxypypy/package.py b/var/spack/repos/builtin/packages/py-doxypypy/package.py index cdb8f07f86..01cb324a7c 100644 --- a/var/spack/repos/builtin/packages/py-doxypypy/package.py +++ b/var/spack/repos/builtin/packages/py-doxypypy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dryscrape/package.py b/var/spack/repos/builtin/packages/py-dryscrape/package.py index 00fd1e7919..1878249b55 100644 --- a/var/spack/repos/builtin/packages/py-dryscrape/package.py +++ b/var/spack/repos/builtin/packages/py-dryscrape/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dxchange/package.py b/var/spack/repos/builtin/packages/py-dxchange/package.py index b273beb8b4..e5a0220685 100644 --- a/var/spack/repos/builtin/packages/py-dxchange/package.py +++ b/var/spack/repos/builtin/packages/py-dxchange/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-dxfile/package.py b/var/spack/repos/builtin/packages/py-dxfile/package.py index 43398b2e9c..4198303143 100644 --- a/var/spack/repos/builtin/packages/py-dxfile/package.py +++ b/var/spack/repos/builtin/packages/py-dxfile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-edffile/package.py b/var/spack/repos/builtin/packages/py-edffile/package.py index 28e8fa3746..ccdce936ad 100644 --- a/var/spack/repos/builtin/packages/py-edffile/package.py +++ b/var/spack/repos/builtin/packages/py-edffile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-elasticsearch/package.py b/var/spack/repos/builtin/packages/py-elasticsearch/package.py index 645c0bbe59..7232a5d0d8 100644 --- a/var/spack/repos/builtin/packages/py-elasticsearch/package.py +++ b/var/spack/repos/builtin/packages/py-elasticsearch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-elephant/package.py b/var/spack/repos/builtin/packages/py-elephant/package.py index 5a690e3b9f..6efa87dff1 100644 --- a/var/spack/repos/builtin/packages/py-elephant/package.py +++ b/var/spack/repos/builtin/packages/py-elephant/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-emcee/package.py b/var/spack/repos/builtin/packages/py-emcee/package.py index 4b8a24c673..dc0b681ace 100644 --- a/var/spack/repos/builtin/packages/py-emcee/package.py +++ b/var/spack/repos/builtin/packages/py-emcee/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-entrypoints/package.py b/var/spack/repos/builtin/packages/py-entrypoints/package.py index 1df5e8bdc1..d4fdebd70d 100644 --- a/var/spack/repos/builtin/packages/py-entrypoints/package.py +++ b/var/spack/repos/builtin/packages/py-entrypoints/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-enum34/package.py b/var/spack/repos/builtin/packages/py-enum34/package.py index 9f9e05bd7c..a6a1603b91 100644 --- a/var/spack/repos/builtin/packages/py-enum34/package.py +++ b/var/spack/repos/builtin/packages/py-enum34/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-epydoc/package.py b/var/spack/repos/builtin/packages/py-epydoc/package.py index c10ba2a635..067d0d9183 100644 --- a/var/spack/repos/builtin/packages/py-epydoc/package.py +++ b/var/spack/repos/builtin/packages/py-epydoc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-et-xmlfile/package.py b/var/spack/repos/builtin/packages/py-et-xmlfile/package.py index 565440158e..12dd98c711 100644 --- a/var/spack/repos/builtin/packages/py-et-xmlfile/package.py +++ b/var/spack/repos/builtin/packages/py-et-xmlfile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-execnet/package.py b/var/spack/repos/builtin/packages/py-execnet/package.py index dbfa15007e..e1341176dc 100644 --- a/var/spack/repos/builtin/packages/py-execnet/package.py +++ b/var/spack/repos/builtin/packages/py-execnet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-fastaindex/package.py b/var/spack/repos/builtin/packages/py-fastaindex/package.py index 6e98f4c5a4..663504c6b3 100644 --- a/var/spack/repos/builtin/packages/py-fastaindex/package.py +++ b/var/spack/repos/builtin/packages/py-fastaindex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-fasteners/package.py b/var/spack/repos/builtin/packages/py-fasteners/package.py index ae496b42dc..a2fb6e8544 100644 --- a/var/spack/repos/builtin/packages/py-fasteners/package.py +++ b/var/spack/repos/builtin/packages/py-fasteners/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-faststructure/package.py b/var/spack/repos/builtin/packages/py-faststructure/package.py index 5085c33af0..9b96424ba3 100644 --- a/var/spack/repos/builtin/packages/py-faststructure/package.py +++ b/var/spack/repos/builtin/packages/py-faststructure/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-fiscalyear/package.py b/var/spack/repos/builtin/packages/py-fiscalyear/package.py index 866067e1b3..f954791311 100644 --- a/var/spack/repos/builtin/packages/py-fiscalyear/package.py +++ b/var/spack/repos/builtin/packages/py-fiscalyear/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-flake8/package.py b/var/spack/repos/builtin/packages/py-flake8/package.py index eb99ab3a1d..adbdbd32a0 100644 --- a/var/spack/repos/builtin/packages/py-flake8/package.py +++ b/var/spack/repos/builtin/packages/py-flake8/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-flask/package.py b/var/spack/repos/builtin/packages/py-flask/package.py index b489ce131e..e0b8cec167 100644 --- a/var/spack/repos/builtin/packages/py-flask/package.py +++ b/var/spack/repos/builtin/packages/py-flask/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-flexx/package.py b/var/spack/repos/builtin/packages/py-flexx/package.py index 4310331199..e9bce25fed 100644 --- a/var/spack/repos/builtin/packages/py-flexx/package.py +++ b/var/spack/repos/builtin/packages/py-flexx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-funcsigs/package.py b/var/spack/repos/builtin/packages/py-funcsigs/package.py index d51e797ac2..9f87cbb990 100644 --- a/var/spack/repos/builtin/packages/py-funcsigs/package.py +++ b/var/spack/repos/builtin/packages/py-funcsigs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-functools32/package.py b/var/spack/repos/builtin/packages/py-functools32/package.py index 658aab5b4e..57c6180804 100644 --- a/var/spack/repos/builtin/packages/py-functools32/package.py +++ b/var/spack/repos/builtin/packages/py-functools32/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-future/package.py b/var/spack/repos/builtin/packages/py-future/package.py index 25c3e18649..25382ba5a7 100644 --- a/var/spack/repos/builtin/packages/py-future/package.py +++ b/var/spack/repos/builtin/packages/py-future/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-futures/package.py b/var/spack/repos/builtin/packages/py-futures/package.py index 7d78f3f875..9ac438f338 100644 --- a/var/spack/repos/builtin/packages/py-futures/package.py +++ b/var/spack/repos/builtin/packages/py-futures/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-genders/package.py b/var/spack/repos/builtin/packages/py-genders/package.py index 2acc438c6f..8db2c4e757 100644 --- a/var/spack/repos/builtin/packages/py-genders/package.py +++ b/var/spack/repos/builtin/packages/py-genders/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-genshi/package.py b/var/spack/repos/builtin/packages/py-genshi/package.py index 4d721ae74c..66b48be8b2 100644 --- a/var/spack/repos/builtin/packages/py-genshi/package.py +++ b/var/spack/repos/builtin/packages/py-genshi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-git-review/package.py b/var/spack/repos/builtin/packages/py-git-review/package.py index 8987b1c302..0711d98fcd 100644 --- a/var/spack/repos/builtin/packages/py-git-review/package.py +++ b/var/spack/repos/builtin/packages/py-git-review/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-git2/package.py b/var/spack/repos/builtin/packages/py-git2/package.py index d5b5bd28f0..228450217f 100644 --- a/var/spack/repos/builtin/packages/py-git2/package.py +++ b/var/spack/repos/builtin/packages/py-git2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-gnuplot/package.py b/var/spack/repos/builtin/packages/py-gnuplot/package.py index fe1c48fe88..ad412b98ed 100644 --- a/var/spack/repos/builtin/packages/py-gnuplot/package.py +++ b/var/spack/repos/builtin/packages/py-gnuplot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-griddataformats/package.py b/var/spack/repos/builtin/packages/py-griddataformats/package.py index 81ef3b9dda..c5a2afb8a8 100644 --- a/var/spack/repos/builtin/packages/py-griddataformats/package.py +++ b/var/spack/repos/builtin/packages/py-griddataformats/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-guidata/package.py b/var/spack/repos/builtin/packages/py-guidata/package.py index ad960bb5d0..4893aac5bf 100644 --- a/var/spack/repos/builtin/packages/py-guidata/package.py +++ b/var/spack/repos/builtin/packages/py-guidata/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-guiqwt/package.py b/var/spack/repos/builtin/packages/py-guiqwt/package.py index 585c5f4598..053e0b7a22 100644 --- a/var/spack/repos/builtin/packages/py-guiqwt/package.py +++ b/var/spack/repos/builtin/packages/py-guiqwt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-h5py/package.py b/var/spack/repos/builtin/packages/py-h5py/package.py index 5a5c02338c..ee2f3e78be 100644 --- a/var/spack/repos/builtin/packages/py-h5py/package.py +++ b/var/spack/repos/builtin/packages/py-h5py/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-html2text/package.py b/var/spack/repos/builtin/packages/py-html2text/package.py index 7ea6dc5921..bb0c654070 100644 --- a/var/spack/repos/builtin/packages/py-html2text/package.py +++ b/var/spack/repos/builtin/packages/py-html2text/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-html5lib/package.py b/var/spack/repos/builtin/packages/py-html5lib/package.py index e219450f83..4131341fcb 100644 --- a/var/spack/repos/builtin/packages/py-html5lib/package.py +++ b/var/spack/repos/builtin/packages/py-html5lib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-httpbin/package.py b/var/spack/repos/builtin/packages/py-httpbin/package.py index 0d426c5e2c..89aa288153 100644 --- a/var/spack/repos/builtin/packages/py-httpbin/package.py +++ b/var/spack/repos/builtin/packages/py-httpbin/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-hypothesis/package.py b/var/spack/repos/builtin/packages/py-hypothesis/package.py index d2bcfed2f2..548acd9836 100644 --- a/var/spack/repos/builtin/packages/py-hypothesis/package.py +++ b/var/spack/repos/builtin/packages/py-hypothesis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-idna/package.py b/var/spack/repos/builtin/packages/py-idna/package.py index aa8c230bf7..a5924f1788 100644 --- a/var/spack/repos/builtin/packages/py-idna/package.py +++ b/var/spack/repos/builtin/packages/py-idna/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-igraph/package.py b/var/spack/repos/builtin/packages/py-igraph/package.py index 7d9c408678..94ab3a747a 100644 --- a/var/spack/repos/builtin/packages/py-igraph/package.py +++ b/var/spack/repos/builtin/packages/py-igraph/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-imagesize/package.py b/var/spack/repos/builtin/packages/py-imagesize/package.py index 3c8de20db0..1b6d6fc500 100644 --- a/var/spack/repos/builtin/packages/py-imagesize/package.py +++ b/var/spack/repos/builtin/packages/py-imagesize/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-iminuit/package.py b/var/spack/repos/builtin/packages/py-iminuit/package.py index 23961d3144..da7d7db11c 100644 --- a/var/spack/repos/builtin/packages/py-iminuit/package.py +++ b/var/spack/repos/builtin/packages/py-iminuit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-importlib/package.py b/var/spack/repos/builtin/packages/py-importlib/package.py index 3375cc9853..3f155245dd 100644 --- a/var/spack/repos/builtin/packages/py-importlib/package.py +++ b/var/spack/repos/builtin/packages/py-importlib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ipaddress/package.py b/var/spack/repos/builtin/packages/py-ipaddress/package.py index d7a7e69e7f..f8f45e6a54 100644 --- a/var/spack/repos/builtin/packages/py-ipaddress/package.py +++ b/var/spack/repos/builtin/packages/py-ipaddress/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ipdb/package.py b/var/spack/repos/builtin/packages/py-ipdb/package.py index 8c6598d109..289836f8b9 100644 --- a/var/spack/repos/builtin/packages/py-ipdb/package.py +++ b/var/spack/repos/builtin/packages/py-ipdb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ipykernel/package.py b/var/spack/repos/builtin/packages/py-ipykernel/package.py index 943db24cee..c86dd3068f 100644 --- a/var/spack/repos/builtin/packages/py-ipykernel/package.py +++ b/var/spack/repos/builtin/packages/py-ipykernel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ipython-genutils/package.py b/var/spack/repos/builtin/packages/py-ipython-genutils/package.py index d72d2ff515..7ae4d5dd89 100644 --- a/var/spack/repos/builtin/packages/py-ipython-genutils/package.py +++ b/var/spack/repos/builtin/packages/py-ipython-genutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ipython/package.py b/var/spack/repos/builtin/packages/py-ipython/package.py index 16da6027e4..a29a642a11 100644 --- a/var/spack/repos/builtin/packages/py-ipython/package.py +++ b/var/spack/repos/builtin/packages/py-ipython/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ipywidgets/package.py b/var/spack/repos/builtin/packages/py-ipywidgets/package.py index 496477ba8a..0d41c0393c 100644 --- a/var/spack/repos/builtin/packages/py-ipywidgets/package.py +++ b/var/spack/repos/builtin/packages/py-ipywidgets/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-itsdangerous/package.py b/var/spack/repos/builtin/packages/py-itsdangerous/package.py index a693c341ae..84978fdc7f 100644 --- a/var/spack/repos/builtin/packages/py-itsdangerous/package.py +++ b/var/spack/repos/builtin/packages/py-itsdangerous/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jdcal/package.py b/var/spack/repos/builtin/packages/py-jdcal/package.py index b4e08ca77f..40e9949738 100644 --- a/var/spack/repos/builtin/packages/py-jdcal/package.py +++ b/var/spack/repos/builtin/packages/py-jdcal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jedi/package.py b/var/spack/repos/builtin/packages/py-jedi/package.py index c90c77ee68..6cb723c627 100644 --- a/var/spack/repos/builtin/packages/py-jedi/package.py +++ b/var/spack/repos/builtin/packages/py-jedi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jinja2/package.py b/var/spack/repos/builtin/packages/py-jinja2/package.py index 31180594de..1b24f36b73 100644 --- a/var/spack/repos/builtin/packages/py-jinja2/package.py +++ b/var/spack/repos/builtin/packages/py-jinja2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-joblib/package.py b/var/spack/repos/builtin/packages/py-joblib/package.py index 50e10663a7..e1097daf79 100644 --- a/var/spack/repos/builtin/packages/py-joblib/package.py +++ b/var/spack/repos/builtin/packages/py-joblib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jpype/package.py b/var/spack/repos/builtin/packages/py-jpype/package.py index b9117f7536..e2c197f241 100644 --- a/var/spack/repos/builtin/packages/py-jpype/package.py +++ b/var/spack/repos/builtin/packages/py-jpype/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jsonschema/package.py b/var/spack/repos/builtin/packages/py-jsonschema/package.py index 2a72c9492a..c072d1fe32 100644 --- a/var/spack/repos/builtin/packages/py-jsonschema/package.py +++ b/var/spack/repos/builtin/packages/py-jsonschema/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-junit-xml/package.py b/var/spack/repos/builtin/packages/py-junit-xml/package.py index 3c21b5056b..eca2b7d981 100644 --- a/var/spack/repos/builtin/packages/py-junit-xml/package.py +++ b/var/spack/repos/builtin/packages/py-junit-xml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jupyter-client/package.py b/var/spack/repos/builtin/packages/py-jupyter-client/package.py index 8fc9a12445..379e8285c8 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-client/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-client/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jupyter-console/package.py b/var/spack/repos/builtin/packages/py-jupyter-console/package.py index bd039a765c..47eb8fc81f 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-console/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-console/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jupyter-core/package.py b/var/spack/repos/builtin/packages/py-jupyter-core/package.py index 547133a345..9378d7acac 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-core/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-core/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py b/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py index 2f0f9e977d..5d09f71011 100644 --- a/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py +++ b/var/spack/repos/builtin/packages/py-jupyter-notebook/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-keras/package.py b/var/spack/repos/builtin/packages/py-keras/package.py index 9c1e639667..d227cc10c3 100644 --- a/var/spack/repos/builtin/packages/py-keras/package.py +++ b/var/spack/repos/builtin/packages/py-keras/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-latexcodec/package.py b/var/spack/repos/builtin/packages/py-latexcodec/package.py index 2f9ef63220..54a25a252a 100644 --- a/var/spack/repos/builtin/packages/py-latexcodec/package.py +++ b/var/spack/repos/builtin/packages/py-latexcodec/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lazy/package.py b/var/spack/repos/builtin/packages/py-lazy/package.py index e1946dc9c8..24bbf6be18 100644 --- a/var/spack/repos/builtin/packages/py-lazy/package.py +++ b/var/spack/repos/builtin/packages/py-lazy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lazyarray/package.py b/var/spack/repos/builtin/packages/py-lazyarray/package.py index 7ab655a20e..0ce3d22782 100644 --- a/var/spack/repos/builtin/packages/py-lazyarray/package.py +++ b/var/spack/repos/builtin/packages/py-lazyarray/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-libconf/package.py b/var/spack/repos/builtin/packages/py-libconf/package.py index f5beae266b..4ba43de000 100644 --- a/var/spack/repos/builtin/packages/py-libconf/package.py +++ b/var/spack/repos/builtin/packages/py-libconf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lit/package.py b/var/spack/repos/builtin/packages/py-lit/package.py index 6d9dbf4830..0037769e1c 100644 --- a/var/spack/repos/builtin/packages/py-lit/package.py +++ b/var/spack/repos/builtin/packages/py-lit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lmfit/package.py b/var/spack/repos/builtin/packages/py-lmfit/package.py index 7d07a8e039..80dd98fc92 100644 --- a/var/spack/repos/builtin/packages/py-lmfit/package.py +++ b/var/spack/repos/builtin/packages/py-lmfit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lockfile/package.py b/var/spack/repos/builtin/packages/py-lockfile/package.py index a9963c340f..ecc5ff806a 100644 --- a/var/spack/repos/builtin/packages/py-lockfile/package.py +++ b/var/spack/repos/builtin/packages/py-lockfile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-logilab-common/package.py b/var/spack/repos/builtin/packages/py-logilab-common/package.py index 925c24a66b..959b930178 100644 --- a/var/spack/repos/builtin/packages/py-logilab-common/package.py +++ b/var/spack/repos/builtin/packages/py-logilab-common/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lxml/package.py b/var/spack/repos/builtin/packages/py-lxml/package.py index 9299d5c877..66b668e8bb 100644 --- a/var/spack/repos/builtin/packages/py-lxml/package.py +++ b/var/spack/repos/builtin/packages/py-lxml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-lzstring/package.py b/var/spack/repos/builtin/packages/py-lzstring/package.py index 75f0f606df..99f06ddc0a 100644 --- a/var/spack/repos/builtin/packages/py-lzstring/package.py +++ b/var/spack/repos/builtin/packages/py-lzstring/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-macholib/package.py b/var/spack/repos/builtin/packages/py-macholib/package.py index 80d9ee4a53..640a1c49bc 100644 --- a/var/spack/repos/builtin/packages/py-macholib/package.py +++ b/var/spack/repos/builtin/packages/py-macholib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-machotools/package.py b/var/spack/repos/builtin/packages/py-machotools/package.py index ec0e1f364c..f3c4690a9c 100644 --- a/var/spack/repos/builtin/packages/py-machotools/package.py +++ b/var/spack/repos/builtin/packages/py-machotools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-macs2/package.py b/var/spack/repos/builtin/packages/py-macs2/package.py index 8f6b4cb27a..1bf5f4983c 100644 --- a/var/spack/repos/builtin/packages/py-macs2/package.py +++ b/var/spack/repos/builtin/packages/py-macs2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mako/package.py b/var/spack/repos/builtin/packages/py-mako/package.py index 481c36818b..4a94e2ca1e 100644 --- a/var/spack/repos/builtin/packages/py-mako/package.py +++ b/var/spack/repos/builtin/packages/py-mako/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-markdown/package.py b/var/spack/repos/builtin/packages/py-markdown/package.py index 71831ccb99..b6692ff7a0 100644 --- a/var/spack/repos/builtin/packages/py-markdown/package.py +++ b/var/spack/repos/builtin/packages/py-markdown/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-markupsafe/package.py b/var/spack/repos/builtin/packages/py-markupsafe/package.py index 95c6a115c3..3e0a6ae83c 100644 --- a/var/spack/repos/builtin/packages/py-markupsafe/package.py +++ b/var/spack/repos/builtin/packages/py-markupsafe/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-matplotlib/package.py b/var/spack/repos/builtin/packages/py-matplotlib/package.py index ec5e33b45f..2359bb5f27 100644 --- a/var/spack/repos/builtin/packages/py-matplotlib/package.py +++ b/var/spack/repos/builtin/packages/py-matplotlib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mccabe/package.py b/var/spack/repos/builtin/packages/py-mccabe/package.py index 87a9027881..54b52c6bdd 100644 --- a/var/spack/repos/builtin/packages/py-mccabe/package.py +++ b/var/spack/repos/builtin/packages/py-mccabe/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mdanalysis/package.py b/var/spack/repos/builtin/packages/py-mdanalysis/package.py index 6d6f945500..541ce43fcd 100644 --- a/var/spack/repos/builtin/packages/py-mdanalysis/package.py +++ b/var/spack/repos/builtin/packages/py-mdanalysis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-meep/package.py b/var/spack/repos/builtin/packages/py-meep/package.py index ef50cf3f3a..e510f6565e 100644 --- a/var/spack/repos/builtin/packages/py-meep/package.py +++ b/var/spack/repos/builtin/packages/py-meep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-misopy/package.py b/var/spack/repos/builtin/packages/py-misopy/package.py index 3bfba1cc30..56407d792f 100644 --- a/var/spack/repos/builtin/packages/py-misopy/package.py +++ b/var/spack/repos/builtin/packages/py-misopy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mistune/package.py b/var/spack/repos/builtin/packages/py-mistune/package.py index a10f0b5024..096b72fcf6 100644 --- a/var/spack/repos/builtin/packages/py-mistune/package.py +++ b/var/spack/repos/builtin/packages/py-mistune/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mock/package.py b/var/spack/repos/builtin/packages/py-mock/package.py index abb8abc125..0aa8a31c1e 100644 --- a/var/spack/repos/builtin/packages/py-mock/package.py +++ b/var/spack/repos/builtin/packages/py-mock/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mongo/package.py b/var/spack/repos/builtin/packages/py-mongo/package.py index 90fec7bc61..21c0b8efba 100644 --- a/var/spack/repos/builtin/packages/py-mongo/package.py +++ b/var/spack/repos/builtin/packages/py-mongo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-monotonic/package.py b/var/spack/repos/builtin/packages/py-monotonic/package.py index 3567c70db1..2872ec9bdd 100644 --- a/var/spack/repos/builtin/packages/py-monotonic/package.py +++ b/var/spack/repos/builtin/packages/py-monotonic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-monty/package.py b/var/spack/repos/builtin/packages/py-monty/package.py index 4993724450..e6968b4d96 100644 --- a/var/spack/repos/builtin/packages/py-monty/package.py +++ b/var/spack/repos/builtin/packages/py-monty/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py index 0d57375787..dd1efed212 100644 --- a/var/spack/repos/builtin/packages/py-mpi4py/package.py +++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mpmath/package.py b/var/spack/repos/builtin/packages/py-mpmath/package.py index aa00488016..17699d6663 100644 --- a/var/spack/repos/builtin/packages/py-mpmath/package.py +++ b/var/spack/repos/builtin/packages/py-mpmath/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-multiprocess/package.py b/var/spack/repos/builtin/packages/py-multiprocess/package.py index 8e64a2a929..0e1a046074 100644 --- a/var/spack/repos/builtin/packages/py-multiprocess/package.py +++ b/var/spack/repos/builtin/packages/py-multiprocess/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-multiqc/package.py b/var/spack/repos/builtin/packages/py-multiqc/package.py index c0eb702974..5311582782 100644 --- a/var/spack/repos/builtin/packages/py-multiqc/package.py +++ b/var/spack/repos/builtin/packages/py-multiqc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mx/package.py b/var/spack/repos/builtin/packages/py-mx/package.py index 98b5d316cd..9ef717a247 100644 --- a/var/spack/repos/builtin/packages/py-mx/package.py +++ b/var/spack/repos/builtin/packages/py-mx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-myhdl/package.py b/var/spack/repos/builtin/packages/py-myhdl/package.py index ee8f8377d6..299badf247 100644 --- a/var/spack/repos/builtin/packages/py-myhdl/package.py +++ b/var/spack/repos/builtin/packages/py-myhdl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-mysqldb1/package.py b/var/spack/repos/builtin/packages/py-mysqldb1/package.py index b24ace3f79..2970045a1e 100644 --- a/var/spack/repos/builtin/packages/py-mysqldb1/package.py +++ b/var/spack/repos/builtin/packages/py-mysqldb1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-nbconvert/package.py b/var/spack/repos/builtin/packages/py-nbconvert/package.py index 4b46ae664f..cf2290a35f 100644 --- a/var/spack/repos/builtin/packages/py-nbconvert/package.py +++ b/var/spack/repos/builtin/packages/py-nbconvert/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-nbformat/package.py b/var/spack/repos/builtin/packages/py-nbformat/package.py index d6006a1db4..14d4316a29 100644 --- a/var/spack/repos/builtin/packages/py-nbformat/package.py +++ b/var/spack/repos/builtin/packages/py-nbformat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-neo/package.py b/var/spack/repos/builtin/packages/py-neo/package.py index a4b9c8eb83..16426f5279 100644 --- a/var/spack/repos/builtin/packages/py-neo/package.py +++ b/var/spack/repos/builtin/packages/py-neo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-nestle/package.py b/var/spack/repos/builtin/packages/py-nestle/package.py index f3c5a88897..106e56c1d9 100644 --- a/var/spack/repos/builtin/packages/py-nestle/package.py +++ b/var/spack/repos/builtin/packages/py-nestle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-netcdf4/package.py b/var/spack/repos/builtin/packages/py-netcdf4/package.py index a27ea51580..71ee17abb4 100644 --- a/var/spack/repos/builtin/packages/py-netcdf4/package.py +++ b/var/spack/repos/builtin/packages/py-netcdf4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-netifaces/package.py b/var/spack/repos/builtin/packages/py-netifaces/package.py index 6a069ae11e..d0adb75508 100644 --- a/var/spack/repos/builtin/packages/py-netifaces/package.py +++ b/var/spack/repos/builtin/packages/py-netifaces/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-networkx/package.py b/var/spack/repos/builtin/packages/py-networkx/package.py index 1d8dfa6b53..10f47623bc 100644 --- a/var/spack/repos/builtin/packages/py-networkx/package.py +++ b/var/spack/repos/builtin/packages/py-networkx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-nose/package.py b/var/spack/repos/builtin/packages/py-nose/package.py index 6876620e24..6db4d74954 100644 --- a/var/spack/repos/builtin/packages/py-nose/package.py +++ b/var/spack/repos/builtin/packages/py-nose/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-nosexcover/package.py b/var/spack/repos/builtin/packages/py-nosexcover/package.py index 5ec76bc194..71191fccab 100644 --- a/var/spack/repos/builtin/packages/py-nosexcover/package.py +++ b/var/spack/repos/builtin/packages/py-nosexcover/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-numexpr/package.py b/var/spack/repos/builtin/packages/py-numexpr/package.py index 58090ae674..b888a219b5 100644 --- a/var/spack/repos/builtin/packages/py-numexpr/package.py +++ b/var/spack/repos/builtin/packages/py-numexpr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index 76ccb1a4a9..6213683097 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-numpydoc/package.py b/var/spack/repos/builtin/packages/py-numpydoc/package.py index 2052ecad24..b219805bd9 100644 --- a/var/spack/repos/builtin/packages/py-numpydoc/package.py +++ b/var/spack/repos/builtin/packages/py-numpydoc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-olefile/package.py b/var/spack/repos/builtin/packages/py-olefile/package.py index fd778862b8..7abc42eb39 100644 --- a/var/spack/repos/builtin/packages/py-olefile/package.py +++ b/var/spack/repos/builtin/packages/py-olefile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py b/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py index 18ef2f59b7..ebec553c00 100644 --- a/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py +++ b/var/spack/repos/builtin/packages/py-ont-fast5-api/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-openpyxl/package.py b/var/spack/repos/builtin/packages/py-openpyxl/package.py index 6ccb5f211d..278e41d57e 100644 --- a/var/spack/repos/builtin/packages/py-openpyxl/package.py +++ b/var/spack/repos/builtin/packages/py-openpyxl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ordereddict/package.py b/var/spack/repos/builtin/packages/py-ordereddict/package.py index 586cfa425b..2c82f9b81c 100644 --- a/var/spack/repos/builtin/packages/py-ordereddict/package.py +++ b/var/spack/repos/builtin/packages/py-ordereddict/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-oset/package.py b/var/spack/repos/builtin/packages/py-oset/package.py index 50428fdd0e..3d0538ea35 100644 --- a/var/spack/repos/builtin/packages/py-oset/package.py +++ b/var/spack/repos/builtin/packages/py-oset/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-packaging/package.py b/var/spack/repos/builtin/packages/py-packaging/package.py index ec165f72b9..e16d341e39 100644 --- a/var/spack/repos/builtin/packages/py-packaging/package.py +++ b/var/spack/repos/builtin/packages/py-packaging/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-palettable/package.py b/var/spack/repos/builtin/packages/py-palettable/package.py index 7fa6358d18..2c802c5081 100644 --- a/var/spack/repos/builtin/packages/py-palettable/package.py +++ b/var/spack/repos/builtin/packages/py-palettable/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pandas/package.py b/var/spack/repos/builtin/packages/py-pandas/package.py index e8283c90eb..6caef3780b 100644 --- a/var/spack/repos/builtin/packages/py-pandas/package.py +++ b/var/spack/repos/builtin/packages/py-pandas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-paramiko/package.py b/var/spack/repos/builtin/packages/py-paramiko/package.py index 033145c0e0..ce48548511 100644 --- a/var/spack/repos/builtin/packages/py-paramiko/package.py +++ b/var/spack/repos/builtin/packages/py-paramiko/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pathlib2/package.py b/var/spack/repos/builtin/packages/py-pathlib2/package.py index 6fdb105c1c..5f14b55af4 100644 --- a/var/spack/repos/builtin/packages/py-pathlib2/package.py +++ b/var/spack/repos/builtin/packages/py-pathlib2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pathos/package.py b/var/spack/repos/builtin/packages/py-pathos/package.py index e48b20929c..3991b91cec 100644 --- a/var/spack/repos/builtin/packages/py-pathos/package.py +++ b/var/spack/repos/builtin/packages/py-pathos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pathspec/package.py b/var/spack/repos/builtin/packages/py-pathspec/package.py index f939865367..8869aa0681 100644 --- a/var/spack/repos/builtin/packages/py-pathspec/package.py +++ b/var/spack/repos/builtin/packages/py-pathspec/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-patsy/package.py b/var/spack/repos/builtin/packages/py-patsy/package.py index 4ebfe697f0..bcca79ba27 100644 --- a/var/spack/repos/builtin/packages/py-patsy/package.py +++ b/var/spack/repos/builtin/packages/py-patsy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pbr/package.py b/var/spack/repos/builtin/packages/py-pbr/package.py index e8dcae1353..353754aab5 100644 --- a/var/spack/repos/builtin/packages/py-pbr/package.py +++ b/var/spack/repos/builtin/packages/py-pbr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-periodictable/package.py b/var/spack/repos/builtin/packages/py-periodictable/package.py index e7e67de871..6ae48e7f32 100644 --- a/var/spack/repos/builtin/packages/py-periodictable/package.py +++ b/var/spack/repos/builtin/packages/py-periodictable/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-petsc4py/package.py b/var/spack/repos/builtin/packages/py-petsc4py/package.py index 8e2d56755d..3a66040db9 100644 --- a/var/spack/repos/builtin/packages/py-petsc4py/package.py +++ b/var/spack/repos/builtin/packages/py-petsc4py/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pexpect/package.py b/var/spack/repos/builtin/packages/py-pexpect/package.py index 6ce99cc7d0..f0bd329a80 100644 --- a/var/spack/repos/builtin/packages/py-pexpect/package.py +++ b/var/spack/repos/builtin/packages/py-pexpect/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-phonopy/package.py b/var/spack/repos/builtin/packages/py-phonopy/package.py index 852f6bd0b4..70cfb70d20 100644 --- a/var/spack/repos/builtin/packages/py-phonopy/package.py +++ b/var/spack/repos/builtin/packages/py-phonopy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pickleshare/package.py b/var/spack/repos/builtin/packages/py-pickleshare/package.py index dde89ce6f8..52424c8f31 100644 --- a/var/spack/repos/builtin/packages/py-pickleshare/package.py +++ b/var/spack/repos/builtin/packages/py-pickleshare/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pil/package.py b/var/spack/repos/builtin/packages/py-pil/package.py index ce65d1ef77..4af94527cc 100644 --- a/var/spack/repos/builtin/packages/py-pil/package.py +++ b/var/spack/repos/builtin/packages/py-pil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pillow/package.py b/var/spack/repos/builtin/packages/py-pillow/package.py index ba6e7b9c67..9f9327d397 100644 --- a/var/spack/repos/builtin/packages/py-pillow/package.py +++ b/var/spack/repos/builtin/packages/py-pillow/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pip/package.py b/var/spack/repos/builtin/packages/py-pip/package.py index 6cfeae8288..9cbf789b2b 100644 --- a/var/spack/repos/builtin/packages/py-pip/package.py +++ b/var/spack/repos/builtin/packages/py-pip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pipits/package.py b/var/spack/repos/builtin/packages/py-pipits/package.py index 88a629cc2e..464627dc68 100644 --- a/var/spack/repos/builtin/packages/py-pipits/package.py +++ b/var/spack/repos/builtin/packages/py-pipits/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pkgconfig/package.py b/var/spack/repos/builtin/packages/py-pkgconfig/package.py index 5d6af2b8e1..9c9f0dcdb0 100644 --- a/var/spack/repos/builtin/packages/py-pkgconfig/package.py +++ b/var/spack/repos/builtin/packages/py-pkgconfig/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ply/package.py b/var/spack/repos/builtin/packages/py-ply/package.py index f023b7ca79..534abb3d21 100644 --- a/var/spack/repos/builtin/packages/py-ply/package.py +++ b/var/spack/repos/builtin/packages/py-ply/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pmw/package.py b/var/spack/repos/builtin/packages/py-pmw/package.py index a0dd79b0e4..69183269f8 100644 --- a/var/spack/repos/builtin/packages/py-pmw/package.py +++ b/var/spack/repos/builtin/packages/py-pmw/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pox/package.py b/var/spack/repos/builtin/packages/py-pox/package.py index 946a6fae0f..b2c490035a 100644 --- a/var/spack/repos/builtin/packages/py-pox/package.py +++ b/var/spack/repos/builtin/packages/py-pox/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ppft/package.py b/var/spack/repos/builtin/packages/py-ppft/package.py index da96ba458e..a7c5a3bcf9 100644 --- a/var/spack/repos/builtin/packages/py-ppft/package.py +++ b/var/spack/repos/builtin/packages/py-ppft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-prettytable/package.py b/var/spack/repos/builtin/packages/py-prettytable/package.py index 53e1ec75b6..ea70e52de4 100644 --- a/var/spack/repos/builtin/packages/py-prettytable/package.py +++ b/var/spack/repos/builtin/packages/py-prettytable/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-proj/package.py b/var/spack/repos/builtin/packages/py-proj/package.py index 649fa40f5c..848b5f27da 100644 --- a/var/spack/repos/builtin/packages/py-proj/package.py +++ b/var/spack/repos/builtin/packages/py-proj/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py b/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py index 35500c833b..ad5cf78c26 100644 --- a/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py +++ b/var/spack/repos/builtin/packages/py-prompt-toolkit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-protobuf/package.py b/var/spack/repos/builtin/packages/py-protobuf/package.py index 32421e959e..846d7ae016 100644 --- a/var/spack/repos/builtin/packages/py-protobuf/package.py +++ b/var/spack/repos/builtin/packages/py-protobuf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-psutil/package.py b/var/spack/repos/builtin/packages/py-psutil/package.py index f1524e56c2..5dcca0c679 100644 --- a/var/spack/repos/builtin/packages/py-psutil/package.py +++ b/var/spack/repos/builtin/packages/py-psutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ptyprocess/package.py b/var/spack/repos/builtin/packages/py-ptyprocess/package.py index cdd5105796..55110f1d02 100644 --- a/var/spack/repos/builtin/packages/py-ptyprocess/package.py +++ b/var/spack/repos/builtin/packages/py-ptyprocess/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pudb/package.py b/var/spack/repos/builtin/packages/py-pudb/package.py index 2ee28865d4..d30201d59b 100644 --- a/var/spack/repos/builtin/packages/py-pudb/package.py +++ b/var/spack/repos/builtin/packages/py-pudb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-py/package.py b/var/spack/repos/builtin/packages/py-py/package.py index 28d9ed75ac..1e3df34f7b 100644 --- a/var/spack/repos/builtin/packages/py-py/package.py +++ b/var/spack/repos/builtin/packages/py-py/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-py2bit/package.py b/var/spack/repos/builtin/packages/py-py2bit/package.py index d48fb7e9b9..79a6fe3e55 100644 --- a/var/spack/repos/builtin/packages/py-py2bit/package.py +++ b/var/spack/repos/builtin/packages/py-py2bit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-py2cairo/package.py b/var/spack/repos/builtin/packages/py-py2cairo/package.py index 9bd3f9a9b1..c72e407e03 100644 --- a/var/spack/repos/builtin/packages/py-py2cairo/package.py +++ b/var/spack/repos/builtin/packages/py-py2cairo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-py2neo/package.py b/var/spack/repos/builtin/packages/py-py2neo/package.py index 9c2ef0e8d7..e3890765e0 100644 --- a/var/spack/repos/builtin/packages/py-py2neo/package.py +++ b/var/spack/repos/builtin/packages/py-py2neo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-py4j/package.py b/var/spack/repos/builtin/packages/py-py4j/package.py index cdb3b4db0a..a2d5a98f49 100644 --- a/var/spack/repos/builtin/packages/py-py4j/package.py +++ b/var/spack/repos/builtin/packages/py-py4j/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyasn1/package.py b/var/spack/repos/builtin/packages/py-pyasn1/package.py index 666a20f758..b9771ade39 100644 --- a/var/spack/repos/builtin/packages/py-pyasn1/package.py +++ b/var/spack/repos/builtin/packages/py-pyasn1/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pybigwig/package.py b/var/spack/repos/builtin/packages/py-pybigwig/package.py index 4d96ba58c0..f49bbf3763 100644 --- a/var/spack/repos/builtin/packages/py-pybigwig/package.py +++ b/var/spack/repos/builtin/packages/py-pybigwig/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pybind11/package.py b/var/spack/repos/builtin/packages/py-pybind11/package.py index 0fabae48bc..1d3d7db7e1 100644 --- a/var/spack/repos/builtin/packages/py-pybind11/package.py +++ b/var/spack/repos/builtin/packages/py-pybind11/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py b/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py index d0b75be3a5..105abd99c7 100644 --- a/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py +++ b/var/spack/repos/builtin/packages/py-pybtex-docutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pybtex/package.py b/var/spack/repos/builtin/packages/py-pybtex/package.py index bcdbc61ca4..2b7377d96a 100644 --- a/var/spack/repos/builtin/packages/py-pybtex/package.py +++ b/var/spack/repos/builtin/packages/py-pybtex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pychecker/package.py b/var/spack/repos/builtin/packages/py-pychecker/package.py index 8dcb6ee15d..60df4df823 100644 --- a/var/spack/repos/builtin/packages/py-pychecker/package.py +++ b/var/spack/repos/builtin/packages/py-pychecker/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pycodestyle/package.py b/var/spack/repos/builtin/packages/py-pycodestyle/package.py index 4f69e749e9..c646da9c5e 100644 --- a/var/spack/repos/builtin/packages/py-pycodestyle/package.py +++ b/var/spack/repos/builtin/packages/py-pycodestyle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pycparser/package.py b/var/spack/repos/builtin/packages/py-pycparser/package.py index d950d1578d..6f0f40bb28 100644 --- a/var/spack/repos/builtin/packages/py-pycparser/package.py +++ b/var/spack/repos/builtin/packages/py-pycparser/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pycrypto/package.py b/var/spack/repos/builtin/packages/py-pycrypto/package.py index 0c24ceb242..ad945c1279 100644 --- a/var/spack/repos/builtin/packages/py-pycrypto/package.py +++ b/var/spack/repos/builtin/packages/py-pycrypto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pycurl/package.py b/var/spack/repos/builtin/packages/py-pycurl/package.py index 4d9164b269..62f3e83d20 100644 --- a/var/spack/repos/builtin/packages/py-pycurl/package.py +++ b/var/spack/repos/builtin/packages/py-pycurl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pydatalog/package.py b/var/spack/repos/builtin/packages/py-pydatalog/package.py index 270847f5dc..e487579cb4 100644 --- a/var/spack/repos/builtin/packages/py-pydatalog/package.py +++ b/var/spack/repos/builtin/packages/py-pydatalog/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pydispatcher/package.py b/var/spack/repos/builtin/packages/py-pydispatcher/package.py index 7f6e9b493e..53934c1762 100644 --- a/var/spack/repos/builtin/packages/py-pydispatcher/package.py +++ b/var/spack/repos/builtin/packages/py-pydispatcher/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pydot/package.py b/var/spack/repos/builtin/packages/py-pydot/package.py index f843bcbe2b..1aebf2d0d7 100644 --- a/var/spack/repos/builtin/packages/py-pydot/package.py +++ b/var/spack/repos/builtin/packages/py-pydot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyelftools/package.py b/var/spack/repos/builtin/packages/py-pyelftools/package.py index e1d074edae..46054cc097 100644 --- a/var/spack/repos/builtin/packages/py-pyelftools/package.py +++ b/var/spack/repos/builtin/packages/py-pyelftools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyfftw/package.py b/var/spack/repos/builtin/packages/py-pyfftw/package.py index c9f32f57ff..8fa2e50002 100644 --- a/var/spack/repos/builtin/packages/py-pyfftw/package.py +++ b/var/spack/repos/builtin/packages/py-pyfftw/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyflakes/package.py b/var/spack/repos/builtin/packages/py-pyflakes/package.py index e816f1b992..fdab4d31d0 100644 --- a/var/spack/repos/builtin/packages/py-pyflakes/package.py +++ b/var/spack/repos/builtin/packages/py-pyflakes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pygments/package.py b/var/spack/repos/builtin/packages/py-pygments/package.py index e814589cc5..0b55d6d913 100644 --- a/var/spack/repos/builtin/packages/py-pygments/package.py +++ b/var/spack/repos/builtin/packages/py-pygments/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pygobject/package.py b/var/spack/repos/builtin/packages/py-pygobject/package.py index 10b9b5ecea..2a0b25dbc4 100644 --- a/var/spack/repos/builtin/packages/py-pygobject/package.py +++ b/var/spack/repos/builtin/packages/py-pygobject/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pygtk/package.py b/var/spack/repos/builtin/packages/py-pygtk/package.py index 57f422437a..330961766c 100644 --- a/var/spack/repos/builtin/packages/py-pygtk/package.py +++ b/var/spack/repos/builtin/packages/py-pygtk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pylint/package.py b/var/spack/repos/builtin/packages/py-pylint/package.py index a251529410..e6f1501035 100644 --- a/var/spack/repos/builtin/packages/py-pylint/package.py +++ b/var/spack/repos/builtin/packages/py-pylint/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pymatgen/package.py b/var/spack/repos/builtin/packages/py-pymatgen/package.py index d944410084..838f59bdf1 100644 --- a/var/spack/repos/builtin/packages/py-pymatgen/package.py +++ b/var/spack/repos/builtin/packages/py-pymatgen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyminifier/package.py b/var/spack/repos/builtin/packages/py-pyminifier/package.py index d085d49ea7..eb6fbf006c 100644 --- a/var/spack/repos/builtin/packages/py-pyminifier/package.py +++ b/var/spack/repos/builtin/packages/py-pyminifier/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pympler/package.py b/var/spack/repos/builtin/packages/py-pympler/package.py index 9ca0ddc0cf..40fc8628b5 100644 --- a/var/spack/repos/builtin/packages/py-pympler/package.py +++ b/var/spack/repos/builtin/packages/py-pympler/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pynn/package.py b/var/spack/repos/builtin/packages/py-pynn/package.py index 420c2d238b..d5a080d515 100644 --- a/var/spack/repos/builtin/packages/py-pynn/package.py +++ b/var/spack/repos/builtin/packages/py-pynn/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pypar/package.py b/var/spack/repos/builtin/packages/py-pypar/package.py index 8c84826174..eaafbb213b 100644 --- a/var/spack/repos/builtin/packages/py-pypar/package.py +++ b/var/spack/repos/builtin/packages/py-pypar/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyparsing/package.py b/var/spack/repos/builtin/packages/py-pyparsing/package.py index ae4f3a3d9f..5bcc309f21 100644 --- a/var/spack/repos/builtin/packages/py-pyparsing/package.py +++ b/var/spack/repos/builtin/packages/py-pyparsing/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pypeflow/package.py b/var/spack/repos/builtin/packages/py-pypeflow/package.py index 8741b731f5..f7e32e326e 100644 --- a/var/spack/repos/builtin/packages/py-pypeflow/package.py +++ b/var/spack/repos/builtin/packages/py-pypeflow/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyprof2html/package.py b/var/spack/repos/builtin/packages/py-pyprof2html/package.py index 0014d6127a..de3495864d 100644 --- a/var/spack/repos/builtin/packages/py-pyprof2html/package.py +++ b/var/spack/repos/builtin/packages/py-pyprof2html/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyqt/package.py b/var/spack/repos/builtin/packages/py-pyqt/package.py index 3aed68f845..402e7b5faa 100644 --- a/var/spack/repos/builtin/packages/py-pyqt/package.py +++ b/var/spack/repos/builtin/packages/py-pyqt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyrad/package.py b/var/spack/repos/builtin/packages/py-pyrad/package.py index 05142e26b0..81d1516e23 100644 --- a/var/spack/repos/builtin/packages/py-pyrad/package.py +++ b/var/spack/repos/builtin/packages/py-pyrad/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pysam/package.py b/var/spack/repos/builtin/packages/py-pysam/package.py index cf470ea564..92359f1792 100644 --- a/var/spack/repos/builtin/packages/py-pysam/package.py +++ b/var/spack/repos/builtin/packages/py-pysam/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyscaf/package.py b/var/spack/repos/builtin/packages/py-pyscaf/package.py index 93f6b6afdd..8f57751be1 100644 --- a/var/spack/repos/builtin/packages/py-pyscaf/package.py +++ b/var/spack/repos/builtin/packages/py-pyscaf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyserial/package.py b/var/spack/repos/builtin/packages/py-pyserial/package.py index e2ba88d660..a215410e45 100644 --- a/var/spack/repos/builtin/packages/py-pyserial/package.py +++ b/var/spack/repos/builtin/packages/py-pyserial/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyside/package.py b/var/spack/repos/builtin/packages/py-pyside/package.py index aff69b46d6..a755840de3 100644 --- a/var/spack/repos/builtin/packages/py-pyside/package.py +++ b/var/spack/repos/builtin/packages/py-pyside/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pysocks/package.py b/var/spack/repos/builtin/packages/py-pysocks/package.py index 6d0ff52400..4aad04e971 100644 --- a/var/spack/repos/builtin/packages/py-pysocks/package.py +++ b/var/spack/repos/builtin/packages/py-pysocks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytables/package.py b/var/spack/repos/builtin/packages/py-pytables/package.py index 00fd9309be..948e92bc3a 100644 --- a/var/spack/repos/builtin/packages/py-pytables/package.py +++ b/var/spack/repos/builtin/packages/py-pytables/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest-cov/package.py b/var/spack/repos/builtin/packages/py-pytest-cov/package.py index 3a7496f766..81f34022db 100644 --- a/var/spack/repos/builtin/packages/py-pytest-cov/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-cov/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest-flake8/package.py b/var/spack/repos/builtin/packages/py-pytest-flake8/package.py index 8299fd7dc9..4eb4fdb1c4 100644 --- a/var/spack/repos/builtin/packages/py-pytest-flake8/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-flake8/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py b/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py index 74e0b9e933..3c01fecda9 100644 --- a/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-httpbin/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest-mock/package.py b/var/spack/repos/builtin/packages/py-pytest-mock/package.py index 9cd84a01c3..d9711f7e8f 100644 --- a/var/spack/repos/builtin/packages/py-pytest-mock/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-mock/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest-runner/package.py b/var/spack/repos/builtin/packages/py-pytest-runner/package.py index 114a9dcd13..f21a28c441 100644 --- a/var/spack/repos/builtin/packages/py-pytest-runner/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-runner/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest-xdist/package.py b/var/spack/repos/builtin/packages/py-pytest-xdist/package.py index f82fa13039..2ded426267 100644 --- a/var/spack/repos/builtin/packages/py-pytest-xdist/package.py +++ b/var/spack/repos/builtin/packages/py-pytest-xdist/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytest/package.py b/var/spack/repos/builtin/packages/py-pytest/package.py index 965cb26a8d..064ae274a4 100644 --- a/var/spack/repos/builtin/packages/py-pytest/package.py +++ b/var/spack/repos/builtin/packages/py-pytest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-python-daemon/package.py b/var/spack/repos/builtin/packages/py-python-daemon/package.py index 858c57b7d9..f3c64b2fd3 100644 --- a/var/spack/repos/builtin/packages/py-python-daemon/package.py +++ b/var/spack/repos/builtin/packages/py-python-daemon/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-python-gitlab/package.py b/var/spack/repos/builtin/packages/py-python-gitlab/package.py index 79a5f82fbf..b581cc0a68 100644 --- a/var/spack/repos/builtin/packages/py-python-gitlab/package.py +++ b/var/spack/repos/builtin/packages/py-python-gitlab/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pythonqwt/package.py b/var/spack/repos/builtin/packages/py-pythonqwt/package.py index fd4f2825cb..8af79ab4f0 100644 --- a/var/spack/repos/builtin/packages/py-pythonqwt/package.py +++ b/var/spack/repos/builtin/packages/py-pythonqwt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pytz/package.py b/var/spack/repos/builtin/packages/py-pytz/package.py index 0bcadd8238..ba37d6b37c 100644 --- a/var/spack/repos/builtin/packages/py-pytz/package.py +++ b/var/spack/repos/builtin/packages/py-pytz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pywavelets/package.py b/var/spack/repos/builtin/packages/py-pywavelets/package.py index ffe1d5364c..6fb2e36b30 100644 --- a/var/spack/repos/builtin/packages/py-pywavelets/package.py +++ b/var/spack/repos/builtin/packages/py-pywavelets/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-pyyaml/package.py b/var/spack/repos/builtin/packages/py-pyyaml/package.py index def71814e3..fb44ca2d3f 100644 --- a/var/spack/repos/builtin/packages/py-pyyaml/package.py +++ b/var/spack/repos/builtin/packages/py-pyyaml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-qtawesome/package.py b/var/spack/repos/builtin/packages/py-qtawesome/package.py index abaabc45f4..e3b3f00222 100644 --- a/var/spack/repos/builtin/packages/py-qtawesome/package.py +++ b/var/spack/repos/builtin/packages/py-qtawesome/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-qtconsole/package.py b/var/spack/repos/builtin/packages/py-qtconsole/package.py index 6fde8783b6..60c741a75d 100644 --- a/var/spack/repos/builtin/packages/py-qtconsole/package.py +++ b/var/spack/repos/builtin/packages/py-qtconsole/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-qtpy/package.py b/var/spack/repos/builtin/packages/py-qtpy/package.py index 4471e33a58..6a2b6b60fa 100644 --- a/var/spack/repos/builtin/packages/py-qtpy/package.py +++ b/var/spack/repos/builtin/packages/py-qtpy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-quantities/package.py b/var/spack/repos/builtin/packages/py-quantities/package.py index c74e897805..2b78e643aa 100644 --- a/var/spack/repos/builtin/packages/py-quantities/package.py +++ b/var/spack/repos/builtin/packages/py-quantities/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-radical-utils/package.py b/var/spack/repos/builtin/packages/py-radical-utils/package.py index 97dd700f74..91020fdaea 100644 --- a/var/spack/repos/builtin/packages/py-radical-utils/package.py +++ b/var/spack/repos/builtin/packages/py-radical-utils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-ranger/package.py b/var/spack/repos/builtin/packages/py-ranger/package.py index c5fee4e8fa..2255edbd69 100644 --- a/var/spack/repos/builtin/packages/py-ranger/package.py +++ b/var/spack/repos/builtin/packages/py-ranger/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-readme-renderer/package.py b/var/spack/repos/builtin/packages/py-readme-renderer/package.py index 709851aed5..ef31eec986 100644 --- a/var/spack/repos/builtin/packages/py-readme-renderer/package.py +++ b/var/spack/repos/builtin/packages/py-readme-renderer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-regex/package.py b/var/spack/repos/builtin/packages/py-regex/package.py index a13dd01919..0b7760fd05 100644 --- a/var/spack/repos/builtin/packages/py-regex/package.py +++ b/var/spack/repos/builtin/packages/py-regex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-requests/package.py b/var/spack/repos/builtin/packages/py-requests/package.py index 065d22b436..50dea17fd2 100644 --- a/var/spack/repos/builtin/packages/py-requests/package.py +++ b/var/spack/repos/builtin/packages/py-requests/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-restview/package.py b/var/spack/repos/builtin/packages/py-restview/package.py index 5ab66a9ba3..be2da22bd2 100644 --- a/var/spack/repos/builtin/packages/py-restview/package.py +++ b/var/spack/repos/builtin/packages/py-restview/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-rope/package.py b/var/spack/repos/builtin/packages/py-rope/package.py index 4138096d73..144940a0be 100644 --- a/var/spack/repos/builtin/packages/py-rope/package.py +++ b/var/spack/repos/builtin/packages/py-rope/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-rpy2/package.py b/var/spack/repos/builtin/packages/py-rpy2/package.py index a0d020f427..9830d3f2a4 100644 --- a/var/spack/repos/builtin/packages/py-rpy2/package.py +++ b/var/spack/repos/builtin/packages/py-rpy2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-rsa/package.py b/var/spack/repos/builtin/packages/py-rsa/package.py index 4b58a286bd..fe8d8ca760 100644 --- a/var/spack/repos/builtin/packages/py-rsa/package.py +++ b/var/spack/repos/builtin/packages/py-rsa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-rtree/package.py b/var/spack/repos/builtin/packages/py-rtree/package.py index 3eeb6c01d1..424b1565e7 100644 --- a/var/spack/repos/builtin/packages/py-rtree/package.py +++ b/var/spack/repos/builtin/packages/py-rtree/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-saga-python/package.py b/var/spack/repos/builtin/packages/py-saga-python/package.py index 0b2cd60d89..04e1b3d712 100644 --- a/var/spack/repos/builtin/packages/py-saga-python/package.py +++ b/var/spack/repos/builtin/packages/py-saga-python/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-scientificpython/package.py b/var/spack/repos/builtin/packages/py-scientificpython/package.py index 0478438ad4..774628aa40 100644 --- a/var/spack/repos/builtin/packages/py-scientificpython/package.py +++ b/var/spack/repos/builtin/packages/py-scientificpython/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-scikit-image/package.py b/var/spack/repos/builtin/packages/py-scikit-image/package.py index f164a3a25f..cd3691abfa 100644 --- a/var/spack/repos/builtin/packages/py-scikit-image/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-image/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-scikit-learn/package.py b/var/spack/repos/builtin/packages/py-scikit-learn/package.py index 0d2a9a155c..39a98f0f64 100644 --- a/var/spack/repos/builtin/packages/py-scikit-learn/package.py +++ b/var/spack/repos/builtin/packages/py-scikit-learn/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py index 6e2ef327e3..39f2337547 100644 --- a/var/spack/repos/builtin/packages/py-scipy/package.py +++ b/var/spack/repos/builtin/packages/py-scipy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-seaborn/package.py b/var/spack/repos/builtin/packages/py-seaborn/package.py index 26c76b7aa9..5c31a85835 100644 --- a/var/spack/repos/builtin/packages/py-seaborn/package.py +++ b/var/spack/repos/builtin/packages/py-seaborn/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-setuptools/package.py b/var/spack/repos/builtin/packages/py-setuptools/package.py index 768dd3b5f7..44905cab7d 100644 --- a/var/spack/repos/builtin/packages/py-setuptools/package.py +++ b/var/spack/repos/builtin/packages/py-setuptools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sh/package.py b/var/spack/repos/builtin/packages/py-sh/package.py index 60154de923..d5765e3a41 100644 --- a/var/spack/repos/builtin/packages/py-sh/package.py +++ b/var/spack/repos/builtin/packages/py-sh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-shiboken/package.py b/var/spack/repos/builtin/packages/py-shiboken/package.py index 2f6f40df3a..984234ac0f 100644 --- a/var/spack/repos/builtin/packages/py-shiboken/package.py +++ b/var/spack/repos/builtin/packages/py-shiboken/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-simplegeneric/package.py b/var/spack/repos/builtin/packages/py-simplegeneric/package.py index c6db610ec4..7f2a6e7b6a 100644 --- a/var/spack/repos/builtin/packages/py-simplegeneric/package.py +++ b/var/spack/repos/builtin/packages/py-simplegeneric/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-simplejson/package.py b/var/spack/repos/builtin/packages/py-simplejson/package.py index 81fc585967..5f16f6183f 100644 --- a/var/spack/repos/builtin/packages/py-simplejson/package.py +++ b/var/spack/repos/builtin/packages/py-simplejson/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-singledispatch/package.py b/var/spack/repos/builtin/packages/py-singledispatch/package.py index 08e86a24aa..7603b90bdb 100644 --- a/var/spack/repos/builtin/packages/py-singledispatch/package.py +++ b/var/spack/repos/builtin/packages/py-singledispatch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sip/package.py b/var/spack/repos/builtin/packages/py-sip/package.py index 4243cefce0..ed906d4302 100644 --- a/var/spack/repos/builtin/packages/py-sip/package.py +++ b/var/spack/repos/builtin/packages/py-sip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-six/package.py b/var/spack/repos/builtin/packages/py-six/package.py index 767d43b3ba..fede104b6c 100644 --- a/var/spack/repos/builtin/packages/py-six/package.py +++ b/var/spack/repos/builtin/packages/py-six/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-slepc4py/package.py b/var/spack/repos/builtin/packages/py-slepc4py/package.py index 35b7286b9d..f71b0eeb82 100644 --- a/var/spack/repos/builtin/packages/py-slepc4py/package.py +++ b/var/spack/repos/builtin/packages/py-slepc4py/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sncosmo/package.py b/var/spack/repos/builtin/packages/py-sncosmo/package.py index e5f5165fb2..8ebb0e65a2 100644 --- a/var/spack/repos/builtin/packages/py-sncosmo/package.py +++ b/var/spack/repos/builtin/packages/py-sncosmo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-snowballstemmer/package.py b/var/spack/repos/builtin/packages/py-snowballstemmer/package.py index fa6a19a01f..7ecd7b9e28 100644 --- a/var/spack/repos/builtin/packages/py-snowballstemmer/package.py +++ b/var/spack/repos/builtin/packages/py-snowballstemmer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-spectra/package.py b/var/spack/repos/builtin/packages/py-spectra/package.py index acb2643698..959b4baa89 100644 --- a/var/spack/repos/builtin/packages/py-spectra/package.py +++ b/var/spack/repos/builtin/packages/py-spectra/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-spefile/package.py b/var/spack/repos/builtin/packages/py-spefile/package.py index 4ae57f64ec..76d6772240 100644 --- a/var/spack/repos/builtin/packages/py-spefile/package.py +++ b/var/spack/repos/builtin/packages/py-spefile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-spglib/package.py b/var/spack/repos/builtin/packages/py-spglib/package.py index e463970feb..e5e3f075e1 100644 --- a/var/spack/repos/builtin/packages/py-spglib/package.py +++ b/var/spack/repos/builtin/packages/py-spglib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py b/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py index bcdc5fa934..6f4cb0b242 100644 --- a/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx-bootstrap-theme/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py b/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py index 7166caef79..8972baafb8 100644 --- a/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx-rtd-theme/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sphinx/package.py b/var/spack/repos/builtin/packages/py-sphinx/package.py index 1dbf581eb7..37c8505740 100644 --- a/var/spack/repos/builtin/packages/py-sphinx/package.py +++ b/var/spack/repos/builtin/packages/py-sphinx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py index d186c09b8f..ec02dc1ef0 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-bibtex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py index a52565107f..d7ec02db2a 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-programoutput/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py b/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py index 884f8c27a3..6f05a46044 100644 --- a/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py +++ b/var/spack/repos/builtin/packages/py-sphinxcontrib-websupport/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-spyder/package.py b/var/spack/repos/builtin/packages/py-spyder/package.py index 67194f31b1..432f5a6a9f 100644 --- a/var/spack/repos/builtin/packages/py-spyder/package.py +++ b/var/spack/repos/builtin/packages/py-spyder/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-spykeutils/package.py b/var/spack/repos/builtin/packages/py-spykeutils/package.py index 3c715071f5..bfe3a130ba 100644 --- a/var/spack/repos/builtin/packages/py-spykeutils/package.py +++ b/var/spack/repos/builtin/packages/py-spykeutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sqlalchemy/package.py b/var/spack/repos/builtin/packages/py-sqlalchemy/package.py index 12d868660f..c009c058a2 100644 --- a/var/spack/repos/builtin/packages/py-sqlalchemy/package.py +++ b/var/spack/repos/builtin/packages/py-sqlalchemy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-statsmodels/package.py b/var/spack/repos/builtin/packages/py-statsmodels/package.py index 9cef776e6d..865ffba0c2 100644 --- a/var/spack/repos/builtin/packages/py-statsmodels/package.py +++ b/var/spack/repos/builtin/packages/py-statsmodels/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-storm/package.py b/var/spack/repos/builtin/packages/py-storm/package.py index 1205b2a9cc..be504b7223 100644 --- a/var/spack/repos/builtin/packages/py-storm/package.py +++ b/var/spack/repos/builtin/packages/py-storm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-subprocess32/package.py b/var/spack/repos/builtin/packages/py-subprocess32/package.py index 5ed2027452..2e2589e6db 100644 --- a/var/spack/repos/builtin/packages/py-subprocess32/package.py +++ b/var/spack/repos/builtin/packages/py-subprocess32/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-symengine/package.py b/var/spack/repos/builtin/packages/py-symengine/package.py index 97c51d00b8..eed8c6759f 100644 --- a/var/spack/repos/builtin/packages/py-symengine/package.py +++ b/var/spack/repos/builtin/packages/py-symengine/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-symfit/package.py b/var/spack/repos/builtin/packages/py-symfit/package.py index cbc30acf65..2707fa5903 100644 --- a/var/spack/repos/builtin/packages/py-symfit/package.py +++ b/var/spack/repos/builtin/packages/py-symfit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-sympy/package.py b/var/spack/repos/builtin/packages/py-sympy/package.py index 8ab3e60a9b..976442f23d 100644 --- a/var/spack/repos/builtin/packages/py-sympy/package.py +++ b/var/spack/repos/builtin/packages/py-sympy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tabulate/package.py b/var/spack/repos/builtin/packages/py-tabulate/package.py index d33ca7b785..61cc27a317 100644 --- a/var/spack/repos/builtin/packages/py-tabulate/package.py +++ b/var/spack/repos/builtin/packages/py-tabulate/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tappy/package.py b/var/spack/repos/builtin/packages/py-tappy/package.py index 36e22f71e1..e4f9d0b52b 100644 --- a/var/spack/repos/builtin/packages/py-tappy/package.py +++ b/var/spack/repos/builtin/packages/py-tappy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-terminado/package.py b/var/spack/repos/builtin/packages/py-terminado/package.py index 483a3f472e..948d028841 100644 --- a/var/spack/repos/builtin/packages/py-terminado/package.py +++ b/var/spack/repos/builtin/packages/py-terminado/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-theano/package.py b/var/spack/repos/builtin/packages/py-theano/package.py index 0e1275700d..d763ef6ec8 100644 --- a/var/spack/repos/builtin/packages/py-theano/package.py +++ b/var/spack/repos/builtin/packages/py-theano/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tifffile/package.py b/var/spack/repos/builtin/packages/py-tifffile/package.py index ef70e2ae69..ea6c619e85 100644 --- a/var/spack/repos/builtin/packages/py-tifffile/package.py +++ b/var/spack/repos/builtin/packages/py-tifffile/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tomopy/package.py b/var/spack/repos/builtin/packages/py-tomopy/package.py index a77caa4dac..5ea077df00 100644 --- a/var/spack/repos/builtin/packages/py-tomopy/package.py +++ b/var/spack/repos/builtin/packages/py-tomopy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tornado/package.py b/var/spack/repos/builtin/packages/py-tornado/package.py index 0ec044ad54..0ae50e38e2 100644 --- a/var/spack/repos/builtin/packages/py-tornado/package.py +++ b/var/spack/repos/builtin/packages/py-tornado/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tqdm/package.py b/var/spack/repos/builtin/packages/py-tqdm/package.py index 2ca30c8e14..5f112cfb52 100644 --- a/var/spack/repos/builtin/packages/py-tqdm/package.py +++ b/var/spack/repos/builtin/packages/py-tqdm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-traitlets/package.py b/var/spack/repos/builtin/packages/py-traitlets/package.py index 10ff5a6e38..c419c60e72 100644 --- a/var/spack/repos/builtin/packages/py-traitlets/package.py +++ b/var/spack/repos/builtin/packages/py-traitlets/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tuiview/package.py b/var/spack/repos/builtin/packages/py-tuiview/package.py index 32166e6740..5c11639710 100644 --- a/var/spack/repos/builtin/packages/py-tuiview/package.py +++ b/var/spack/repos/builtin/packages/py-tuiview/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-twisted/package.py b/var/spack/repos/builtin/packages/py-twisted/package.py index 1184b49e3c..546a2c7637 100644 --- a/var/spack/repos/builtin/packages/py-twisted/package.py +++ b/var/spack/repos/builtin/packages/py-twisted/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-typing/package.py b/var/spack/repos/builtin/packages/py-typing/package.py index 52f5fa05b0..7b775853b1 100644 --- a/var/spack/repos/builtin/packages/py-typing/package.py +++ b/var/spack/repos/builtin/packages/py-typing/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-tzlocal/package.py b/var/spack/repos/builtin/packages/py-tzlocal/package.py index e4c085f1ce..e65b506170 100644 --- a/var/spack/repos/builtin/packages/py-tzlocal/package.py +++ b/var/spack/repos/builtin/packages/py-tzlocal/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-unittest2/package.py b/var/spack/repos/builtin/packages/py-unittest2/package.py index c0cdbf9339..eb979bcc0c 100644 --- a/var/spack/repos/builtin/packages/py-unittest2/package.py +++ b/var/spack/repos/builtin/packages/py-unittest2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py index ea8a9927e5..2903d57f33 100644 --- a/var/spack/repos/builtin/packages/py-unittest2py3k/package.py +++ b/var/spack/repos/builtin/packages/py-unittest2py3k/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-urllib3/package.py b/var/spack/repos/builtin/packages/py-urllib3/package.py index 5c56de7615..76418a3512 100644 --- a/var/spack/repos/builtin/packages/py-urllib3/package.py +++ b/var/spack/repos/builtin/packages/py-urllib3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-urwid/package.py b/var/spack/repos/builtin/packages/py-urwid/package.py index 4b662a0f1e..964238581d 100644 --- a/var/spack/repos/builtin/packages/py-urwid/package.py +++ b/var/spack/repos/builtin/packages/py-urwid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-vcversioner/package.py b/var/spack/repos/builtin/packages/py-vcversioner/package.py index 33be558e3c..5c6cc23748 100644 --- a/var/spack/repos/builtin/packages/py-vcversioner/package.py +++ b/var/spack/repos/builtin/packages/py-vcversioner/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-virtualenv/package.py b/var/spack/repos/builtin/packages/py-virtualenv/package.py index 7c9f4a7af3..6daa9f1448 100644 --- a/var/spack/repos/builtin/packages/py-virtualenv/package.py +++ b/var/spack/repos/builtin/packages/py-virtualenv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-wcsaxes/package.py b/var/spack/repos/builtin/packages/py-wcsaxes/package.py index 70cb81e896..c6ea80a2be 100644 --- a/var/spack/repos/builtin/packages/py-wcsaxes/package.py +++ b/var/spack/repos/builtin/packages/py-wcsaxes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-wcwidth/package.py b/var/spack/repos/builtin/packages/py-wcwidth/package.py index a5339b7f60..dc6dbe3890 100644 --- a/var/spack/repos/builtin/packages/py-wcwidth/package.py +++ b/var/spack/repos/builtin/packages/py-wcwidth/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-webkit-server/package.py b/var/spack/repos/builtin/packages/py-webkit-server/package.py index 1c3d42dc06..89f20a4f51 100644 --- a/var/spack/repos/builtin/packages/py-webkit-server/package.py +++ b/var/spack/repos/builtin/packages/py-webkit-server/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-werkzeug/package.py b/var/spack/repos/builtin/packages/py-werkzeug/package.py index a712cc84f2..a1241666eb 100644 --- a/var/spack/repos/builtin/packages/py-werkzeug/package.py +++ b/var/spack/repos/builtin/packages/py-werkzeug/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-wheel/package.py b/var/spack/repos/builtin/packages/py-wheel/package.py index 6771932244..31351095ad 100644 --- a/var/spack/repos/builtin/packages/py-wheel/package.py +++ b/var/spack/repos/builtin/packages/py-wheel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py b/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py index 86465235d1..4dfb93fdfa 100644 --- a/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py +++ b/var/spack/repos/builtin/packages/py-widgetsnbextension/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-wrapt/package.py b/var/spack/repos/builtin/packages/py-wrapt/package.py index 8b792a16ec..70058141bc 100644 --- a/var/spack/repos/builtin/packages/py-wrapt/package.py +++ b/var/spack/repos/builtin/packages/py-wrapt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-xarray/package.py b/var/spack/repos/builtin/packages/py-xarray/package.py index 436f1f87d0..51a071cf2f 100644 --- a/var/spack/repos/builtin/packages/py-xarray/package.py +++ b/var/spack/repos/builtin/packages/py-xarray/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-xlrd/package.py b/var/spack/repos/builtin/packages/py-xlrd/package.py index 4bf87a46ca..61760fcbff 100644 --- a/var/spack/repos/builtin/packages/py-xlrd/package.py +++ b/var/spack/repos/builtin/packages/py-xlrd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-xmlrunner/package.py b/var/spack/repos/builtin/packages/py-xmlrunner/package.py index 73fabe6242..28d6fd5821 100644 --- a/var/spack/repos/builtin/packages/py-xmlrunner/package.py +++ b/var/spack/repos/builtin/packages/py-xmlrunner/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-xopen/package.py b/var/spack/repos/builtin/packages/py-xopen/package.py index c98ee00b1a..3553e38bda 100644 --- a/var/spack/repos/builtin/packages/py-xopen/package.py +++ b/var/spack/repos/builtin/packages/py-xopen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-xpyb/package.py b/var/spack/repos/builtin/packages/py-xpyb/package.py index b9099daa71..d3db02838f 100644 --- a/var/spack/repos/builtin/packages/py-xpyb/package.py +++ b/var/spack/repos/builtin/packages/py-xpyb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py b/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py index 6b04d18521..1fd0bc7981 100644 --- a/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py +++ b/var/spack/repos/builtin/packages/py-xvfbwrapper/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-yapf/package.py b/var/spack/repos/builtin/packages/py-yapf/package.py index 84a21bcc59..471f972b13 100644 --- a/var/spack/repos/builtin/packages/py-yapf/package.py +++ b/var/spack/repos/builtin/packages/py-yapf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-yt/package.py b/var/spack/repos/builtin/packages/py-yt/package.py index 4575de0371..6f1a1e97fa 100644 --- a/var/spack/repos/builtin/packages/py-yt/package.py +++ b/var/spack/repos/builtin/packages/py-yt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/py-zmq/package.py b/var/spack/repos/builtin/packages/py-zmq/package.py index deddb77b95..644f374442 100644 --- a/var/spack/repos/builtin/packages/py-zmq/package.py +++ b/var/spack/repos/builtin/packages/py-zmq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index 2420190f56..fa6f3e33a1 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qbank/package.py b/var/spack/repos/builtin/packages/qbank/package.py index a503ace345..d6434006b2 100644 --- a/var/spack/repos/builtin/packages/qbank/package.py +++ b/var/spack/repos/builtin/packages/qbank/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qbox/package.py b/var/spack/repos/builtin/packages/qbox/package.py index 6ffb27e197..dbbbdc329e 100644 --- a/var/spack/repos/builtin/packages/qbox/package.py +++ b/var/spack/repos/builtin/packages/qbox/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qhull/package.py b/var/spack/repos/builtin/packages/qhull/package.py index aaad704d66..12c9aad492 100644 --- a/var/spack/repos/builtin/packages/qhull/package.py +++ b/var/spack/repos/builtin/packages/qhull/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qrupdate/package.py b/var/spack/repos/builtin/packages/qrupdate/package.py index 5398592d22..473ed20121 100644 --- a/var/spack/repos/builtin/packages/qrupdate/package.py +++ b/var/spack/repos/builtin/packages/qrupdate/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qt-creator/package.py b/var/spack/repos/builtin/packages/qt-creator/package.py index 4b3054b7b6..55ceeaf17f 100644 --- a/var/spack/repos/builtin/packages/qt-creator/package.py +++ b/var/spack/repos/builtin/packages/qt-creator/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qt/package.py b/var/spack/repos/builtin/packages/qt/package.py index e872a53013..30d9431353 100644 --- a/var/spack/repos/builtin/packages/qt/package.py +++ b/var/spack/repos/builtin/packages/qt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qthreads/package.py b/var/spack/repos/builtin/packages/qthreads/package.py index a4be2072c5..09f9d594b3 100644 --- a/var/spack/repos/builtin/packages/qthreads/package.py +++ b/var/spack/repos/builtin/packages/qthreads/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/qwt/package.py b/var/spack/repos/builtin/packages/qwt/package.py index 10ca44e1c3..6efc837a22 100644 --- a/var/spack/repos/builtin/packages/qwt/package.py +++ b/var/spack/repos/builtin/packages/qwt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-abind/package.py b/var/spack/repos/builtin/packages/r-abind/package.py index 5b63f7b7fe..44a8618f26 100644 --- a/var/spack/repos/builtin/packages/r-abind/package.py +++ b/var/spack/repos/builtin/packages/r-abind/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ada/package.py b/var/spack/repos/builtin/packages/r-ada/package.py index 27b1f8c95a..34d285e5cb 100644 --- a/var/spack/repos/builtin/packages/r-ada/package.py +++ b/var/spack/repos/builtin/packages/r-ada/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-adabag/package.py b/var/spack/repos/builtin/packages/r-adabag/package.py index 87fc37362d..cfde479fd8 100644 --- a/var/spack/repos/builtin/packages/r-adabag/package.py +++ b/var/spack/repos/builtin/packages/r-adabag/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ade4/package.py b/var/spack/repos/builtin/packages/r-ade4/package.py index 2951703c65..d4c51ca7a7 100644 --- a/var/spack/repos/builtin/packages/r-ade4/package.py +++ b/var/spack/repos/builtin/packages/r-ade4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-adegenet/package.py b/var/spack/repos/builtin/packages/r-adegenet/package.py index e7e7c408e7..a1435189db 100644 --- a/var/spack/repos/builtin/packages/r-adegenet/package.py +++ b/var/spack/repos/builtin/packages/r-adegenet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ape/package.py b/var/spack/repos/builtin/packages/r-ape/package.py index 9830a0e35d..d2519aa4f7 100644 --- a/var/spack/repos/builtin/packages/r-ape/package.py +++ b/var/spack/repos/builtin/packages/r-ape/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-assertthat/package.py b/var/spack/repos/builtin/packages/r-assertthat/package.py index d9b6eccbbc..8ba3002fa8 100644 --- a/var/spack/repos/builtin/packages/r-assertthat/package.py +++ b/var/spack/repos/builtin/packages/r-assertthat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-base64enc/package.py b/var/spack/repos/builtin/packages/r-base64enc/package.py index 6e3ac59d7f..4657fd3396 100644 --- a/var/spack/repos/builtin/packages/r-base64enc/package.py +++ b/var/spack/repos/builtin/packages/r-base64enc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-bh/package.py b/var/spack/repos/builtin/packages/r-bh/package.py index 3cdac25f0d..fe1fa6467a 100644 --- a/var/spack/repos/builtin/packages/r-bh/package.py +++ b/var/spack/repos/builtin/packages/r-bh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-biocgenerics/package.py b/var/spack/repos/builtin/packages/r-biocgenerics/package.py index f8c0294b22..7b91598ca1 100644 --- a/var/spack/repos/builtin/packages/r-biocgenerics/package.py +++ b/var/spack/repos/builtin/packages/r-biocgenerics/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-biocinstaller/package.py b/var/spack/repos/builtin/packages/r-biocinstaller/package.py index fbde6a26f6..5d91eb0a83 100644 --- a/var/spack/repos/builtin/packages/r-biocinstaller/package.py +++ b/var/spack/repos/builtin/packages/r-biocinstaller/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-bitops/package.py b/var/spack/repos/builtin/packages/r-bitops/package.py index c9b2d6af01..59bd6308aa 100644 --- a/var/spack/repos/builtin/packages/r-bitops/package.py +++ b/var/spack/repos/builtin/packages/r-bitops/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-boot/package.py b/var/spack/repos/builtin/packages/r-boot/package.py index 50a057bcbb..55ea5dba01 100644 --- a/var/spack/repos/builtin/packages/r-boot/package.py +++ b/var/spack/repos/builtin/packages/r-boot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-brew/package.py b/var/spack/repos/builtin/packages/r-brew/package.py index c9e42339c3..faecc9ac92 100644 --- a/var/spack/repos/builtin/packages/r-brew/package.py +++ b/var/spack/repos/builtin/packages/r-brew/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-c50/package.py b/var/spack/repos/builtin/packages/r-c50/package.py index fbffd61d38..2b526b7862 100644 --- a/var/spack/repos/builtin/packages/r-c50/package.py +++ b/var/spack/repos/builtin/packages/r-c50/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-car/package.py b/var/spack/repos/builtin/packages/r-car/package.py index 5bd107d2d2..ac1045ff51 100644 --- a/var/spack/repos/builtin/packages/r-car/package.py +++ b/var/spack/repos/builtin/packages/r-car/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-caret/package.py b/var/spack/repos/builtin/packages/r-caret/package.py index 92b6ef28d8..ec0d08d1f2 100644 --- a/var/spack/repos/builtin/packages/r-caret/package.py +++ b/var/spack/repos/builtin/packages/r-caret/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-catools/package.py b/var/spack/repos/builtin/packages/r-catools/package.py index 6867af0e89..421da49e00 100644 --- a/var/spack/repos/builtin/packages/r-catools/package.py +++ b/var/spack/repos/builtin/packages/r-catools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-checkpoint/package.py b/var/spack/repos/builtin/packages/r-checkpoint/package.py index 78c0d55975..cb9fd1de1f 100644 --- a/var/spack/repos/builtin/packages/r-checkpoint/package.py +++ b/var/spack/repos/builtin/packages/r-checkpoint/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-chron/package.py b/var/spack/repos/builtin/packages/r-chron/package.py index a86dd10eef..323210fe3c 100644 --- a/var/spack/repos/builtin/packages/r-chron/package.py +++ b/var/spack/repos/builtin/packages/r-chron/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-class/package.py b/var/spack/repos/builtin/packages/r-class/package.py index feb1951f62..85c5c747ba 100644 --- a/var/spack/repos/builtin/packages/r-class/package.py +++ b/var/spack/repos/builtin/packages/r-class/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-cluster/package.py b/var/spack/repos/builtin/packages/r-cluster/package.py index 680982d86d..46020781b9 100644 --- a/var/spack/repos/builtin/packages/r-cluster/package.py +++ b/var/spack/repos/builtin/packages/r-cluster/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-coda/package.py b/var/spack/repos/builtin/packages/r-coda/package.py index a0fe4eef5c..a75059bc70 100644 --- a/var/spack/repos/builtin/packages/r-coda/package.py +++ b/var/spack/repos/builtin/packages/r-coda/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-codetools/package.py b/var/spack/repos/builtin/packages/r-codetools/package.py index 157aeb80de..6aff92cd33 100644 --- a/var/spack/repos/builtin/packages/r-codetools/package.py +++ b/var/spack/repos/builtin/packages/r-codetools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-coin/package.py b/var/spack/repos/builtin/packages/r-coin/package.py index 7ab7a3fdae..b17696e7f0 100644 --- a/var/spack/repos/builtin/packages/r-coin/package.py +++ b/var/spack/repos/builtin/packages/r-coin/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-colorspace/package.py b/var/spack/repos/builtin/packages/r-colorspace/package.py index 8c16c6ba62..30bdf8ee1f 100644 --- a/var/spack/repos/builtin/packages/r-colorspace/package.py +++ b/var/spack/repos/builtin/packages/r-colorspace/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-corpcor/package.py b/var/spack/repos/builtin/packages/r-corpcor/package.py index 09798cbd2d..2e97c78cef 100644 --- a/var/spack/repos/builtin/packages/r-corpcor/package.py +++ b/var/spack/repos/builtin/packages/r-corpcor/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-corrplot/package.py b/var/spack/repos/builtin/packages/r-corrplot/package.py index 1fdaf194db..9a7612d7c3 100644 --- a/var/spack/repos/builtin/packages/r-corrplot/package.py +++ b/var/spack/repos/builtin/packages/r-corrplot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-crayon/package.py b/var/spack/repos/builtin/packages/r-crayon/package.py index d40942e887..bc35add9ff 100644 --- a/var/spack/repos/builtin/packages/r-crayon/package.py +++ b/var/spack/repos/builtin/packages/r-crayon/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-cubature/package.py b/var/spack/repos/builtin/packages/r-cubature/package.py index 3f436ef847..41bed75080 100644 --- a/var/spack/repos/builtin/packages/r-cubature/package.py +++ b/var/spack/repos/builtin/packages/r-cubature/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-cubist/package.py b/var/spack/repos/builtin/packages/r-cubist/package.py index 9c50c57c38..771045e4e6 100644 --- a/var/spack/repos/builtin/packages/r-cubist/package.py +++ b/var/spack/repos/builtin/packages/r-cubist/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-curl/package.py b/var/spack/repos/builtin/packages/r-curl/package.py index 91bd22e267..676e3b5c90 100644 --- a/var/spack/repos/builtin/packages/r-curl/package.py +++ b/var/spack/repos/builtin/packages/r-curl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-data-table/package.py b/var/spack/repos/builtin/packages/r-data-table/package.py index db76130599..36997d7268 100644 --- a/var/spack/repos/builtin/packages/r-data-table/package.py +++ b/var/spack/repos/builtin/packages/r-data-table/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-dbi/package.py b/var/spack/repos/builtin/packages/r-dbi/package.py index 06477a7bb6..e6f37bd592 100644 --- a/var/spack/repos/builtin/packages/r-dbi/package.py +++ b/var/spack/repos/builtin/packages/r-dbi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-deldir/package.py b/var/spack/repos/builtin/packages/r-deldir/package.py index 1bc8341241..af7869ae87 100644 --- a/var/spack/repos/builtin/packages/r-deldir/package.py +++ b/var/spack/repos/builtin/packages/r-deldir/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-dendextend/package.py b/var/spack/repos/builtin/packages/r-dendextend/package.py index 33a4fb9563..b1750f8670 100644 --- a/var/spack/repos/builtin/packages/r-dendextend/package.py +++ b/var/spack/repos/builtin/packages/r-dendextend/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-deoptim/package.py b/var/spack/repos/builtin/packages/r-deoptim/package.py index 5c55bcc160..5f62b426b9 100644 --- a/var/spack/repos/builtin/packages/r-deoptim/package.py +++ b/var/spack/repos/builtin/packages/r-deoptim/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-deoptimr/package.py b/var/spack/repos/builtin/packages/r-deoptimr/package.py index fa028e5fbf..f47e7046ad 100644 --- a/var/spack/repos/builtin/packages/r-deoptimr/package.py +++ b/var/spack/repos/builtin/packages/r-deoptimr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-devtools/package.py b/var/spack/repos/builtin/packages/r-devtools/package.py index ed5515185f..8f21e62eeb 100644 --- a/var/spack/repos/builtin/packages/r-devtools/package.py +++ b/var/spack/repos/builtin/packages/r-devtools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-diagrammer/package.py b/var/spack/repos/builtin/packages/r-diagrammer/package.py index ada1cb2776..cdf75e260d 100644 --- a/var/spack/repos/builtin/packages/r-diagrammer/package.py +++ b/var/spack/repos/builtin/packages/r-diagrammer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-dichromat/package.py b/var/spack/repos/builtin/packages/r-dichromat/package.py index 0c51cc8947..931c50bcfe 100644 --- a/var/spack/repos/builtin/packages/r-dichromat/package.py +++ b/var/spack/repos/builtin/packages/r-dichromat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-digest/package.py b/var/spack/repos/builtin/packages/r-digest/package.py index 9f68dec358..0964212124 100644 --- a/var/spack/repos/builtin/packages/r-digest/package.py +++ b/var/spack/repos/builtin/packages/r-digest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-diptest/package.py b/var/spack/repos/builtin/packages/r-diptest/package.py index aca82156b8..b21955fdc6 100644 --- a/var/spack/repos/builtin/packages/r-diptest/package.py +++ b/var/spack/repos/builtin/packages/r-diptest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-domc/package.py b/var/spack/repos/builtin/packages/r-domc/package.py index 51e174185b..9b5ce2cd42 100644 --- a/var/spack/repos/builtin/packages/r-domc/package.py +++ b/var/spack/repos/builtin/packages/r-domc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-doparallel/package.py b/var/spack/repos/builtin/packages/r-doparallel/package.py index 83e7c98476..86e886f6e5 100644 --- a/var/spack/repos/builtin/packages/r-doparallel/package.py +++ b/var/spack/repos/builtin/packages/r-doparallel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-dplyr/package.py b/var/spack/repos/builtin/packages/r-dplyr/package.py index bb05d9cea4..bd99fc137f 100644 --- a/var/spack/repos/builtin/packages/r-dplyr/package.py +++ b/var/spack/repos/builtin/packages/r-dplyr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-dt/package.py b/var/spack/repos/builtin/packages/r-dt/package.py index 473d5e1be5..6284137ffb 100644 --- a/var/spack/repos/builtin/packages/r-dt/package.py +++ b/var/spack/repos/builtin/packages/r-dt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-dygraphs/package.py b/var/spack/repos/builtin/packages/r-dygraphs/package.py index 63304451b6..eff42c1464 100644 --- a/var/spack/repos/builtin/packages/r-dygraphs/package.py +++ b/var/spack/repos/builtin/packages/r-dygraphs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-e1071/package.py b/var/spack/repos/builtin/packages/r-e1071/package.py index 19dd5b5466..8c7729b624 100644 --- a/var/spack/repos/builtin/packages/r-e1071/package.py +++ b/var/spack/repos/builtin/packages/r-e1071/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ellipse/package.py b/var/spack/repos/builtin/packages/r-ellipse/package.py index 686da16b0b..55f2e078e4 100644 --- a/var/spack/repos/builtin/packages/r-ellipse/package.py +++ b/var/spack/repos/builtin/packages/r-ellipse/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ergm/package.py b/var/spack/repos/builtin/packages/r-ergm/package.py index ae254dca43..ea89c615f8 100644 --- a/var/spack/repos/builtin/packages/r-ergm/package.py +++ b/var/spack/repos/builtin/packages/r-ergm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-evaluate/package.py b/var/spack/repos/builtin/packages/r-evaluate/package.py index 6bb5ed8e95..918f1e11bc 100644 --- a/var/spack/repos/builtin/packages/r-evaluate/package.py +++ b/var/spack/repos/builtin/packages/r-evaluate/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-expm/package.py b/var/spack/repos/builtin/packages/r-expm/package.py index f819a07641..431981d739 100644 --- a/var/spack/repos/builtin/packages/r-expm/package.py +++ b/var/spack/repos/builtin/packages/r-expm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-factoextra/package.py b/var/spack/repos/builtin/packages/r-factoextra/package.py index ed42193f92..fcba342af6 100644 --- a/var/spack/repos/builtin/packages/r-factoextra/package.py +++ b/var/spack/repos/builtin/packages/r-factoextra/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-factominer/package.py b/var/spack/repos/builtin/packages/r-factominer/package.py index de5668b311..7d4eb40eae 100644 --- a/var/spack/repos/builtin/packages/r-factominer/package.py +++ b/var/spack/repos/builtin/packages/r-factominer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-filehash/package.py b/var/spack/repos/builtin/packages/r-filehash/package.py index 4dcd3df5a3..eb16bdaae7 100644 --- a/var/spack/repos/builtin/packages/r-filehash/package.py +++ b/var/spack/repos/builtin/packages/r-filehash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-flashclust/package.py b/var/spack/repos/builtin/packages/r-flashclust/package.py index 4edb9df844..913c915c3f 100644 --- a/var/spack/repos/builtin/packages/r-flashclust/package.py +++ b/var/spack/repos/builtin/packages/r-flashclust/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-flexmix/package.py b/var/spack/repos/builtin/packages/r-flexmix/package.py index 65a3a9dc17..c40e5f5eeb 100644 --- a/var/spack/repos/builtin/packages/r-flexmix/package.py +++ b/var/spack/repos/builtin/packages/r-flexmix/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-foreach/package.py b/var/spack/repos/builtin/packages/r-foreach/package.py index 166a9f20cb..f2a75125bf 100644 --- a/var/spack/repos/builtin/packages/r-foreach/package.py +++ b/var/spack/repos/builtin/packages/r-foreach/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-foreign/package.py b/var/spack/repos/builtin/packages/r-foreign/package.py index 45845234e0..687b970744 100644 --- a/var/spack/repos/builtin/packages/r-foreign/package.py +++ b/var/spack/repos/builtin/packages/r-foreign/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-formatr/package.py b/var/spack/repos/builtin/packages/r-formatr/package.py index d1609ad718..5f1aba7997 100644 --- a/var/spack/repos/builtin/packages/r-formatr/package.py +++ b/var/spack/repos/builtin/packages/r-formatr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-formula/package.py b/var/spack/repos/builtin/packages/r-formula/package.py index 5d7b7119dd..5ce97399a8 100644 --- a/var/spack/repos/builtin/packages/r-formula/package.py +++ b/var/spack/repos/builtin/packages/r-formula/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-fpc/package.py b/var/spack/repos/builtin/packages/r-fpc/package.py index e8fff8c067..eb14ea1102 100644 --- a/var/spack/repos/builtin/packages/r-fpc/package.py +++ b/var/spack/repos/builtin/packages/r-fpc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gdata/package.py b/var/spack/repos/builtin/packages/r-gdata/package.py index 79ea4baeff..5765313157 100644 --- a/var/spack/repos/builtin/packages/r-gdata/package.py +++ b/var/spack/repos/builtin/packages/r-gdata/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-geosphere/package.py b/var/spack/repos/builtin/packages/r-geosphere/package.py index a338d4b112..89222b0986 100644 --- a/var/spack/repos/builtin/packages/r-geosphere/package.py +++ b/var/spack/repos/builtin/packages/r-geosphere/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ggmap/package.py b/var/spack/repos/builtin/packages/r-ggmap/package.py index b7cb033d6f..d921c0944e 100644 --- a/var/spack/repos/builtin/packages/r-ggmap/package.py +++ b/var/spack/repos/builtin/packages/r-ggmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ggplot2/package.py b/var/spack/repos/builtin/packages/r-ggplot2/package.py index c8ee8acea6..1063b81392 100644 --- a/var/spack/repos/builtin/packages/r-ggplot2/package.py +++ b/var/spack/repos/builtin/packages/r-ggplot2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ggpubr/package.py b/var/spack/repos/builtin/packages/r-ggpubr/package.py index bdf8774e28..e3543c4c42 100644 --- a/var/spack/repos/builtin/packages/r-ggpubr/package.py +++ b/var/spack/repos/builtin/packages/r-ggpubr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ggrepel/package.py b/var/spack/repos/builtin/packages/r-ggrepel/package.py index 52baa0b077..35d0df5927 100644 --- a/var/spack/repos/builtin/packages/r-ggrepel/package.py +++ b/var/spack/repos/builtin/packages/r-ggrepel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ggsci/package.py b/var/spack/repos/builtin/packages/r-ggsci/package.py index 8df9c21de8..d8dfa0e24b 100644 --- a/var/spack/repos/builtin/packages/r-ggsci/package.py +++ b/var/spack/repos/builtin/packages/r-ggsci/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ggvis/package.py b/var/spack/repos/builtin/packages/r-ggvis/package.py index d527d2a93a..8cfdfe533a 100644 --- a/var/spack/repos/builtin/packages/r-ggvis/package.py +++ b/var/spack/repos/builtin/packages/r-ggvis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gistr/package.py b/var/spack/repos/builtin/packages/r-gistr/package.py index d8e89722e9..344d03db78 100644 --- a/var/spack/repos/builtin/packages/r-gistr/package.py +++ b/var/spack/repos/builtin/packages/r-gistr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-git2r/package.py b/var/spack/repos/builtin/packages/r-git2r/package.py index 3612d6ebb5..037a9b0fc8 100644 --- a/var/spack/repos/builtin/packages/r-git2r/package.py +++ b/var/spack/repos/builtin/packages/r-git2r/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-glmnet/package.py b/var/spack/repos/builtin/packages/r-glmnet/package.py index 8f9793ec31..f7ab38d026 100644 --- a/var/spack/repos/builtin/packages/r-glmnet/package.py +++ b/var/spack/repos/builtin/packages/r-glmnet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gmodels/package.py b/var/spack/repos/builtin/packages/r-gmodels/package.py index c703c2a521..7cf838caf7 100644 --- a/var/spack/repos/builtin/packages/r-gmodels/package.py +++ b/var/spack/repos/builtin/packages/r-gmodels/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gmp/package.py b/var/spack/repos/builtin/packages/r-gmp/package.py index 12eb85e5cc..2db8ac871e 100644 --- a/var/spack/repos/builtin/packages/r-gmp/package.py +++ b/var/spack/repos/builtin/packages/r-gmp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-googlevis/package.py b/var/spack/repos/builtin/packages/r-googlevis/package.py index 95101c3d06..9a568bd94f 100644 --- a/var/spack/repos/builtin/packages/r-googlevis/package.py +++ b/var/spack/repos/builtin/packages/r-googlevis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gridbase/package.py b/var/spack/repos/builtin/packages/r-gridbase/package.py index ab9d7ad834..1a45997ef6 100644 --- a/var/spack/repos/builtin/packages/r-gridbase/package.py +++ b/var/spack/repos/builtin/packages/r-gridbase/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gridextra/package.py b/var/spack/repos/builtin/packages/r-gridextra/package.py index 9ae3af3026..752c5374db 100644 --- a/var/spack/repos/builtin/packages/r-gridextra/package.py +++ b/var/spack/repos/builtin/packages/r-gridextra/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gtable/package.py b/var/spack/repos/builtin/packages/r-gtable/package.py index 2bb1c713e7..f7c120c9e1 100644 --- a/var/spack/repos/builtin/packages/r-gtable/package.py +++ b/var/spack/repos/builtin/packages/r-gtable/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-gtools/package.py b/var/spack/repos/builtin/packages/r-gtools/package.py index 3e6f5949d2..f81590ab75 100644 --- a/var/spack/repos/builtin/packages/r-gtools/package.py +++ b/var/spack/repos/builtin/packages/r-gtools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-hexbin/package.py b/var/spack/repos/builtin/packages/r-hexbin/package.py index 018d5e24ce..0442fc3165 100644 --- a/var/spack/repos/builtin/packages/r-hexbin/package.py +++ b/var/spack/repos/builtin/packages/r-hexbin/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-highr/package.py b/var/spack/repos/builtin/packages/r-highr/package.py index 0fa7a850df..ed24a290d6 100644 --- a/var/spack/repos/builtin/packages/r-highr/package.py +++ b/var/spack/repos/builtin/packages/r-highr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-htmltools/package.py b/var/spack/repos/builtin/packages/r-htmltools/package.py index c679c51b0e..68fc94504c 100644 --- a/var/spack/repos/builtin/packages/r-htmltools/package.py +++ b/var/spack/repos/builtin/packages/r-htmltools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-htmlwidgets/package.py b/var/spack/repos/builtin/packages/r-htmlwidgets/package.py index bf624e7639..03db018c9c 100644 --- a/var/spack/repos/builtin/packages/r-htmlwidgets/package.py +++ b/var/spack/repos/builtin/packages/r-htmlwidgets/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-httpuv/package.py b/var/spack/repos/builtin/packages/r-httpuv/package.py index 93d8508300..a3f73fb61f 100644 --- a/var/spack/repos/builtin/packages/r-httpuv/package.py +++ b/var/spack/repos/builtin/packages/r-httpuv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-httr/package.py b/var/spack/repos/builtin/packages/r-httr/package.py index e976a30f7c..5e0ca16c19 100644 --- a/var/spack/repos/builtin/packages/r-httr/package.py +++ b/var/spack/repos/builtin/packages/r-httr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-igraph/package.py b/var/spack/repos/builtin/packages/r-igraph/package.py index 0e8177d84e..cc2186003d 100644 --- a/var/spack/repos/builtin/packages/r-igraph/package.py +++ b/var/spack/repos/builtin/packages/r-igraph/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-influencer/package.py b/var/spack/repos/builtin/packages/r-influencer/package.py index ca17e900d9..8ecaaafde9 100644 --- a/var/spack/repos/builtin/packages/r-influencer/package.py +++ b/var/spack/repos/builtin/packages/r-influencer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-inline/package.py b/var/spack/repos/builtin/packages/r-inline/package.py index 3ddd145cae..5314cd7ea8 100644 --- a/var/spack/repos/builtin/packages/r-inline/package.py +++ b/var/spack/repos/builtin/packages/r-inline/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ipred/package.py b/var/spack/repos/builtin/packages/r-ipred/package.py index c3aa0e0d40..4bb4e871bd 100644 --- a/var/spack/repos/builtin/packages/r-ipred/package.py +++ b/var/spack/repos/builtin/packages/r-ipred/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-irdisplay/package.py b/var/spack/repos/builtin/packages/r-irdisplay/package.py index 1896eccf6d..6e99a0ab8a 100644 --- a/var/spack/repos/builtin/packages/r-irdisplay/package.py +++ b/var/spack/repos/builtin/packages/r-irdisplay/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-irkernel/package.py b/var/spack/repos/builtin/packages/r-irkernel/package.py index 1ea52dedad..87ab0abb17 100644 --- a/var/spack/repos/builtin/packages/r-irkernel/package.py +++ b/var/spack/repos/builtin/packages/r-irkernel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-irlba/package.py b/var/spack/repos/builtin/packages/r-irlba/package.py index aea557cd3f..14d08e8c43 100644 --- a/var/spack/repos/builtin/packages/r-irlba/package.py +++ b/var/spack/repos/builtin/packages/r-irlba/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-iterators/package.py b/var/spack/repos/builtin/packages/r-iterators/package.py index 6561a471f0..6c3d208eba 100644 --- a/var/spack/repos/builtin/packages/r-iterators/package.py +++ b/var/spack/repos/builtin/packages/r-iterators/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-jpeg/package.py b/var/spack/repos/builtin/packages/r-jpeg/package.py index 13a96d50e2..80f6e09017 100644 --- a/var/spack/repos/builtin/packages/r-jpeg/package.py +++ b/var/spack/repos/builtin/packages/r-jpeg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-jsonlite/package.py b/var/spack/repos/builtin/packages/r-jsonlite/package.py index 364966c9c1..a58059c537 100644 --- a/var/spack/repos/builtin/packages/r-jsonlite/package.py +++ b/var/spack/repos/builtin/packages/r-jsonlite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-kernlab/package.py b/var/spack/repos/builtin/packages/r-kernlab/package.py index fc336e6c8c..943902844c 100644 --- a/var/spack/repos/builtin/packages/r-kernlab/package.py +++ b/var/spack/repos/builtin/packages/r-kernlab/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-kernsmooth/package.py b/var/spack/repos/builtin/packages/r-kernsmooth/package.py index e72c299919..6cf4119079 100644 --- a/var/spack/repos/builtin/packages/r-kernsmooth/package.py +++ b/var/spack/repos/builtin/packages/r-kernsmooth/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-kknn/package.py b/var/spack/repos/builtin/packages/r-kknn/package.py index 27824c7fdb..4ee2cdeacd 100644 --- a/var/spack/repos/builtin/packages/r-kknn/package.py +++ b/var/spack/repos/builtin/packages/r-kknn/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-knitr/package.py b/var/spack/repos/builtin/packages/r-knitr/package.py index 71e95b49f2..0b214a11eb 100644 --- a/var/spack/repos/builtin/packages/r-knitr/package.py +++ b/var/spack/repos/builtin/packages/r-knitr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-labeling/package.py b/var/spack/repos/builtin/packages/r-labeling/package.py index 7a57909787..c2cfdf8712 100644 --- a/var/spack/repos/builtin/packages/r-labeling/package.py +++ b/var/spack/repos/builtin/packages/r-labeling/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-laplacesdemon/package.py b/var/spack/repos/builtin/packages/r-laplacesdemon/package.py index 61aca6b9d8..7f245db1a0 100644 --- a/var/spack/repos/builtin/packages/r-laplacesdemon/package.py +++ b/var/spack/repos/builtin/packages/r-laplacesdemon/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lattice/package.py b/var/spack/repos/builtin/packages/r-lattice/package.py index faefc2de0f..6c1532ee53 100644 --- a/var/spack/repos/builtin/packages/r-lattice/package.py +++ b/var/spack/repos/builtin/packages/r-lattice/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lava/package.py b/var/spack/repos/builtin/packages/r-lava/package.py index e3aef589b2..4616e0a23a 100644 --- a/var/spack/repos/builtin/packages/r-lava/package.py +++ b/var/spack/repos/builtin/packages/r-lava/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lazyeval/package.py b/var/spack/repos/builtin/packages/r-lazyeval/package.py index a48a06f38f..19d8b0b6bd 100644 --- a/var/spack/repos/builtin/packages/r-lazyeval/package.py +++ b/var/spack/repos/builtin/packages/r-lazyeval/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-leaflet/package.py b/var/spack/repos/builtin/packages/r-leaflet/package.py index b7f39992bd..002703313a 100644 --- a/var/spack/repos/builtin/packages/r-leaflet/package.py +++ b/var/spack/repos/builtin/packages/r-leaflet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-leaps/package.py b/var/spack/repos/builtin/packages/r-leaps/package.py index 9ac7875b37..097e503903 100644 --- a/var/spack/repos/builtin/packages/r-leaps/package.py +++ b/var/spack/repos/builtin/packages/r-leaps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-learnbayes/package.py b/var/spack/repos/builtin/packages/r-learnbayes/package.py index d4a6fa42fa..4eb01c23d6 100644 --- a/var/spack/repos/builtin/packages/r-learnbayes/package.py +++ b/var/spack/repos/builtin/packages/r-learnbayes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lme4/package.py b/var/spack/repos/builtin/packages/r-lme4/package.py index c06e319273..c7d4e815e3 100644 --- a/var/spack/repos/builtin/packages/r-lme4/package.py +++ b/var/spack/repos/builtin/packages/r-lme4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lmtest/package.py b/var/spack/repos/builtin/packages/r-lmtest/package.py index 27fe98f0f8..a9871f2cc4 100644 --- a/var/spack/repos/builtin/packages/r-lmtest/package.py +++ b/var/spack/repos/builtin/packages/r-lmtest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lpsolve/package.py b/var/spack/repos/builtin/packages/r-lpsolve/package.py index 5f694f6f6d..215ee38c93 100644 --- a/var/spack/repos/builtin/packages/r-lpsolve/package.py +++ b/var/spack/repos/builtin/packages/r-lpsolve/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-lubridate/package.py b/var/spack/repos/builtin/packages/r-lubridate/package.py index 5e2f6f0d05..4983b06a12 100644 --- a/var/spack/repos/builtin/packages/r-lubridate/package.py +++ b/var/spack/repos/builtin/packages/r-lubridate/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-magic/package.py b/var/spack/repos/builtin/packages/r-magic/package.py index 3844584c68..84ddac9ad7 100644 --- a/var/spack/repos/builtin/packages/r-magic/package.py +++ b/var/spack/repos/builtin/packages/r-magic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-magrittr/package.py b/var/spack/repos/builtin/packages/r-magrittr/package.py index 33cc9b178c..6bb8dce442 100644 --- a/var/spack/repos/builtin/packages/r-magrittr/package.py +++ b/var/spack/repos/builtin/packages/r-magrittr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mapproj/package.py b/var/spack/repos/builtin/packages/r-mapproj/package.py index 590ff0c9bd..4eca2c2a41 100644 --- a/var/spack/repos/builtin/packages/r-mapproj/package.py +++ b/var/spack/repos/builtin/packages/r-mapproj/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-maps/package.py b/var/spack/repos/builtin/packages/r-maps/package.py index 9c526c80df..49095012ad 100644 --- a/var/spack/repos/builtin/packages/r-maps/package.py +++ b/var/spack/repos/builtin/packages/r-maps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-maptools/package.py b/var/spack/repos/builtin/packages/r-maptools/package.py index 217af81541..d09a5a4fa7 100644 --- a/var/spack/repos/builtin/packages/r-maptools/package.py +++ b/var/spack/repos/builtin/packages/r-maptools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-markdown/package.py b/var/spack/repos/builtin/packages/r-markdown/package.py index e44d67aa33..0e956f6d4c 100644 --- a/var/spack/repos/builtin/packages/r-markdown/package.py +++ b/var/spack/repos/builtin/packages/r-markdown/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mass/package.py b/var/spack/repos/builtin/packages/r-mass/package.py index 873376c26f..5620b4b11b 100644 --- a/var/spack/repos/builtin/packages/r-mass/package.py +++ b/var/spack/repos/builtin/packages/r-mass/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-matrix/package.py b/var/spack/repos/builtin/packages/r-matrix/package.py index 7f30d58446..e6014d5102 100644 --- a/var/spack/repos/builtin/packages/r-matrix/package.py +++ b/var/spack/repos/builtin/packages/r-matrix/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-matrixmodels/package.py b/var/spack/repos/builtin/packages/r-matrixmodels/package.py index 1707453552..5b201a6bbf 100644 --- a/var/spack/repos/builtin/packages/r-matrixmodels/package.py +++ b/var/spack/repos/builtin/packages/r-matrixmodels/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mclust/package.py b/var/spack/repos/builtin/packages/r-mclust/package.py index 9c5f3dd4b0..1b3b3c1701 100644 --- a/var/spack/repos/builtin/packages/r-mclust/package.py +++ b/var/spack/repos/builtin/packages/r-mclust/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mda/package.py b/var/spack/repos/builtin/packages/r-mda/package.py index 079c2a1a5a..e7b124195b 100644 --- a/var/spack/repos/builtin/packages/r-mda/package.py +++ b/var/spack/repos/builtin/packages/r-mda/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-memoise/package.py b/var/spack/repos/builtin/packages/r-memoise/package.py index 9c507391da..c8402fd7d1 100644 --- a/var/spack/repos/builtin/packages/r-memoise/package.py +++ b/var/spack/repos/builtin/packages/r-memoise/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mgcv/package.py b/var/spack/repos/builtin/packages/r-mgcv/package.py index 3a879971ff..1b0c1dc872 100644 --- a/var/spack/repos/builtin/packages/r-mgcv/package.py +++ b/var/spack/repos/builtin/packages/r-mgcv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mime/package.py b/var/spack/repos/builtin/packages/r-mime/package.py index db490bd24d..b0a7ed2f65 100644 --- a/var/spack/repos/builtin/packages/r-mime/package.py +++ b/var/spack/repos/builtin/packages/r-mime/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-minqa/package.py b/var/spack/repos/builtin/packages/r-minqa/package.py index 47fa0620ce..1af935c2d1 100644 --- a/var/spack/repos/builtin/packages/r-minqa/package.py +++ b/var/spack/repos/builtin/packages/r-minqa/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mlbench/package.py b/var/spack/repos/builtin/packages/r-mlbench/package.py index 98366d9fa8..bee3b4006c 100644 --- a/var/spack/repos/builtin/packages/r-mlbench/package.py +++ b/var/spack/repos/builtin/packages/r-mlbench/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-modelmetrics/package.py b/var/spack/repos/builtin/packages/r-modelmetrics/package.py index 99cb924433..e8f4eb5c35 100644 --- a/var/spack/repos/builtin/packages/r-modelmetrics/package.py +++ b/var/spack/repos/builtin/packages/r-modelmetrics/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-modeltools/package.py b/var/spack/repos/builtin/packages/r-modeltools/package.py index a77bb04805..8d5156cc54 100644 --- a/var/spack/repos/builtin/packages/r-modeltools/package.py +++ b/var/spack/repos/builtin/packages/r-modeltools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-multcomp/package.py b/var/spack/repos/builtin/packages/r-multcomp/package.py index acaba46b51..67b7f48cd9 100644 --- a/var/spack/repos/builtin/packages/r-multcomp/package.py +++ b/var/spack/repos/builtin/packages/r-multcomp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-munsell/package.py b/var/spack/repos/builtin/packages/r-munsell/package.py index fa635782e1..5f5d341b9f 100644 --- a/var/spack/repos/builtin/packages/r-munsell/package.py +++ b/var/spack/repos/builtin/packages/r-munsell/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-mvtnorm/package.py b/var/spack/repos/builtin/packages/r-mvtnorm/package.py index 2df9206a63..98bdee82b5 100644 --- a/var/spack/repos/builtin/packages/r-mvtnorm/package.py +++ b/var/spack/repos/builtin/packages/r-mvtnorm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ncdf4/package.py b/var/spack/repos/builtin/packages/r-ncdf4/package.py index 31b2f4f2ee..27be190065 100644 --- a/var/spack/repos/builtin/packages/r-ncdf4/package.py +++ b/var/spack/repos/builtin/packages/r-ncdf4/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-network/package.py b/var/spack/repos/builtin/packages/r-network/package.py index c561cb1932..c441bbd15a 100644 --- a/var/spack/repos/builtin/packages/r-network/package.py +++ b/var/spack/repos/builtin/packages/r-network/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-networkd3/package.py b/var/spack/repos/builtin/packages/r-networkd3/package.py index 68501bba52..5d92d76956 100644 --- a/var/spack/repos/builtin/packages/r-networkd3/package.py +++ b/var/spack/repos/builtin/packages/r-networkd3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-nlme/package.py b/var/spack/repos/builtin/packages/r-nlme/package.py index 68f4a7d74e..3deb7f1a58 100644 --- a/var/spack/repos/builtin/packages/r-nlme/package.py +++ b/var/spack/repos/builtin/packages/r-nlme/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-nloptr/package.py b/var/spack/repos/builtin/packages/r-nloptr/package.py index edf19e653f..110cb8c406 100644 --- a/var/spack/repos/builtin/packages/r-nloptr/package.py +++ b/var/spack/repos/builtin/packages/r-nloptr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-nmf/package.py b/var/spack/repos/builtin/packages/r-nmf/package.py index 5911652eda..8edb0b810e 100644 --- a/var/spack/repos/builtin/packages/r-nmf/package.py +++ b/var/spack/repos/builtin/packages/r-nmf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-nnet/package.py b/var/spack/repos/builtin/packages/r-nnet/package.py index 75b9be602d..48a223fdf4 100644 --- a/var/spack/repos/builtin/packages/r-nnet/package.py +++ b/var/spack/repos/builtin/packages/r-nnet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-np/package.py b/var/spack/repos/builtin/packages/r-np/package.py index 4f45314f0b..ec88a4f557 100644 --- a/var/spack/repos/builtin/packages/r-np/package.py +++ b/var/spack/repos/builtin/packages/r-np/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-numderiv/package.py b/var/spack/repos/builtin/packages/r-numderiv/package.py index a6a5b0bcc1..8cb2c063c7 100644 --- a/var/spack/repos/builtin/packages/r-numderiv/package.py +++ b/var/spack/repos/builtin/packages/r-numderiv/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-openssl/package.py b/var/spack/repos/builtin/packages/r-openssl/package.py index ae5eca3f5a..e33f8bce17 100644 --- a/var/spack/repos/builtin/packages/r-openssl/package.py +++ b/var/spack/repos/builtin/packages/r-openssl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-packrat/package.py b/var/spack/repos/builtin/packages/r-packrat/package.py index 123ceb5caa..4fb9c7ee71 100644 --- a/var/spack/repos/builtin/packages/r-packrat/package.py +++ b/var/spack/repos/builtin/packages/r-packrat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-pacman/package.py b/var/spack/repos/builtin/packages/r-pacman/package.py index 41c9efbc5c..c40fd90f73 100644 --- a/var/spack/repos/builtin/packages/r-pacman/package.py +++ b/var/spack/repos/builtin/packages/r-pacman/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-party/package.py b/var/spack/repos/builtin/packages/r-party/package.py index d0b39a681e..5e7e893375 100644 --- a/var/spack/repos/builtin/packages/r-party/package.py +++ b/var/spack/repos/builtin/packages/r-party/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-partykit/package.py b/var/spack/repos/builtin/packages/r-partykit/package.py index 188507e44d..8371c1f32e 100644 --- a/var/spack/repos/builtin/packages/r-partykit/package.py +++ b/var/spack/repos/builtin/packages/r-partykit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-pbdzmq/package.py b/var/spack/repos/builtin/packages/r-pbdzmq/package.py index 42f7f19351..065a23534a 100644 --- a/var/spack/repos/builtin/packages/r-pbdzmq/package.py +++ b/var/spack/repos/builtin/packages/r-pbdzmq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-pbkrtest/package.py b/var/spack/repos/builtin/packages/r-pbkrtest/package.py index 41971003db..a969e99440 100644 --- a/var/spack/repos/builtin/packages/r-pbkrtest/package.py +++ b/var/spack/repos/builtin/packages/r-pbkrtest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-permute/package.py b/var/spack/repos/builtin/packages/r-permute/package.py index 25a3161713..ac994eb4fb 100644 --- a/var/spack/repos/builtin/packages/r-permute/package.py +++ b/var/spack/repos/builtin/packages/r-permute/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-pkgmaker/package.py b/var/spack/repos/builtin/packages/r-pkgmaker/package.py index a1ea734f1d..66b75ff428 100644 --- a/var/spack/repos/builtin/packages/r-pkgmaker/package.py +++ b/var/spack/repos/builtin/packages/r-pkgmaker/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-plotrix/package.py b/var/spack/repos/builtin/packages/r-plotrix/package.py index 0fcb7c29af..743f4f39ee 100644 --- a/var/spack/repos/builtin/packages/r-plotrix/package.py +++ b/var/spack/repos/builtin/packages/r-plotrix/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-pls/package.py b/var/spack/repos/builtin/packages/r-pls/package.py index cf9c763959..9166c9dcb7 100644 --- a/var/spack/repos/builtin/packages/r-pls/package.py +++ b/var/spack/repos/builtin/packages/r-pls/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-plyr/package.py b/var/spack/repos/builtin/packages/r-plyr/package.py index eef6e9fd0f..52b18fcd21 100644 --- a/var/spack/repos/builtin/packages/r-plyr/package.py +++ b/var/spack/repos/builtin/packages/r-plyr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-png/package.py b/var/spack/repos/builtin/packages/r-png/package.py index 9fdfbec533..f273818326 100644 --- a/var/spack/repos/builtin/packages/r-png/package.py +++ b/var/spack/repos/builtin/packages/r-png/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-prabclus/package.py b/var/spack/repos/builtin/packages/r-prabclus/package.py index 3ef75d85fc..a6375e9bd4 100644 --- a/var/spack/repos/builtin/packages/r-prabclus/package.py +++ b/var/spack/repos/builtin/packages/r-prabclus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-praise/package.py b/var/spack/repos/builtin/packages/r-praise/package.py index 05650efc47..5ae2cb8e5b 100644 --- a/var/spack/repos/builtin/packages/r-praise/package.py +++ b/var/spack/repos/builtin/packages/r-praise/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-prodlim/package.py b/var/spack/repos/builtin/packages/r-prodlim/package.py index 34634839ba..1321d49ce0 100644 --- a/var/spack/repos/builtin/packages/r-prodlim/package.py +++ b/var/spack/repos/builtin/packages/r-prodlim/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-proto/package.py b/var/spack/repos/builtin/packages/r-proto/package.py index efb90b9914..c07ec021fe 100644 --- a/var/spack/repos/builtin/packages/r-proto/package.py +++ b/var/spack/repos/builtin/packages/r-proto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-pryr/package.py b/var/spack/repos/builtin/packages/r-pryr/package.py index cae4a8af8e..e2154423c1 100644 --- a/var/spack/repos/builtin/packages/r-pryr/package.py +++ b/var/spack/repos/builtin/packages/r-pryr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-quadprog/package.py b/var/spack/repos/builtin/packages/r-quadprog/package.py index ff4fa300eb..125cba3282 100644 --- a/var/spack/repos/builtin/packages/r-quadprog/package.py +++ b/var/spack/repos/builtin/packages/r-quadprog/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-quantmod/package.py b/var/spack/repos/builtin/packages/r-quantmod/package.py index b52bc8a57a..7a1b0a43c3 100644 --- a/var/spack/repos/builtin/packages/r-quantmod/package.py +++ b/var/spack/repos/builtin/packages/r-quantmod/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-quantreg/package.py b/var/spack/repos/builtin/packages/r-quantreg/package.py index 3d9a04c290..fec25aede1 100644 --- a/var/spack/repos/builtin/packages/r-quantreg/package.py +++ b/var/spack/repos/builtin/packages/r-quantreg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-r6/package.py b/var/spack/repos/builtin/packages/r-r6/package.py index 01a2feda21..5f5b10d9cc 100644 --- a/var/spack/repos/builtin/packages/r-r6/package.py +++ b/var/spack/repos/builtin/packages/r-r6/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-randomforest/package.py b/var/spack/repos/builtin/packages/r-randomforest/package.py index 85d7473486..3b9dc87b1c 100644 --- a/var/spack/repos/builtin/packages/r-randomforest/package.py +++ b/var/spack/repos/builtin/packages/r-randomforest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-raster/package.py b/var/spack/repos/builtin/packages/r-raster/package.py index 73a1b38b5a..c8a2b7088b 100644 --- a/var/spack/repos/builtin/packages/r-raster/package.py +++ b/var/spack/repos/builtin/packages/r-raster/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rbokeh/package.py b/var/spack/repos/builtin/packages/r-rbokeh/package.py index 12173b3077..5bdc15402b 100644 --- a/var/spack/repos/builtin/packages/r-rbokeh/package.py +++ b/var/spack/repos/builtin/packages/r-rbokeh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py b/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py index c6b888d6d6..4adc8eef3c 100644 --- a/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py +++ b/var/spack/repos/builtin/packages/r-rcolorbrewer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rcpp/package.py b/var/spack/repos/builtin/packages/r-rcpp/package.py index b77fffb1a0..2a9f7c4ced 100644 --- a/var/spack/repos/builtin/packages/r-rcpp/package.py +++ b/var/spack/repos/builtin/packages/r-rcpp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rcppeigen/package.py b/var/spack/repos/builtin/packages/r-rcppeigen/package.py index de604f8322..3f38e21b0b 100644 --- a/var/spack/repos/builtin/packages/r-rcppeigen/package.py +++ b/var/spack/repos/builtin/packages/r-rcppeigen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-registry/package.py b/var/spack/repos/builtin/packages/r-registry/package.py index db1a369739..1197b56a1b 100644 --- a/var/spack/repos/builtin/packages/r-registry/package.py +++ b/var/spack/repos/builtin/packages/r-registry/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-repr/package.py b/var/spack/repos/builtin/packages/r-repr/package.py index c42bea87df..e4eb9d0110 100644 --- a/var/spack/repos/builtin/packages/r-repr/package.py +++ b/var/spack/repos/builtin/packages/r-repr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-reshape2/package.py b/var/spack/repos/builtin/packages/r-reshape2/package.py index 1b53e94e80..400dfcbfe7 100644 --- a/var/spack/repos/builtin/packages/r-reshape2/package.py +++ b/var/spack/repos/builtin/packages/r-reshape2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rgl/package.py b/var/spack/repos/builtin/packages/r-rgl/package.py index 099702e2ed..12c82f32b4 100644 --- a/var/spack/repos/builtin/packages/r-rgl/package.py +++ b/var/spack/repos/builtin/packages/r-rgl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rgooglemaps/package.py b/var/spack/repos/builtin/packages/r-rgooglemaps/package.py index cfe19257fb..aee89fdc93 100644 --- a/var/spack/repos/builtin/packages/r-rgooglemaps/package.py +++ b/var/spack/repos/builtin/packages/r-rgooglemaps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rinside/package.py b/var/spack/repos/builtin/packages/r-rinside/package.py index 759910a859..81574e579e 100644 --- a/var/spack/repos/builtin/packages/r-rinside/package.py +++ b/var/spack/repos/builtin/packages/r-rinside/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rjava/package.py b/var/spack/repos/builtin/packages/r-rjava/package.py index 55d8282cd7..9a5d4887be 100644 --- a/var/spack/repos/builtin/packages/r-rjava/package.py +++ b/var/spack/repos/builtin/packages/r-rjava/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rjson/package.py b/var/spack/repos/builtin/packages/r-rjson/package.py index 1fbf94ccbf..cd873cab84 100644 --- a/var/spack/repos/builtin/packages/r-rjson/package.py +++ b/var/spack/repos/builtin/packages/r-rjson/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rjsonio/package.py b/var/spack/repos/builtin/packages/r-rjsonio/package.py index c57846395e..7db3fa5b84 100644 --- a/var/spack/repos/builtin/packages/r-rjsonio/package.py +++ b/var/spack/repos/builtin/packages/r-rjsonio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rmarkdown/package.py b/var/spack/repos/builtin/packages/r-rmarkdown/package.py index 6e1c25ef64..4a14d274aa 100644 --- a/var/spack/repos/builtin/packages/r-rmarkdown/package.py +++ b/var/spack/repos/builtin/packages/r-rmarkdown/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rminer/package.py b/var/spack/repos/builtin/packages/r-rminer/package.py index b86948b3bc..90395efedf 100644 --- a/var/spack/repos/builtin/packages/r-rminer/package.py +++ b/var/spack/repos/builtin/packages/r-rminer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rmpfr/package.py b/var/spack/repos/builtin/packages/r-rmpfr/package.py index ae419592e3..c54e2840f6 100644 --- a/var/spack/repos/builtin/packages/r-rmpfr/package.py +++ b/var/spack/repos/builtin/packages/r-rmpfr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rmpi/package.py b/var/spack/repos/builtin/packages/r-rmpi/package.py index 5f8dac889b..f096faa362 100644 --- a/var/spack/repos/builtin/packages/r-rmpi/package.py +++ b/var/spack/repos/builtin/packages/r-rmpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rmysql/package.py b/var/spack/repos/builtin/packages/r-rmysql/package.py index 5d7be1aff8..d2dc1196e3 100644 --- a/var/spack/repos/builtin/packages/r-rmysql/package.py +++ b/var/spack/repos/builtin/packages/r-rmysql/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rngtools/package.py b/var/spack/repos/builtin/packages/r-rngtools/package.py index 1f55311e97..ad38c09721 100644 --- a/var/spack/repos/builtin/packages/r-rngtools/package.py +++ b/var/spack/repos/builtin/packages/r-rngtools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-robustbase/package.py b/var/spack/repos/builtin/packages/r-robustbase/package.py index 43e6602821..35951e4bbf 100644 --- a/var/spack/repos/builtin/packages/r-robustbase/package.py +++ b/var/spack/repos/builtin/packages/r-robustbase/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rodbc/package.py b/var/spack/repos/builtin/packages/r-rodbc/package.py index cfd7470a76..10c65628c3 100644 --- a/var/spack/repos/builtin/packages/r-rodbc/package.py +++ b/var/spack/repos/builtin/packages/r-rodbc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-roxygen2/package.py b/var/spack/repos/builtin/packages/r-roxygen2/package.py index 0e23c83522..6992923bc0 100644 --- a/var/spack/repos/builtin/packages/r-roxygen2/package.py +++ b/var/spack/repos/builtin/packages/r-roxygen2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rpart-plot/package.py b/var/spack/repos/builtin/packages/r-rpart-plot/package.py index c17761f764..473dc19179 100644 --- a/var/spack/repos/builtin/packages/r-rpart-plot/package.py +++ b/var/spack/repos/builtin/packages/r-rpart-plot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rpart/package.py b/var/spack/repos/builtin/packages/r-rpart/package.py index 9d2ed2df4d..a5c894038f 100644 --- a/var/spack/repos/builtin/packages/r-rpart/package.py +++ b/var/spack/repos/builtin/packages/r-rpart/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rpostgresql/package.py b/var/spack/repos/builtin/packages/r-rpostgresql/package.py index 351b23a16e..62feca83be 100644 --- a/var/spack/repos/builtin/packages/r-rpostgresql/package.py +++ b/var/spack/repos/builtin/packages/r-rpostgresql/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rsnns/package.py b/var/spack/repos/builtin/packages/r-rsnns/package.py index b56bde343f..6e50489a1c 100644 --- a/var/spack/repos/builtin/packages/r-rsnns/package.py +++ b/var/spack/repos/builtin/packages/r-rsnns/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rsqlite/package.py b/var/spack/repos/builtin/packages/r-rsqlite/package.py index ebdc91ba7d..43f55753f7 100644 --- a/var/spack/repos/builtin/packages/r-rsqlite/package.py +++ b/var/spack/repos/builtin/packages/r-rsqlite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rstan/package.py b/var/spack/repos/builtin/packages/r-rstan/package.py index daea44437e..200de8c66d 100644 --- a/var/spack/repos/builtin/packages/r-rstan/package.py +++ b/var/spack/repos/builtin/packages/r-rstan/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rstudioapi/package.py b/var/spack/repos/builtin/packages/r-rstudioapi/package.py index 923fe4b716..dd739436ce 100644 --- a/var/spack/repos/builtin/packages/r-rstudioapi/package.py +++ b/var/spack/repos/builtin/packages/r-rstudioapi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-rzmq/package.py b/var/spack/repos/builtin/packages/r-rzmq/package.py index e4c0e95f44..1d29286b03 100644 --- a/var/spack/repos/builtin/packages/r-rzmq/package.py +++ b/var/spack/repos/builtin/packages/r-rzmq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-sandwich/package.py b/var/spack/repos/builtin/packages/r-sandwich/package.py index 3ab36537c1..862e1e7351 100644 --- a/var/spack/repos/builtin/packages/r-sandwich/package.py +++ b/var/spack/repos/builtin/packages/r-sandwich/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-scales/package.py b/var/spack/repos/builtin/packages/r-scales/package.py index 4e513bc2c0..c730ef7b90 100644 --- a/var/spack/repos/builtin/packages/r-scales/package.py +++ b/var/spack/repos/builtin/packages/r-scales/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-scatterplot3d/package.py b/var/spack/repos/builtin/packages/r-scatterplot3d/package.py index ac3a9dc8cc..9103733a2f 100644 --- a/var/spack/repos/builtin/packages/r-scatterplot3d/package.py +++ b/var/spack/repos/builtin/packages/r-scatterplot3d/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-segmented/package.py b/var/spack/repos/builtin/packages/r-segmented/package.py index bc3b02e3c0..4ec25c4268 100644 --- a/var/spack/repos/builtin/packages/r-segmented/package.py +++ b/var/spack/repos/builtin/packages/r-segmented/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-seqinr/package.py b/var/spack/repos/builtin/packages/r-seqinr/package.py index 3b3dbdf871..998b01dbed 100644 --- a/var/spack/repos/builtin/packages/r-seqinr/package.py +++ b/var/spack/repos/builtin/packages/r-seqinr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-shiny/package.py b/var/spack/repos/builtin/packages/r-shiny/package.py index 763551049b..da566d884d 100644 --- a/var/spack/repos/builtin/packages/r-shiny/package.py +++ b/var/spack/repos/builtin/packages/r-shiny/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-snow/package.py b/var/spack/repos/builtin/packages/r-snow/package.py index d19847a8a1..4ce7312dfe 100644 --- a/var/spack/repos/builtin/packages/r-snow/package.py +++ b/var/spack/repos/builtin/packages/r-snow/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-sp/package.py b/var/spack/repos/builtin/packages/r-sp/package.py index bbb7752f60..2d7a5563f0 100644 --- a/var/spack/repos/builtin/packages/r-sp/package.py +++ b/var/spack/repos/builtin/packages/r-sp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-sparsem/package.py b/var/spack/repos/builtin/packages/r-sparsem/package.py index 7ac268ff8d..596ec8b932 100644 --- a/var/spack/repos/builtin/packages/r-sparsem/package.py +++ b/var/spack/repos/builtin/packages/r-sparsem/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-spdep/package.py b/var/spack/repos/builtin/packages/r-spdep/package.py index 1362a671c0..e16fb56fd7 100644 --- a/var/spack/repos/builtin/packages/r-spdep/package.py +++ b/var/spack/repos/builtin/packages/r-spdep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-stanheaders/package.py b/var/spack/repos/builtin/packages/r-stanheaders/package.py index 4060a10efd..04ea6deafd 100644 --- a/var/spack/repos/builtin/packages/r-stanheaders/package.py +++ b/var/spack/repos/builtin/packages/r-stanheaders/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-statnet-common/package.py b/var/spack/repos/builtin/packages/r-statnet-common/package.py index b3dd2569c8..a741ccd521 100644 --- a/var/spack/repos/builtin/packages/r-statnet-common/package.py +++ b/var/spack/repos/builtin/packages/r-statnet-common/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-stringi/package.py b/var/spack/repos/builtin/packages/r-stringi/package.py index a6e52b5690..0e38ad5a50 100644 --- a/var/spack/repos/builtin/packages/r-stringi/package.py +++ b/var/spack/repos/builtin/packages/r-stringi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-stringr/package.py b/var/spack/repos/builtin/packages/r-stringr/package.py index e3c3f4c7c9..b67b5305ab 100644 --- a/var/spack/repos/builtin/packages/r-stringr/package.py +++ b/var/spack/repos/builtin/packages/r-stringr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-strucchange/package.py b/var/spack/repos/builtin/packages/r-strucchange/package.py index 40f699b022..1715ea1fcc 100644 --- a/var/spack/repos/builtin/packages/r-strucchange/package.py +++ b/var/spack/repos/builtin/packages/r-strucchange/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-survey/package.py b/var/spack/repos/builtin/packages/r-survey/package.py index 816371ff15..0cef2c8cee 100644 --- a/var/spack/repos/builtin/packages/r-survey/package.py +++ b/var/spack/repos/builtin/packages/r-survey/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-survival/package.py b/var/spack/repos/builtin/packages/r-survival/package.py index 0ac191e9ab..c54bba3b47 100644 --- a/var/spack/repos/builtin/packages/r-survival/package.py +++ b/var/spack/repos/builtin/packages/r-survival/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-tarifx/package.py b/var/spack/repos/builtin/packages/r-tarifx/package.py index 401fe48950..a25594971f 100644 --- a/var/spack/repos/builtin/packages/r-tarifx/package.py +++ b/var/spack/repos/builtin/packages/r-tarifx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-testit/package.py b/var/spack/repos/builtin/packages/r-testit/package.py index 274f8d265d..de24fa72a4 100644 --- a/var/spack/repos/builtin/packages/r-testit/package.py +++ b/var/spack/repos/builtin/packages/r-testit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-testthat/package.py b/var/spack/repos/builtin/packages/r-testthat/package.py index d021e31c6e..411b3043b7 100644 --- a/var/spack/repos/builtin/packages/r-testthat/package.py +++ b/var/spack/repos/builtin/packages/r-testthat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-th-data/package.py b/var/spack/repos/builtin/packages/r-th-data/package.py index 161024ce36..3c2fba8e7e 100644 --- a/var/spack/repos/builtin/packages/r-th-data/package.py +++ b/var/spack/repos/builtin/packages/r-th-data/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-threejs/package.py b/var/spack/repos/builtin/packages/r-threejs/package.py index f8e3ada3cf..0483364898 100644 --- a/var/spack/repos/builtin/packages/r-threejs/package.py +++ b/var/spack/repos/builtin/packages/r-threejs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-tibble/package.py b/var/spack/repos/builtin/packages/r-tibble/package.py index 54b8703c13..a97380a448 100644 --- a/var/spack/repos/builtin/packages/r-tibble/package.py +++ b/var/spack/repos/builtin/packages/r-tibble/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-tidyr/package.py b/var/spack/repos/builtin/packages/r-tidyr/package.py index 45b8f0240e..c240aa11fa 100644 --- a/var/spack/repos/builtin/packages/r-tidyr/package.py +++ b/var/spack/repos/builtin/packages/r-tidyr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-trimcluster/package.py b/var/spack/repos/builtin/packages/r-trimcluster/package.py index 883b229536..fac63c7bec 100644 --- a/var/spack/repos/builtin/packages/r-trimcluster/package.py +++ b/var/spack/repos/builtin/packages/r-trimcluster/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-trust/package.py b/var/spack/repos/builtin/packages/r-trust/package.py index 99f3ee0c3e..201ab2486f 100644 --- a/var/spack/repos/builtin/packages/r-trust/package.py +++ b/var/spack/repos/builtin/packages/r-trust/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-ttr/package.py b/var/spack/repos/builtin/packages/r-ttr/package.py index bcce612ace..8f220a7830 100644 --- a/var/spack/repos/builtin/packages/r-ttr/package.py +++ b/var/spack/repos/builtin/packages/r-ttr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-uuid/package.py b/var/spack/repos/builtin/packages/r-uuid/package.py index 7d42c95e89..87e4ec5008 100644 --- a/var/spack/repos/builtin/packages/r-uuid/package.py +++ b/var/spack/repos/builtin/packages/r-uuid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-vcd/package.py b/var/spack/repos/builtin/packages/r-vcd/package.py index 9b65117a41..6fc05bbc6d 100644 --- a/var/spack/repos/builtin/packages/r-vcd/package.py +++ b/var/spack/repos/builtin/packages/r-vcd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-vegan/package.py b/var/spack/repos/builtin/packages/r-vegan/package.py index 6816660ffe..0c40d1abff 100644 --- a/var/spack/repos/builtin/packages/r-vegan/package.py +++ b/var/spack/repos/builtin/packages/r-vegan/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-viridis/package.py b/var/spack/repos/builtin/packages/r-viridis/package.py index ed9ad5ab6a..a2843cf5c7 100644 --- a/var/spack/repos/builtin/packages/r-viridis/package.py +++ b/var/spack/repos/builtin/packages/r-viridis/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-viridislite/package.py b/var/spack/repos/builtin/packages/r-viridislite/package.py index 885e673d56..5af084bf2c 100644 --- a/var/spack/repos/builtin/packages/r-viridislite/package.py +++ b/var/spack/repos/builtin/packages/r-viridislite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-visnetwork/package.py b/var/spack/repos/builtin/packages/r-visnetwork/package.py index 2b2921df81..b9b5395123 100644 --- a/var/spack/repos/builtin/packages/r-visnetwork/package.py +++ b/var/spack/repos/builtin/packages/r-visnetwork/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-whisker/package.py b/var/spack/repos/builtin/packages/r-whisker/package.py index cff466f287..a5a87a2cc7 100644 --- a/var/spack/repos/builtin/packages/r-whisker/package.py +++ b/var/spack/repos/builtin/packages/r-whisker/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-withr/package.py b/var/spack/repos/builtin/packages/r-withr/package.py index 4491a8fd36..741a44acac 100644 --- a/var/spack/repos/builtin/packages/r-withr/package.py +++ b/var/spack/repos/builtin/packages/r-withr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xgboost/package.py b/var/spack/repos/builtin/packages/r-xgboost/package.py index 45504c89b9..49ace84248 100644 --- a/var/spack/repos/builtin/packages/r-xgboost/package.py +++ b/var/spack/repos/builtin/packages/r-xgboost/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xlconnect/package.py b/var/spack/repos/builtin/packages/r-xlconnect/package.py index d580faace7..e16b084b80 100644 --- a/var/spack/repos/builtin/packages/r-xlconnect/package.py +++ b/var/spack/repos/builtin/packages/r-xlconnect/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xlconnectjars/package.py b/var/spack/repos/builtin/packages/r-xlconnectjars/package.py index a618ad7157..43bd70ec3e 100644 --- a/var/spack/repos/builtin/packages/r-xlconnectjars/package.py +++ b/var/spack/repos/builtin/packages/r-xlconnectjars/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xlsx/package.py b/var/spack/repos/builtin/packages/r-xlsx/package.py index c3506b43d4..5cea8cd7bd 100644 --- a/var/spack/repos/builtin/packages/r-xlsx/package.py +++ b/var/spack/repos/builtin/packages/r-xlsx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xlsxjars/package.py b/var/spack/repos/builtin/packages/r-xlsxjars/package.py index b0b6b91868..c7cb22cf2b 100644 --- a/var/spack/repos/builtin/packages/r-xlsxjars/package.py +++ b/var/spack/repos/builtin/packages/r-xlsxjars/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xml/package.py b/var/spack/repos/builtin/packages/r-xml/package.py index 5704a64aed..83891b9548 100644 --- a/var/spack/repos/builtin/packages/r-xml/package.py +++ b/var/spack/repos/builtin/packages/r-xml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xtable/package.py b/var/spack/repos/builtin/packages/r-xtable/package.py index 1ec138c14c..8813a23f61 100644 --- a/var/spack/repos/builtin/packages/r-xtable/package.py +++ b/var/spack/repos/builtin/packages/r-xtable/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-xts/package.py b/var/spack/repos/builtin/packages/r-xts/package.py index b0ab027206..c1ed514fba 100644 --- a/var/spack/repos/builtin/packages/r-xts/package.py +++ b/var/spack/repos/builtin/packages/r-xts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-yaml/package.py b/var/spack/repos/builtin/packages/r-yaml/package.py index d4f096109f..0d09397605 100644 --- a/var/spack/repos/builtin/packages/r-yaml/package.py +++ b/var/spack/repos/builtin/packages/r-yaml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r-zoo/package.py b/var/spack/repos/builtin/packages/r-zoo/package.py index bda4fd6cf9..49965c74df 100644 --- a/var/spack/repos/builtin/packages/r-zoo/package.py +++ b/var/spack/repos/builtin/packages/r-zoo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/r/package.py b/var/spack/repos/builtin/packages/r/package.py index 886a238b06..07ad38da98 100644 --- a/var/spack/repos/builtin/packages/r/package.py +++ b/var/spack/repos/builtin/packages/r/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/raft/package.py b/var/spack/repos/builtin/packages/raft/package.py index 81040410d7..fabfd66253 100644 --- a/var/spack/repos/builtin/packages/raft/package.py +++ b/var/spack/repos/builtin/packages/raft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/raja/package.py b/var/spack/repos/builtin/packages/raja/package.py index 0fba029cab..b4a1ba9edd 100644 --- a/var/spack/repos/builtin/packages/raja/package.py +++ b/var/spack/repos/builtin/packages/raja/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/random123/package.py b/var/spack/repos/builtin/packages/random123/package.py index 2aedf9aa63..681cee6d84 100644 --- a/var/spack/repos/builtin/packages/random123/package.py +++ b/var/spack/repos/builtin/packages/random123/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/randrproto/package.py b/var/spack/repos/builtin/packages/randrproto/package.py index 87c6d1ad81..9345429d4f 100644 --- a/var/spack/repos/builtin/packages/randrproto/package.py +++ b/var/spack/repos/builtin/packages/randrproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ravel/package.py b/var/spack/repos/builtin/packages/ravel/package.py index e7ba7abb4a..45dcc910ee 100644 --- a/var/spack/repos/builtin/packages/ravel/package.py +++ b/var/spack/repos/builtin/packages/ravel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/raxml/package.py b/var/spack/repos/builtin/packages/raxml/package.py index 198347b0c1..c49dc9c11d 100644 --- a/var/spack/repos/builtin/packages/raxml/package.py +++ b/var/spack/repos/builtin/packages/raxml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ray/package.py b/var/spack/repos/builtin/packages/ray/package.py index 7056b59454..6624eb4ca9 100644 --- a/var/spack/repos/builtin/packages/ray/package.py +++ b/var/spack/repos/builtin/packages/ray/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rdp-classifier/package.py b/var/spack/repos/builtin/packages/rdp-classifier/package.py index 49cc367c8d..e3b480d6d3 100644 --- a/var/spack/repos/builtin/packages/rdp-classifier/package.py +++ b/var/spack/repos/builtin/packages/rdp-classifier/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/readline/package.py b/var/spack/repos/builtin/packages/readline/package.py index 31320bf666..8b737ae1ec 100644 --- a/var/spack/repos/builtin/packages/readline/package.py +++ b/var/spack/repos/builtin/packages/readline/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/recordproto/package.py b/var/spack/repos/builtin/packages/recordproto/package.py index 27042e7b03..09d0f0711d 100644 --- a/var/spack/repos/builtin/packages/recordproto/package.py +++ b/var/spack/repos/builtin/packages/recordproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/redundans/package.py b/var/spack/repos/builtin/packages/redundans/package.py index 0e801f556f..0b50b74b0e 100644 --- a/var/spack/repos/builtin/packages/redundans/package.py +++ b/var/spack/repos/builtin/packages/redundans/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/relion/package.py b/var/spack/repos/builtin/packages/relion/package.py index 23b1834fbc..d832b60d8b 100644 --- a/var/spack/repos/builtin/packages/relion/package.py +++ b/var/spack/repos/builtin/packages/relion/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rempi/package.py b/var/spack/repos/builtin/packages/rempi/package.py index 48ff14468a..97d618fa01 100644 --- a/var/spack/repos/builtin/packages/rempi/package.py +++ b/var/spack/repos/builtin/packages/rempi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rename/package.py b/var/spack/repos/builtin/packages/rename/package.py index 9970a1a51c..7a0cac4ecd 100644 --- a/var/spack/repos/builtin/packages/rename/package.py +++ b/var/spack/repos/builtin/packages/rename/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rendercheck/package.py b/var/spack/repos/builtin/packages/rendercheck/package.py index 894329dbe9..0dbd5f9aaf 100644 --- a/var/spack/repos/builtin/packages/rendercheck/package.py +++ b/var/spack/repos/builtin/packages/rendercheck/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/renderproto/package.py b/var/spack/repos/builtin/packages/renderproto/package.py index 687acf1675..f1521d1f83 100644 --- a/var/spack/repos/builtin/packages/renderproto/package.py +++ b/var/spack/repos/builtin/packages/renderproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/resourceproto/package.py b/var/spack/repos/builtin/packages/resourceproto/package.py index 67e0bad922..f4c7693985 100644 --- a/var/spack/repos/builtin/packages/resourceproto/package.py +++ b/var/spack/repos/builtin/packages/resourceproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/revbayes/package.py b/var/spack/repos/builtin/packages/revbayes/package.py index 3498ddd952..be422e22e0 100644 --- a/var/spack/repos/builtin/packages/revbayes/package.py +++ b/var/spack/repos/builtin/packages/revbayes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rgb/package.py b/var/spack/repos/builtin/packages/rgb/package.py index 75d483172d..a61c3383c6 100644 --- a/var/spack/repos/builtin/packages/rgb/package.py +++ b/var/spack/repos/builtin/packages/rgb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rhash/package.py b/var/spack/repos/builtin/packages/rhash/package.py index 94af243ae5..91d947b5ec 100644 --- a/var/spack/repos/builtin/packages/rhash/package.py +++ b/var/spack/repos/builtin/packages/rhash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rockstar/package.py b/var/spack/repos/builtin/packages/rockstar/package.py index 9cb92d0f8d..94bbad417e 100644 --- a/var/spack/repos/builtin/packages/rockstar/package.py +++ b/var/spack/repos/builtin/packages/rockstar/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/root/package.py b/var/spack/repos/builtin/packages/root/package.py index dfd7ba3e25..8c04e7034d 100644 --- a/var/spack/repos/builtin/packages/root/package.py +++ b/var/spack/repos/builtin/packages/root/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rose/package.py b/var/spack/repos/builtin/packages/rose/package.py index 8ba397df55..12db39cf5f 100644 --- a/var/spack/repos/builtin/packages/rose/package.py +++ b/var/spack/repos/builtin/packages/rose/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rr/package.py b/var/spack/repos/builtin/packages/rr/package.py index 5337d7eef4..b30ee2b2d4 100644 --- a/var/spack/repos/builtin/packages/rr/package.py +++ b/var/spack/repos/builtin/packages/rr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rsbench/package.py b/var/spack/repos/builtin/packages/rsbench/package.py index 7e4027d2d4..834b52d4d0 100644 --- a/var/spack/repos/builtin/packages/rsbench/package.py +++ b/var/spack/repos/builtin/packages/rsbench/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rsem/package.py b/var/spack/repos/builtin/packages/rsem/package.py index 805a71e0d9..2280ba6741 100644 --- a/var/spack/repos/builtin/packages/rsem/package.py +++ b/var/spack/repos/builtin/packages/rsem/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rstart/package.py b/var/spack/repos/builtin/packages/rstart/package.py index ff43120daf..7b6826daa8 100644 --- a/var/spack/repos/builtin/packages/rstart/package.py +++ b/var/spack/repos/builtin/packages/rstart/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rsync/package.py b/var/spack/repos/builtin/packages/rsync/package.py index de51073287..9e40f0291b 100644 --- a/var/spack/repos/builtin/packages/rsync/package.py +++ b/var/spack/repos/builtin/packages/rsync/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rtags/package.py b/var/spack/repos/builtin/packages/rtags/package.py index e212ea108c..51ef51636a 100644 --- a/var/spack/repos/builtin/packages/rtags/package.py +++ b/var/spack/repos/builtin/packages/rtags/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rtax/package.py b/var/spack/repos/builtin/packages/rtax/package.py index c2b917a81e..9a8d865bce 100644 --- a/var/spack/repos/builtin/packages/rtax/package.py +++ b/var/spack/repos/builtin/packages/rtax/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/ruby/package.py b/var/spack/repos/builtin/packages/ruby/package.py index d3cc4db319..0b824d6b84 100644 --- a/var/spack/repos/builtin/packages/ruby/package.py +++ b/var/spack/repos/builtin/packages/ruby/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rust-bindgen/package.py b/var/spack/repos/builtin/packages/rust-bindgen/package.py index 9db050425e..17688080e1 100644 --- a/var/spack/repos/builtin/packages/rust-bindgen/package.py +++ b/var/spack/repos/builtin/packages/rust-bindgen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/rust/package.py b/var/spack/repos/builtin/packages/rust/package.py index 44e7218ab4..f332e626ea 100644 --- a/var/spack/repos/builtin/packages/rust/package.py +++ b/var/spack/repos/builtin/packages/rust/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sabre/package.py b/var/spack/repos/builtin/packages/sabre/package.py index ecee1012f5..fadb92acb1 100644 --- a/var/spack/repos/builtin/packages/sabre/package.py +++ b/var/spack/repos/builtin/packages/sabre/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/salmon/package.py b/var/spack/repos/builtin/packages/salmon/package.py index 413eb9aebe..87b3e14b97 100644 --- a/var/spack/repos/builtin/packages/salmon/package.py +++ b/var/spack/repos/builtin/packages/salmon/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/samrai/package.py b/var/spack/repos/builtin/packages/samrai/package.py index c624a75a47..27eeaaeeb4 100644 --- a/var/spack/repos/builtin/packages/samrai/package.py +++ b/var/spack/repos/builtin/packages/samrai/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/samtools/package.py b/var/spack/repos/builtin/packages/samtools/package.py index 173fd7e772..e7976fc224 100644 --- a/var/spack/repos/builtin/packages/samtools/package.py +++ b/var/spack/repos/builtin/packages/samtools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sas/package.py b/var/spack/repos/builtin/packages/sas/package.py index 050d6172d6..60fbc05dad 100644 --- a/var/spack/repos/builtin/packages/sas/package.py +++ b/var/spack/repos/builtin/packages/sas/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/satsuma2/package.py b/var/spack/repos/builtin/packages/satsuma2/package.py index 39abc714e0..58485e2137 100644 --- a/var/spack/repos/builtin/packages/satsuma2/package.py +++ b/var/spack/repos/builtin/packages/satsuma2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/savanna/package.py b/var/spack/repos/builtin/packages/savanna/package.py index b7cd94ece0..5e211b9499 100644 --- a/var/spack/repos/builtin/packages/savanna/package.py +++ b/var/spack/repos/builtin/packages/savanna/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/saws/package.py b/var/spack/repos/builtin/packages/saws/package.py index 047f24f447..f46e0f620e 100644 --- a/var/spack/repos/builtin/packages/saws/package.py +++ b/var/spack/repos/builtin/packages/saws/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sbt/package.py b/var/spack/repos/builtin/packages/sbt/package.py index 6747e51b3f..0f42a194a1 100644 --- a/var/spack/repos/builtin/packages/sbt/package.py +++ b/var/spack/repos/builtin/packages/sbt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scala/package.py b/var/spack/repos/builtin/packages/scala/package.py index 35a49f6be5..9d8e1497b0 100644 --- a/var/spack/repos/builtin/packages/scala/package.py +++ b/var/spack/repos/builtin/packages/scala/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scalasca/package.py b/var/spack/repos/builtin/packages/scalasca/package.py index 81c08802fa..44f3627d41 100644 --- a/var/spack/repos/builtin/packages/scalasca/package.py +++ b/var/spack/repos/builtin/packages/scalasca/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scons/package.py b/var/spack/repos/builtin/packages/scons/package.py index 6b65528f3c..b850ec5c2f 100644 --- a/var/spack/repos/builtin/packages/scons/package.py +++ b/var/spack/repos/builtin/packages/scons/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scorec-core/package.py b/var/spack/repos/builtin/packages/scorec-core/package.py index dd143fc118..956783abcd 100644 --- a/var/spack/repos/builtin/packages/scorec-core/package.py +++ b/var/spack/repos/builtin/packages/scorec-core/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scorep/package.py b/var/spack/repos/builtin/packages/scorep/package.py index 59665a482d..8471b70f8a 100644 --- a/var/spack/repos/builtin/packages/scorep/package.py +++ b/var/spack/repos/builtin/packages/scorep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scotch/package.py b/var/spack/repos/builtin/packages/scotch/package.py index b5903c2789..2c8c3c62f4 100644 --- a/var/spack/repos/builtin/packages/scotch/package.py +++ b/var/spack/repos/builtin/packages/scotch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scr/package.py b/var/spack/repos/builtin/packages/scr/package.py index 1ab117721c..099c15d888 100644 --- a/var/spack/repos/builtin/packages/scr/package.py +++ b/var/spack/repos/builtin/packages/scr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/screen/package.py b/var/spack/repos/builtin/packages/screen/package.py index 997220eb37..98d759e2f0 100644 --- a/var/spack/repos/builtin/packages/screen/package.py +++ b/var/spack/repos/builtin/packages/screen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scripts/package.py b/var/spack/repos/builtin/packages/scripts/package.py index 2f12bf217c..3b9bc197a3 100644 --- a/var/spack/repos/builtin/packages/scripts/package.py +++ b/var/spack/repos/builtin/packages/scripts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/scrnsaverproto/package.py b/var/spack/repos/builtin/packages/scrnsaverproto/package.py index 767566cc03..bc8ffea1da 100644 --- a/var/spack/repos/builtin/packages/scrnsaverproto/package.py +++ b/var/spack/repos/builtin/packages/scrnsaverproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sctk/package.py b/var/spack/repos/builtin/packages/sctk/package.py index 8c3734f623..1903714158 100644 --- a/var/spack/repos/builtin/packages/sctk/package.py +++ b/var/spack/repos/builtin/packages/sctk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sdl2-image/package.py b/var/spack/repos/builtin/packages/sdl2-image/package.py index 5caba819b2..eb203163e3 100644 --- a/var/spack/repos/builtin/packages/sdl2-image/package.py +++ b/var/spack/repos/builtin/packages/sdl2-image/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sdl2/package.py b/var/spack/repos/builtin/packages/sdl2/package.py index bb7f46d036..c3bf529a12 100644 --- a/var/spack/repos/builtin/packages/sdl2/package.py +++ b/var/spack/repos/builtin/packages/sdl2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sed/package.py b/var/spack/repos/builtin/packages/sed/package.py index 3e59841579..3675a30101 100644 --- a/var/spack/repos/builtin/packages/sed/package.py +++ b/var/spack/repos/builtin/packages/sed/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/seqprep/package.py b/var/spack/repos/builtin/packages/seqprep/package.py index 728b47167b..fab33afaba 100644 --- a/var/spack/repos/builtin/packages/seqprep/package.py +++ b/var/spack/repos/builtin/packages/seqprep/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/seqtk/package.py b/var/spack/repos/builtin/packages/seqtk/package.py index 466ec80535..7c9f8ec012 100644 --- a/var/spack/repos/builtin/packages/seqtk/package.py +++ b/var/spack/repos/builtin/packages/seqtk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/serf/package.py b/var/spack/repos/builtin/packages/serf/package.py index 250a6f498f..28d93d85fe 100644 --- a/var/spack/repos/builtin/packages/serf/package.py +++ b/var/spack/repos/builtin/packages/serf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sessreg/package.py b/var/spack/repos/builtin/packages/sessreg/package.py index a5bfd177c9..0b361ad33c 100644 --- a/var/spack/repos/builtin/packages/sessreg/package.py +++ b/var/spack/repos/builtin/packages/sessreg/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/setxkbmap/package.py b/var/spack/repos/builtin/packages/setxkbmap/package.py index 7b28d55f1b..9f5baefb78 100644 --- a/var/spack/repos/builtin/packages/setxkbmap/package.py +++ b/var/spack/repos/builtin/packages/setxkbmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sga/package.py b/var/spack/repos/builtin/packages/sga/package.py index e8581781ff..8cea2a6caa 100644 --- a/var/spack/repos/builtin/packages/sga/package.py +++ b/var/spack/repos/builtin/packages/sga/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/shapeit/package.py b/var/spack/repos/builtin/packages/shapeit/package.py index a3f79c6255..41d2e867d9 100644 --- a/var/spack/repos/builtin/packages/shapeit/package.py +++ b/var/spack/repos/builtin/packages/shapeit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/shared-mime-info/package.py b/var/spack/repos/builtin/packages/shared-mime-info/package.py index ef920c797b..2f42ebcd0a 100644 --- a/var/spack/repos/builtin/packages/shared-mime-info/package.py +++ b/var/spack/repos/builtin/packages/shared-mime-info/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/shiny-server/package.py b/var/spack/repos/builtin/packages/shiny-server/package.py index 90b297327e..f96928ce4c 100644 --- a/var/spack/repos/builtin/packages/shiny-server/package.py +++ b/var/spack/repos/builtin/packages/shiny-server/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/shortstack/package.py b/var/spack/repos/builtin/packages/shortstack/package.py index 8feb671013..f12e6e1406 100644 --- a/var/spack/repos/builtin/packages/shortstack/package.py +++ b/var/spack/repos/builtin/packages/shortstack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/showfont/package.py b/var/spack/repos/builtin/packages/showfont/package.py index 7f75ef8c53..624ecd79aa 100644 --- a/var/spack/repos/builtin/packages/showfont/package.py +++ b/var/spack/repos/builtin/packages/showfont/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sickle/package.py b/var/spack/repos/builtin/packages/sickle/package.py index eee50d39aa..bf851b9fac 100644 --- a/var/spack/repos/builtin/packages/sickle/package.py +++ b/var/spack/repos/builtin/packages/sickle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/signalp/package.py b/var/spack/repos/builtin/packages/signalp/package.py index 78caa33452..1bf4674bb2 100644 --- a/var/spack/repos/builtin/packages/signalp/package.py +++ b/var/spack/repos/builtin/packages/signalp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/silo/package.py b/var/spack/repos/builtin/packages/silo/package.py index 75060d488e..3a18a1995f 100644 --- a/var/spack/repos/builtin/packages/silo/package.py +++ b/var/spack/repos/builtin/packages/silo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/simplemoc/package.py b/var/spack/repos/builtin/packages/simplemoc/package.py index 0472215800..f4b36bdf25 100644 --- a/var/spack/repos/builtin/packages/simplemoc/package.py +++ b/var/spack/repos/builtin/packages/simplemoc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/simul/package.py b/var/spack/repos/builtin/packages/simul/package.py index 2fb8f1b70d..e24bae8725 100644 --- a/var/spack/repos/builtin/packages/simul/package.py +++ b/var/spack/repos/builtin/packages/simul/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/simulationio/package.py b/var/spack/repos/builtin/packages/simulationio/package.py index 46ec5e5abb..1c84c5776b 100644 --- a/var/spack/repos/builtin/packages/simulationio/package.py +++ b/var/spack/repos/builtin/packages/simulationio/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/singularity/package.py b/var/spack/repos/builtin/packages/singularity/package.py index 61acf56463..4617a782ab 100644 --- a/var/spack/repos/builtin/packages/singularity/package.py +++ b/var/spack/repos/builtin/packages/singularity/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/slepc/package.py b/var/spack/repos/builtin/packages/slepc/package.py index 2b4b03147d..d0ea038c2e 100644 --- a/var/spack/repos/builtin/packages/slepc/package.py +++ b/var/spack/repos/builtin/packages/slepc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/slurm/package.py b/var/spack/repos/builtin/packages/slurm/package.py index 626f43c6c5..544b6d17fb 100644 --- a/var/spack/repos/builtin/packages/slurm/package.py +++ b/var/spack/repos/builtin/packages/slurm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/smalt/package.py b/var/spack/repos/builtin/packages/smalt/package.py index c19f3d040a..cc99923193 100644 --- a/var/spack/repos/builtin/packages/smalt/package.py +++ b/var/spack/repos/builtin/packages/smalt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/smc/package.py b/var/spack/repos/builtin/packages/smc/package.py index 402c892b0f..abe5262c23 100644 --- a/var/spack/repos/builtin/packages/smc/package.py +++ b/var/spack/repos/builtin/packages/smc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/smproxy/package.py b/var/spack/repos/builtin/packages/smproxy/package.py index bead0b37de..463fa4c515 100644 --- a/var/spack/repos/builtin/packages/smproxy/package.py +++ b/var/spack/repos/builtin/packages/smproxy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/snakemake/package.py b/var/spack/repos/builtin/packages/snakemake/package.py index ed79e6002c..9e180d9191 100644 --- a/var/spack/repos/builtin/packages/snakemake/package.py +++ b/var/spack/repos/builtin/packages/snakemake/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/snap-berkeley/package.py b/var/spack/repos/builtin/packages/snap-berkeley/package.py index 9bd9cd961c..c1c2744685 100644 --- a/var/spack/repos/builtin/packages/snap-berkeley/package.py +++ b/var/spack/repos/builtin/packages/snap-berkeley/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/snap/package.py b/var/spack/repos/builtin/packages/snap/package.py index 2db4dc7afa..86968f1680 100644 --- a/var/spack/repos/builtin/packages/snap/package.py +++ b/var/spack/repos/builtin/packages/snap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/snappy/package.py b/var/spack/repos/builtin/packages/snappy/package.py index bba05844e9..ce110344ff 100644 --- a/var/spack/repos/builtin/packages/snappy/package.py +++ b/var/spack/repos/builtin/packages/snappy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/snbone/package.py b/var/spack/repos/builtin/packages/snbone/package.py index b4d125a77e..f2462edca7 100644 --- a/var/spack/repos/builtin/packages/snbone/package.py +++ b/var/spack/repos/builtin/packages/snbone/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sniffles/package.py b/var/spack/repos/builtin/packages/sniffles/package.py index 9d890b03df..ea7f98cbbf 100644 --- a/var/spack/repos/builtin/packages/sniffles/package.py +++ b/var/spack/repos/builtin/packages/sniffles/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/snptest/package.py b/var/spack/repos/builtin/packages/snptest/package.py index a60a15d054..bd8654ba26 100644 --- a/var/spack/repos/builtin/packages/snptest/package.py +++ b/var/spack/repos/builtin/packages/snptest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/soap2/package.py b/var/spack/repos/builtin/packages/soap2/package.py index 5853bdf1e6..374c1bd449 100644 --- a/var/spack/repos/builtin/packages/soap2/package.py +++ b/var/spack/repos/builtin/packages/soap2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/soapindel/package.py b/var/spack/repos/builtin/packages/soapindel/package.py index 6d22660786..b09fa753cf 100644 --- a/var/spack/repos/builtin/packages/soapindel/package.py +++ b/var/spack/repos/builtin/packages/soapindel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/soapsnp/package.py b/var/spack/repos/builtin/packages/soapsnp/package.py index 3d22a579bf..a268298ff4 100644 --- a/var/spack/repos/builtin/packages/soapsnp/package.py +++ b/var/spack/repos/builtin/packages/soapsnp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/somatic-sniper/package.py b/var/spack/repos/builtin/packages/somatic-sniper/package.py index 4d5a17bcce..3c48c7b5d7 100644 --- a/var/spack/repos/builtin/packages/somatic-sniper/package.py +++ b/var/spack/repos/builtin/packages/somatic-sniper/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sortmerna/package.py b/var/spack/repos/builtin/packages/sortmerna/package.py index fbf0f44ed8..61b58d02d1 100644 --- a/var/spack/repos/builtin/packages/sortmerna/package.py +++ b/var/spack/repos/builtin/packages/sortmerna/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sowing/package.py b/var/spack/repos/builtin/packages/sowing/package.py index 3f0b76078c..121a6f19c9 100644 --- a/var/spack/repos/builtin/packages/sowing/package.py +++ b/var/spack/repos/builtin/packages/sowing/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sox/package.py b/var/spack/repos/builtin/packages/sox/package.py index 21e755c196..8645ed47d5 100644 --- a/var/spack/repos/builtin/packages/sox/package.py +++ b/var/spack/repos/builtin/packages/sox/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spades/package.py b/var/spack/repos/builtin/packages/spades/package.py index 443436d3ae..44baee6a28 100644 --- a/var/spack/repos/builtin/packages/spades/package.py +++ b/var/spack/repos/builtin/packages/spades/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spark/package.py b/var/spack/repos/builtin/packages/spark/package.py index ddd825018e..a0150b02e4 100644 --- a/var/spack/repos/builtin/packages/spark/package.py +++ b/var/spack/repos/builtin/packages/spark/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sparsehash/package.py b/var/spack/repos/builtin/packages/sparsehash/package.py index 864c5ffce8..234eef4d8f 100644 --- a/var/spack/repos/builtin/packages/sparsehash/package.py +++ b/var/spack/repos/builtin/packages/sparsehash/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sparta/package.py b/var/spack/repos/builtin/packages/sparta/package.py index 361c0253e2..07793e0169 100644 --- a/var/spack/repos/builtin/packages/sparta/package.py +++ b/var/spack/repos/builtin/packages/sparta/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spdlog/package.py b/var/spack/repos/builtin/packages/spdlog/package.py index a5a5612ae9..8fcc2ebf26 100644 --- a/var/spack/repos/builtin/packages/spdlog/package.py +++ b/var/spack/repos/builtin/packages/spdlog/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spectrum-mpi/package.py b/var/spack/repos/builtin/packages/spectrum-mpi/package.py index 1daa4b917a..ed2c568d69 100644 --- a/var/spack/repos/builtin/packages/spectrum-mpi/package.py +++ b/var/spack/repos/builtin/packages/spectrum-mpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at International Business Machines Corporation # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/speex/package.py b/var/spack/repos/builtin/packages/speex/package.py index 6cac86f20d..c726c62830 100644 --- a/var/spack/repos/builtin/packages/speex/package.py +++ b/var/spack/repos/builtin/packages/speex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sph2pipe/package.py b/var/spack/repos/builtin/packages/sph2pipe/package.py index c89a16c902..463da455a4 100644 --- a/var/spack/repos/builtin/packages/sph2pipe/package.py +++ b/var/spack/repos/builtin/packages/sph2pipe/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spherepack/package.py b/var/spack/repos/builtin/packages/spherepack/package.py index 12c274774c..dedace898f 100644 --- a/var/spack/repos/builtin/packages/spherepack/package.py +++ b/var/spack/repos/builtin/packages/spherepack/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spindle/package.py b/var/spack/repos/builtin/packages/spindle/package.py index 673cc5ebbe..be1e43e0d2 100644 --- a/var/spack/repos/builtin/packages/spindle/package.py +++ b/var/spack/repos/builtin/packages/spindle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/spot/package.py b/var/spack/repos/builtin/packages/spot/package.py index 1dc26a4e7c..4918ab74ea 100644 --- a/var/spack/repos/builtin/packages/spot/package.py +++ b/var/spack/repos/builtin/packages/spot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sqlite/package.py b/var/spack/repos/builtin/packages/sqlite/package.py index 66b76e1be1..d4dbf9c014 100644 --- a/var/spack/repos/builtin/packages/sqlite/package.py +++ b/var/spack/repos/builtin/packages/sqlite/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sspace-longread/package.py b/var/spack/repos/builtin/packages/sspace-longread/package.py index 9f55ecdc6e..ce0c8b6f03 100644 --- a/var/spack/repos/builtin/packages/sspace-longread/package.py +++ b/var/spack/repos/builtin/packages/sspace-longread/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sspace-standard/package.py b/var/spack/repos/builtin/packages/sspace-standard/package.py index 7b1de9c1b3..0e933448bf 100644 --- a/var/spack/repos/builtin/packages/sspace-standard/package.py +++ b/var/spack/repos/builtin/packages/sspace-standard/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sst-dumpi/package.py b/var/spack/repos/builtin/packages/sst-dumpi/package.py index 537d0f5e14..30dceecdc6 100644 --- a/var/spack/repos/builtin/packages/sst-dumpi/package.py +++ b/var/spack/repos/builtin/packages/sst-dumpi/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sst-macro/package.py b/var/spack/repos/builtin/packages/sst-macro/package.py index 3fd1a7489d..168883ffc2 100644 --- a/var/spack/repos/builtin/packages/sst-macro/package.py +++ b/var/spack/repos/builtin/packages/sst-macro/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/stacks/package.py b/var/spack/repos/builtin/packages/stacks/package.py index df0d486b0b..fa62210ffb 100644 --- a/var/spack/repos/builtin/packages/stacks/package.py +++ b/var/spack/repos/builtin/packages/stacks/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/staden-io-lib/package.py b/var/spack/repos/builtin/packages/staden-io-lib/package.py index c69b319252..f94a1b982d 100644 --- a/var/spack/repos/builtin/packages/staden-io-lib/package.py +++ b/var/spack/repos/builtin/packages/staden-io-lib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/star-ccm-plus/package.py b/var/spack/repos/builtin/packages/star-ccm-plus/package.py index 35fa9629c4..b917cb1233 100644 --- a/var/spack/repos/builtin/packages/star-ccm-plus/package.py +++ b/var/spack/repos/builtin/packages/star-ccm-plus/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/star/package.py b/var/spack/repos/builtin/packages/star/package.py index e06ed646df..35de77733a 100644 --- a/var/spack/repos/builtin/packages/star/package.py +++ b/var/spack/repos/builtin/packages/star/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/stat/package.py b/var/spack/repos/builtin/packages/stat/package.py index eedb2fe314..6a0ced2d4f 100644 --- a/var/spack/repos/builtin/packages/stat/package.py +++ b/var/spack/repos/builtin/packages/stat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/stc/package.py b/var/spack/repos/builtin/packages/stc/package.py index 2403767679..08f5aa1356 100644 --- a/var/spack/repos/builtin/packages/stc/package.py +++ b/var/spack/repos/builtin/packages/stc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/stream/package.py b/var/spack/repos/builtin/packages/stream/package.py index c98ecc9c39..f38f7aac05 100644 --- a/var/spack/repos/builtin/packages/stream/package.py +++ b/var/spack/repos/builtin/packages/stream/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/stress/package.py b/var/spack/repos/builtin/packages/stress/package.py index acdcf262d1..fd3cdf3854 100644 --- a/var/spack/repos/builtin/packages/stress/package.py +++ b/var/spack/repos/builtin/packages/stress/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/stringtie/package.py b/var/spack/repos/builtin/packages/stringtie/package.py index 9baf545a4c..123f156d32 100644 --- a/var/spack/repos/builtin/packages/stringtie/package.py +++ b/var/spack/repos/builtin/packages/stringtie/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/structure/package.py b/var/spack/repos/builtin/packages/structure/package.py index abe1ee76e8..3a452fc15f 100644 --- a/var/spack/repos/builtin/packages/structure/package.py +++ b/var/spack/repos/builtin/packages/structure/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sublime-text/package.py b/var/spack/repos/builtin/packages/sublime-text/package.py index e7605b40be..b9087aa57a 100644 --- a/var/spack/repos/builtin/packages/sublime-text/package.py +++ b/var/spack/repos/builtin/packages/sublime-text/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/subread/package.py b/var/spack/repos/builtin/packages/subread/package.py index b09e398602..be48f127d8 100644 --- a/var/spack/repos/builtin/packages/subread/package.py +++ b/var/spack/repos/builtin/packages/subread/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/subversion/package.py b/var/spack/repos/builtin/packages/subversion/package.py index eb39c8299d..b8e5a24fab 100644 --- a/var/spack/repos/builtin/packages/subversion/package.py +++ b/var/spack/repos/builtin/packages/subversion/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py index e64be9730b..6699cdada9 100644 --- a/var/spack/repos/builtin/packages/suite-sparse/package.py +++ b/var/spack/repos/builtin/packages/suite-sparse/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sumaclust/package.py b/var/spack/repos/builtin/packages/sumaclust/package.py index b1d7a94c5a..bc67148f61 100644 --- a/var/spack/repos/builtin/packages/sumaclust/package.py +++ b/var/spack/repos/builtin/packages/sumaclust/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py index b0ad1c1f42..b3007d191a 100644 --- a/var/spack/repos/builtin/packages/sundials/package.py +++ b/var/spack/repos/builtin/packages/sundials/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/superlu-dist/package.py b/var/spack/repos/builtin/packages/superlu-dist/package.py index f535252b8a..69c6d401e8 100644 --- a/var/spack/repos/builtin/packages/superlu-dist/package.py +++ b/var/spack/repos/builtin/packages/superlu-dist/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/superlu-mt/package.py b/var/spack/repos/builtin/packages/superlu-mt/package.py index a4adff7c30..4f44f8e5a4 100644 --- a/var/spack/repos/builtin/packages/superlu-mt/package.py +++ b/var/spack/repos/builtin/packages/superlu-mt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/superlu/package.py b/var/spack/repos/builtin/packages/superlu/package.py index c7ef1e3bae..948cea6336 100644 --- a/var/spack/repos/builtin/packages/superlu/package.py +++ b/var/spack/repos/builtin/packages/superlu/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/swarm/package.py b/var/spack/repos/builtin/packages/swarm/package.py index b752f52381..941e9f3872 100644 --- a/var/spack/repos/builtin/packages/swarm/package.py +++ b/var/spack/repos/builtin/packages/swarm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/swiftsim/package.py b/var/spack/repos/builtin/packages/swiftsim/package.py index 19860d1ec0..25c1267c7b 100644 --- a/var/spack/repos/builtin/packages/swiftsim/package.py +++ b/var/spack/repos/builtin/packages/swiftsim/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/swig/package.py b/var/spack/repos/builtin/packages/swig/package.py index 4f197a838e..67e507d300 100644 --- a/var/spack/repos/builtin/packages/swig/package.py +++ b/var/spack/repos/builtin/packages/swig/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/symengine/package.py b/var/spack/repos/builtin/packages/symengine/package.py index a36cfc70b2..1126ef6ab5 100644 --- a/var/spack/repos/builtin/packages/symengine/package.py +++ b/var/spack/repos/builtin/packages/symengine/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sympol/package.py b/var/spack/repos/builtin/packages/sympol/package.py index 3e129e68eb..77e01d395b 100644 --- a/var/spack/repos/builtin/packages/sympol/package.py +++ b/var/spack/repos/builtin/packages/sympol/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/sz/package.py b/var/spack/repos/builtin/packages/sz/package.py index d914b0226d..089a4b339e 100644 --- a/var/spack/repos/builtin/packages/sz/package.py +++ b/var/spack/repos/builtin/packages/sz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tabix/package.py b/var/spack/repos/builtin/packages/tabix/package.py index 1e54dd4716..47dfdded32 100644 --- a/var/spack/repos/builtin/packages/tabix/package.py +++ b/var/spack/repos/builtin/packages/tabix/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/talloc/package.py b/var/spack/repos/builtin/packages/talloc/package.py index bd3d066ada..25b926f12f 100644 --- a/var/spack/repos/builtin/packages/talloc/package.py +++ b/var/spack/repos/builtin/packages/talloc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tar/package.py b/var/spack/repos/builtin/packages/tar/package.py index 16e7920d54..3c75b6d99e 100644 --- a/var/spack/repos/builtin/packages/tar/package.py +++ b/var/spack/repos/builtin/packages/tar/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/task/package.py b/var/spack/repos/builtin/packages/task/package.py index 11cc280a9a..1318503430 100644 --- a/var/spack/repos/builtin/packages/task/package.py +++ b/var/spack/repos/builtin/packages/task/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/taskd/package.py b/var/spack/repos/builtin/packages/taskd/package.py index 9a9e250011..b2fc1c83f2 100644 --- a/var/spack/repos/builtin/packages/taskd/package.py +++ b/var/spack/repos/builtin/packages/taskd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tau/package.py b/var/spack/repos/builtin/packages/tau/package.py index f9e2dea56e..2159aca927 100644 --- a/var/spack/repos/builtin/packages/tau/package.py +++ b/var/spack/repos/builtin/packages/tau/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tcl/package.py b/var/spack/repos/builtin/packages/tcl/package.py index ea2b55573c..556ea77295 100644 --- a/var/spack/repos/builtin/packages/tcl/package.py +++ b/var/spack/repos/builtin/packages/tcl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tcoffee/package.py b/var/spack/repos/builtin/packages/tcoffee/package.py index 0f954b42c7..5bf8bc6fa9 100644 --- a/var/spack/repos/builtin/packages/tcoffee/package.py +++ b/var/spack/repos/builtin/packages/tcoffee/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tealeaf/package.py b/var/spack/repos/builtin/packages/tealeaf/package.py index e8d60b4448..7002c76325 100644 --- a/var/spack/repos/builtin/packages/tealeaf/package.py +++ b/var/spack/repos/builtin/packages/tealeaf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tetgen/package.py b/var/spack/repos/builtin/packages/tetgen/package.py index c887c7c8f5..0aa35e9db9 100644 --- a/var/spack/repos/builtin/packages/tetgen/package.py +++ b/var/spack/repos/builtin/packages/tetgen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tethex/package.py b/var/spack/repos/builtin/packages/tethex/package.py index f699164609..dd2dadffd8 100644 --- a/var/spack/repos/builtin/packages/tethex/package.py +++ b/var/spack/repos/builtin/packages/tethex/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/texinfo/package.py b/var/spack/repos/builtin/packages/texinfo/package.py index e633cd6ac3..480b2098d0 100644 --- a/var/spack/repos/builtin/packages/texinfo/package.py +++ b/var/spack/repos/builtin/packages/texinfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/texlive/package.py b/var/spack/repos/builtin/packages/texlive/package.py index 58859d5ebb..33ff76f6a8 100644 --- a/var/spack/repos/builtin/packages/texlive/package.py +++ b/var/spack/repos/builtin/packages/texlive/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/the-platinum-searcher/package.py b/var/spack/repos/builtin/packages/the-platinum-searcher/package.py index b8d99fcf77..abbca39a9e 100644 --- a/var/spack/repos/builtin/packages/the-platinum-searcher/package.py +++ b/var/spack/repos/builtin/packages/the-platinum-searcher/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/the-silver-searcher/package.py b/var/spack/repos/builtin/packages/the-silver-searcher/package.py index 236d1f88f4..5e1c83d235 100644 --- a/var/spack/repos/builtin/packages/the-silver-searcher/package.py +++ b/var/spack/repos/builtin/packages/the-silver-searcher/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/thrift/package.py b/var/spack/repos/builtin/packages/thrift/package.py index c91d0096f3..8b5d1ff388 100644 --- a/var/spack/repos/builtin/packages/thrift/package.py +++ b/var/spack/repos/builtin/packages/thrift/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tig/package.py b/var/spack/repos/builtin/packages/tig/package.py index da8482a21a..88a7398377 100644 --- a/var/spack/repos/builtin/packages/tig/package.py +++ b/var/spack/repos/builtin/packages/tig/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tinyxml/package.py b/var/spack/repos/builtin/packages/tinyxml/package.py index 70dfb552f9..7f62c1f1f1 100644 --- a/var/spack/repos/builtin/packages/tinyxml/package.py +++ b/var/spack/repos/builtin/packages/tinyxml/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tinyxml2/package.py b/var/spack/repos/builtin/packages/tinyxml2/package.py index f39ca8b7af..9622f6c9b1 100644 --- a/var/spack/repos/builtin/packages/tinyxml2/package.py +++ b/var/spack/repos/builtin/packages/tinyxml2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tk/package.py b/var/spack/repos/builtin/packages/tk/package.py index ab25ba1d5b..87d955e9c9 100644 --- a/var/spack/repos/builtin/packages/tk/package.py +++ b/var/spack/repos/builtin/packages/tk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tmalign/package.py b/var/spack/repos/builtin/packages/tmalign/package.py index 5f08bb27fc..73e8811eab 100644 --- a/var/spack/repos/builtin/packages/tmalign/package.py +++ b/var/spack/repos/builtin/packages/tmalign/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tmux/package.py b/var/spack/repos/builtin/packages/tmux/package.py index a3a8e5ad89..5b877d25e6 100644 --- a/var/spack/repos/builtin/packages/tmux/package.py +++ b/var/spack/repos/builtin/packages/tmux/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tmuxinator/package.py b/var/spack/repos/builtin/packages/tmuxinator/package.py index 2078187189..366acbb760 100644 --- a/var/spack/repos/builtin/packages/tmuxinator/package.py +++ b/var/spack/repos/builtin/packages/tmuxinator/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tophat/package.py b/var/spack/repos/builtin/packages/tophat/package.py index 116db56b32..8100949434 100644 --- a/var/spack/repos/builtin/packages/tophat/package.py +++ b/var/spack/repos/builtin/packages/tophat/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tppred/package.py b/var/spack/repos/builtin/packages/tppred/package.py index 919e15c3b0..532662fb22 100644 --- a/var/spack/repos/builtin/packages/tppred/package.py +++ b/var/spack/repos/builtin/packages/tppred/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/transabyss/package.py b/var/spack/repos/builtin/packages/transabyss/package.py index 10ee508899..28896479f2 100644 --- a/var/spack/repos/builtin/packages/transabyss/package.py +++ b/var/spack/repos/builtin/packages/transabyss/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/transdecoder/package.py b/var/spack/repos/builtin/packages/transdecoder/package.py index 4c23afbf2a..396f96f536 100644 --- a/var/spack/repos/builtin/packages/transdecoder/package.py +++ b/var/spack/repos/builtin/packages/transdecoder/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/transposome/package.py b/var/spack/repos/builtin/packages/transposome/package.py index 01499290cf..a70c3beedf 100644 --- a/var/spack/repos/builtin/packages/transposome/package.py +++ b/var/spack/repos/builtin/packages/transposome/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/transset/package.py b/var/spack/repos/builtin/packages/transset/package.py index 7f93754263..3c692f4769 100644 --- a/var/spack/repos/builtin/packages/transset/package.py +++ b/var/spack/repos/builtin/packages/transset/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/trapproto/package.py b/var/spack/repos/builtin/packages/trapproto/package.py index 5433fc97f7..2e06cca3cd 100644 --- a/var/spack/repos/builtin/packages/trapproto/package.py +++ b/var/spack/repos/builtin/packages/trapproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/tree/package.py b/var/spack/repos/builtin/packages/tree/package.py index 19979124ba..39b4ced9b2 100644 --- a/var/spack/repos/builtin/packages/tree/package.py +++ b/var/spack/repos/builtin/packages/tree/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/triangle/package.py b/var/spack/repos/builtin/packages/triangle/package.py index c7cfa3a60e..b43a65d26c 100644 --- a/var/spack/repos/builtin/packages/triangle/package.py +++ b/var/spack/repos/builtin/packages/triangle/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index 585ff0e81b..1e2142644a 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/trimgalore/package.py b/var/spack/repos/builtin/packages/trimgalore/package.py index 9dd8be11e9..0f032dbe55 100644 --- a/var/spack/repos/builtin/packages/trimgalore/package.py +++ b/var/spack/repos/builtin/packages/trimgalore/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/trimmomatic/package.py b/var/spack/repos/builtin/packages/trimmomatic/package.py index 42f0e68973..980cc850fe 100644 --- a/var/spack/repos/builtin/packages/trimmomatic/package.py +++ b/var/spack/repos/builtin/packages/trimmomatic/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/turbine/package.py b/var/spack/repos/builtin/packages/turbine/package.py index 6de98eef16..0292c9dc24 100644 --- a/var/spack/repos/builtin/packages/turbine/package.py +++ b/var/spack/repos/builtin/packages/turbine/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/turbomole/package.py b/var/spack/repos/builtin/packages/turbomole/package.py index 9eb9af6ff1..2c50457bee 100644 --- a/var/spack/repos/builtin/packages/turbomole/package.py +++ b/var/spack/repos/builtin/packages/turbomole/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/twm/package.py b/var/spack/repos/builtin/packages/twm/package.py index 22ef578750..cbbe94f096 100644 --- a/var/spack/repos/builtin/packages/twm/package.py +++ b/var/spack/repos/builtin/packages/twm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/uberftp/package.py b/var/spack/repos/builtin/packages/uberftp/package.py index 6cb17c417a..052636b735 100644 --- a/var/spack/repos/builtin/packages/uberftp/package.py +++ b/var/spack/repos/builtin/packages/uberftp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/udunits2/package.py b/var/spack/repos/builtin/packages/udunits2/package.py index 2658674992..2bf6f39e1b 100644 --- a/var/spack/repos/builtin/packages/udunits2/package.py +++ b/var/spack/repos/builtin/packages/udunits2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/uncrustify/package.py b/var/spack/repos/builtin/packages/uncrustify/package.py index 20c26ed29f..248d459712 100644 --- a/var/spack/repos/builtin/packages/uncrustify/package.py +++ b/var/spack/repos/builtin/packages/uncrustify/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/unibilium/package.py b/var/spack/repos/builtin/packages/unibilium/package.py index 2a5ce7f267..5419e5b42c 100644 --- a/var/spack/repos/builtin/packages/unibilium/package.py +++ b/var/spack/repos/builtin/packages/unibilium/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/unison/package.py b/var/spack/repos/builtin/packages/unison/package.py index 70420a38d4..3c35630377 100644 --- a/var/spack/repos/builtin/packages/unison/package.py +++ b/var/spack/repos/builtin/packages/unison/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/units/package.py b/var/spack/repos/builtin/packages/units/package.py index e2a12bf57c..bfdfe75c80 100644 --- a/var/spack/repos/builtin/packages/units/package.py +++ b/var/spack/repos/builtin/packages/units/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/unixodbc/package.py b/var/spack/repos/builtin/packages/unixodbc/package.py index a1ca765a56..605bc3bce4 100644 --- a/var/spack/repos/builtin/packages/unixodbc/package.py +++ b/var/spack/repos/builtin/packages/unixodbc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/usearch/package.py b/var/spack/repos/builtin/packages/usearch/package.py index 87ea6798ca..e6d41d74ce 100644 --- a/var/spack/repos/builtin/packages/usearch/package.py +++ b/var/spack/repos/builtin/packages/usearch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/util-linux/package.py b/var/spack/repos/builtin/packages/util-linux/package.py index 018ce1993d..4b6a22ff66 100644 --- a/var/spack/repos/builtin/packages/util-linux/package.py +++ b/var/spack/repos/builtin/packages/util-linux/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/util-macros/package.py b/var/spack/repos/builtin/packages/util-macros/package.py index 10decd35f6..af9b837639 100644 --- a/var/spack/repos/builtin/packages/util-macros/package.py +++ b/var/spack/repos/builtin/packages/util-macros/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/uuid/package.py b/var/spack/repos/builtin/packages/uuid/package.py index 2d92e257e8..e4a0f8cee0 100644 --- a/var/spack/repos/builtin/packages/uuid/package.py +++ b/var/spack/repos/builtin/packages/uuid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/valgrind/package.py b/var/spack/repos/builtin/packages/valgrind/package.py index 05efd67a3c..588c87ecb8 100644 --- a/var/spack/repos/builtin/packages/valgrind/package.py +++ b/var/spack/repos/builtin/packages/valgrind/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vampirtrace/package.py b/var/spack/repos/builtin/packages/vampirtrace/package.py index dc4841f2ba..ada4e9004e 100644 --- a/var/spack/repos/builtin/packages/vampirtrace/package.py +++ b/var/spack/repos/builtin/packages/vampirtrace/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/varscan/package.py b/var/spack/repos/builtin/packages/varscan/package.py index f4c2ae029d..332488c5e0 100644 --- a/var/spack/repos/builtin/packages/varscan/package.py +++ b/var/spack/repos/builtin/packages/varscan/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vc/package.py b/var/spack/repos/builtin/packages/vc/package.py index 67ced036b2..034bd784b4 100644 --- a/var/spack/repos/builtin/packages/vc/package.py +++ b/var/spack/repos/builtin/packages/vc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vcftools/package.py b/var/spack/repos/builtin/packages/vcftools/package.py index bb2721e353..bfce69ef86 100644 --- a/var/spack/repos/builtin/packages/vcftools/package.py +++ b/var/spack/repos/builtin/packages/vcftools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vcsh/package.py b/var/spack/repos/builtin/packages/vcsh/package.py index e09833d5e1..a8e81304ed 100644 --- a/var/spack/repos/builtin/packages/vcsh/package.py +++ b/var/spack/repos/builtin/packages/vcsh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vdt/package.py b/var/spack/repos/builtin/packages/vdt/package.py index df21465506..3aee09c919 100644 --- a/var/spack/repos/builtin/packages/vdt/package.py +++ b/var/spack/repos/builtin/packages/vdt/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vecgeom/package.py b/var/spack/repos/builtin/packages/vecgeom/package.py index 9843840e5b..5cc5764f8c 100644 --- a/var/spack/repos/builtin/packages/vecgeom/package.py +++ b/var/spack/repos/builtin/packages/vecgeom/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/veclibfort/package.py b/var/spack/repos/builtin/packages/veclibfort/package.py index ed11439b9f..c5917bacea 100644 --- a/var/spack/repos/builtin/packages/veclibfort/package.py +++ b/var/spack/repos/builtin/packages/veclibfort/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vegas2/package.py b/var/spack/repos/builtin/packages/vegas2/package.py index 1c091a568c..982fe54df1 100644 --- a/var/spack/repos/builtin/packages/vegas2/package.py +++ b/var/spack/repos/builtin/packages/vegas2/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/velvet/package.py b/var/spack/repos/builtin/packages/velvet/package.py index 48e0e04d1a..d7c39f8004 100644 --- a/var/spack/repos/builtin/packages/velvet/package.py +++ b/var/spack/repos/builtin/packages/velvet/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/videoproto/package.py b/var/spack/repos/builtin/packages/videoproto/package.py index c63d0e3291..d09aaf4ef1 100644 --- a/var/spack/repos/builtin/packages/videoproto/package.py +++ b/var/spack/repos/builtin/packages/videoproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/viennarna/package.py b/var/spack/repos/builtin/packages/viennarna/package.py index 548aacb56f..dbaff25eec 100644 --- a/var/spack/repos/builtin/packages/viennarna/package.py +++ b/var/spack/repos/builtin/packages/viennarna/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/viewres/package.py b/var/spack/repos/builtin/packages/viewres/package.py index 2ab28c832a..cb9a89d741 100644 --- a/var/spack/repos/builtin/packages/viewres/package.py +++ b/var/spack/repos/builtin/packages/viewres/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vim/package.py b/var/spack/repos/builtin/packages/vim/package.py index 623f54b5d3..0647c91904 100644 --- a/var/spack/repos/builtin/packages/vim/package.py +++ b/var/spack/repos/builtin/packages/vim/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/virtualgl/package.py b/var/spack/repos/builtin/packages/virtualgl/package.py index d2ea587fb0..2e78ea4fbd 100644 --- a/var/spack/repos/builtin/packages/virtualgl/package.py +++ b/var/spack/repos/builtin/packages/virtualgl/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/visit/package.py b/var/spack/repos/builtin/packages/visit/package.py index 2c08c73a3c..7459f11a4c 100644 --- a/var/spack/repos/builtin/packages/visit/package.py +++ b/var/spack/repos/builtin/packages/visit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vizglow/package.py b/var/spack/repos/builtin/packages/vizglow/package.py index d153edcc9a..65f9ba1090 100644 --- a/var/spack/repos/builtin/packages/vizglow/package.py +++ b/var/spack/repos/builtin/packages/vizglow/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vmatch/package.py b/var/spack/repos/builtin/packages/vmatch/package.py index bc09c0b70d..66095d1cae 100644 --- a/var/spack/repos/builtin/packages/vmatch/package.py +++ b/var/spack/repos/builtin/packages/vmatch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/voropp/package.py b/var/spack/repos/builtin/packages/voropp/package.py index d44347b87f..3ad6f3b0d8 100644 --- a/var/spack/repos/builtin/packages/voropp/package.py +++ b/var/spack/repos/builtin/packages/voropp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vpfft/package.py b/var/spack/repos/builtin/packages/vpfft/package.py index 8d4ef7defe..b27c232d28 100644 --- a/var/spack/repos/builtin/packages/vpfft/package.py +++ b/var/spack/repos/builtin/packages/vpfft/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vsearch/package.py b/var/spack/repos/builtin/packages/vsearch/package.py index 07ed838654..1a4b201bec 100644 --- a/var/spack/repos/builtin/packages/vsearch/package.py +++ b/var/spack/repos/builtin/packages/vsearch/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/vtk/package.py b/var/spack/repos/builtin/packages/vtk/package.py index fed631efe9..2e4ab7e23a 100644 --- a/var/spack/repos/builtin/packages/vtk/package.py +++ b/var/spack/repos/builtin/packages/vtk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/wannier90/package.py b/var/spack/repos/builtin/packages/wannier90/package.py index d7d2a929cb..d9150f9491 100644 --- a/var/spack/repos/builtin/packages/wannier90/package.py +++ b/var/spack/repos/builtin/packages/wannier90/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/wget/package.py b/var/spack/repos/builtin/packages/wget/package.py index f852f4e9f0..fc5e3b8230 100644 --- a/var/spack/repos/builtin/packages/wget/package.py +++ b/var/spack/repos/builtin/packages/wget/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/windowswmproto/package.py b/var/spack/repos/builtin/packages/windowswmproto/package.py index d5045f16ab..3310a51077 100644 --- a/var/spack/repos/builtin/packages/windowswmproto/package.py +++ b/var/spack/repos/builtin/packages/windowswmproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/wx/package.py b/var/spack/repos/builtin/packages/wx/package.py index c343908778..25325842f4 100644 --- a/var/spack/repos/builtin/packages/wx/package.py +++ b/var/spack/repos/builtin/packages/wx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/wxpropgrid/package.py b/var/spack/repos/builtin/packages/wxpropgrid/package.py index 989c3ef002..22e68dd3d8 100644 --- a/var/spack/repos/builtin/packages/wxpropgrid/package.py +++ b/var/spack/repos/builtin/packages/wxpropgrid/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/x11perf/package.py b/var/spack/repos/builtin/packages/x11perf/package.py index 944acab645..ed8b94a43c 100644 --- a/var/spack/repos/builtin/packages/x11perf/package.py +++ b/var/spack/repos/builtin/packages/x11perf/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xapian-core/package.py b/var/spack/repos/builtin/packages/xapian-core/package.py index 82a8fac8ab..fed3b79998 100644 --- a/var/spack/repos/builtin/packages/xapian-core/package.py +++ b/var/spack/repos/builtin/packages/xapian-core/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xauth/package.py b/var/spack/repos/builtin/packages/xauth/package.py index 85256a2245..4f6900cbfc 100644 --- a/var/spack/repos/builtin/packages/xauth/package.py +++ b/var/spack/repos/builtin/packages/xauth/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xbacklight/package.py b/var/spack/repos/builtin/packages/xbacklight/package.py index 1695ebdfe8..1a038fea69 100644 --- a/var/spack/repos/builtin/packages/xbacklight/package.py +++ b/var/spack/repos/builtin/packages/xbacklight/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xbiff/package.py b/var/spack/repos/builtin/packages/xbiff/package.py index 5b1a05afb4..51c371d54c 100644 --- a/var/spack/repos/builtin/packages/xbiff/package.py +++ b/var/spack/repos/builtin/packages/xbiff/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xbitmaps/package.py b/var/spack/repos/builtin/packages/xbitmaps/package.py index 15cfbadc4b..1fecec08ab 100644 --- a/var/spack/repos/builtin/packages/xbitmaps/package.py +++ b/var/spack/repos/builtin/packages/xbitmaps/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcalc/package.py b/var/spack/repos/builtin/packages/xcalc/package.py index 10c472f86c..0b666234a9 100644 --- a/var/spack/repos/builtin/packages/xcalc/package.py +++ b/var/spack/repos/builtin/packages/xcalc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-demo/package.py b/var/spack/repos/builtin/packages/xcb-demo/package.py index 95f7eecdc2..dcceb2c222 100644 --- a/var/spack/repos/builtin/packages/xcb-demo/package.py +++ b/var/spack/repos/builtin/packages/xcb-demo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-proto/package.py b/var/spack/repos/builtin/packages/xcb-proto/package.py index 314a07af3f..9b58531181 100644 --- a/var/spack/repos/builtin/packages/xcb-proto/package.py +++ b/var/spack/repos/builtin/packages/xcb-proto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util-cursor/package.py b/var/spack/repos/builtin/packages/xcb-util-cursor/package.py index 5d9cb5db95..305f09f715 100644 --- a/var/spack/repos/builtin/packages/xcb-util-cursor/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-cursor/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util-errors/package.py b/var/spack/repos/builtin/packages/xcb-util-errors/package.py index f3b1c21ce2..25336d835f 100644 --- a/var/spack/repos/builtin/packages/xcb-util-errors/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-errors/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util-image/package.py b/var/spack/repos/builtin/packages/xcb-util-image/package.py index 76cb6074d7..1837362a25 100644 --- a/var/spack/repos/builtin/packages/xcb-util-image/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-image/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py b/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py index 525e5e3427..f496df6534 100644 --- a/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-keysyms/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py b/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py index 4b97eb1312..aff15afacc 100644 --- a/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-renderutil/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util-wm/package.py b/var/spack/repos/builtin/packages/xcb-util-wm/package.py index b55457b703..d17bc985ca 100644 --- a/var/spack/repos/builtin/packages/xcb-util-wm/package.py +++ b/var/spack/repos/builtin/packages/xcb-util-wm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcb-util/package.py b/var/spack/repos/builtin/packages/xcb-util/package.py index 0096e226b5..628d118de3 100644 --- a/var/spack/repos/builtin/packages/xcb-util/package.py +++ b/var/spack/repos/builtin/packages/xcb-util/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xclipboard/package.py b/var/spack/repos/builtin/packages/xclipboard/package.py index 6e3173078a..7e4d922cbd 100644 --- a/var/spack/repos/builtin/packages/xclipboard/package.py +++ b/var/spack/repos/builtin/packages/xclipboard/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xclock/package.py b/var/spack/repos/builtin/packages/xclock/package.py index 45d12d169c..1c974a7284 100644 --- a/var/spack/repos/builtin/packages/xclock/package.py +++ b/var/spack/repos/builtin/packages/xclock/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcmiscproto/package.py b/var/spack/repos/builtin/packages/xcmiscproto/package.py index 050a02fe42..7afd048726 100644 --- a/var/spack/repos/builtin/packages/xcmiscproto/package.py +++ b/var/spack/repos/builtin/packages/xcmiscproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcmsdb/package.py b/var/spack/repos/builtin/packages/xcmsdb/package.py index cfa6cf9b12..c2f305cc3e 100644 --- a/var/spack/repos/builtin/packages/xcmsdb/package.py +++ b/var/spack/repos/builtin/packages/xcmsdb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcompmgr/package.py b/var/spack/repos/builtin/packages/xcompmgr/package.py index e0fb129692..71a47b9251 100644 --- a/var/spack/repos/builtin/packages/xcompmgr/package.py +++ b/var/spack/repos/builtin/packages/xcompmgr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xconsole/package.py b/var/spack/repos/builtin/packages/xconsole/package.py index 3261df3e2a..49219716c2 100644 --- a/var/spack/repos/builtin/packages/xconsole/package.py +++ b/var/spack/repos/builtin/packages/xconsole/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcursor-themes/package.py b/var/spack/repos/builtin/packages/xcursor-themes/package.py index 046b217de5..a31d552326 100644 --- a/var/spack/repos/builtin/packages/xcursor-themes/package.py +++ b/var/spack/repos/builtin/packages/xcursor-themes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xcursorgen/package.py b/var/spack/repos/builtin/packages/xcursorgen/package.py index d9229aba77..9737f2302b 100644 --- a/var/spack/repos/builtin/packages/xcursorgen/package.py +++ b/var/spack/repos/builtin/packages/xcursorgen/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xdbedizzy/package.py b/var/spack/repos/builtin/packages/xdbedizzy/package.py index ee77adad2e..b0498af9d1 100644 --- a/var/spack/repos/builtin/packages/xdbedizzy/package.py +++ b/var/spack/repos/builtin/packages/xdbedizzy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xditview/package.py b/var/spack/repos/builtin/packages/xditview/package.py index 81566abdc9..68c619f27e 100644 --- a/var/spack/repos/builtin/packages/xditview/package.py +++ b/var/spack/repos/builtin/packages/xditview/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xdm/package.py b/var/spack/repos/builtin/packages/xdm/package.py index 07e31c000b..72c3bb708d 100644 --- a/var/spack/repos/builtin/packages/xdm/package.py +++ b/var/spack/repos/builtin/packages/xdm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xdpyinfo/package.py b/var/spack/repos/builtin/packages/xdpyinfo/package.py index cd5b32a689..0e0d360172 100644 --- a/var/spack/repos/builtin/packages/xdpyinfo/package.py +++ b/var/spack/repos/builtin/packages/xdpyinfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xdriinfo/package.py b/var/spack/repos/builtin/packages/xdriinfo/package.py index 79f693dc4b..a4749d9bf4 100644 --- a/var/spack/repos/builtin/packages/xdriinfo/package.py +++ b/var/spack/repos/builtin/packages/xdriinfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xedit/package.py b/var/spack/repos/builtin/packages/xedit/package.py index acb44faf74..2211c75ac4 100644 --- a/var/spack/repos/builtin/packages/xedit/package.py +++ b/var/spack/repos/builtin/packages/xedit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xerces-c/package.py b/var/spack/repos/builtin/packages/xerces-c/package.py index 3b8e512c17..c1032dd5ce 100644 --- a/var/spack/repos/builtin/packages/xerces-c/package.py +++ b/var/spack/repos/builtin/packages/xerces-c/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xev/package.py b/var/spack/repos/builtin/packages/xev/package.py index ddfd72e4c7..315c535891 100644 --- a/var/spack/repos/builtin/packages/xev/package.py +++ b/var/spack/repos/builtin/packages/xev/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xextproto/package.py b/var/spack/repos/builtin/packages/xextproto/package.py index a6de568f61..e98a772e97 100644 --- a/var/spack/repos/builtin/packages/xextproto/package.py +++ b/var/spack/repos/builtin/packages/xextproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xeyes/package.py b/var/spack/repos/builtin/packages/xeyes/package.py index 28b3e1d624..bf7e299b48 100644 --- a/var/spack/repos/builtin/packages/xeyes/package.py +++ b/var/spack/repos/builtin/packages/xeyes/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86bigfontproto/package.py b/var/spack/repos/builtin/packages/xf86bigfontproto/package.py index 620d7f014c..8ee1cce512 100644 --- a/var/spack/repos/builtin/packages/xf86bigfontproto/package.py +++ b/var/spack/repos/builtin/packages/xf86bigfontproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86dga/package.py b/var/spack/repos/builtin/packages/xf86dga/package.py index 84c194e236..1928ac83ae 100644 --- a/var/spack/repos/builtin/packages/xf86dga/package.py +++ b/var/spack/repos/builtin/packages/xf86dga/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86dgaproto/package.py b/var/spack/repos/builtin/packages/xf86dgaproto/package.py index e07da8cd2d..bbd9539dec 100644 --- a/var/spack/repos/builtin/packages/xf86dgaproto/package.py +++ b/var/spack/repos/builtin/packages/xf86dgaproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86driproto/package.py b/var/spack/repos/builtin/packages/xf86driproto/package.py index 5c10143e43..468aeab610 100644 --- a/var/spack/repos/builtin/packages/xf86driproto/package.py +++ b/var/spack/repos/builtin/packages/xf86driproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86miscproto/package.py b/var/spack/repos/builtin/packages/xf86miscproto/package.py index 9e6231b344..b0eb8c1639 100644 --- a/var/spack/repos/builtin/packages/xf86miscproto/package.py +++ b/var/spack/repos/builtin/packages/xf86miscproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86rushproto/package.py b/var/spack/repos/builtin/packages/xf86rushproto/package.py index 0e5d8d935a..5e5bfe7703 100644 --- a/var/spack/repos/builtin/packages/xf86rushproto/package.py +++ b/var/spack/repos/builtin/packages/xf86rushproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py b/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py index 20238e3c27..d665d33be1 100644 --- a/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py +++ b/var/spack/repos/builtin/packages/xf86vidmodeproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xfd/package.py b/var/spack/repos/builtin/packages/xfd/package.py index b55b90752a..0a2284a444 100644 --- a/var/spack/repos/builtin/packages/xfd/package.py +++ b/var/spack/repos/builtin/packages/xfd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xfindproxy/package.py b/var/spack/repos/builtin/packages/xfindproxy/package.py index 3cdcd5069a..5c78e42bb3 100644 --- a/var/spack/repos/builtin/packages/xfindproxy/package.py +++ b/var/spack/repos/builtin/packages/xfindproxy/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xfontsel/package.py b/var/spack/repos/builtin/packages/xfontsel/package.py index c8fa0ef95b..59dcfa6ee0 100644 --- a/var/spack/repos/builtin/packages/xfontsel/package.py +++ b/var/spack/repos/builtin/packages/xfontsel/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xfs/package.py b/var/spack/repos/builtin/packages/xfs/package.py index ecc94d4835..e892ffb222 100644 --- a/var/spack/repos/builtin/packages/xfs/package.py +++ b/var/spack/repos/builtin/packages/xfs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xfsinfo/package.py b/var/spack/repos/builtin/packages/xfsinfo/package.py index 8f6bdae9cc..88b45b2f4f 100644 --- a/var/spack/repos/builtin/packages/xfsinfo/package.py +++ b/var/spack/repos/builtin/packages/xfsinfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xfwp/package.py b/var/spack/repos/builtin/packages/xfwp/package.py index 38bbf8342b..6093f5b3ef 100644 --- a/var/spack/repos/builtin/packages/xfwp/package.py +++ b/var/spack/repos/builtin/packages/xfwp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xgamma/package.py b/var/spack/repos/builtin/packages/xgamma/package.py index 9ec7118608..468572af94 100644 --- a/var/spack/repos/builtin/packages/xgamma/package.py +++ b/var/spack/repos/builtin/packages/xgamma/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xgc/package.py b/var/spack/repos/builtin/packages/xgc/package.py index 3592bc923f..f51283b85e 100644 --- a/var/spack/repos/builtin/packages/xgc/package.py +++ b/var/spack/repos/builtin/packages/xgc/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xhost/package.py b/var/spack/repos/builtin/packages/xhost/package.py index 21accc5284..93b75790d0 100644 --- a/var/spack/repos/builtin/packages/xhost/package.py +++ b/var/spack/repos/builtin/packages/xhost/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xineramaproto/package.py b/var/spack/repos/builtin/packages/xineramaproto/package.py index 003e365a90..1a21892a47 100644 --- a/var/spack/repos/builtin/packages/xineramaproto/package.py +++ b/var/spack/repos/builtin/packages/xineramaproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xinit/package.py b/var/spack/repos/builtin/packages/xinit/package.py index 376978683f..71361a24b2 100644 --- a/var/spack/repos/builtin/packages/xinit/package.py +++ b/var/spack/repos/builtin/packages/xinit/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xinput/package.py b/var/spack/repos/builtin/packages/xinput/package.py index 7c6f82afdf..4def5efbbb 100644 --- a/var/spack/repos/builtin/packages/xinput/package.py +++ b/var/spack/repos/builtin/packages/xinput/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkbcomp/package.py b/var/spack/repos/builtin/packages/xkbcomp/package.py index 398742d7e5..aa85999bf4 100644 --- a/var/spack/repos/builtin/packages/xkbcomp/package.py +++ b/var/spack/repos/builtin/packages/xkbcomp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkbdata/package.py b/var/spack/repos/builtin/packages/xkbdata/package.py index 96cf29b500..d6108ea7e9 100644 --- a/var/spack/repos/builtin/packages/xkbdata/package.py +++ b/var/spack/repos/builtin/packages/xkbdata/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkbevd/package.py b/var/spack/repos/builtin/packages/xkbevd/package.py index 66c8f3b811..e74674befa 100644 --- a/var/spack/repos/builtin/packages/xkbevd/package.py +++ b/var/spack/repos/builtin/packages/xkbevd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkbprint/package.py b/var/spack/repos/builtin/packages/xkbprint/package.py index 2b93582d3e..d8b252d529 100644 --- a/var/spack/repos/builtin/packages/xkbprint/package.py +++ b/var/spack/repos/builtin/packages/xkbprint/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkbutils/package.py b/var/spack/repos/builtin/packages/xkbutils/package.py index 45d966f26e..4bb964a95b 100644 --- a/var/spack/repos/builtin/packages/xkbutils/package.py +++ b/var/spack/repos/builtin/packages/xkbutils/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkeyboard-config/package.py b/var/spack/repos/builtin/packages/xkeyboard-config/package.py index e1f2753275..3a0eb8f516 100644 --- a/var/spack/repos/builtin/packages/xkeyboard-config/package.py +++ b/var/spack/repos/builtin/packages/xkeyboard-config/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xkill/package.py b/var/spack/repos/builtin/packages/xkill/package.py index 6afbf5a680..bdc2f10119 100644 --- a/var/spack/repos/builtin/packages/xkill/package.py +++ b/var/spack/repos/builtin/packages/xkill/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xload/package.py b/var/spack/repos/builtin/packages/xload/package.py index b71986db1a..3074f272ca 100644 --- a/var/spack/repos/builtin/packages/xload/package.py +++ b/var/spack/repos/builtin/packages/xload/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xlogo/package.py b/var/spack/repos/builtin/packages/xlogo/package.py index 6522d4f514..fca0cfb00b 100644 --- a/var/spack/repos/builtin/packages/xlogo/package.py +++ b/var/spack/repos/builtin/packages/xlogo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xlsatoms/package.py b/var/spack/repos/builtin/packages/xlsatoms/package.py index a1a8257dc1..6332605bf2 100644 --- a/var/spack/repos/builtin/packages/xlsatoms/package.py +++ b/var/spack/repos/builtin/packages/xlsatoms/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xlsclients/package.py b/var/spack/repos/builtin/packages/xlsclients/package.py index 124c876a0a..dcdec448ed 100644 --- a/var/spack/repos/builtin/packages/xlsclients/package.py +++ b/var/spack/repos/builtin/packages/xlsclients/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xlsfonts/package.py b/var/spack/repos/builtin/packages/xlsfonts/package.py index 7267692b98..942fbeb79a 100644 --- a/var/spack/repos/builtin/packages/xlsfonts/package.py +++ b/var/spack/repos/builtin/packages/xlsfonts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xmag/package.py b/var/spack/repos/builtin/packages/xmag/package.py index c2d135eec0..8ec5a3bb05 100644 --- a/var/spack/repos/builtin/packages/xmag/package.py +++ b/var/spack/repos/builtin/packages/xmag/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xman/package.py b/var/spack/repos/builtin/packages/xman/package.py index c59ced19a6..3a3a6ab7d9 100644 --- a/var/spack/repos/builtin/packages/xman/package.py +++ b/var/spack/repos/builtin/packages/xman/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xmessage/package.py b/var/spack/repos/builtin/packages/xmessage/package.py index 55461933bc..b8fe904ced 100644 --- a/var/spack/repos/builtin/packages/xmessage/package.py +++ b/var/spack/repos/builtin/packages/xmessage/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xmh/package.py b/var/spack/repos/builtin/packages/xmh/package.py index 35798f8846..a045941b3e 100644 --- a/var/spack/repos/builtin/packages/xmh/package.py +++ b/var/spack/repos/builtin/packages/xmh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xmlto/package.py b/var/spack/repos/builtin/packages/xmlto/package.py index de4a8985b0..8cb95a962f 100644 --- a/var/spack/repos/builtin/packages/xmlto/package.py +++ b/var/spack/repos/builtin/packages/xmlto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xmodmap/package.py b/var/spack/repos/builtin/packages/xmodmap/package.py index 727cebc563..5091a7df74 100644 --- a/var/spack/repos/builtin/packages/xmodmap/package.py +++ b/var/spack/repos/builtin/packages/xmodmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xmore/package.py b/var/spack/repos/builtin/packages/xmore/package.py index e1da468d3e..06183f113c 100644 --- a/var/spack/repos/builtin/packages/xmore/package.py +++ b/var/spack/repos/builtin/packages/xmore/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xorg-cf-files/package.py b/var/spack/repos/builtin/packages/xorg-cf-files/package.py index 3fd9cb45b9..5b63ee0723 100644 --- a/var/spack/repos/builtin/packages/xorg-cf-files/package.py +++ b/var/spack/repos/builtin/packages/xorg-cf-files/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xorg-docs/package.py b/var/spack/repos/builtin/packages/xorg-docs/package.py index 1f81642c8b..cfd336760d 100644 --- a/var/spack/repos/builtin/packages/xorg-docs/package.py +++ b/var/spack/repos/builtin/packages/xorg-docs/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xorg-gtest/package.py b/var/spack/repos/builtin/packages/xorg-gtest/package.py index 2774027e3f..4e66679929 100644 --- a/var/spack/repos/builtin/packages/xorg-gtest/package.py +++ b/var/spack/repos/builtin/packages/xorg-gtest/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xorg-server/package.py b/var/spack/repos/builtin/packages/xorg-server/package.py index 8c5f1473e9..c6f1291a7c 100644 --- a/var/spack/repos/builtin/packages/xorg-server/package.py +++ b/var/spack/repos/builtin/packages/xorg-server/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py b/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py index 4c8f4d0ec1..b71bb26284 100644 --- a/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py +++ b/var/spack/repos/builtin/packages/xorg-sgml-doctools/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xphelloworld/package.py b/var/spack/repos/builtin/packages/xphelloworld/package.py index 61a158cc41..29d1dba9e8 100644 --- a/var/spack/repos/builtin/packages/xphelloworld/package.py +++ b/var/spack/repos/builtin/packages/xphelloworld/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xplor-nih/package.py b/var/spack/repos/builtin/packages/xplor-nih/package.py index 4ae0ea519f..d58a5257ba 100644 --- a/var/spack/repos/builtin/packages/xplor-nih/package.py +++ b/var/spack/repos/builtin/packages/xplor-nih/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xplsprinters/package.py b/var/spack/repos/builtin/packages/xplsprinters/package.py index 02bddf0877..e524c1affe 100644 --- a/var/spack/repos/builtin/packages/xplsprinters/package.py +++ b/var/spack/repos/builtin/packages/xplsprinters/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xpr/package.py b/var/spack/repos/builtin/packages/xpr/package.py index 4960647670..3b79ca2f27 100644 --- a/var/spack/repos/builtin/packages/xpr/package.py +++ b/var/spack/repos/builtin/packages/xpr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xprehashprinterlist/package.py b/var/spack/repos/builtin/packages/xprehashprinterlist/package.py index 3a0efd00c4..6d4e5f6ba4 100644 --- a/var/spack/repos/builtin/packages/xprehashprinterlist/package.py +++ b/var/spack/repos/builtin/packages/xprehashprinterlist/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xprop/package.py b/var/spack/repos/builtin/packages/xprop/package.py index 0cd9b92040..8ba775dbf9 100644 --- a/var/spack/repos/builtin/packages/xprop/package.py +++ b/var/spack/repos/builtin/packages/xprop/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xproto/package.py b/var/spack/repos/builtin/packages/xproto/package.py index 2bb1df326c..121e4b465b 100644 --- a/var/spack/repos/builtin/packages/xproto/package.py +++ b/var/spack/repos/builtin/packages/xproto/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py b/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py index f4eb75ca28..d88c892c28 100644 --- a/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py +++ b/var/spack/repos/builtin/packages/xproxymanagementprotocol/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xqilla/package.py b/var/spack/repos/builtin/packages/xqilla/package.py index 5cb346cc1d..3097070604 100644 --- a/var/spack/repos/builtin/packages/xqilla/package.py +++ b/var/spack/repos/builtin/packages/xqilla/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xrandr/package.py b/var/spack/repos/builtin/packages/xrandr/package.py index c33f0a227f..35bb5079be 100644 --- a/var/spack/repos/builtin/packages/xrandr/package.py +++ b/var/spack/repos/builtin/packages/xrandr/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xrdb/package.py b/var/spack/repos/builtin/packages/xrdb/package.py index 3c6452476f..39daff0be2 100644 --- a/var/spack/repos/builtin/packages/xrdb/package.py +++ b/var/spack/repos/builtin/packages/xrdb/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xrefresh/package.py b/var/spack/repos/builtin/packages/xrefresh/package.py index ef929f325f..bddc69f855 100644 --- a/var/spack/repos/builtin/packages/xrefresh/package.py +++ b/var/spack/repos/builtin/packages/xrefresh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xrootd/package.py b/var/spack/repos/builtin/packages/xrootd/package.py index 6388c006a7..684a4ce845 100644 --- a/var/spack/repos/builtin/packages/xrootd/package.py +++ b/var/spack/repos/builtin/packages/xrootd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xrx/package.py b/var/spack/repos/builtin/packages/xrx/package.py index af832f80a0..e83ba15a16 100644 --- a/var/spack/repos/builtin/packages/xrx/package.py +++ b/var/spack/repos/builtin/packages/xrx/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsbench/package.py b/var/spack/repos/builtin/packages/xsbench/package.py index db84ec5b3d..e38f2d9a18 100644 --- a/var/spack/repos/builtin/packages/xsbench/package.py +++ b/var/spack/repos/builtin/packages/xsbench/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xscope/package.py b/var/spack/repos/builtin/packages/xscope/package.py index 7b3b910415..a1e55ff60e 100644 --- a/var/spack/repos/builtin/packages/xscope/package.py +++ b/var/spack/repos/builtin/packages/xscope/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsdk/package.py b/var/spack/repos/builtin/packages/xsdk/package.py index 4d27b5a79f..98b628a56b 100644 --- a/var/spack/repos/builtin/packages/xsdk/package.py +++ b/var/spack/repos/builtin/packages/xsdk/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsdktrilinos/package.py b/var/spack/repos/builtin/packages/xsdktrilinos/package.py index cf3d425313..dd17611115 100644 --- a/var/spack/repos/builtin/packages/xsdktrilinos/package.py +++ b/var/spack/repos/builtin/packages/xsdktrilinos/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xset/package.py b/var/spack/repos/builtin/packages/xset/package.py index e0d8b9fdee..23f8f499ac 100644 --- a/var/spack/repos/builtin/packages/xset/package.py +++ b/var/spack/repos/builtin/packages/xset/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsetmode/package.py b/var/spack/repos/builtin/packages/xsetmode/package.py index 36e4c52021..fe3d3b740d 100644 --- a/var/spack/repos/builtin/packages/xsetmode/package.py +++ b/var/spack/repos/builtin/packages/xsetmode/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsetpointer/package.py b/var/spack/repos/builtin/packages/xsetpointer/package.py index d2e27810a5..64f77c146c 100644 --- a/var/spack/repos/builtin/packages/xsetpointer/package.py +++ b/var/spack/repos/builtin/packages/xsetpointer/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsetroot/package.py b/var/spack/repos/builtin/packages/xsetroot/package.py index 1a9bcd141e..3ac117dd6d 100644 --- a/var/spack/repos/builtin/packages/xsetroot/package.py +++ b/var/spack/repos/builtin/packages/xsetroot/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xsm/package.py b/var/spack/repos/builtin/packages/xsm/package.py index eb22f4ff64..d5e28969c9 100644 --- a/var/spack/repos/builtin/packages/xsm/package.py +++ b/var/spack/repos/builtin/packages/xsm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xstdcmap/package.py b/var/spack/repos/builtin/packages/xstdcmap/package.py index b2b1592b84..78a907ea3a 100644 --- a/var/spack/repos/builtin/packages/xstdcmap/package.py +++ b/var/spack/repos/builtin/packages/xstdcmap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xterm/package.py b/var/spack/repos/builtin/packages/xterm/package.py index 70208d05c8..632db2cf30 100644 --- a/var/spack/repos/builtin/packages/xterm/package.py +++ b/var/spack/repos/builtin/packages/xterm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xtrans/package.py b/var/spack/repos/builtin/packages/xtrans/package.py index c2b032564a..866ab021ce 100644 --- a/var/spack/repos/builtin/packages/xtrans/package.py +++ b/var/spack/repos/builtin/packages/xtrans/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xtrap/package.py b/var/spack/repos/builtin/packages/xtrap/package.py index 499d56f48e..dd3ec02bd8 100644 --- a/var/spack/repos/builtin/packages/xtrap/package.py +++ b/var/spack/repos/builtin/packages/xtrap/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xts/package.py b/var/spack/repos/builtin/packages/xts/package.py index 727991b78d..5a2c728dec 100644 --- a/var/spack/repos/builtin/packages/xts/package.py +++ b/var/spack/repos/builtin/packages/xts/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xvidtune/package.py b/var/spack/repos/builtin/packages/xvidtune/package.py index fd3cdb7f8c..d3cf88f854 100644 --- a/var/spack/repos/builtin/packages/xvidtune/package.py +++ b/var/spack/repos/builtin/packages/xvidtune/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xvinfo/package.py b/var/spack/repos/builtin/packages/xvinfo/package.py index 04efb4549c..e1f503659e 100644 --- a/var/spack/repos/builtin/packages/xvinfo/package.py +++ b/var/spack/repos/builtin/packages/xvinfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xwd/package.py b/var/spack/repos/builtin/packages/xwd/package.py index a93e54fb93..9a69c18bee 100644 --- a/var/spack/repos/builtin/packages/xwd/package.py +++ b/var/spack/repos/builtin/packages/xwd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xwininfo/package.py b/var/spack/repos/builtin/packages/xwininfo/package.py index 4fe2e5b8c3..7aa923600e 100644 --- a/var/spack/repos/builtin/packages/xwininfo/package.py +++ b/var/spack/repos/builtin/packages/xwininfo/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xwud/package.py b/var/spack/repos/builtin/packages/xwud/package.py index 2635f9d171..5fd5bc55de 100644 --- a/var/spack/repos/builtin/packages/xwud/package.py +++ b/var/spack/repos/builtin/packages/xwud/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/xz/package.py b/var/spack/repos/builtin/packages/xz/package.py index 9da2eac201..b92fe6687d 100644 --- a/var/spack/repos/builtin/packages/xz/package.py +++ b/var/spack/repos/builtin/packages/xz/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/yaml-cpp/package.py b/var/spack/repos/builtin/packages/yaml-cpp/package.py index 59228ec4cb..28a916b4ca 100644 --- a/var/spack/repos/builtin/packages/yaml-cpp/package.py +++ b/var/spack/repos/builtin/packages/yaml-cpp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/yasm/package.py b/var/spack/repos/builtin/packages/yasm/package.py index 07173cc0fb..d971a7b9a7 100644 --- a/var/spack/repos/builtin/packages/yasm/package.py +++ b/var/spack/repos/builtin/packages/yasm/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/yorick/package.py b/var/spack/repos/builtin/packages/yorick/package.py index 6facdfd9fb..d4df477c4a 100644 --- a/var/spack/repos/builtin/packages/yorick/package.py +++ b/var/spack/repos/builtin/packages/yorick/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/z3/package.py b/var/spack/repos/builtin/packages/z3/package.py index d6cd94a53a..358fe5a334 100644 --- a/var/spack/repos/builtin/packages/z3/package.py +++ b/var/spack/repos/builtin/packages/z3/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zeromq/package.py b/var/spack/repos/builtin/packages/zeromq/package.py index 945459b948..237b63f7b2 100644 --- a/var/spack/repos/builtin/packages/zeromq/package.py +++ b/var/spack/repos/builtin/packages/zeromq/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zfp/package.py b/var/spack/repos/builtin/packages/zfp/package.py index b5e3c7c2bc..b815612c54 100644 --- a/var/spack/repos/builtin/packages/zfp/package.py +++ b/var/spack/repos/builtin/packages/zfp/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zip/package.py b/var/spack/repos/builtin/packages/zip/package.py index 3787df320a..98cbba0c35 100644 --- a/var/spack/repos/builtin/packages/zip/package.py +++ b/var/spack/repos/builtin/packages/zip/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zlib/package.py b/var/spack/repos/builtin/packages/zlib/package.py index 30fcef95e1..11ae411e91 100644 --- a/var/spack/repos/builtin/packages/zlib/package.py +++ b/var/spack/repos/builtin/packages/zlib/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zoltan/package.py b/var/spack/repos/builtin/packages/zoltan/package.py index 6404cadbe1..4f81efbc6c 100644 --- a/var/spack/repos/builtin/packages/zoltan/package.py +++ b/var/spack/repos/builtin/packages/zoltan/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zsh/package.py b/var/spack/repos/builtin/packages/zsh/package.py index 7225418363..d18200b4ad 100644 --- a/var/spack/repos/builtin/packages/zsh/package.py +++ b/var/spack/repos/builtin/packages/zsh/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. diff --git a/var/spack/repos/builtin/packages/zstd/package.py b/var/spack/repos/builtin/packages/zstd/package.py index 0551ff8163..3e8c6e7c39 100644 --- a/var/spack/repos/builtin/packages/zstd/package.py +++ b/var/spack/repos/builtin/packages/zstd/package.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory. # # This file is part of Spack. -- cgit v1.2.3-70-g09d2 From 4f57c9651a5f4605d4e3668298bd20307181bfb5 Mon Sep 17 00:00:00 2001 From: Rob Latham Date: Thu, 7 Sep 2017 22:07:03 -0500 Subject: dump environment in sourceable form (#5301) First, quote the environment variable values. Second, export the variables. sorry, this is bourn-shell syntax. Happy to consider a shell-independent way to do this, but spack is already using sh-like "env=value" --- lib/spack/spack/util/environment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index 276f8d63f3..38576d6e9d 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -72,4 +72,4 @@ def dump_environment(path): """Dump the current environment out to a file.""" with open(path, 'w') as env_file: for key, val in sorted(os.environ.items()): - env_file.write("%s=%s\n" % (key, val)) + env_file.write('export %s="%s"\n' % (key, val)) -- cgit v1.2.3-70-g09d2 From 51828dd982f2642b3f52512aea4fb2c02395d378 Mon Sep 17 00:00:00 2001 From: Matthew Scott Krafczyk Date: Fri, 8 Sep 2017 12:15:06 -0500 Subject: Bootstrap environment-modules Renames the existing bootstrap command to 'clone'. Repurposes 'spack bootstrap' to install packages that are useful to the operation of Spack (for now this is just environment-modules). For bash and ksh users running setup-env.sh, if a Spack-installed instance of environment-modules is detected and environment modules and dotkit are not externally available, Spack will define the 'module' command in the user's shell to use the environment-modules built by Spack. --- lib/spack/docs/getting_started.rst | 101 +++++++++++------ lib/spack/docs/module_file_support.rst | 12 +- lib/spack/spack/cmd/bootstrap.py | 125 +++++++++------------ lib/spack/spack/cmd/clone.py | 107 ++++++++++++++++++ share/spack/setup-env.sh | 57 +++++++++- .../packages/environment-modules/package.py | 5 + 6 files changed, 292 insertions(+), 115 deletions(-) create mode 100644 lib/spack/spack/cmd/clone.py (limited to 'lib') diff --git a/lib/spack/docs/getting_started.rst b/lib/spack/docs/getting_started.rst index ef0f25cb04..ffa9bf2414 100644 --- a/lib/spack/docs/getting_started.rst +++ b/lib/spack/docs/getting_started.rst @@ -52,7 +52,7 @@ For a richer experience, use Spack's shell support: .. code-block:: console - # For bash users + # For bash/zsh users $ export SPACK_ROOT=/path/to/spack $ . $SPACK_ROOT/share/spack/setup-env.sh @@ -60,10 +60,15 @@ For a richer experience, use Spack's shell support: $ setenv SPACK_ROOT /path/to/spack $ source $SPACK_ROOT/share/spack/setup-env.csh + This automatically adds Spack to your ``PATH`` and allows the ``spack`` -command to :ref:`load environment modules ` and execute +command to be used to execute spack :ref:`commands ` and :ref:`useful packaging commands `. +If :ref:`environment-modules or dotkit ` is +installed and available, the ``spack`` command can also load and unload +:ref:`modules `. + ^^^^^^^^^^^^^^^^^ Clean Environment ^^^^^^^^^^^^^^^^^ @@ -94,12 +99,12 @@ Optional: Alternate Prefix ^^^^^^^^^^^^^^^^^^^^^^^^^^ You may want to run Spack out of a prefix other than the git repository -you cloned. The ``spack bootstrap`` command provides this +you cloned. The ``spack clone`` command provides this functionality. To install spack in a new directory, simply type: .. code-block:: console - $ spack bootstrap /my/favorite/prefix + $ spack clone /my/favorite/prefix This will install a new spack script in ``/my/favorite/prefix/bin``, which you can use just like you would the regular spack script. Each @@ -849,6 +854,10 @@ well. They can generally be activated as in the ``curl`` example above; or some systems might already have an appropriate hand-built environment module that may be loaded. Either way works. +If you find that you are missing some of these programs, ``spack`` can +build some of them for you with ``spack bootstrap``. Currently supported +programs are ``environment-modules``. + A few notes on specific programs in this list: """""""""""""""""""""""""" @@ -885,52 +894,72 @@ Environment Modules In order to use Spack's generated environment modules, you must have installed one of *Environment Modules* or *Lmod*. On many Linux distributions, this can be installed from the vendor's repository. For -example: ``yum install environment-modules`` (Fedora/RHEL/CentOS). If -your Linux distribution does not have Environment Modules, you can get it -with Spack: +example: ``yum install environment-modules`` (Fedora/RHEL/CentOS). If +your Linux distribution does not have Environment Modules, Spack can +build it for you! -#. Consider using system tcl (as long as your system has Tcl version 8.0 or later): +What follows are three steps describing how to install and use environment-modules with spack. - #) Identify its location using ``which tclsh`` - #) Identify its version using ``echo 'puts $tcl_version;exit 0' | tclsh`` - #) Add to ``~/.spack/packages.yaml`` and modify as appropriate: +#. Install ``environment-modules``. - .. code-block:: yaml + * ``spack bootstrap`` will build ``environment-modules`` for you (and may build + other packages that are useful to the operation of Spack) - packages: - tcl: - paths: - tcl@8.5: /usr - buildable: False + * Install ``environment-modules`` using ``spack install`` with + ``spack install environment-modules~X`` (The ``~X`` variant builds without Xorg + dependencies, but ``environment-modules`` works fine too.) -#. Install with: +#. Add ``modulecmd`` to ``PATH`` and create a ``module`` command. - .. code-block:: console + * If you are using ``bash`` or ``ksh``, Spack can currently do this for you as well. + After installing ``environment-modules`` following the step + above, source Spack's shell integration script. This will automatically + detect the lack of ``modulecmd`` and ``module``, and use the installed + ``environment-modules`` from ``spack bootstrap`` or ``spack install``. + + .. code-block:: console - $ spack install environment-modules + # For bash/zsh users + $ export SPACK_ROOT=/path/to/spack + $ . $SPACK_ROOT/share/spack/setup-env.sh -#. Activate with the following script (or apply the updates to your - ``.bashrc`` file manually): - .. code-block:: sh + * If you prefer to do it manually, you can activate with the following + script (or apply the updates to your ``.bashrc`` file manually): - TMP=`tempfile` - echo >$TMP - MODULE_HOME=`spack location --install-dir environment-modules` - MODULE_VERSION=`ls -1 $MODULE_HOME/Modules | head -1` - ${MODULE_HOME}/Modules/${MODULE_VERSION}/bin/add.modules <$TMP - cp .bashrc $TMP - echo "MODULE_VERSION=${MODULE_VERSION}" > .bashrc - cat $TMP >>.bashrc + .. code-block:: sh -This adds to your ``.bashrc`` (or similar) files, enabling Environment -Modules when you log in. Re-load your .bashrc (or log out and in -again), and then test that the ``module`` command is found with: + TMP=`tempfile` + echo >$TMP + MODULE_HOME=`spack location --install-dir environment-modules` + MODULE_VERSION=`ls -1 $MODULE_HOME/Modules | head -1` + ${MODULE_HOME}/Modules/${MODULE_VERSION}/bin/add.modules <$TMP + cp .bashrc $TMP + echo "MODULE_VERSION=${MODULE_VERSION}" > .bashrc + cat $TMP >>.bashrc -.. code-block:: console + This is added to your ``.bashrc`` (or similar) files, enabling Environment + Modules when you log in. + +#. Test that the ``module`` command is found with: - $ module avail + .. code-block:: console + + $ module avail + + +If ``tcl`` 8.0 or later is installed on your system, you can prevent +spack from rebuilding ``tcl`` as part of the ``environment-modules`` dependency +stack by adding the following to your ``~/.spack/packages.yaml`` replacing +version 8.5 with whatever version is installed on your system: + + .. code-block:: yaml + packages: + tcl: + paths: + tcl@8.5: /usr + buildable: False ^^^^^^^^^^^^^^^^^ Package Utilities diff --git a/lib/spack/docs/module_file_support.rst b/lib/spack/docs/module_file_support.rst index 93c2ee33c6..d8f5e561a8 100644 --- a/lib/spack/docs/module_file_support.rst +++ b/lib/spack/docs/module_file_support.rst @@ -44,6 +44,7 @@ For ``csh`` and ``tcsh`` instead: $ source $SPACK_ROOT/share/spack/setup-env.csh +When ``bash`` and ``ksh`` users update their environment with ``setup-env.sh``, it will check for spack-installed environment modules and add the ``module`` command to their environment; This only occurs if the module command is not already available. You can install ``environment-modules`` with ``spack bootstrap`` as described in :ref:`InstallEnvironmentModules`. .. note:: You can put the source line in your ``.bashrc`` or ``.cshrc`` to @@ -54,10 +55,11 @@ For ``csh`` and ``tcsh`` instead: Using module files via Spack ---------------------------- -If you have shell support enabled you should be able to run either -``module avail`` or ``use -l spack`` to see what module/dotkit files have -been installed. Here is sample output of those programs, showing lots -of installed packages. +If you have installed a supported module system either manually or through +``spack bootstrap`` and have enabled shell support, you should be able to +run either ``module avail`` or ``use -l spack`` to see what module/dotkit +files have been installed. Here is sample output of those programs, +showing lots of installed packages. .. code-block:: console @@ -210,7 +212,7 @@ Scripts to load modules recursively may be made with the command: $ spack module loads --dependencies -An equivalent alternative is: +An equivalent alternative using `process substitution `_ is: .. code-block :: console diff --git a/lib/spack/spack/cmd/bootstrap.py b/lib/spack/spack/cmd/bootstrap.py index b0550644f8..cd0a21b9e0 100644 --- a/lib/spack/spack/cmd/bootstrap.py +++ b/lib/spack/spack/cmd/bootstrap.py @@ -22,86 +22,69 @@ # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## -import os - import llnl.util.tty as tty -from llnl.util.filesystem import join_path, mkdirp - import spack -from spack.util.executable import ProcessError, which - -_SPACK_UPSTREAM = 'https://github.com/llnl/spack' +import spack.cmd +import spack.cmd.common.arguments as arguments -description = "create a new installation of spack in another prefix" +description = "Bootstrap packages needed for spack to run smoothly" section = "admin" level = "long" def setup_parser(subparser): subparser.add_argument( - '-r', '--remote', action='store', dest='remote', - help="name of the remote to bootstrap from", default='origin') + '-j', '--jobs', action='store', type=int, + help="explicitly set number of make jobs. default is #cpus") subparser.add_argument( - 'prefix', - help="names of prefix where we should install spack") - - -def get_origin_info(remote): - git_dir = join_path(spack.prefix, '.git') - git = which('git', required=True) - try: - branch = git('symbolic-ref', '--short', 'HEAD', output=str) - except ProcessError: - branch = 'develop' - tty.warn('No branch found; using default branch: %s' % branch) - if remote == 'origin' and \ - branch not in ('master', 'develop'): - branch = 'develop' - tty.warn('Unknown branch found; using default branch: %s' % branch) - try: - origin_url = git( - '--git-dir=%s' % git_dir, - 'config', '--get', 'remote.%s.url' % remote, - output=str) - except ProcessError: - origin_url = _SPACK_UPSTREAM - tty.warn('No git repository found; ' - 'using default upstream URL: %s' % origin_url) - return (origin_url.strip(), branch.strip()) - - -def bootstrap(parser, args): - origin_url, branch = get_origin_info(args.remote) - prefix = args.prefix - - tty.msg("Fetching spack from '%s': %s" % (args.remote, origin_url)) - - if os.path.isfile(prefix): - tty.die("There is already a file at %s" % prefix) - - mkdirp(prefix) - - if os.path.exists(join_path(prefix, '.git')): - tty.die("There already seems to be a git repository in %s" % prefix) - - files_in_the_way = os.listdir(prefix) - if files_in_the_way: - tty.die("There are already files there! " - "Delete these files before boostrapping spack.", - *files_in_the_way) - - tty.msg("Installing:", - "%s/bin/spack" % prefix, - "%s/lib/spack/..." % prefix) + '--keep-prefix', action='store_true', dest='keep_prefix', + help="don't remove the install prefix if installation fails") + 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") - os.chdir(prefix) - git = which('git', required=True) - git('init', '--shared', '-q') - git('remote', 'add', 'origin', origin_url) - git('fetch', 'origin', '%s:refs/remotes/origin/%s' % (branch, branch), - '-n', '-q') - git('reset', '--hard', 'origin/%s' % branch, '-q') - git('checkout', '-B', branch, 'origin/%s' % branch, '-q') + cd_group = subparser.add_mutually_exclusive_group() + arguments.add_common_arguments(cd_group, ['clean', 'dirty']) - tty.msg("Successfully created a new spack in %s" % prefix, - "Run %s/bin/spack to use this installation." % prefix) + subparser.add_argument( + '--run-tests', action='store_true', dest='run_tests', + help="run package level tests during installation" + ) + + +def bootstrap(parser, args, **kwargs): + kwargs.update({ + 'keep_prefix': args.keep_prefix, + 'keep_stage': args.keep_stage, + 'install_deps': 'dependencies', + 'make_jobs': args.jobs, + 'run_tests': args.run_tests, + 'verbose': args.verbose, + 'dirty': args.dirty + }) + + # Define requirement dictionary defining general specs which need + # to be satisfied, and the specs to install when the general spec + # isn't satisfied. + requirement_dict = {'environment-modules': 'environment-modules~X'} + + for requirement in requirement_dict: + installed_specs = spack.store.db.query(requirement) + if(len(installed_specs) > 0): + tty.msg("Requirement %s is satisfied with installed " + "package %s" % (requirement, installed_specs[0])) + else: + # Install requirement + spec_to_install = spack.Spec(requirement_dict[requirement]) + spec_to_install.concretize() + tty.msg("Installing %s to satisfy requirement for %s" % + (spec_to_install, requirement)) + kwargs['explicit'] = True + package = spack.repo.get(spec_to_install) + package.do_install(**kwargs) diff --git a/lib/spack/spack/cmd/clone.py b/lib/spack/spack/cmd/clone.py new file mode 100644 index 0000000000..19201b1f86 --- /dev/null +++ b/lib/spack/spack/cmd/clone.py @@ -0,0 +1,107 @@ +############################################################################## +# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +import os + +import llnl.util.tty as tty +from llnl.util.filesystem import join_path, mkdirp + +import spack +from spack.util.executable import ProcessError, which + +_SPACK_UPSTREAM = 'https://github.com/llnl/spack' + +description = "create a new installation of spack in another prefix" +section = "admin" +level = "long" + + +def setup_parser(subparser): + subparser.add_argument( + '-r', '--remote', action='store', dest='remote', + help="name of the remote to clone from", default='origin') + subparser.add_argument( + 'prefix', + help="names of prefix where we should install spack") + + +def get_origin_info(remote): + git_dir = join_path(spack.prefix, '.git') + git = which('git', required=True) + try: + branch = git('symbolic-ref', '--short', 'HEAD', output=str) + except ProcessError: + branch = 'develop' + tty.warn('No branch found; using default branch: %s' % branch) + if remote == 'origin' and \ + branch not in ('master', 'develop'): + branch = 'develop' + tty.warn('Unknown branch found; using default branch: %s' % branch) + try: + origin_url = git( + '--git-dir=%s' % git_dir, + 'config', '--get', 'remote.%s.url' % remote, + output=str) + except ProcessError: + origin_url = _SPACK_UPSTREAM + tty.warn('No git repository found; ' + 'using default upstream URL: %s' % origin_url) + return (origin_url.strip(), branch.strip()) + + +def clone(parser, args): + origin_url, branch = get_origin_info(args.remote) + prefix = args.prefix + + tty.msg("Fetching spack from '%s': %s" % (args.remote, origin_url)) + + if os.path.isfile(prefix): + tty.die("There is already a file at %s" % prefix) + + mkdirp(prefix) + + if os.path.exists(join_path(prefix, '.git')): + tty.die("There already seems to be a git repository in %s" % prefix) + + files_in_the_way = os.listdir(prefix) + if files_in_the_way: + tty.die("There are already files there! " + "Delete these files before boostrapping spack.", + *files_in_the_way) + + tty.msg("Installing:", + "%s/bin/spack" % prefix, + "%s/lib/spack/..." % prefix) + + os.chdir(prefix) + git = which('git', required=True) + git('init', '--shared', '-q') + git('remote', 'add', 'origin', origin_url) + git('fetch', 'origin', '%s:refs/remotes/origin/%s' % (branch, branch), + '-n', '-q') + git('reset', '--hard', 'origin/%s' % branch, '-q') + git('checkout', '-B', branch, 'origin/%s' % branch, '-q') + + tty.msg("Successfully created a new spack in %s" % prefix, + "Run %s/bin/spack to use this installation." % prefix) diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh index c9a3858621..958689cab4 100755 --- a/share/spack/setup-env.sh +++ b/share/spack/setup-env.sh @@ -27,7 +27,9 @@ # # This file is part of Spack and sets up the spack environment for # bash and zsh. This includes dotkit support, module support, and -# it also puts spack in your path. Source it like this: +# it also puts spack in your path. The script also checks that +# at least module support exists, and provides suggestions if it +# doesn't. Source it like this: # # . /path/to/spack/share/spack/setup-env.sh # @@ -189,19 +191,68 @@ if [ -z "$_sp_source_file" ]; then fi # -# Set up modules and dotkit search paths in the user environment +# Find root directory and add bin to path. # _sp_share_dir=$(cd "$(dirname $_sp_source_file)" && pwd) _sp_prefix=$(cd "$(dirname $(dirname $_sp_share_dir))" && pwd) _spack_pathadd PATH "${_sp_prefix%/}/bin" +export SPACK_ROOT=${_sp_prefix} + +# +# Determine which shell is being used +# +function _spack_determine_shell() { + ps -p $$ | tail -n 1 | awk '{print $4}' | xargs basename +} +export SPACK_SHELL=$(_spack_determine_shell) + +# +# Check whether a shell function of the given name is defined +# +function _spack_fn_exists() { + type $1 2>&1 | grep -q 'shell function' +} +need_module="no" +if [ ! $(_spack_fn_exists use) ] && [ ! $(_spack_fn_exists module) ]; then + need_module="yes" +fi; + +# +# build and make available environment-modules +# +if [ "${need_module}" = "yes" ]; then + #check if environment-modules~X is installed + module_prefix="$(spack location -i "environment-modules" 2>&1 || echo "not_installed")" + module_prefix=$(echo ${module_prefix} | tail -n 1) + if [ "${module_prefix}" != "not_installed" ]; then + #activate it! + export MODULE_PREFIX=${module_prefix} + _spack_pathadd PATH "${MODULE_PREFIX}/Modules/bin" + module() { eval `${MODULE_PREFIX}/Modules/bin/modulecmd ${SPACK_SHELL} $*`; } + echo "INFO: Using spack managed module system." + else + echo "WARNING: A method for managing modules does not currently exist." + echo "" + echo "To resolve this you may either:" + echo "1. Allow spack to handle this by running 'spack boostrap'" + echo " and sourcing this script again." + echo "2. Install and activate a supported module managment engine manually" + echo " Supported engines include: environment-modules and lmod" + fi; +else + echo "INFO: Using system available module system." +fi; + +# +# Set up modules and dotkit search paths in the user environment +# _sp_sys_type=$(spack-python -c 'print(spack.architecture.sys_type())') _sp_dotkit_root=$(spack-python -c "print(spack.util.path.canonicalize_path(spack.config.get_config('config').get('module_roots', {}).get('dotkit')))") _sp_tcl_root=$(spack-python -c "print(spack.util.path.canonicalize_path(spack.config.get_config('config').get('module_roots', {}).get('tcl')))") _spack_pathadd DK_NODE "${_sp_dotkit_root%/}/$_sp_sys_type" _spack_pathadd MODULEPATH "${_sp_tcl_root%/}/$_sp_sys_type" -# # Add programmable tab completion for Bash # if [ -n "${BASH_VERSION:-}" ]; then diff --git a/var/spack/repos/builtin/packages/environment-modules/package.py b/var/spack/repos/builtin/packages/environment-modules/package.py index 2774402605..fa0ea90fcf 100644 --- a/var/spack/repos/builtin/packages/environment-modules/package.py +++ b/var/spack/repos/builtin/packages/environment-modules/package.py @@ -35,6 +35,8 @@ class EnvironmentModules(Package): version('3.2.10', '8b097fdcb90c514d7540bb55a3cb90fb') + variant('X', default=True, description='Build with X functionality') + # Dependencies: depends_on('tcl', type=('build', 'link', 'run')) @@ -75,6 +77,9 @@ class EnvironmentModules(Package): 'CPPFLAGS=' + ' '.join(cpp_flags) ] + if '~X' in spec: + config_args = ['--without-x'] + config_args + configure(*config_args) make() make('install') -- cgit v1.2.3-70-g09d2 From 2eb8db1dd2e8da010974a48c024538930a48ea94 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Sat, 9 Sep 2017 15:22:56 -0500 Subject: Fix name detection in HeaderList and LibraryList (#5118) * Fix name detection in HeaderList and LibraryList * Add support for CUDA header files --- lib/spack/llnl/util/filesystem.py | 60 ++++++++++++++++++++++++++++++--------- lib/spack/spack/test/file_list.py | 42 ++++++++++++++------------- 2 files changed, 68 insertions(+), 34 deletions(-) (limited to 'lib') diff --git a/lib/spack/llnl/util/filesystem.py b/lib/spack/llnl/util/filesystem.py index 554ae25230..4f018536e6 100644 --- a/lib/spack/llnl/util/filesystem.py +++ b/lib/spack/llnl/util/filesystem.py @@ -647,19 +647,6 @@ class FileList(collections.Sequence): """ return list(dedupe(os.path.basename(x) for x in self.files)) - @property - def names(self): - """Stable de-duplication of file names in the list without extensions - - >>> h = HeaderList(['/dir1/a.h', '/dir2/b.h', '/dir3/a.h']) - >>> h.names - ['a', 'b'] - - Returns: - list of strings: A list of files without extensions - """ - return list(dedupe(x.split('.')[0] for x in self.basenames)) - def __getitem__(self, item): cls = type(self) if isinstance(item, numbers.Integral): @@ -709,6 +696,34 @@ class HeaderList(FileList): """ return self.files + @property + def names(self): + """Stable de-duplication of header names in the list without extensions + + >>> h = HeaderList(['/dir1/a.h', '/dir2/b.h', '/dir3/a.h']) + >>> h.names + ['a', 'b'] + + Returns: + list of strings: A list of files without extensions + """ + names = [] + + for x in self.basenames: + name = x + + # Valid extensions include: ['.cuh', '.hpp', '.hh', '.h'] + for ext in ['.cuh', '.hpp', '.hh', '.h']: + i = name.rfind(ext) + if i != -1: + names.append(name[:i]) + break + else: + # No valid extension, should we still include it? + names.append(name) + + return list(dedupe(names)) + @property def include_flags(self): """Include flags @@ -833,7 +848,24 @@ class LibraryList(FileList): Returns: list of strings: A list of library names """ - return list(dedupe(x.split('.')[0][3:] for x in self.basenames)) + names = [] + + for x in self.basenames: + name = x + if x.startswith('lib'): + name = x[3:] + + # Valid extensions include: ['.dylib', '.so', '.a'] + for ext in ['.dylib', '.so', '.a']: + i = name.rfind(ext) + if i != -1: + names.append(name[:i]) + break + else: + # No valid extension, should we still include it? + names.append(name) + + return list(dedupe(names)) @property def search_flags(self): diff --git a/lib/spack/spack/test/file_list.py b/lib/spack/spack/test/file_list.py index 66f71b4190..4b71881313 100644 --- a/lib/spack/spack/test/file_list.py +++ b/lib/spack/spack/test/file_list.py @@ -36,12 +36,13 @@ from llnl.util.filesystem import find_libraries, find_headers @pytest.fixture() def library_list(): """Returns an instance of LibraryList.""" + # Test all valid extensions: ['.a', '.dylib', '.so'] l = [ '/dir1/liblapack.a', - '/dir2/libfoo.dylib', + '/dir2/libpython3.6.dylib', # name may contain periods '/dir1/libblas.a', - '/dir3/libbar.so', - 'libbaz.so' + '/dir3/libz.so', + 'libmpi.so.20.10.1', # shared object libraries may be versioned ] return LibraryList(l) @@ -50,12 +51,13 @@ def library_list(): @pytest.fixture() def header_list(): """Returns an instance of header list""" + # Test all valid extensions: ['.h', '.hpp', '.hh', '.cuh'] h = [ '/dir1/Python.h', - '/dir2/datetime.h', - '/dir1/pyconfig.h', - '/dir3/core.h', - 'pymem.h' + '/dir2/date.time.h', + '/dir1/pyconfig.hpp', + '/dir3/core.hh', + 'pymem.cuh', ] h = HeaderList(h) h.add_macro('-DBOOST_LIB_NAME=boost_regex') @@ -72,14 +74,14 @@ class TestLibraryList(object): def test_joined_and_str(self, library_list): s1 = library_list.joined() - expected = '/dir1/liblapack.a /dir2/libfoo.dylib /dir1/libblas.a /dir3/libbar.so libbaz.so' # noqa: E501 + expected = '/dir1/liblapack.a /dir2/libpython3.6.dylib /dir1/libblas.a /dir3/libz.so libmpi.so.20.10.1' # noqa: E501 assert s1 == expected s2 = str(library_list) assert s1 == s2 s3 = library_list.joined(';') - expected = '/dir1/liblapack.a;/dir2/libfoo.dylib;/dir1/libblas.a;/dir3/libbar.so;libbaz.so' # noqa: E501 + expected = '/dir1/liblapack.a;/dir2/libpython3.6.dylib;/dir1/libblas.a;/dir3/libz.so;libmpi.so.20.10.1' # noqa: E501 assert s3 == expected def test_flags(self, library_list): @@ -93,12 +95,12 @@ class TestLibraryList(object): link_flags = library_list.link_flags assert '-llapack' in link_flags - assert '-lfoo' in link_flags + assert '-lpython3.6' in link_flags assert '-lblas' in link_flags - assert '-lbar' in link_flags - assert '-lbaz' in link_flags + assert '-lz' in link_flags + assert '-lmpi' in link_flags assert isinstance(link_flags, str) - assert link_flags == '-llapack -lfoo -lblas -lbar -lbaz' + assert link_flags == '-llapack -lpython3.6 -lblas -lz -lmpi' ld_flags = library_list.ld_flags assert isinstance(ld_flags, str) @@ -106,7 +108,7 @@ class TestLibraryList(object): def test_paths_manipulation(self, library_list): names = library_list.names - assert names == ['lapack', 'foo', 'blas', 'bar', 'baz'] + assert names == ['lapack', 'python3.6', 'blas', 'z', 'mpi'] directories = library_list.directories assert directories == ['/dir1', '/dir2', '/dir3'] @@ -123,7 +125,7 @@ class TestLibraryList(object): def test_add(self, library_list): pylist = [ '/dir1/liblapack.a', # removed from the final list - '/dir2/libbaz.so', + '/dir2/libmpi.so', '/dir4/libnew.a' ] another = LibraryList(pylist) @@ -146,14 +148,14 @@ class TestHeaderList(object): def test_joined_and_str(self, header_list): s1 = header_list.joined() - expected = '/dir1/Python.h /dir2/datetime.h /dir1/pyconfig.h /dir3/core.h pymem.h' # noqa: E501 + expected = '/dir1/Python.h /dir2/date.time.h /dir1/pyconfig.hpp /dir3/core.hh pymem.cuh' # noqa: E501 assert s1 == expected s2 = str(header_list) assert s1 == s2 s3 = header_list.joined(';') - expected = '/dir1/Python.h;/dir2/datetime.h;/dir1/pyconfig.h;/dir3/core.h;pymem.h' # noqa: E501 + expected = '/dir1/Python.h;/dir2/date.time.h;/dir1/pyconfig.hpp;/dir3/core.hh;pymem.cuh' # noqa: E501 assert s3 == expected def test_flags(self, header_list): @@ -176,7 +178,7 @@ class TestHeaderList(object): def test_paths_manipulation(self, header_list): names = header_list.names - assert names == ['Python', 'datetime', 'pyconfig', 'core', 'pymem'] + assert names == ['Python', 'date.time', 'pyconfig', 'core', 'pymem'] directories = header_list.directories assert directories == ['/dir1', '/dir2', '/dir3'] @@ -193,8 +195,8 @@ class TestHeaderList(object): def test_add(self, header_list): pylist = [ '/dir1/Python.h', # removed from the final list - '/dir2/pyconfig.h', - '/dir4/datetime.h' + '/dir2/pyconfig.hpp', + '/dir4/date.time.h' ] another = HeaderList(pylist) h = header_list + another -- cgit v1.2.3-70-g09d2 From 32117c22deb97c0be06ef073c432e45569b138c3 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 12 Sep 2017 01:20:49 +0200 Subject: 'with_or_without' accepts bool variants Fixes #4112 This commit extends the support of the AutotoolsPackage methods `with_or_without` and `enable_or_disable` to bool-valued variants. It also defines for those functions a convenience short-cut if the activation parameter is the prefix of a spec (like in `--with-{pkg}={prefix}`). This commit also includes: * Updates to viennarna and adios accordingly: they have been modified to use `enable_or_disable` and `with_or_without` * Improved docstrings in `autotools.py`. Raise `KeyError` if name is not a variant. --- lib/spack/spack/build_systems/autotools.py | 160 +++++++++++++++++---- lib/spack/spack/test/build_systems.py | 27 ++-- var/spack/repos/builtin.mock/packages/a/package.py | 2 + var/spack/repos/builtin/packages/adios/package.py | 98 ++++++------- .../repos/builtin/packages/viennarna/package.py | 24 ++-- 5 files changed, 202 insertions(+), 109 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/autotools.py b/lib/spack/spack/build_systems/autotools.py index afabb90820..b78d3ed026 100644 --- a/lib/spack/spack/build_systems/autotools.py +++ b/lib/spack/spack/build_systems/autotools.py @@ -291,49 +291,161 @@ class AutotoolsPackage(PackageBase): self._if_make_target_execute('test') self._if_make_target_execute('check') - def _activate_or_not(self, active, inactive, name, active_parameters=None): + def _activate_or_not( + self, + name, + activation_word, + deactivation_word, + activation_value=None + ): + """This function contains the current implementation details of + :py:meth:`~.AutotoolsPackage.with_or_without` and + :py:meth:`~.AutotoolsPackage.enable_or_disable`. + + Args: + name (str): name of the variant that is being processed + activation_word (str): the default activation word ('with' in the + case of ``with_or_without``) + deactivation_word (str): the default deactivation word ('without' + in the case of ``with_or_without``) + activation_value (callable): callable that accepts a single + value. This value is either one of the allowed values for a + multi-valued variant or the name of a bool-valued variant. + Returns the parameter to be used when the value is activated. + + The special value 'prefix' can also be assigned and will return + ``spec[name].prefix`` as activation parameter. + + Examples: + + Given a package with: + + .. code-block:: python + + variant('foo', values=('x', 'y'), description='') + variant('bar', default=True, description='') + + calling this function like: + + .. code-block:: python + + _activate_or_not( + 'foo', 'with', 'without', activation_value='prefix' + ) + _activate_or_not('bar', 'with', 'without') + + will generate the following configuration options: + + .. code-block:: console + + --with-x= --without-y --with-bar + + for `` foo=x +bar`` + + Returns: + list of strings that corresponds to the activation/deactivation + of the variant that has been processed + + Raises: + KeyError: if name is not among known variants + """ spec = self.spec args = [] + + if activation_value == 'prefix': + activation_value = lambda x: spec[x].prefix + + # Defensively look that the name passed as argument is among + # variants + if name not in self.variants: + msg = '"{0}" is not a variant of "{1}"' + raise KeyError(msg.format(name, self.name)) + + # Create a list of pairs. Each pair includes a configuration + # option and whether or not that option is activated + if set(self.variants[name].values) == set((True, False)): + # BoolValuedVariant carry information about a single option. + # Nonetheless, for uniformity of treatment we'll package them + # in an iterable of one element. + condition = '+{name}'.format(name=name) + options = [(name, condition in spec)] + else: + condition = '{name}={value}' + options = [ + (value, condition.format(name=name, value=value) in spec) + for value in self.variants[name].values + ] + # For each allowed value in the list of values - for value in self.variants[name].values: - # Check if the value is active in the current spec - condition = '{name}={value}'.format(name=name, value=value) - activated = condition in spec + for option_value, activated in options: # Search for an override in the package for this value - override_name = '{0}_or_{1}_{2}'.format(active, inactive, value) + override_name = '{0}_or_{1}_{2}'.format( + activation_word, deactivation_word, option_value + ) line_generator = getattr(self, override_name, None) # If not available use a sensible default if line_generator is None: def _default_generator(is_activated): if is_activated: - line = '--{0}-{1}'.format(active, value) - if active_parameters is not None and active_parameters(value): # NOQA=ignore=E501 - line += '={0}'.format(active_parameters(value)) + line = '--{0}-{1}'.format( + activation_word, option_value + ) + if activation_value is not None and activation_value(option_value): # NOQA=ignore=E501 + line += '={0}'.format( + activation_value(option_value) + ) return line - return '--{0}-{1}'.format(inactive, value) + return '--{0}-{1}'.format(deactivation_word, option_value) line_generator = _default_generator args.append(line_generator(activated)) return args - def with_or_without(self, name, active_parameters=None): - """Inspects the multi-valued variant 'name' and returns the configure - arguments that activate / deactivate the selected feature. + def with_or_without(self, name, activation_value=None): + """Inspects a variant and returns the arguments that activate + or deactivate the selected feature(s) for the configure options. + + This function works on all type of variants. For bool-valued variants + it will return by default ``--with-{name}`` or ``--without-{name}``. + For other kinds of variants it will cycle over the allowed values and + return either ``--with-{value}`` or ``--without-{value}``. + + If activation_value is given, then for each possible value of the + variant, the option ``--with-{value}=activation_value(value)`` or + ``--without-{value}`` will be added depending on whether or not + ``variant=value`` is in the spec. - :param str name: name of a valid multi-valued variant - :param callable active_parameters: if present accepts a single value - and returns the parameter to be used leading to an entry of the - type '--with-{name}={parameter} + Args: + name (str): name of a valid multi-valued variant + activation_value (callable): callable that accepts a single + value and returns the parameter to be used leading to an entry + of the type ``--with-{name}={parameter}``. + + The special value 'prefix' can also be assigned and will return + ``spec[name].prefix`` as activation parameter. + + Returns: + list of arguments to configure """ - return self._activate_or_not( - 'with', 'without', name, active_parameters - ) + return self._activate_or_not(name, 'with', 'without', activation_value) + + def enable_or_disable(self, name, activation_value=None): + """Same as :py:meth:`~.AutotoolsPackage.with_or_without` but substitute + ``with`` with ``enable`` and ``without`` with ``disable``. + + Args: + name (str): name of a valid multi-valued variant + activation_value (callable): if present accepts a single value + and returns the parameter to be used leading to an entry of the + type ``--enable-{name}={parameter}`` + + The special value 'prefix' can also be assigned and will return + ``spec[name].prefix`` as activation parameter. - def enable_or_disable(self, name, active_parameters=None): - """Inspects the multi-valued variant 'name' and returns the configure - arguments that activate / deactivate the selected feature. + Returns: + list of arguments to configure """ return self._activate_or_not( - 'enable', 'disable', name, active_parameters + name, 'enable', 'disable', activation_value ) run_after('install')(PackageBase._run_default_install_time_test_callbacks) diff --git a/lib/spack/spack/test/build_systems.py b/lib/spack/spack/test/build_systems.py index 114497bccd..9960966e2f 100644 --- a/lib/spack/spack/test/build_systems.py +++ b/lib/spack/spack/test/build_systems.py @@ -53,20 +53,23 @@ class TestAutotoolsPackage(object): pkg = spack.repo.get(s) # Called without parameters - l = pkg.with_or_without('foo') - assert '--with-bar' in l - assert '--without-baz' in l - assert '--no-fee' in l + options = pkg.with_or_without('foo') + assert '--with-bar' in options + assert '--without-baz' in options + assert '--no-fee' in options def activate(value): return 'something' - l = pkg.with_or_without('foo', active_parameters=activate) - assert '--with-bar=something' in l - assert '--without-baz' in l - assert '--no-fee' in l + options = pkg.with_or_without('foo', activation_value=activate) + assert '--with-bar=something' in options + assert '--without-baz' in options + assert '--no-fee' in options - l = pkg.enable_or_disable('foo') - assert '--enable-bar' in l - assert '--disable-baz' in l - assert '--disable-fee' in l + options = pkg.enable_or_disable('foo') + assert '--enable-bar' in options + assert '--disable-baz' in options + assert '--disable-fee' in options + + options = pkg.with_or_without('bvv') + assert '--with-bvv' in options diff --git a/var/spack/repos/builtin.mock/packages/a/package.py b/var/spack/repos/builtin.mock/packages/a/package.py index dc078d2434..463ad10055 100644 --- a/var/spack/repos/builtin.mock/packages/a/package.py +++ b/var/spack/repos/builtin.mock/packages/a/package.py @@ -50,6 +50,8 @@ class A(AutotoolsPackage): multi=False ) + variant('bvv', default=True, description='The good old BV variant') + depends_on('b', when='foobar=bar') def with_or_without_fee(self, activated): diff --git a/var/spack/repos/builtin/packages/adios/package.py b/var/spack/repos/builtin/packages/adios/package.py index 88721a477a..91188b8e4e 100644 --- a/var/spack/repos/builtin/packages/adios/package.py +++ b/var/spack/repos/builtin/packages/adios/package.py @@ -61,9 +61,14 @@ class Adios(AutotoolsPackage): # transports and serial file converters variant('hdf5', default=False, description='Enable parallel HDF5 transport and serial bp2h5 converter') variant('netcdf', default=False, description='Enable netcdf support') - variant('flexpath', default=False, description='Enable flexpath transport') - variant('dataspaces', default=False, description='Enable dataspaces transport') - variant('staging', default=False, description='Enable dataspaces and flexpath staging transports') + + variant( + 'staging', + default=None, + values=('flexpath', 'dataspaces'), + multi=True, + description='Enable dataspaces and/or flexpath staging transports' + ) depends_on('autoconf', type='build') depends_on('automake', type='build') @@ -100,15 +105,27 @@ class Adios(AutotoolsPackage): patch('adios_1100.patch', when='@:1.10.0^hdf5@1.10:') def validate(self, spec): - """ - Checks if incompatible variants have been activated at the same time - :param spec: spec of the package - :raises RuntimeError: in case of inconsistencies + """Checks if incompatible variants have been activated at the same time + + Args: + spec: spec of the package + + Raises: + RuntimeError: in case of inconsistencies """ if '+fortran' in spec and not self.compiler.fc: msg = 'cannot build a fortran variant without a fortran compiler' raise RuntimeError(msg) + def with_or_without_hdf5(self, activated): + + if activated: + return '--with-phdf5={0}'.format( + self.spec['hdf5'].prefix + ) + + return '--without-phdf5' + def configure_args(self): spec = self.spec self.validate(spec) @@ -118,66 +135,31 @@ class Adios(AutotoolsPackage): 'CFLAGS={0}'.format(self.compiler.pic_flag) ] - if '+shared' in spec: - extra_args.append('--enable-shared') + extra_args += self.enable_or_disable('shared') + extra_args += self.enable_or_disable('fortran') if '+mpi' in spec: env['MPICC'] = spec['mpi'].mpicc env['MPICXX'] = spec['mpi'].mpicxx - extra_args.append('--with-mpi=%s' % spec['mpi'].prefix) - else: - extra_args.append('--without-mpi') - if '+infiniband' in spec: - extra_args.append('--with-infiniband') - else: - extra_args.append('--with-infiniband=no') - - if '+fortran' in spec: - extra_args.append('--enable-fortran') - else: - extra_args.append('--disable-fortran') + + extra_args += self.with_or_without('mpi', activation='prefix') + extra_args += self.with_or_without('infiniband') # Transforms - if '+zlib' in spec: - extra_args.append('--with-zlib=%s' % spec['zlib'].prefix) - else: - extra_args.append('--without-zlib') - if '+bzip2' in spec: - extra_args.append('--with-bzip2=%s' % spec['bzip2'].prefix) - else: - extra_args.append('--without-bzip2') - if '+szip' in spec: - extra_args.append('--with-szip=%s' % spec['szip'].prefix) - else: - extra_args.append('--without-szip') - if '+zfp' in spec: - extra_args.append('--with-zfp=%s' % spec['zfp'].prefix) - else: - extra_args.append('--without-zfp') - if '+sz' in spec: - extra_args.append('--with-sz=%s' % spec['sz'].prefix) - else: - extra_args.append('--without-sz') + variants = ['zlib', 'bzip2', 'szip', 'zfp', 'sz'] # External I/O libraries - if '+hdf5' in spec: - extra_args.append('--with-phdf5=%s' % spec['hdf5'].prefix) - else: - extra_args.append('--without-phdf5') - if '+netcdf' in spec: - extra_args.append('--with-netcdf=%s' % spec['netcdf'].prefix) - else: - extra_args.append('--without-netcdf') + variants += ['hdf5', 'netcdf'] + + for x in variants: + extra_args += self.with_or_without(x, activation='prefix') # Staging transports - if '+flexpath' in spec or '+staging' in spec: - extra_args.append('--with-flexpath=%s' % spec['libevpath'].prefix) - else: - extra_args.append('--without-flexpath') - if '+dataspaces' in spec or '+staging' in spec: - extra_args.append('--with-dataspaces=%s' - % spec['dataspaces'].prefix) - else: - extra_args.append('--without-dataspaces') + def with_staging(name): + if name == 'flexpath': + return spec['libevpath'].prefix + return spec[name].prefix + + extra_args += self.with_or_without('staging', activation=with_staging) return extra_args diff --git a/var/spack/repos/builtin/packages/viennarna/package.py b/var/spack/repos/builtin/packages/viennarna/package.py index dbaff25eec..7f8f2cb18c 100644 --- a/var/spack/repos/builtin/packages/viennarna/package.py +++ b/var/spack/repos/builtin/packages/viennarna/package.py @@ -27,8 +27,9 @@ from spack import * class Viennarna(AutotoolsPackage): """The ViennaRNA Package consists of a C code library and several - stand-alone programs for the prediction and comparison of RNA secondary - structures.""" + stand-alone programs for the prediction and comparison of RNA secondary + structures. + """ homepage = "https://www.tbi.univie.ac.at/RNA/" url = "https://www.tbi.univie.ac.at/RNA/download/sourcecode/2_3_x/ViennaRNA-2.3.5.tar.gz" @@ -49,19 +50,12 @@ class Viennarna(AutotoolsPackage): return url.format(version.up_to(2).underscored, version) def configure_args(self): - args = [] - if '+sse' in self.spec: - args.append('--enable-sse') - else: - args.append('--disable-sse') - if '~python' in self.spec: - args.append('--without-python') - else: - args.append('--with-python') - if '~perl' in self.spec: - args.append('--without-perl') - else: - args.append('--with-perl') + + args = self.enable_or_disable('sse') + args += self.with_or_without('python') + args += self.with_or_without('perl') + if 'python@3:' in self.spec: args.append('--with-python3') + return args -- cgit v1.2.3-70-g09d2 From de7e99f866e37c94dacdccd4c16dea4eabe2fdbb Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 10 Sep 2017 16:41:17 -0700 Subject: Preserve original stack trace for UnsatisfiableSpecError --- lib/spack/spack/spec.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index cd4922cf53..910788c81a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2113,14 +2113,15 @@ class Spec(object): fmt += 'while trying to concretize the partial spec:' fmt += '\n\n{0}\n\n'.format(self.tree(indent=4)) fmt += '{0} requires {1} {2} {3}, but spec asked for {4}' + e.message = fmt.format( self.name, dep.name, e.constraint_type, e.required, - e.provided - ) - raise e + e.provided) + + raise # Add merged spec to my deps and recurse dependency = spec_deps[dep.name] -- cgit v1.2.3-70-g09d2 From 14cd73ed3ce3f7d02782f72917c70071d2a6c091 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 10 Sep 2017 16:41:54 -0700 Subject: Simplify logic in Spec.normalize() --- lib/spack/spack/spec.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 910788c81a..56a6b9b4d6 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2183,13 +2183,13 @@ class Spec(object): if not self.name: raise SpecError("Attempting to normalize anonymous spec") - if self._normal and not force: - return False - - # avoid any assumptions about concreteness when forced + # Set _normal and _concrete to False when forced if force: self._mark_concrete(False) + if self._normal: + return False + # Ensure first that all packages & compilers in the DAG exist. self.validate_or_raise() # Get all the dependencies into one DependencyMap -- cgit v1.2.3-70-g09d2 From 8c42aed9d5f8b02538eb15ac936c78bc6a36308a Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 11 Sep 2017 11:41:21 -0700 Subject: bugfix: concrete dependencies are now copied properly. - Dependencies in concrete specs did not previously have their cache fields (_concrete, _normal, etc.) preserved. - _dup and _dup_deps weren't passing each other enough information to preserve concreteness properly, so only the root was properly preserved. - cached concreteness is now preserved properly for the entire DAG, not just the root. - added method docs. --- lib/spack/spack/spec.py | 69 +++++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 25 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 56a6b9b4d6..f2836e8eb8 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -2542,7 +2542,7 @@ class Spec(object): """Return list of any virtual deps in this spec.""" return [spec for spec in self.traverse() if spec.virtual] - def _dup(self, other, deps=True, cleardeps=True): + def _dup(self, other, deps=True, cleardeps=True, caches=None): """Copy the spec other into self. This is an overwriting copy. It does not copy any dependents (parents), but by default copies dependencies. @@ -2557,6 +2557,10 @@ class Spec(object): cleardeps (bool): if True clears the dependencies of ``self``, before possibly copying the dependencies of ``other`` onto ``self`` + caches (bool or None): preserve cached fields such as + ``_normal``, ``_concrete``, and ``_cmp_key_cache``. By + default this is ``False`` if DAG structure would be + changed by the copy, ``True`` if it's an exact copy. Returns: True if ``self`` changed because of the copy operation, @@ -2594,21 +2598,20 @@ class Spec(object): self.external_module = other.external_module self.namespace = other.namespace + # Cached fields are results of expensive operations. + # If we preserved the original structure, we can copy them + # safely. If not, they need to be recomputed. + if caches is None: + caches = (deps is True or deps == alldeps) + # If we copy dependencies, preserve DAG structure in the new spec if deps: - deptypes = alldeps # by default copy all deptypes - - # if caller restricted deptypes to be copied, adjust that here. - if isinstance(deps, (tuple, list)): - deptypes = deps + # If caller restricted deptypes to be copied, adjust that here. + # By default, just copy all deptypes + deptypes = deps if isinstance(deps, (tuple, list)) else alldeps + self._dup_deps(other, deptypes, caches) - self._dup_deps(other, deptypes) - - # These fields are all cached results of expensive operations. - # If we preserved the original structure, we can copy them - # safely. If not, they need to be recomputed. - # TODO: dependency hashes can be copied more aggressively. - if deps is True or deps == alldeps: + if caches: self._hash = other._hash self._cmp_key_cache = other._cmp_key_cache self._normal = other._normal @@ -2621,7 +2624,7 @@ class Spec(object): return changed - def _dup_deps(self, other, deptypes): + def _dup_deps(self, other, deptypes, caches): new_specs = {self.name: self} for dspec in other.traverse_edges(cover='edges', root=False): if (dspec.deptypes and @@ -2629,29 +2632,45 @@ class Spec(object): continue if dspec.parent.name not in new_specs: - new_specs[dspec.parent.name] = dspec.parent.copy(deps=False) + new_specs[dspec.parent.name] = dspec.parent.copy( + deps=False, caches=caches) if dspec.spec.name not in new_specs: - new_specs[dspec.spec.name] = dspec.spec.copy(deps=False) + new_specs[dspec.spec.name] = dspec.spec.copy( + deps=False, caches=caches) new_specs[dspec.parent.name]._add_dependency( new_specs[dspec.spec.name], dspec.deptypes) - def copy(self, deps=True): - """Return a copy of this spec. + def copy(self, deps=True, **kwargs): + """Make a copy of this spec. + + Args: + deps (bool or tuple): Defaults to True. If boolean, controls + whether dependencies are copied (copied if True). If a + tuple is provided, *only* dependencies of types matching + those in the tuple are copied. + kwargs: additional arguments for internal use (passed to ``_dup``). + + Returns: + A copy of this spec. + + Examples: + Deep copy with dependnecies:: + + spec.copy() + spec.copy(deps=True) - By default, returns a deep copy. To control how dependencies are - copied, supply: + Shallow copy (no dependencies):: - deps=True: deep copy + spec.copy(deps=False) - deps=False: shallow copy (no dependencies) + Only build and run dependencies:: - deps=('link', 'build'): - only build and link dependencies. Similar for other deptypes. + deps=('build', 'run'): """ clone = Spec.__new__(Spec) - clone._dup(self, deps=deps) + clone._dup(self, deps=deps, **kwargs) return clone @property -- cgit v1.2.3-70-g09d2 From f8f1c308c994512622c952d289388f9ab7f19709 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Mon, 11 Sep 2017 11:43:41 -0700 Subject: clean up concreteness detection - Fixes bugs where concretization would fail due to an erroneously cached _concrete attribute. - Ripped out a bunch of code in spec.py that isn't needed/valid anymore: - The various concrete() methods on different types of Specs would attempt to statically compute whether the Spec was concrete. - This dates back to when DAGs were simpler and there were no optional dependencies. It's actually NOT possible to compute statically whether a Spec is concrete now. The ONLY way you know is if it goes through concretization and is marked concrete once that completes. - This commit removes all simple concreteness checks and relies only on the _concrete attribute. This should make thinking about concreteness simpler. - Fixed a couple places where Specs need to be marked concrete explicitly. - Specs read from files and Specs that are destructively copied from concrete Specs now need to be marked concrete explicitly. - These spots may previously have "worked", but they were brittle and should be explcitly marked anyway. --- lib/spack/spack/binary_distribution.py | 5 ++ lib/spack/spack/spec.py | 113 +++++-------------------------- lib/spack/spack/test/directory_layout.py | 8 ++- 3 files changed, 27 insertions(+), 99 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/binary_distribution.py b/lib/spack/spack/binary_distribution.py index 9693a75c39..f915e3a0d0 100644 --- a/lib/spack/spack/binary_distribution.py +++ b/lib/spack/spack/binary_distribution.py @@ -447,7 +447,12 @@ def get_specs(): except fs.FetchError: continue with open(stage.save_filename, 'r') as f: + # read the spec from the build cache file. All specs + # in build caches are concrete (as they aer built) so + # we need to mark this spec concrete on read-in. spec = spack.spec.Spec.from_yaml(f) + spec._mark_concrete() + specs.add(spec) durls[spec].append(link) return specs, durls diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index f2836e8eb8..1b5f41d4c4 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -635,10 +635,6 @@ class FlagMap(HashableMap): def valid_compiler_flags(): return _valid_compiler_flags - @property - def concrete(self): - return all(flag in self for flag in _valid_compiler_flags) - def copy(self): clone = FlagMap(None) for name, value in self.items(): @@ -661,73 +657,6 @@ class DependencyMap(HashableMap): """Each spec has a DependencyMap containing specs for its dependencies. The DependencyMap is keyed by name. """ - def __init__(self, owner): - super(DependencyMap, self).__init__() - - # Owner Spec for the current map - self.owner = owner - - @property - def concrete(self): - - # Check if the dependencies are concrete and of the correct type - dependencies_are_concrete = all( - (d.spec.concrete and d.deptypes) for d in self.values() - ) - - if not dependencies_are_concrete: - return False - - # If we are dealing with an external spec, it clearly has no - # dependencies managed by spack - if self.owner.external: - return True - - # Now check we have every dependency we need - pkg = self.owner.package - for dependency in pkg.dependencies.values(): - # Check that for every condition we satisfy we satisfy also - # the associated constraint - for condition, constraint in dependency.items(): - # WARNING: This part relies on the fact that dependencies are - # the last item to be checked when computing if a spec is - # concrete. This means that we are ensured that all variants, - # versions, compilers, etc. are there with their final value - # when we call 'Spec.satisfies(..., strict=True)' - - # FIXME: at the moment check only for non conditional - # FIXME: dependencies, to avoid infinite recursion - - # satisfy_condition = self.owner.satisfies( - # condition, strict=True - # ) - - satisfy_condition = str(condition) == self.owner.name - - if not satisfy_condition: - continue - - dependency_name = constraint.name - - # We don't want to check build dependencies - if pkg.dependency_types[dependency_name] == set(['build']): - continue - - try: - dependency = self.owner[dependency_name] - satisfy_constraint = dependency.satisfies( - constraint, strict=True - ) - except KeyError: - # If the dependency is not there we don't - # satisfy the constraint - satisfy_constraint = False - - if satisfy_condition and not satisfy_constraint: - return False - - return True - def __str__(self): return "{deps: %s}" % ', '.join(str(d) for d in sorted(self.values())) @@ -1315,26 +1244,16 @@ class Spec(object): @property def concrete(self): - """A spec is concrete if it can describe only ONE build of a package. - If any of the name, version, architecture, compiler, - variants, or depdenencies are ambiguous,then it is not concrete. - """ - # If we have cached that the spec is concrete, then it's concrete - if self._concrete: - return True + """A spec is concrete if it describes a single build of a package. - # Otherwise check if the various parts of the spec are concrete. - # It's crucial to have the check on dependencies last, as it relies - # on all the other parts to be already checked for concreteness. - self._concrete = bool(not self.virtual and - self.namespace is not None and - self.versions.concrete and - self.variants.concrete and - self.architecture and - self.architecture.concrete and - self.compiler and self.compiler.concrete and - self.compiler_flags.concrete and - self._dependencies.concrete) + More formally, a spec is concrete if concretize() has been called + on it and it has been marked `_concrete`. + + Concrete specs either can be or have been built. All constraints + have been resolved, optional dependencies have been added or + removed, a compiler has been chosen, and all variants have + values. + """ return self._concrete def traverse(self, **kwargs): @@ -1825,8 +1744,8 @@ class Spec(object): if replacement.external: if (spec._dependencies): changed = True - spec._dependencies = DependencyMap(spec) - replacement._dependencies = DependencyMap(replacement) + spec._dependencies = DependencyMap() + replacement._dependencies = DependencyMap() replacement.architecture = self.architecture # TODO: could this and the stuff in _dup be cleaned up? @@ -1986,7 +1905,7 @@ class Spec(object): def index(self, deptype=None): """Return DependencyMap that points to all the dependencies in this spec.""" - dm = DependencyMap(None) + dm = DependencyMap() for spec in self.traverse(deptype=deptype): dm[spec.name] = spec return dm @@ -2588,8 +2507,8 @@ class Spec(object): else None self.compiler = other.compiler.copy() if other.compiler else None if cleardeps: - self._dependents = DependencyMap(self) - self._dependencies = DependencyMap(self) + self._dependents = DependencyMap() + self._dependencies = DependencyMap() self.compiler_flags = other.compiler_flags.copy() self.compiler_flags.spec = self self.variants = other.variants.copy() @@ -3296,8 +3215,8 @@ class SpecParser(spack.parse.Parser): spec.external_path = None spec.external_module = None spec.compiler_flags = FlagMap(spec) - spec._dependents = DependencyMap(spec) - spec._dependencies = DependencyMap(spec) + spec._dependents = DependencyMap() + spec._dependencies = DependencyMap() spec.namespace = spec_namespace spec._hash = None spec._cmp_key_cache = None diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py index a2609c8162..0cfd796e06 100644 --- a/lib/spack/spack/test/directory_layout.py +++ b/lib/spack/spack/test/directory_layout.py @@ -55,8 +55,10 @@ def test_yaml_directory_layout_parameters( # Ensure default layout matches expected spec format layout_default = YamlDirectoryLayout(str(tmpdir)) path_default = layout_default.relative_path_for_spec(spec) - assert(path_default == - spec.format("${ARCHITECTURE}/${COMPILERNAME}-${COMPILERVER}/${PACKAGE}-${VERSION}-${HASH}")) # NOQA: ignore=E501 + assert(path_default == spec.format( + "${ARCHITECTURE}/" + "${COMPILERNAME}-${COMPILERVER}/" + "${PACKAGE}-${VERSION}-${HASH}")) # Test hash_length parameter works correctly layout_10 = YamlDirectoryLayout(str(tmpdir), hash_len=10) @@ -133,6 +135,8 @@ def test_read_and_write_spec( # TODO: increase reuse of build dependencies. stored_deptypes = ('link', 'run') expected = spec.copy(deps=stored_deptypes) + expected._mark_concrete() + assert expected.concrete assert expected == spec_from_file assert expected.eq_dag(spec_from_file) -- cgit v1.2.3-70-g09d2 From 90d50a0cee912fc1da43f617a166d0104c41939f Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 12 Sep 2017 21:10:31 +0200 Subject: Force reference consistency between Spec & Package The correct place to set the mutual references between spec and package objects is at the end of concretization. After a call to concretize we should now be ensured that spec is the same object as spec.package.spec. Code in `build_environment.py` that was performing the same operation has been turned into an assertion to be defensive on the new behavior. --- lib/spack/spack/build_environment.py | 6 +----- lib/spack/spack/spec.py | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index a27d8c68ab..66b7da9e55 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -465,12 +465,8 @@ def setup_package(pkg, dirty): # 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 + assert s.package.spec is s # Trap spack-tracked compiler flags as appropriate. # Must be before set_compiler_environment_variables diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 1b5f41d4c4..5c082d90c8 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1782,15 +1782,24 @@ class Spec(object): def concretize(self): """A spec is concrete if it describes one build of a package uniquely. - This will ensure that this spec is concrete. + This will ensure that this spec is concrete. - If this spec could describe more than one version, variant, or build - of a package, this will add constraints to make it concrete. + If this spec could describe more than one version, variant, or build + of a package, this will add constraints to make it concrete. - Some rigorous validation and checks are also performed on the spec. - Concretizing ensures that it is self-consistent and that it's - consistent with requirements of its pacakges. See flatten() and - normalize() for more details on this. + Some rigorous validation and checks are also performed on the spec. + Concretizing ensures that it is self-consistent and that it's + consistent with requirements of its pacakges. See flatten() and + normalize() for more details on this. + + It also ensures that: + + .. code-block:: python + + for x in self.traverse(): + assert x.package.spec == x + + which may not be true *during* the concretization step. """ if not self.name: raise SpecError("Attempting to concretize anonymous spec") @@ -1844,6 +1853,11 @@ class Spec(object): if matches: raise ConflictsInSpecError(self, matches) + # At this point the spec-package mutual references should + # be self-consistent + for x in self.traverse(): + x.package.spec = x + def _mark_concrete(self, value=True): """Mark this spec and its dependencies as concrete. @@ -2463,7 +2477,7 @@ class Spec(object): def _dup(self, other, deps=True, cleardeps=True, caches=None): """Copy the spec other into self. This is an overwriting - copy. It does not copy any dependents (parents), but by default + copy. It does not copy any dependents (parents), but by default copies dependencies. To duplicate an entire DAG, call _dup() on the root of the DAG. -- cgit v1.2.3-70-g09d2 From f710a520e5246bc95e95506b8831b72237c2172c Mon Sep 17 00:00:00 2001 From: Denis Davydov Date: Sat, 16 Sep 2017 22:14:03 +0200 Subject: set CMAKE_PREFIX_PATH for cmake packages (#5364) * cmake: set CMAKE_PREFIX_PATH * cmake: use build/link immediate dependencies to construct CMAKE_PREFIX_PATH --- lib/spack/spack/build_systems/cmake.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index 026cf7903a..edc9751c82 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -145,6 +145,11 @@ class CMakePackage(PackageBase): args.append('-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=FALSE') rpaths = ':'.join(spack.build_environment.get_rpaths(pkg)) args.append('-DCMAKE_INSTALL_RPATH:STRING={0}'.format(rpaths)) + # CMake's find_package() looks in CMAKE_PREFIX_PATH first, help CMake + # to find immediate link dependencies in right places: + deps = [d.prefix for d in + pkg.spec.dependencies(deptype=('build', 'link'))] + args.append('-DCMAKE_PREFIX_PATH:STRING={0}'.format(';'.join(deps))) return args @property -- cgit v1.2.3-70-g09d2 From 0558fd640eadc979f8f44e0ffaf8b212dbd1b9e0 Mon Sep 17 00:00:00 2001 From: "Kelly (KT) Thompson" Date: Sat, 16 Sep 2017 14:26:29 -0600 Subject: Improve external package location detection algorithm. (#5145) Also inspect `PATH` to help locate an external package and provide a test for getting path from module's PATH. Fixes #5141 --- lib/spack/spack/test/module_parsing.py | 3 ++- lib/spack/spack/util/module_cmd.py | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/spack/spack/test/module_parsing.py b/lib/spack/spack/test/module_parsing.py index 63eafcca26..7483b66ebb 100644 --- a/lib/spack/spack/test/module_parsing.py +++ b/lib/spack/spack/test/module_parsing.py @@ -53,7 +53,8 @@ def test_get_path_from_module(save_env): lines = ['prepend-path LD_LIBRARY_PATH /path/to/lib', 'setenv MOD_DIR /path/to', 'setenv LDFLAGS -Wl,-rpath/path/to/lib', - 'setenv LDFLAGS -L/path/to/lib'] + 'setenv LDFLAGS -L/path/to/lib', + 'prepend-path PATH /path/to/bin'] for line in lines: module_func = '() { eval `echo ' + line + ' bash filler`\n}' diff --git a/lib/spack/spack/util/module_cmd.py b/lib/spack/spack/util/module_cmd.py index c2448aa278..a726023d95 100644 --- a/lib/spack/spack/util/module_cmd.py +++ b/lib/spack/spack/util/module_cmd.py @@ -187,6 +187,12 @@ def get_path_from_module(mod): if L >= 0: return line[L + 2:line.find('/lib')] + # If it sets the PATH, use it + for line in text: + if line.find('PATH') >= 0: + path = get_argument_from_module_line(line) + return path[:path.find('/bin')] + # Unable to find module path return None -- cgit v1.2.3-70-g09d2 From 9aafe21b6328d5944469b7a0933e5a446133f876 Mon Sep 17 00:00:00 2001 From: Pramod S Kumbhar Date: Sun, 17 Sep 2017 14:47:16 +0200 Subject: Filter system paths from CMAKE_PREFIX_PATH (#5385) --- lib/spack/spack/build_systems/cmake.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/spack/spack/build_systems/cmake.py b/lib/spack/spack/build_systems/cmake.py index edc9751c82..5b0f5526c9 100644 --- a/lib/spack/spack/build_systems/cmake.py +++ b/lib/spack/spack/build_systems/cmake.py @@ -29,6 +29,7 @@ import platform import spack.build_environment from llnl.util.filesystem import working_dir, join_path +from spack.util.environment import filter_system_paths from spack.directives import depends_on, variant from spack.package import PackageBase, InstallError, run_after @@ -149,6 +150,7 @@ class CMakePackage(PackageBase): # to find immediate link dependencies in right places: deps = [d.prefix for d in pkg.spec.dependencies(deptype=('build', 'link'))] + deps = filter_system_paths(deps) args.append('-DCMAKE_PREFIX_PATH:STRING={0}'.format(';'.join(deps))) return args -- cgit v1.2.3-70-g09d2 From eb0ea7697ac3cc903051157f2580d03d073b325a Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 17 Sep 2017 15:31:32 -0700 Subject: Fix log error parsing bug introduced in c830eda0e (#5387) - '\b' in regular expression needs to be in a raw string (r'\b') - Regression test that would've caught this was unintentionally disabled - This fixes the string and the test --- lib/spack/spack/test/cmd/install.py | 4 +- lib/spack/spack/util/log_parse.py | 2 +- .../builtin.mock/packages/build-error/package.py | 49 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/build-error/package.py (limited to 'lib') diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 10dedeac68..80ecc1249d 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -114,8 +114,8 @@ def test_package_output(tmpdir, capsys, install_mockery, mock_fetch): assert "'install'\nAFTER INSTALL" in out -def _test_install_output_on_build_error(builtin_mock, mock_archive, mock_fetch, - config, install_mockery, capfd): +def test_install_output_on_build_error(builtin_mock, mock_archive, mock_fetch, + config, install_mockery, capfd): # capfd interferes with Spack's capturing with capfd.disabled(): out = install('build-error', fail_on_error=False) diff --git a/lib/spack/spack/util/log_parse.py b/lib/spack/spack/util/log_parse.py index a9ff356aff..53a0a7e7f2 100644 --- a/lib/spack/spack/util/log_parse.py +++ b/lib/spack/spack/util/log_parse.py @@ -86,7 +86,7 @@ def parse_log_events(logfile, context=6): log_events = [] for i, line in enumerate(lines): - if re.search('\berror:', line, re.IGNORECASE): + if re.search(r'\berror:', line, re.IGNORECASE): event = LogEvent( line.strip(), i + 1, diff --git a/var/spack/repos/builtin.mock/packages/build-error/package.py b/var/spack/repos/builtin.mock/packages/build-error/package.py new file mode 100644 index 0000000000..35e9ccc471 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/build-error/package.py @@ -0,0 +1,49 @@ +############################################################################## +# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC. +# Produced at the Lawrence Livermore National Laboratory. +# +# This file is part of Spack. +# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the NOTICE and LICENSE files 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 Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, 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 Lesser 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 BuildError(Package): + """This package has an install method that fails in a build script.""" + + homepage = "http://www.example.com/trivial_install" + url = "http://www.unit-test-should-replace-this-url/trivial_install-1.0.tar.gz" + + version('1.0', 'foobarbaz') + + def install(self, spec, prefix): + with open('configure', 'w') as f: + f.write("""#!/bin/sh\n +echo 'checking build system type... x86_64-apple-darwin16.6.0' +echo 'checking host system type... x86_64-apple-darwin16.6.0' +echo 'checking for gcc... /Users/gamblin2/src/spack/lib/spack/env/clang/clang' +echo 'checking whether the C compiler works... yes' +echo 'checking for C compiler default output file name... a.out' +echo 'checking for suffix of executables...' +echo 'configure: error: in /path/to/some/file:' +echo 'configure: error: cannot run C compiled programs.' +exit 1 +""") + configure() -- cgit v1.2.3-70-g09d2 From 742cd7f1270e0fe6229a965b768c1613e653eb3b Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 17 Sep 2017 15:06:15 -0700 Subject: Remove redundant dest arguments in install.py --- lib/spack/spack/cmd/install.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index ee752222db..f9d60c8f32 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -60,28 +60,28 @@ the dependencies""" '-j', '--jobs', action='store', type=int, help="explicitly set number of make jobs. default is #cpus") subparser.add_argument( - '--keep-prefix', action='store_true', dest='keep_prefix', + '--keep-prefix', action='store_true', help="don't remove the install prefix if installation fails") subparser.add_argument( - '--keep-stage', action='store_true', dest='keep_stage', + '--keep-stage', action='store_true', help="don't remove the build stage if installation succeeds") subparser.add_argument( - '--restage', action='store_true', dest='restage', + '--restage', action='store_true', help="if a partial install is detected, delete prior state") subparser.add_argument( '--source', action='store_true', dest='install_source', help="install source files in prefix") subparser.add_argument( - '-n', '--no-checksum', action='store_true', dest='no_checksum', + '-n', '--no-checksum', action='store_true', help="do not check packages against checksum") subparser.add_argument( - '-v', '--verbose', action='store_true', dest='verbose', + '-v', '--verbose', action='store_true', help="display verbose build output while installing") subparser.add_argument( - '--fake', action='store_true', dest='fake', + '--fake', action='store_true', help="fake install. just remove prefix and create a fake file") subparser.add_argument( - '-f', '--file', action='store_true', dest='file', + '-f', '--file', action='store_true', help="install from file. Read specs to install from .yaml files") cd_group = subparser.add_mutually_exclusive_group() @@ -93,7 +93,7 @@ the dependencies""" help="spec of the package to install" ) subparser.add_argument( - '--run-tests', action='store_true', dest='run_tests', + '--run-tests', action='store_true', help="run package level tests during installation" ) subparser.add_argument( -- cgit v1.2.3-70-g09d2 From c7a789e2d61b85d081f65100f0d5ee40bf78928f Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 17 Sep 2017 15:07:44 -0700 Subject: Add --show-log-on-error option to `spack install` - converted `log_path` and `env_path` to properties of PackageBase. - InstallErrors in build_environment are now annotated with the package that caused them, in the 'pkg' attribute. - Add `--show-log-on-error` option to `spack install` that catches InstallErrors and prints the log to stderr if it exists. Note that adding a reference to the Pakcage allows a lot of stuff currently handled by do_install() and build_environment to be handled externally. --- lib/spack/spack/build_environment.py | 17 +++++++++++++++-- lib/spack/spack/cmd/install.py | 20 +++++++++++++++++++- lib/spack/spack/package.py | 21 ++++++++++----------- lib/spack/spack/test/cmd/install.py | 15 +++++++++++++++ 4 files changed, 59 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 66b7da9e55..a456efb8ca 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -598,6 +598,10 @@ def fork(pkg, function, dirty): target=child_process, args=(child_pipe, input_stream)) p.start() + except InstallError as e: + e.pkg = pkg + raise + finally: # Close the input stream in the parent process if input_stream is not None: @@ -606,6 +610,10 @@ def fork(pkg, function, dirty): child_result = parent_pipe.recv() p.join() + # let the caller know which package went wrong. + if isinstance(child_result, InstallError): + child_result.pkg = pkg + # If the child process raised an error, print its output here rather # than waiting until the call to SpackError.die() in main(). This # allows exception handling output to be logged from within Spack. @@ -676,10 +684,15 @@ def get_package_context(traceback, context=3): class InstallError(spack.error.SpackError): - """Raised by packages when a package fails to install""" + """Raised by packages when a package fails to install. + + Any subclass of InstallError will be annotated by Spack wtih a + ``pkg`` attribute on failure, which the caller can use to get the + package for which the exception was raised. + """ -class ChildError(spack.error.SpackError): +class ChildError(InstallError): """Special exception class for wrapping exceptions from child processes in Spack's build environment. diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index f9d60c8f32..d42d06d06b 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -27,6 +27,8 @@ import codecs import functools import os import platform +import shutil +import sys import time import xml.dom.minidom import xml.etree.ElementTree as ET @@ -68,6 +70,9 @@ the dependencies""" subparser.add_argument( '--restage', action='store_true', help="if a partial install is detected, delete prior state") + subparser.add_argument( + '--show-log-on-error', action='store_true', + help="print full build log to stderr if build fails") subparser.add_argument( '--source', action='store_true', dest='install_source', help="install source files in prefix") @@ -367,13 +372,26 @@ def install(parser, args, **kwargs): for s in spec.dependencies(): p = spack.repo.get(s) p.do_install(**kwargs) + else: package = spack.repo.get(spec) kwargs['explicit'] = True package.do_install(**kwargs) + + except InstallError as e: + if args.show_log_on_error: + e.print_context() + if not os.path.exists(e.pkg.build_log_path): + tty.error("'spack install' created no log.") + else: + sys.stderr.write('Full build log:\n') + with open(e.pkg.build_log_path) as log: + shutil.copyfileobj(log, sys.stderr) + raise + finally: PackageBase.do_install = saved_do_install - # Dump log file if asked to + # Dump test output if asked to if args.log_format is not None: test_suite.dump(log_filename) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 86223688fa..897b5ea9bc 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -785,6 +785,14 @@ class PackageBase(with_metaclass(PackageMeta, object)): """Allow a stage object to be set to override the default.""" self._stage = stage + @property + def env_path(self): + return os.path.join(self.stage.source_path, 'spack-build.env') + + @property + def log_path(self): + return os.path.join(self.stage.source_path, 'spack-build.out') + def _make_fetcher(self): # Construct a composite fetcher that always contains at least # one element (the root package). In case there are resources @@ -1331,20 +1339,11 @@ class PackageBase(with_metaclass(PackageMeta, object)): self.stage.chdir_to_source() # Save the build environment in a file before building. - env_path = join_path(os.getcwd(), 'spack-build.env') - - # Redirect I/O to a build log (and optionally to - # the terminal) - log_path = join_path(os.getcwd(), 'spack-build.out') - - # FIXME : refactor this assignment - self.log_path = log_path - self.env_path = env_path - dump_environment(env_path) + dump_environment(self.env_path) # Spawn a daemon that reads from a pipe and redirects # everything to log_path - with log_output(log_path, echo, True) as logger: + with log_output(self.log_path, echo, True) as logger: for phase_name, phase_attr in zip( self.phases, self._InstallPhase_phases): diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 80ecc1249d..66b79642a3 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -142,3 +142,18 @@ def test_install_with_source( spec.prefix.share, 'trivial-install-test-package', 'src') assert filecmp.cmp(os.path.join(mock_archive.path, 'configure'), os.path.join(src, 'configure')) + + +def test_show_log_on_error(builtin_mock, mock_archive, mock_fetch, + config, install_mockery, capfd): + """Make sure --show-log-on-error works.""" + with capfd.disabled(): + out = install('--show-log-on-error', 'build-error', + fail_on_error=False) + assert isinstance(install.error, spack.build_environment.ChildError) + assert install.error.pkg.name == 'build-error' + assert 'Full build log:' in out + + errors = [line for line in out.split('\n') + if 'configure: error: cannot run C compiled programs' in line] + assert len(errors) == 2 -- cgit v1.2.3-70-g09d2 From b1d129e68199a94b6210af0a6d8e2aa5b4df576e Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Tue, 19 Sep 2017 21:34:20 +0200 Subject: Modulefiles generated with a template engine (#3183) * Module files now are generated using a template engine refers #2902 #3173 jinja2 has been hooked into Spack. The python module `modules.py` has been splitted into several modules under the python package `spack/modules`. Unit tests stressing module file generation have been refactored accordingly. The module file generator for Lmod has been extended to multi-providers and deeper hierarchies. * Improved the support for templates in module files. Added an entry in `config.yaml` (`template_dirs`) to list all the directories where Spack could find templates for `jinja2`. Module file generators have a simple override mechanism to override template selection ('modules.yaml' beats 'package.py' beats 'default'). * Added jinja2 and MarkupSafe to vendored packages. * Spec.concretize() sets mutual spec-package references The correct place to set the mutual references between spec and package objects at the end of concretization. After a call to concretize we should now be ensured that spec is the same object as spec.package.spec. Code in `build_environment.py` that was performing the same operation has been turned into an assertion to be defensive on the new behavior. * Improved code and data layout for modules and related tests. Common fixtures related to module file generation have been extracted in `conftest.py`. All the mock configurations for module files have been extracted from python code and have been put into their own yaml file. Added a `context_property` decorator for the template engine, to make it easy to define dictionaries out of properties. The default for `verbose` in `modules.yaml` is now False instead of True. * Extendable module file contexts + short description from docstring The contexts that are used in conjunction with `jinja2` templates to generate module files can now be extended from package.py and modules.yaml. Module files generators now infer the short description from package.py docstring (and as you may expect it's the first paragraph) * 'module refresh' regenerates all modules by default `module refresh` without `--module-type` specified tries to regenerate all known module types. The same holds true for `module rm` Configure options used at build time are extracted and written into the module files where possible. * Fixed python3 compatibility, tests for Lmod and Tcl. Added test for exceptional paths of execution when generating Lmod module files. Fixed a few compatibility issues with python3. Fixed a bug in Tcl with naming_scheme and autoload + unit tests * Updated module file tutorial docs. Fixed a few typos in docstrings. The reference section for module files has been reorganized. The idea is to have only three topics at the highest level: - shell support + spack load/unload use/unuse - module file generation (a.k.a. APIs + modules.yaml) - module file maintenance (spack module refresh/rm) Module file generation will cover the entries in modules.yaml Also: - Licenses have been updated to include NOTICE and extended to 2017 - docstrings have been reformatted according to Google style * Removed redundant arguments to RPackage and WafPackage. All the callbacks in `RPackage` and `WafPackage` that are not build phases have been modified not to accept a `spec` and a `prefix` argument. This permits to leverage the common `configure_args` signature to insert by default the configuration arguments into the generated module files. I think it's preferable to handling those packages differently than `AutotoolsPackage`. Besides only one package seems to override one of these methods. * Fixed broken indentation + improved resiliency of refresh Fixed broken indentation in `spack module refresh` (probably a rebase gone silently wrong?). Filter the writers for blacklisted specs before searching for name clashes. An error with a single writer will not stop regeneration, but instead will print a warning and continue the command. --- .codecov.yml | 4 + etc/spack/defaults/config.yaml | 3 + etc/spack/defaults/modules.yaml | 4 + lib/spack/docs/module_file_support.rst | 319 ++-- lib/spack/docs/tutorial_modules.rst | 15 +- lib/spack/external/__init__.py | 2 + lib/spack/external/jinja2/AUTHORS | 33 + lib/spack/external/jinja2/LICENSE | 31 + lib/spack/external/jinja2/README.rst | 51 + lib/spack/external/jinja2/__init__.py | 82 + lib/spack/external/jinja2/_compat.py | 99 ++ lib/spack/external/jinja2/_stringdefs.py | 71 + lib/spack/external/jinja2/asyncfilters.py | 146 ++ lib/spack/external/jinja2/asyncsupport.py | 254 +++ lib/spack/external/jinja2/bccache.py | 362 +++++ lib/spack/external/jinja2/compiler.py | 1653 ++++++++++++++++++++ lib/spack/external/jinja2/constants.py | 32 + lib/spack/external/jinja2/debug.py | 372 +++++ lib/spack/external/jinja2/defaults.py | 54 + lib/spack/external/jinja2/environment.py | 1276 +++++++++++++++ lib/spack/external/jinja2/exceptions.py | 146 ++ lib/spack/external/jinja2/ext.py | 609 ++++++++ lib/spack/external/jinja2/filters.py | 1073 +++++++++++++ lib/spack/external/jinja2/idtracking.py | 273 ++++ lib/spack/external/jinja2/lexer.py | 737 +++++++++ lib/spack/external/jinja2/loaders.py | 481 ++++++ lib/spack/external/jinja2/meta.py | 106 ++ lib/spack/external/jinja2/nodes.py | 939 +++++++++++ lib/spack/external/jinja2/optimizer.py | 49 + lib/spack/external/jinja2/parser.py | 898 +++++++++++ lib/spack/external/jinja2/runtime.py | 787 ++++++++++ lib/spack/external/jinja2/sandbox.py | 475 ++++++ lib/spack/external/jinja2/tests.py | 185 +++ lib/spack/external/jinja2/utils.py | 624 ++++++++ lib/spack/external/jinja2/visitor.py | 87 ++ lib/spack/external/markupsafe/AUTHORS | 13 + lib/spack/external/markupsafe/LICENSE | 33 + lib/spack/external/markupsafe/README.rst | 113 ++ lib/spack/external/markupsafe/__init__.py | 305 ++++ lib/spack/external/markupsafe/_compat.py | 26 + lib/spack/external/markupsafe/_constants.py | 267 ++++ lib/spack/external/markupsafe/_native.py | 46 + lib/spack/spack/__init__.py | 4 + lib/spack/spack/build_systems/r.py | 8 +- lib/spack/spack/build_systems/waf.py | 14 +- lib/spack/spack/cmd/common/arguments.py | 4 +- lib/spack/spack/cmd/module.py | 284 ++-- lib/spack/spack/environment.py | 96 +- lib/spack/spack/hooks/module_file_generation.py | 24 +- lib/spack/spack/modules.py | 906 ----------- lib/spack/spack/modules/__init__.py | 46 + lib/spack/spack/modules/common.py | 680 ++++++++ lib/spack/spack/modules/dotkit.py | 78 + lib/spack/spack/modules/lmod.py | 418 +++++ lib/spack/spack/modules/tcl.py | 116 ++ lib/spack/spack/schema/config.py | 4 + lib/spack/spack/schema/modules.py | 7 + lib/spack/spack/tengine.py | 120 ++ lib/spack/spack/test/cmd/module.py | 28 +- lib/spack/spack/test/data/config.yaml | 4 + .../test/data/modules/dotkit/autoload_direct.yaml | 5 + .../data/modules/dotkit/override_template.yaml | 5 + .../test/data/modules/lmod/alter_environment.yaml | 27 + .../spack/test/data/modules/lmod/autoload_all.yaml | 11 + .../test/data/modules/lmod/autoload_direct.yaml | 10 + .../spack/test/data/modules/lmod/blacklist.yaml | 12 + .../test/data/modules/lmod/complex_hierarchy.yaml | 17 + .../data/modules/lmod/core_compilers_empty.yaml | 6 + .../data/modules/lmod/missing_core_compilers.yaml | 5 + .../spack/test/data/modules/lmod/no_hash.yaml | 10 + .../modules/lmod/non_virtual_in_hierarchy.yaml | 11 + .../test/data/modules/lmod/override_template.yaml | 10 + .../test/data/modules/tcl/alter_environment.yaml | 21 + .../spack/test/data/modules/tcl/autoload_all.yaml | 6 + .../test/data/modules/tcl/autoload_direct.yaml | 5 + .../spack/test/data/modules/tcl/blacklist.yaml | 10 + .../spack/test/data/modules/tcl/conflicts.yaml | 8 + .../test/data/modules/tcl/override_template.yaml | 5 + .../test/data/modules/tcl/prerequisites_all.yaml | 5 + .../data/modules/tcl/prerequisites_direct.yaml | 5 + lib/spack/spack/test/data/modules/tcl/suffix.yaml | 7 + .../test/data/modules/tcl/wrong_conflicts.yaml | 7 + lib/spack/spack/test/data/templates/a.txt | 1 + lib/spack/spack/test/data/templates/extension.tcl | 4 + lib/spack/spack/test/data/templates/override.txt | 1 + lib/spack/spack/test/data/templates_again/b.txt | 1 + .../data/templates_again/override_from_modules.txt | 1 + lib/spack/spack/test/environment.py | 28 + lib/spack/spack/test/modules.py | 521 ------ lib/spack/spack/test/modules/common.py | 53 + lib/spack/spack/test/modules/conftest.py | 154 ++ lib/spack/spack/test/modules/dotkit.py | 72 + lib/spack/spack/test/modules/lmod.py | 238 +++ lib/spack/spack/test/modules/tcl.py | 253 +++ lib/spack/spack/test/python_version.py | 8 + lib/spack/spack/test/tengine.py | 110 ++ lib/spack/spack/test/util/prefix.py | 2 +- templates/modules/modulefile.dk | 31 + templates/modules/modulefile.lua | 91 ++ templates/modules/modulefile.tcl | 82 + .../packages/override-context-templates/package.py | 42 + .../packages/override-module-templates/package.py | 39 + var/spack/repos/builtin/packages/r-rmpi/package.py | 4 +- var/spack/repos/builtin/packages/tut/package.py | 2 +- 104 files changed, 16145 insertions(+), 1777 deletions(-) create mode 100644 lib/spack/external/jinja2/AUTHORS create mode 100644 lib/spack/external/jinja2/LICENSE create mode 100644 lib/spack/external/jinja2/README.rst create mode 100644 lib/spack/external/jinja2/__init__.py create mode 100644 lib/spack/external/jinja2/_compat.py create mode 100644 lib/spack/external/jinja2/_stringdefs.py create mode 100644 lib/spack/external/jinja2/asyncfilters.py create mode 100644 lib/spack/external/jinja2/asyncsupport.py create mode 100644 lib/spack/external/jinja2/bccache.py create mode 100644 lib/spack/external/jinja2/compiler.py create mode 100644 lib/spack/external/jinja2/constants.py create mode 100644 lib/spack/external/jinja2/debug.py create mode 100644 lib/spack/external/jinja2/defaults.py create mode 100644 lib/spack/external/jinja2/environment.py create mode 100644 lib/spack/external/jinja2/exceptions.py create mode 100644 lib/spack/external/jinja2/ext.py create mode 100644 lib/spack/external/jinja2/filters.py create mode 100644 lib/spack/external/jinja2/idtracking.py create mode 100644 lib/spack/external/jinja2/lexer.py create mode 100644 lib/spack/external/jinja2/loaders.py create mode 100644 lib/spack/external/jinja2/meta.py create mode 100644 lib/spack/external/jinja2/nodes.py create mode 100644 lib/spack/external/jinja2/optimizer.py create mode 100644 lib/spack/external/jinja2/parser.py create mode 100644 lib/spack/external/jinja2/runtime.py create mode 100644 lib/spack/external/jinja2/sandbox.py create mode 100644 lib/spack/external/jinja2/tests.py create mode 100644 lib/spack/external/jinja2/utils.py create mode 100644 lib/spack/external/jinja2/visitor.py create mode 100644 lib/spack/external/markupsafe/AUTHORS create mode 100644 lib/spack/external/markupsafe/LICENSE create mode 100644 lib/spack/external/markupsafe/README.rst create mode 100644 lib/spack/external/markupsafe/__init__.py create mode 100644 lib/spack/external/markupsafe/_compat.py create mode 100644 lib/spack/external/markupsafe/_constants.py create mode 100644 lib/spack/external/markupsafe/_native.py delete mode 100644 lib/spack/spack/modules.py create mode 100644 lib/spack/spack/modules/__init__.py create mode 100644 lib/spack/spack/modules/common.py create mode 100644 lib/spack/spack/modules/dotkit.py create mode 100644 lib/spack/spack/modules/lmod.py create mode 100644 lib/spack/spack/modules/tcl.py create mode 100644 lib/spack/spack/tengine.py create mode 100644 lib/spack/spack/test/data/modules/dotkit/autoload_direct.yaml create mode 100644 lib/spack/spack/test/data/modules/dotkit/override_template.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/alter_environment.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/autoload_all.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/autoload_direct.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/blacklist.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/complex_hierarchy.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/core_compilers_empty.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/missing_core_compilers.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/no_hash.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/non_virtual_in_hierarchy.yaml create mode 100644 lib/spack/spack/test/data/modules/lmod/override_template.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/alter_environment.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/autoload_all.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/autoload_direct.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/blacklist.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/conflicts.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/override_template.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/prerequisites_all.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/prerequisites_direct.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/suffix.yaml create mode 100644 lib/spack/spack/test/data/modules/tcl/wrong_conflicts.yaml create mode 100644 lib/spack/spack/test/data/templates/a.txt create mode 100644 lib/spack/spack/test/data/templates/extension.tcl create mode 100644 lib/spack/spack/test/data/templates/override.txt create mode 100644 lib/spack/spack/test/data/templates_again/b.txt create mode 100644 lib/spack/spack/test/data/templates_again/override_from_modules.txt delete mode 100644 lib/spack/spack/test/modules.py create mode 100644 lib/spack/spack/test/modules/common.py create mode 100644 lib/spack/spack/test/modules/conftest.py create mode 100644 lib/spack/spack/test/modules/dotkit.py create mode 100644 lib/spack/spack/test/modules/lmod.py create mode 100644 lib/spack/spack/test/modules/tcl.py create mode 100644 lib/spack/spack/test/tengine.py create mode 100644 templates/modules/modulefile.dk create mode 100644 templates/modules/modulefile.lua create mode 100644 templates/modules/modulefile.tcl create mode 100644 var/spack/repos/builtin.mock/packages/override-context-templates/package.py create mode 100644 var/spack/repos/builtin.mock/packages/override-module-templates/package.py (limited to 'lib') diff --git a/.codecov.yml b/.codecov.yml index 639b07012d..11af0577da 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -17,6 +17,10 @@ coverage: threshold: 0.5 paths: - lib/spack/spack/build_systems + modules: + threshold: 0.5 + paths: + - lib/spack/spack/modules core: threshold: 0.5 paths: diff --git a/etc/spack/defaults/config.yaml b/etc/spack/defaults/config.yaml index f29acfe018..b6a09a7738 100644 --- a/etc/spack/defaults/config.yaml +++ b/etc/spack/defaults/config.yaml @@ -18,6 +18,9 @@ config: # You can use $spack here to refer to the root of the spack instance. install_tree: $spack/opt/spack + # Locations where templates should be found + template_dirs: + - $spack/templates # Locations where different types of modules should be installed. module_roots: diff --git a/etc/spack/defaults/modules.yaml b/etc/spack/defaults/modules.yaml index 25fe2088e7..8b6f1b40af 100644 --- a/etc/spack/defaults/modules.yaml +++ b/etc/spack/defaults/modules.yaml @@ -40,3 +40,7 @@ modules: - PKG_CONFIG_PATH '': - CMAKE_PREFIX_PATH + + lmod: + hierarchy: + - mpi diff --git a/lib/spack/docs/module_file_support.rst b/lib/spack/docs/module_file_support.rst index d8f5e561a8..6b874fbe97 100644 --- a/lib/spack/docs/module_file_support.rst +++ b/lib/spack/docs/module_file_support.rst @@ -7,16 +7,10 @@ Modules The use of module systems to manage user environment in a controlled way is a common practice at HPC centers that is often embraced also by individual programmers on their development machines. To support this common practice -Spack provides integration with `Environment Modules +Spack integrates with `Environment Modules `_ , `LMod -`_ and `Dotkit `_ by: - -* generating module files after a successful installation -* providing commands that can leverage the spec syntax to manipulate modules - -In the following you will see how to activate shell support for commands in Spack -that requires it, and discover what benefits this may bring with respect to deal -directly with automatically generated module files. +`_ and `Dotkit `_ by +providing post-install hooks that generate module files and commands to manipulate them. .. note:: @@ -26,91 +20,81 @@ directly with automatically generated module files. .. _shell-support: -------------- -Shell support -------------- +---------------------------- +Using module files via Spack +---------------------------- -You can enable shell support by sourcing the appropriate setup file -in the ``$SPACK_ROOT/share/spack`` directory. -For ``bash`` or ``ksh`` users: +If you have installed a supported module system either manually or through +``spack bootstrap``, you should be able to run either ``module avail`` or +``use -l spack`` to see what module files have been installed. Here is +sample output of those programs, showing lots of installed packages: .. code-block:: console - $ . ${SPACK_ROOT}/share/spack/setup-env.sh + $ module avail -For ``csh`` and ``tcsh`` instead: + --------------------------------------------------------------- ~/spack/share/spack/modules/linux-ubuntu14-x86_64 --------------------------------------------------------------- + autoconf-2.69-gcc-4.8-qextxkq hwloc-1.11.6-gcc-6.3.0-akcisez m4-1.4.18-gcc-4.8-ev2znoc openblas-0.2.19-gcc-6.3.0-dhkmed6 py-setuptools-34.2.0-gcc-6.3.0-fadur4s + automake-1.15-gcc-4.8-maqvukj isl-0.18-gcc-4.8-afi6taq m4-1.4.18-gcc-6.3.0-uppywnz openmpi-2.1.0-gcc-6.3.0-go2s4z5 py-six-1.10.0-gcc-6.3.0-p4dhkaw + binutils-2.28-gcc-4.8-5s7c6rs libiconv-1.15-gcc-4.8-at46wg3 mawk-1.3.4-gcc-4.8-acjez57 openssl-1.0.2k-gcc-4.8-dkls5tk python-2.7.13-gcc-6.3.0-tyehea7 + bison-3.0.4-gcc-4.8-ek4luo5 libpciaccess-0.13.4-gcc-6.3.0-gmufnvh mawk-1.3.4-gcc-6.3.0-ostdoms openssl-1.0.2k-gcc-6.3.0-gxgr5or readline-7.0-gcc-4.8-xhufqhn + bzip2-1.0.6-gcc-4.8-iffrxzn libsigsegv-2.11-gcc-4.8-pp2cvte mpc-1.0.3-gcc-4.8-g5mztc5 pcre-8.40-gcc-4.8-r5pbrxb readline-7.0-gcc-6.3.0-zzcyicg + bzip2-1.0.6-gcc-6.3.0-bequudr libsigsegv-2.11-gcc-6.3.0-7enifnh mpfr-3.1.5-gcc-4.8-o7xm7az perl-5.24.1-gcc-4.8-dg5j65u sqlite-3.8.5-gcc-6.3.0-6zoruzj + cmake-3.7.2-gcc-6.3.0-fowuuby libtool-2.4.6-gcc-4.8-7a523za mpich-3.2-gcc-6.3.0-dmvd3aw perl-5.24.1-gcc-6.3.0-6uzkpt6 tar-1.29-gcc-4.8-wse2ass + curl-7.53.1-gcc-4.8-3fz46n6 libtool-2.4.6-gcc-6.3.0-n7zmbzt ncurses-6.0-gcc-4.8-dcpe7ia pkg-config-0.29.2-gcc-4.8-ib33t75 tcl-8.6.6-gcc-4.8-tfxzqbr + expat-2.2.0-gcc-4.8-mrv6bd4 libxml2-2.9.4-gcc-4.8-ryzxnsu ncurses-6.0-gcc-6.3.0-ucbhcdy pkg-config-0.29.2-gcc-6.3.0-jpgubk3 util-macros-1.19.1-gcc-6.3.0-xorz2x2 + flex-2.6.3-gcc-4.8-yf345oo libxml2-2.9.4-gcc-6.3.0-rltzsdh netlib-lapack-3.6.1-gcc-6.3.0-js33dog py-appdirs-1.4.0-gcc-6.3.0-jxawmw7 xz-5.2.3-gcc-4.8-mew4log + gcc-6.3.0-gcc-4.8-24puqve lmod-7.4.1-gcc-4.8-je4srhr netlib-scalapack-2.0.2-gcc-6.3.0-5aidk4l py-numpy-1.12.0-gcc-6.3.0-oemmoeu xz-5.2.3-gcc-6.3.0-3vqeuvb + gettext-0.19.8.1-gcc-4.8-yymghlh lua-5.3.4-gcc-4.8-im75yaz netlib-scalapack-2.0.2-gcc-6.3.0-hjsemcn py-packaging-16.8-gcc-6.3.0-i2n3dtl zip-3.0-gcc-4.8-rwar22d + gmp-6.1.2-gcc-4.8-5ub2wu5 lua-luafilesystem-1_6_3-gcc-4.8-wkey3nl netlib-scalapack-2.0.2-gcc-6.3.0-jva724b py-pyparsing-2.1.10-gcc-6.3.0-tbo6gmw zlib-1.2.11-gcc-4.8-pgxsxv7 + help2man-1.47.4-gcc-4.8-kcnqmau lua-luaposix-33.4.0-gcc-4.8-mdod2ry netlib-scalapack-2.0.2-gcc-6.3.0-rgqfr6d py-scipy-0.19.0-gcc-6.3.0-kr7nat4 zlib-1.2.11-gcc-6.3.0-7cqp6cj + +The names should look familiar, as they resemble the output from ``spack find``. +You *can* use the modules here directly. For example, you could type either of these commands +to load the ``cmake`` module: .. code-block:: console - $ source $SPACK_ROOT/share/spack/setup-env.csh + $ use cmake-3.7.2-gcc-6.3.0-fowuuby -When ``bash`` and ``ksh`` users update their environment with ``setup-env.sh``, it will check for spack-installed environment modules and add the ``module`` command to their environment; This only occurs if the module command is not already available. You can install ``environment-modules`` with ``spack bootstrap`` as described in :ref:`InstallEnvironmentModules`. +.. code-block:: console -.. note:: - You can put the source line in your ``.bashrc`` or ``.cshrc`` to - have Spack's shell support available on the command line at any login. + $ module load cmake-3.7.2-gcc-6.3.0-fowuuby +Neither of these is particularly pretty, easy to remember, or +easy to type. Luckily, Spack has its own interface for using modules and dotkits. ----------------------------- -Using module files via Spack ----------------------------- +^^^^^^^^^^^^^ +Shell support +^^^^^^^^^^^^^ -If you have installed a supported module system either manually or through -``spack bootstrap`` and have enabled shell support, you should be able to -run either ``module avail`` or ``use -l spack`` to see what module/dotkit -files have been installed. Here is sample output of those programs, -showing lots of installed packages. +To enable additional Spack commands for loading and unloading module files, +and to add the correct path to ``MODULEPATH``, you need to source the appropriate +setup file in the ``$SPACK_ROOT/share/spack`` directory. This will activate shell +support for the commands that need it. For ``bash``, ``ksh`` or ``zsh`` users: .. code-block:: console - $ module avail + $ . ${SPACK_ROOT}/share/spack/setup-env.sh - ------- ~/spack/share/spack/modules/linux-debian7-x86_64 -------- - adept-utils@1.0%gcc@4.4.7-5adef8da libelf@0.8.13%gcc@4.4.7 - automaded@1.0%gcc@4.4.7-d9691bb0 libelf@0.8.13%intel@15.0.0 - boost@1.55.0%gcc@4.4.7 mpc@1.0.2%gcc@4.4.7-559607f5 - callpath@1.0.1%gcc@4.4.7-5dce4318 mpfr@3.1.2%gcc@4.4.7 - dyninst@8.1.2%gcc@4.4.7-b040c20e mpich@3.0.4%gcc@4.4.7 - gcc@4.9.1%gcc@4.4.7-93ab98c5 mpich@3.0.4%gcc@4.9.0 - gmp@6.0.0a%gcc@4.4.7 mrnet@4.1.0%gcc@4.4.7-72b7881d - graphlib@2.0.0%gcc@4.4.7 netgauge@2.4.6%gcc@4.9.0-27912b7b - launchmon@1.0.1%gcc@4.4.7 stat@2.1.0%gcc@4.4.7-51101207 - libNBC@1.1.1%gcc@4.9.0-27912b7b sundials@2.5.0%gcc@4.9.0-27912b7b - libdwarf@20130729%gcc@4.4.7-b52fac98 +For ``csh`` and ``tcsh`` instead: .. code-block:: console - $ use -l spack - - spack ---------- - adept-utils@1.0%gcc@4.4.7-5adef8da - adept-utils @1.0 - automaded@1.0%gcc@4.4.7-d9691bb0 - automaded @1.0 - boost@1.55.0%gcc@4.4.7 - boost @1.55.0 - callpath@1.0.1%gcc@4.4.7-5dce4318 - callpath @1.0.1 - dyninst@8.1.2%gcc@4.4.7-b040c20e - dyninst @8.1.2 - gmp@6.0.0a%gcc@4.4.7 - gmp @6.0.0a - libNBC@1.1.1%gcc@4.9.0-27912b7b - libNBC @1.1.1 - libdwarf@20130729%gcc@4.4.7-b52fac98 - libdwarf @20130729 - libelf@0.8.13%gcc@4.4.7 - libelf @0.8.13 - libelf@0.8.13%intel@15.0.0 - libelf @0.8.13 - mpc@1.0.2%gcc@4.4.7-559607f5 - mpc @1.0.2 - mpfr@3.1.2%gcc@4.4.7 - mpfr @3.1.2 - mpich@3.0.4%gcc@4.4.7 - mpich @3.0.4 - mpich@3.0.4%gcc@4.9.0 - mpich @3.0.4 - netgauge@2.4.6%gcc@4.9.0-27912b7b - netgauge @2.4.6 - sundials@2.5.0%gcc@4.9.0-27912b7b - sundials @2.5.0 - -The names here should look familiar, they're the same ones from -``spack find``. You *can* use the names here directly. For example, -you could type either of these commands to load the callpath module: + $ set SPACK_ROOT ... + $ source $SPACK_ROOT/share/spack/setup-env.csh -.. code-block:: console +Note that in the latter case it is necessary to explicitly set ``SPACK_ROOT`` +before sourcing the setup file (you will get a meaningful error message +if you don't). - $ use callpath@1.0.1%gcc@4.4.7-5dce4318 +When ``bash`` and ``ksh`` users update their environment with ``setup-env.sh``, it will check for spack-installed environment modules and add the ``module`` command to their environment; This only occurs if the module command is not already available. You can install ``environment-modules`` with ``spack bootstrap`` as described in :ref:`InstallEnvironmentModules`. -.. code-block:: console +Finally, if you want to have Spack's shell support available on the command line at +any login you can put this source line in one of the files that are sourced +at startup (like ``.profile``, ``.bashrc`` or ``.cshrc``). Be aware though +that the startup time may be slightly increased because of that. - $ module load callpath@1.0.1%gcc@4.4.7-5dce4318 .. _cmd-spack-load: @@ -118,12 +102,11 @@ you could type either of these commands to load the callpath module: ``spack load / unload`` ^^^^^^^^^^^^^^^^^^^^^^^ -Neither of these is particularly pretty, easy to remember, or -easy to type. Luckily, Spack has its own interface for using modules -and dotkits. You can use the same spec syntax you're used to: +Once you have shell support enabled you can use the same spec syntax +you're used to: ========================= ========================== -Environment Modules Dotkit +Modules Dotkit ========================= ========================== ``spack load `` ``spack use `` ``spack unload `` ``spack unuse `` @@ -298,43 +281,46 @@ For example, consider the following on one system: # antlr@2.7.7%gcc@5.3.0~csharp+cxx~java~python arch=linux-SuSE11-x86_64 module load linux-SuSE11-x86_64/antlr-2.7.7-gcc-5.3.0-bdpl46y ----------------------------- -Auto-generating Module Files ----------------------------- +------------------------- +Module file customization +------------------------- Module files are generated by post-install hooks after the successful -installation of a package. The following table summarizes the essential +installation of a package. The table below summarizes the essential information associated with the different file formats that can be generated by Spack: - +-----------------------------+--------------------+-------------------------------+----------------------+ - | | **Hook name** | **Default root directory** | **Compatible tools** | - +=============================+====================+===============================+======================+ - | **Dotkit** | ``dotkit`` | share/spack/dotkit | DotKit | - +-----------------------------+--------------------+-------------------------------+----------------------+ - | **TCL - Non-Hierarchical** | ``tcl`` | share/spack/modules | Env. Modules/LMod | - +-----------------------------+--------------------+-------------------------------+----------------------+ - | **Lua - Hierarchical** | ``lmod`` | share/spack/lmod | LMod | - +-----------------------------+--------------------+-------------------------------+----------------------+ + +-----------------------------+--------------------+-------------------------------+----------------------------------+----------------------+ + | | **Hook name** | **Default root directory** | **Default template file** | **Compatible tools** | + +=============================+====================+===============================+==================================+======================+ + | **Dotkit** | ``dotkit`` | share/spack/dotkit | templates/modules/modulefile.dk | DotKit | + +-----------------------------+--------------------+-------------------------------+----------------------------------+----------------------+ + | **TCL - Non-Hierarchical** | ``tcl`` | share/spack/modules | templates/modules/modulefile.tcl | Env. Modules/LMod | + +-----------------------------+--------------------+-------------------------------+----------------------------------+----------------------+ + | **Lua - Hierarchical** | ``lmod`` | share/spack/lmod | templates/modules/modulefile.lua | LMod | + +-----------------------------+--------------------+-------------------------------+----------------------------------+----------------------+ -Though Spack ships with sensible defaults for the generation of module files, -one can customize many aspects of it to accommodate package or site specific needs. -These customizations are enabled by either: +Spack ships with sensible defaults for the generation of module files, but +you can customize many aspects of it to accommodate package or site specific needs. +In general you can override or extend the default behavior by: 1. overriding certain callback APIs in the Python packages 2. writing specific rules in the ``modules.yaml`` configuration file + 3. writing your own templates to override or extend the defaults -The former method fits best cases that are site independent, e.g. injecting variables -from language interpreters into their extensions. The latter instead permits to -fine tune the content, naming and creation of module files to meet site specific conventions. +The former method let you express changes in the run-time environment +that are needed to use the installed software properly, e.g. injecting variables +from language interpreters into their extensions. The latter two instead permit to +fine tune the filesystem layout, content and creation of module files to meet +site specific conventions. -^^^^^^^^^^^^^^^^^^^^ -``Package`` file API -^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Override API calls in ``package.py`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -There are two methods that can be overridden in any ``package.py`` to affect the -content of generated module files. The first one is: +There are two methods that you can override in any ``package.py`` to affect the +content of the module files generated by Spack. The first one: .. code-block:: python @@ -342,8 +328,8 @@ content of generated module files. The first one is: """Set up the compile and runtime environments for a package.""" pass -and can alter the content of *the same package where it is overridden* -by adding actions to ``run_env``. The second method is: +can alter the content of the module file associated with the same package where it is overridden. +The second method: .. code-block:: python @@ -351,12 +337,13 @@ by adding actions to ``run_env``. The second method is: """Set up the environment of packages that depend on this one""" pass -and has similar effects on module file of dependees. Even in this case -``run_env`` must be filled with the desired list of environment modifications. +can instead inject run-time environment modifications in the module files of packages +that depend on it. In both cases you need to fill ``run_env`` with the desired +list of environment modifications. .. note:: The ``r`` package and callback APIs - A typical example in which overriding both methods prove to be useful + An example in which it is crucial to override both methods is given by the ``r`` package. This package installs libraries and headers in non-standard locations and it is possible to prepend the appropriate directory to the corresponding environment variables: @@ -377,37 +364,36 @@ and has similar effects on module file of dependees. Even in this case it appropriately in the override of the second method: .. literalinclude:: ../../../var/spack/repos/builtin/packages/r/package.py - :lines: 128-129,146-151 + :pyobject: R.setup_dependent_environment .. _modules-yaml: ---------------------------------- -Configuration in ``modules.yaml`` ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Write a configuration file +^^^^^^^^^^^^^^^^^^^^^^^^^^ -The name of the configuration file that controls module generation behavior -is ``modules.yaml``. The default configuration: +The configuration files that control module generation behavior +are named ``modules.yaml``. The default configuration: .. literalinclude:: ../../../etc/spack/defaults/modules.yaml :language: yaml -activates generation for ``tcl`` and ``dotkit`` module files and inspects +activates the hooks to generate ``tcl`` and ``dotkit`` module files and inspects the installation folder of each package for the presence of a set of subdirectories (``bin``, ``man``, ``share/man``, etc.). If any is found its full path is prepended to the environment variables listed below the folder name. -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Activation of other systems -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""" +Activate other hooks +"""""""""""""""""""" Any other module file generator shipped with Spack can be activated adding it to the list under the ``enable`` key in the module file. Currently the only generator that -is not activated by default is ``lmod``, which produces hierarchical lua module files. -For each module system that can be enabled a finer configuration is possible. +is not active by default is ``lmod``, which produces hierarchical lua module files. -Directives that are aimed at driving the generation of a particular type of module files -should be listed under a top level key that corresponds to the generator being -customized: +Each module system can then be configured separately. In fact, you should list configuration +options that affect a particular type of module files under a top level key corresponding +to the generator being customized: .. code-block:: yaml @@ -423,24 +409,21 @@ customized: lmod: # contains lmod specific customizations -All these module sections allow for both: - -1. global directives that usually affect the whole layout of modules or the naming scheme -2. directives that affect only a set of packages and modify their content - -For the latter point in particular it is possible to use anonymous specs -to select an appropriate set of packages on which the modifications should be applied. +In general, the configuration options that you can use in ``modules.yaml`` will +either change the layout of the module files on the filesystem, or they will affect +their content. For the latter point it is possible to use anonymous specs +to fine tune the set of packages on which the modifications should be applied. .. _anonymous_specs: -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""" Selection by anonymous specs -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""" -The procedure to select packages using anonymous specs is a natural -extension of using them to install packages, the only difference being -that specs in this case **are not required to have a root package**. -Consider for instance this snippet: +In the configuration file you can use *anonymous specs* (i.e. specs +that **are not required to have a root package** and are thus used just +to express constraints) to apply certain modifications on a selected set +of the installed software. For instance, in the snippet below: .. code-block:: yaml @@ -469,8 +452,7 @@ Consider for instance this snippet: unset: - FOOBAR -During module file generation, the configuration above will instruct -Spack to set the environment variable ``BAR=bar`` for every module, +you are instructing Spack to set the environment variable ``BAR=bar`` for every module, unless the associated spec satisfies ``^openmpi`` in which case ``BAR=baz``. In addition in any spec that satisfies ``zlib`` the value ``foo`` will be prepended to ``LD_LIBRARY_PATH`` and in any spec that satisfies ``zlib%gcc@4.8`` @@ -482,15 +464,15 @@ the variable ``FOOBAR`` will be unset. first, no matter where they appear in the configuration file. All the other spec constraints are instead evaluated top to bottom. -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Blacklist or whitelist the generation of specific module files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""""""""""""""""""" +Blacklist or whitelist specific module files +"""""""""""""""""""""""""""""""""""""""""""" -Anonymous specs are also used to prevent module files from being written or -to force them to be written. A common case for that at HPC centers is to hide -from users all of the software that needs to be built with system compilers. -Suppose for instance to have ``gcc@4.4.7`` provided by your system. Then -with a configuration file like this one: +You can use anonymous specs also to prevent module files from being written or +to force them to be written. Consider the case where you want to hide from users +all the boilerplate software that you had to build in order to bootstrap a new +compiler. Suppose for instance that ``gcc@4.4.7`` is the compiler provided by +your system. If you write a configuration file like: .. code-block:: yaml @@ -499,13 +481,13 @@ with a configuration file like this one: whitelist: ['gcc', 'llvm'] # Whitelist will have precedence over blacklist blacklist: ['%gcc@4.4.7'] # Assuming gcc@4.4.7 is the system compiler -you will skip the generation of module files for any package that -is compiled with ``gcc@4.4.7``, with the exception of any ``gcc`` +you will prevent the generation of module files for any package that +is compiled with ``gcc@4.4.7``, with the only exception of any ``gcc`` or any ``llvm`` installation. -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""" Customize the naming scheme -^^^^^^^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""""""""" The names of environment modules generated by spack are not always easy to fully comprehend due to the long hash in the name. There are two module @@ -553,7 +535,9 @@ most likely via the ``+blas`` variant specification. tcl: naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' all: - conflict: ['${PACKAGE}', 'intel/14.0.1'] + conflict: + - '${PACKAGE}' + - 'intel/14.0.1' will create module files that will conflict with ``intel/14.0.1`` and with the base directory of the same module, effectively preventing the possibility to @@ -565,9 +549,9 @@ most likely via the ``+blas`` variant specification. .. note:: LMod hierarchical module files When ``lmod`` is activated Spack will generate a set of hierarchical lua module - files that are understood by LMod. The generated hierarchy always contains the - three layers ``Core`` / ``Compiler`` / ``MPI`` but can be further extended to - any other virtual dependency present in Spack. A case that could be useful in + files that are understood by LMod. The hierarchy will always contain the + two layers ``Core`` / ``Compiler`` but can be further extended to + any of the virtual dependencies present in Spack. A case that could be useful in practice is for instance: .. code-block:: yaml @@ -576,11 +560,14 @@ most likely via the ``+blas`` variant specification. enable: - lmod lmod: - core_compilers: ['gcc@4.8'] - hierarchical_scheme: ['lapack'] - - that will generate a hierarchy in which the ``lapack`` layer is treated as the ``mpi`` - one. This allows a site to build the same libraries or applications against different + core_compilers: + - 'gcc@4.8' + hierarchy: + - 'mpi' + - 'lapack' + + that will generate a hierarchy in which the ``lapack`` and ``mpi`` layer can be switched + independently. This allows a site to build the same libraries or applications against different implementations of ``mpi`` and ``lapack``, and let LMod switch safely from one to the other. @@ -589,15 +576,14 @@ most likely via the ``+blas`` variant specification. For hierarchies that are deeper than three layers ``lmod spider`` may have some issues. See `this discussion on the LMod project `_. -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""""""""""" Filter out environment modifications -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +"""""""""""""""""""""""""""""""""""" -Modifications to certain environment variables in module files are generated by -default, for instance by prefix inspections in the default configuration file. -There are cases though where some of these modifications are unwanted. -Suppose you need to avoid having ``CPATH`` and ``LIBRARY_PATH`` -modified by your ``dotkit`` modules: +Modifications to certain environment variables in module files are there by +default, for instance because they are generated by prefix inspections. +If you want to prevent modifications to some environment variables, you can +do so by using the environment blacklist: .. code-block:: yaml @@ -612,11 +598,11 @@ The configuration above will generate dotkit module files that will not contain modifications to either ``CPATH`` or ``LIBRARY_PATH`` and environment module files that instead will contain these modifications. -^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""" Autoload dependencies -^^^^^^^^^^^^^^^^^^^^^ +""""""""""""""""""""" -In some cases it can be useful to have module files directly autoload +In some cases it can be useful to have module files that automatically load their dependencies. This may be the case for Python extensions, if not activated using ``spack activate``: @@ -628,8 +614,9 @@ activated using ``spack activate``: autoload: 'direct' The configuration file above will produce module files that will -automatically load their direct dependencies. The allowed values for the -``autoload`` statement are either ``none``, ``direct`` or ``all``. +load their direct dependencies if the package installed depends on ``python``. +The allowed values for the ``autoload`` statement are either ``none``, +``direct`` or ``all``. .. note:: TCL prerequisites diff --git a/lib/spack/docs/tutorial_modules.rst b/lib/spack/docs/tutorial_modules.rst index 00b42251db..6d78350a9d 100644 --- a/lib/spack/docs/tutorial_modules.rst +++ b/lib/spack/docs/tutorial_modules.rst @@ -607,10 +607,11 @@ modules that load their dependencies by adding the ``autoload`` directive and assigning it the value ``direct``: .. code-block:: yaml - :emphasize-lines: 37,38 + :emphasize-lines: 3,38,39 modules: tcl: + verbose: True hash_length: 0 naming_scheme: '${PACKAGE}/${VERSION}-${COMPILERNAME}-${COMPILERVER}' whitelist: @@ -702,6 +703,9 @@ and will contain code to autoload all the dependencies: Autoloading openblas/0.2.19-gcc-6.2.0 Autoloading py-numpy/1.11.1-gcc-6.2.0-openblas +In case messages are unwanted during the autoload procedure, it will be +sufficient to omit the line setting ``verbose: True`` in the configuration file above. + ----------------------------- Lua hierarchical module files ----------------------------- @@ -733,7 +737,7 @@ enabled module file generators. The other things you need to do are: After modifications the configuration file will be: .. code-block:: yaml - :emphasize-lines: 2-6 + :emphasize-lines: 2-8 modules: enable:: @@ -741,6 +745,8 @@ After modifications the configuration file will be: lmod: core_compilers: - 'gcc@4.8' + hierarchy: + - mpi hash_length: 0 whitelist: - gcc @@ -879,7 +885,7 @@ can add an arbitrary list of virtual providers to the triplet ``Core``/``Compiler``/``MPI``. A configuration file like: .. code-block:: yaml - :emphasize-lines: 7,8 + :emphasize-lines: 9 modules: enable:: @@ -887,7 +893,8 @@ can add an arbitrary list of virtual providers to the triplet lmod: core_compilers: - 'gcc@4.8' - hierarchical_scheme: + hierarchy: + - mpi - lapack hash_length: 0 whitelist: diff --git a/lib/spack/external/__init__.py b/lib/spack/external/__init__.py index 2c4b19b6c8..bdd710153b 100644 --- a/lib/spack/external/__init__.py +++ b/lib/spack/external/__init__.py @@ -33,6 +33,8 @@ So far: functools: Used for implementation of total_ordering. + jinja2: A modern and designer-friendly templating language for Python + jsonschema: An implementation of JSON Schema for Python. ordereddict: We include our own version to be Python 2.6 compatible. diff --git a/lib/spack/external/jinja2/AUTHORS b/lib/spack/external/jinja2/AUTHORS new file mode 100644 index 0000000000..943f625f87 --- /dev/null +++ b/lib/spack/external/jinja2/AUTHORS @@ -0,0 +1,33 @@ +Jinja is written and maintained by the Jinja Team and various +contributors: + +Lead Developer: + +- Armin Ronacher + +Developers: + +- Christoph Hack +- Georg Brandl + +Contributors: + +- Bryan McLemore +- Mickaël Guérin +- Cameron Knight +- Lawrence Journal-World. +- David Cramer + +Patches and suggestions: + +- Ronny Pfannschmidt +- Axel Böhm +- Alexey Melchakov +- Bryan McLemore +- Clovis Fabricio (nosklo) +- Cameron Knight +- Peter van Dijk (Habbie) +- Stefan Ebner +- Rene Leonhardt +- Thomas Waldmann +- Cory Benfield (Lukasa) diff --git a/lib/spack/external/jinja2/LICENSE b/lib/spack/external/jinja2/LICENSE new file mode 100644 index 0000000000..10145a2643 --- /dev/null +++ b/lib/spack/external/jinja2/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/spack/external/jinja2/README.rst b/lib/spack/external/jinja2/README.rst new file mode 100644 index 0000000000..c36b9426d6 --- /dev/null +++ b/lib/spack/external/jinja2/README.rst @@ -0,0 +1,51 @@ +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template: + +.. code-block:: jinja + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller, but don't make the template designer's +life difficult by restricting functionality too much. + +For more information visit the new `Jinja2 webpage`_ and `documentation`_. + +The `Jinja2 tip`_ is installable via ``pip`` with ``pip install +https://github.com/pallets/jinja/zipball/master``. + +.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: http://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/docs/ +.. _Jinja2 tip: http://jinja.pocoo.org/docs/intro/#as-a-python-egg-via-easy-install + +Builds +------ + ++---------------------+------------------------------------------------------------------------------+ +| ``master`` | .. image:: https://travis-ci.org/pallets/jinja.svg?branch=master | +| | :target: https://travis-ci.org/pallets/jinja | ++---------------------+------------------------------------------------------------------------------+ +| ``2.9-maintenance`` | .. image:: https://travis-ci.org/pallets/jinja.svg?branch=2.9-maintenance | +| | :target: https://travis-ci.org/pallets/jinja | ++---------------------+------------------------------------------------------------------------------+ diff --git a/lib/spack/external/jinja2/__init__.py b/lib/spack/external/jinja2/__init__.py new file mode 100644 index 0000000000..4b0b7a8d7f --- /dev/null +++ b/lib/spack/external/jinja2/__init__.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +""" + jinja2 + ~~~~~~ + + Jinja2 is a template engine written in pure Python. It provides a + Django inspired non-XML syntax but supports inline expressions and + an optional sandboxed environment. + + Nutshell + -------- + + Here a small example of a Jinja2 template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +__docformat__ = 'restructuredtext en' +__version__ = '2.9.6' + +# high level interface +from jinja2.environment import Environment, Template + +# loaders +from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \ + DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \ + ModuleLoader + +# bytecode caches +from jinja2.bccache import BytecodeCache, FileSystemBytecodeCache, \ + MemcachedBytecodeCache + +# undefined types +from jinja2.runtime import Undefined, DebugUndefined, StrictUndefined, \ + make_logging_undefined + +# exceptions +from jinja2.exceptions import TemplateError, UndefinedError, \ + TemplateNotFound, TemplatesNotFound, TemplateSyntaxError, \ + TemplateAssertionError + +# decorators and public utilities +from jinja2.filters import environmentfilter, contextfilter, \ + evalcontextfilter +from jinja2.utils import Markup, escape, clear_caches, \ + environmentfunction, evalcontextfunction, contextfunction, \ + is_undefined, select_autoescape + +__all__ = [ + 'Environment', 'Template', 'BaseLoader', 'FileSystemLoader', + 'PackageLoader', 'DictLoader', 'FunctionLoader', 'PrefixLoader', + 'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache', + 'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined', + 'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound', + 'TemplatesNotFound', 'TemplateSyntaxError', 'TemplateAssertionError', + 'ModuleLoader', 'environmentfilter', 'contextfilter', 'Markup', 'escape', + 'environmentfunction', 'contextfunction', 'clear_caches', 'is_undefined', + 'evalcontextfilter', 'evalcontextfunction', 'make_logging_undefined', + 'select_autoescape', +] + + +def _patch_async(): + from jinja2.utils import have_async_gen + if have_async_gen: + from jinja2.asyncsupport import patch_all + patch_all() + + +_patch_async() +del _patch_async diff --git a/lib/spack/external/jinja2/_compat.py b/lib/spack/external/jinja2/_compat.py new file mode 100644 index 0000000000..61d85301a4 --- /dev/null +++ b/lib/spack/external/jinja2/_compat.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +""" + jinja2._compat + ~~~~~~~~~~~~~~ + + Some py2/py3 compatibility support based on a stripped down + version of six so we don't have to depend on a specific version + of it. + + :copyright: Copyright 2013 by the Jinja team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +import sys + +PY2 = sys.version_info[0] == 2 +PYPY = hasattr(sys, 'pypy_translation_info') +_identity = lambda x: x + + +if not PY2: + unichr = chr + range_type = range + text_type = str + string_types = (str,) + integer_types = (int,) + + iterkeys = lambda d: iter(d.keys()) + itervalues = lambda d: iter(d.values()) + iteritems = lambda d: iter(d.items()) + + import pickle + from io import BytesIO, StringIO + NativeStringIO = StringIO + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + ifilter = filter + imap = map + izip = zip + intern = sys.intern + + implements_iterator = _identity + implements_to_string = _identity + encode_filename = _identity + +else: + unichr = unichr + text_type = unicode + range_type = xrange + string_types = (str, unicode) + integer_types = (int, long) + + iterkeys = lambda d: d.iterkeys() + itervalues = lambda d: d.itervalues() + iteritems = lambda d: d.iteritems() + + import cPickle as pickle + from cStringIO import StringIO as BytesIO, StringIO + NativeStringIO = BytesIO + + exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') + + from itertools import imap, izip, ifilter + intern = intern + + def implements_iterator(cls): + cls.next = cls.__next__ + del cls.__next__ + return cls + + def implements_to_string(cls): + cls.__unicode__ = cls.__str__ + cls.__str__ = lambda x: x.__unicode__().encode('utf-8') + return cls + + def encode_filename(filename): + if isinstance(filename, unicode): + return filename.encode('utf-8') + return filename + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a + # dummy metaclass for one level of class instantiation that replaces + # itself with the actual metaclass. + class metaclass(type): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +try: + from urllib.parse import quote_from_bytes as url_quote +except ImportError: + from urllib import quote as url_quote diff --git a/lib/spack/external/jinja2/_stringdefs.py b/lib/spack/external/jinja2/_stringdefs.py new file mode 100644 index 0000000000..a5689f6695 --- /dev/null +++ b/lib/spack/external/jinja2/_stringdefs.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" + jinja2._stringdefs + ~~~~~~~~~~~~~~~~~~ + + Strings of all Unicode characters of a certain category. + Used for matching in Unicode-aware languages. Run to regenerate. + + Inspired by chartypes_create.py from the MoinMoin project, original + implementation from Pygments. + + :copyright: Copyright 2006-2017 by the Jinja team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +# Generated code start + +xid_start = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b\u011c\u011d\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0138\u0139\u013a\u013b\u013c\u013d\u013e\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d\u017e\u017f\u0180\u0181\u0182\u0183\u0184\u0185\u0186\u0187\u0188\u0189\u018a\u018b\u018c\u018d\u018e\u018f\u0190\u0191\u0192\u0193\u0194\u0195\u0196\u0197\u0198\u0199\u019a\u019b\u019c\u019d\u019e\u019f\u01a0\u01a1\u01a2\u01a3\u01a4\u01a5\u01a6\u01a7\u01a8\u01a9\u01aa\u01ab\u01ac\u01ad\u01ae\u01af\u01b0\u01b1\u01b2\u01b3\u01b4\u01b5\u01b6\u01b7\u01b8\u01b9\u01ba\u01bb\u01bc\u01bd\u01be\u01bf\u01c0\u01c1\u01c2\u01c3\u01cd\u01ce\u01cf\u01d0\u01d1\u01d2\u01d3\u01d4\u01d5\u01d6\u01d7\u01d8\u01d9\u01da\u01db\u01dc\u01dd\u01de\u01df\u01e0\u01e1\u01e2\u01e3\u01e4\u01e5\u01e6\u01e7\u01e8\u01e9\u01ea\u01eb\u01ec\u01ed\u01ee\u01ef\u01f0\u01f4\u01f5\u01f6\u01f7\u01f8\u01f9\u01fa\u01fb\u01fc\u01fd\u01fe\u01ff\u0200\u0201\u0202\u0203\u0204\u0205\u0206\u0207\u0208\u0209\u020a\u020b\u020c\u020d\u020e\u020f\u0210\u0211\u0212\u0213\u0214\u0215\u0216\u0217\u0218\u0219\u021a\u021b\u021c\u021d\u021e\u021f\u0220\u0221\u0222\u0223\u0224\u0225\u0226\u0227\u0228\u0229\u022a\u022b\u022c\u022d\u022e\u022f\u0230\u0231\u0232\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023a\u023b\u023c\u023d\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u02ae\u02af\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02b9\u02ba\u02bb\u02bc\u02bd\u02be\u02bf\u02c0\u02c1\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d0\u02d1\u02e0\u02e1\u02e2\u02e3\u02e4\u02ec\u02ee\u0370\u0371\u0372\u0373\u0374\u0376\u0377\u037b\u037c\u037d\u037f\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03cf\u03d0\u03d1\u03d2\u03d3\u03d4\u03d5\u03d6\u03d7\u03d8\u03d9\u03da\u03db\u03dc\u03dd\u03de\u03df\u03e0\u03e1\u03e2\u03e3\u03e4\u03e5\u03e6\u03e7\u03e8\u03e9\u03ea\u03eb\u03ec\u03ed\u03ee\u03ef\u03f0\u03f1\u03f2\u03f3\u03f4\u03f5\u03f7\u03f8\u03f9\u03fa\u03fb\u03fc\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0460\u0461\u0462\u0463\u0464\u0465\u0466\u0467\u0468\u0469\u046a\u046b\u046c\u046d\u046e\u046f\u0470\u0471\u0472\u0473\u0474\u0475\u0476\u0477\u0478\u0479\u047a\u047b\u047c\u047d\u047e\u047f\u0480\u0481\u048a\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u0492\u0493\u0494\u0495\u0496\u0497\u0498\u0499\u049a\u049b\u049c\u049d\u049e\u049f\u04a0\u04a1\u04a2\u04a3\u04a4\u04a5\u04a6\u04a7\u04a8\u04a9\u04aa\u04ab\u04ac\u04ad\u04ae\u04af\u04b0\u04b1\u04b2\u04b3\u04b4\u04b5\u04b6\u04b7\u04b8\u04b9\u04ba\u04bb\u04bc\u04bd\u04be\u04bf\u04c0\u04c1\u04c2\u04c3\u04c4\u04c5\u04c6\u04c7\u04c8\u04c9\u04ca\u04cb\u04cc\u04cd\u04ce\u04cf\u04d0\u04d1\u04d2\u04d3\u04d4\u04d5\u04d6\u04d7\u04d8\u04d9\u04da\u04db\u04dc\u04dd\u04de\u04df\u04e0\u04e1\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u04f3\u04f4\u04f5\u04f6\u04f7\u04f8\u04f9\u04fa\u04fb\u04fc\u04fd\u04fe\u04ff\u0500\u0501\u0502\u0503\u0504\u0505\u0506\u0507\u0508\u0509\u050a\u050b\u050c\u050d\u050e\u050f\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u0620\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u063b\u063c\u063d\u063e\u063f\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u066e\u066f\u0671\u0672\u0673\u0674\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u069c\u069d\u069e\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a5\u06a6\u06a7\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa\u06fb\u06fc\u06ff\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071d\u071e\u071f\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07b1\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07f4\u07f5\u07fa\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u081a\u0824\u0828\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093d\u0950\u0960\u0961\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097d\u097e\u097f\u0980\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b2\u09b6\u09b7\u09b8\u09b9\u09bd\u09ce\u09e0\u09e1\u09f0\u09f1\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0f\u0a10\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a32\u0a35\u0a38\u0a39\u0a5c\u0a72\u0a73\u0a74\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab3\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b32\u0b33\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3d\u0b5f\u0b60\u0b61\u0b71\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0ba9\u0baa\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bd0\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c34\u0c35\u0c36\u0c37\u0c38\u0c39\u0c3d\u0c58\u0c59\u0c5a\u0c60\u0c61\u0c80\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3d\u0d4e\u0d54\u0d55\u0d56\u0d5f\u0d60\u0d61\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e32\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eaf\u0eb0\u0eb2\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec6\u0ede\u0edf\u0f00\u0f40\u0f41\u0f42\u0f44\u0f45\u0f46\u0f47\u0f49\u0f4a\u0f4b\u0f4c\u0f4e\u0f4f\u0f50\u0f51\u0f53\u0f54\u0f55\u0f56\u0f58\u0f59\u0f5a\u0f5b\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f6a\u0f6b\u0f6c\u0f88\u0f89\u0f8a\u0f8b\u0f8c\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u100d\u100e\u100f\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101a\u101b\u101c\u101d\u101e\u101f\u1020\u1021\u1022\u1023\u1024\u1025\u1026\u1027\u1028\u1029\u102a\u103f\u1050\u1051\u1052\u1053\u1054\u1055\u105a\u105b\u105c\u105d\u1061\u1065\u1066\u106e\u106f\u1070\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u1081\u108e\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6\u10f7\u10f8\u10f9\u10fa\u10fc\u10fd\u10fe\u10ff\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110d\u110e\u110f\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111a\u111b\u111c\u111d\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112a\u112b\u112c\u112d\u112e\u112f\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115a\u115b\u115c\u115d\u115e\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u116b\u116c\u116d\u116e\u116f\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u119f\u11a0\u11a1\u11a2\u11a3\u11a4\u11a5\u11a6\u11a7\u11a8\u11a9\u11aa\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b4\u11b5\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u11d5\u11d6\u11d7\u11d8\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135a\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u138e\u138f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u13ab\u13ac\u13ad\u13ae\u13af\u13b0\u13b1\u13b2\u13b3\u13b4\u13b5\u13b6\u13b7\u13b8\u13b9\u13ba\u13bb\u13bc\u13bd\u13be\u13bf\u13c0\u13c1\u13c2\u13c3\u13c4\u13c5\u13c6\u13c7\u13c8\u13c9\u13ca\u13cb\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u13d8\u13d9\u13da\u13db\u13dc\u13dd\u13de\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u13ee\u13ef\u13f0\u13f1\u13f2\u13f3\u13f4\u13f5\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157c\u157d\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u166f\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16ee\u16ef\u16f0\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17d7\u17dc\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182a\u182b\u182c\u182d\u182e\u182f\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183a\u183b\u183c\u183d\u183e\u183f\u1840\u1841\u1842\u1843\u1844\u1845\u1846\u1847\u1848\u1849\u184a\u184b\u184c\u184d\u184e\u184f\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185a\u185b\u185c\u185d\u185e\u185f\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186a\u186b\u186c\u186d\u186e\u186f\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1887\u1888\u1889\u188a\u188b\u188c\u188d\u188e\u188f\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189a\u189b\u189c\u189d\u189e\u189f\u18a0\u18a1\u18a2\u18a3\u18a4\u18a5\u18a6\u18a7\u18a8\u18aa\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190a\u190b\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u191d\u191e\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19aa\u19ab\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u19c8\u19c9\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a53\u1a54\u1aa7\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b23\u1b24\u1b25\u1b26\u1b27\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u1b83\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u1bae\u1baf\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c1b\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c4d\u1c4e\u1c4f\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c80\u1c81\u1c82\u1c83\u1c84\u1c85\u1c86\u1c87\u1c88\u1ce9\u1cea\u1ceb\u1cec\u1cee\u1cef\u1cf0\u1cf1\u1cf5\u1cf6\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u1d06\u1d07\u1d08\u1d09\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u1d0f\u1d10\u1d11\u1d12\u1d13\u1d14\u1d15\u1d16\u1d17\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u1d24\u1d25\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u1d36\u1d37\u1d38\u1d39\u1d3a\u1d3b\u1d3c\u1d3d\u1d3e\u1d3f\u1d40\u1d41\u1d42\u1d43\u1d44\u1d45\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d54\u1d55\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5c\u1d5d\u1d5e\u1d5f\u1d60\u1d61\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u1d70\u1d71\u1d72\u1d73\u1d74\u1d75\u1d76\u1d77\u1d78\u1d79\u1d7a\u1d7b\u1d7c\u1d7d\u1d7e\u1d7f\u1d80\u1d81\u1d82\u1d83\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1d9b\u1d9c\u1d9d\u1d9e\u1d9f\u1da0\u1da1\u1da2\u1da3\u1da4\u1da5\u1da6\u1da7\u1da8\u1da9\u1daa\u1dab\u1dac\u1dad\u1dae\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u1dbc\u1dbd\u1dbe\u1dbf\u1e00\u1e01\u1e02\u1e03\u1e04\u1e05\u1e06\u1e07\u1e08\u1e09\u1e0a\u1e0b\u1e0c\u1e0d\u1e0e\u1e0f\u1e10\u1e11\u1e12\u1e13\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1a\u1e1b\u1e1c\u1e1d\u1e1e\u1e1f\u1e20\u1e21\u1e22\u1e23\u1e24\u1e25\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u1e2c\u1e2d\u1e2e\u1e2f\u1e30\u1e31\u1e32\u1e33\u1e34\u1e35\u1e36\u1e37\u1e38\u1e39\u1e3a\u1e3b\u1e3c\u1e3d\u1e3e\u1e3f\u1e40\u1e41\u1e42\u1e43\u1e44\u1e45\u1e46\u1e47\u1e48\u1e49\u1e4a\u1e4b\u1e4c\u1e4d\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u1e54\u1e55\u1e56\u1e57\u1e58\u1e59\u1e5a\u1e5b\u1e5c\u1e5d\u1e5e\u1e5f\u1e60\u1e61\u1e62\u1e63\u1e64\u1e65\u1e66\u1e67\u1e68\u1e69\u1e6a\u1e6b\u1e6c\u1e6d\u1e6e\u1e6f\u1e70\u1e71\u1e72\u1e73\u1e74\u1e75\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u1e7c\u1e7d\u1e7e\u1e7f\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1e86\u1e87\u1e88\u1e89\u1e8a\u1e8b\u1e8c\u1e8d\u1e8e\u1e8f\u1e90\u1e91\u1e92\u1e93\u1e94\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9b\u1e9c\u1e9d\u1e9e\u1e9f\u1ea0\u1ea1\u1ea2\u1ea3\u1ea4\u1ea5\u1ea6\u1ea7\u1ea8\u1ea9\u1eaa\u1eab\u1eac\u1ead\u1eae\u1eaf\u1eb0\u1eb1\u1eb2\u1eb3\u1eb4\u1eb5\u1eb6\u1eb7\u1eb8\u1eb9\u1eba\u1ebb\u1ebc\u1ebd\u1ebe\u1ebf\u1ec0\u1ec1\u1ec2\u1ec3\u1ec4\u1ec5\u1ec6\u1ec7\u1ec8\u1ec9\u1eca\u1ecb\u1ecc\u1ecd\u1ece\u1ecf\u1ed0\u1ed1\u1ed2\u1ed3\u1ed4\u1ed5\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u1edf\u1ee0\u1ee1\u1ee2\u1ee3\u1ee4\u1ee5\u1ee6\u1ee7\u1ee8\u1ee9\u1eea\u1eeb\u1eec\u1eed\u1eee\u1eef\u1ef0\u1ef1\u1ef2\u1ef3\u1ef4\u1ef5\u1ef6\u1ef7\u1ef8\u1ef9\u1efa\u1efb\u1efc\u1efd\u1efe\u1eff\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f59\u1f5b\u1f5d\u1f5f\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f88\u1f89\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fa8\u1fa9\u1faa\u1fab\u1fac\u1fad\u1fae\u1faf\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fb8\u1fb9\u1fba\u1fbb\u1fbc\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fc8\u1fc9\u1fca\u1fcb\u1fcc\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fd8\u1fd9\u1fda\u1fdb\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u1ff8\u1ff9\u1ffa\u1ffb\u1ffc\u2071\u207f\u2090\u2091\u2092\u2093\u2094\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u2102\u2107\u210a\u210b\u210c\u210d\u210e\u210f\u2110\u2111\u2112\u2113\u2115\u2118\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u212e\u212f\u2130\u2131\u2132\u2133\u2134\u2135\u2136\u2137\u2138\u2139\u213c\u213d\u213e\u213f\u2145\u2146\u2147\u2148\u2149\u214e\u2160\u2164\u2169\u216c\u216d\u216e\u216f\u2170\u2174\u2179\u217c\u217d\u217e\u217f\u2180\u2181\u2182\u2183\u2184\u2185\u2186\u2187\u2188\u2c00\u2c01\u2c02\u2c03\u2c04\u2c05\u2c06\u2c07\u2c08\u2c09\u2c0a\u2c0b\u2c0c\u2c0d\u2c0e\u2c0f\u2c10\u2c11\u2c12\u2c13\u2c14\u2c15\u2c16\u2c17\u2c18\u2c19\u2c1a\u2c1b\u2c1c\u2c1d\u2c1e\u2c1f\u2c20\u2c21\u2c22\u2c23\u2c24\u2c25\u2c26\u2c27\u2c28\u2c29\u2c2a\u2c2b\u2c2c\u2c2d\u2c2e\u2c30\u2c31\u2c32\u2c33\u2c34\u2c35\u2c36\u2c37\u2c38\u2c39\u2c3a\u2c3b\u2c3c\u2c3d\u2c3e\u2c3f\u2c40\u2c41\u2c42\u2c43\u2c44\u2c45\u2c46\u2c47\u2c48\u2c49\u2c4a\u2c4b\u2c4c\u2c4d\u2c4e\u2c4f\u2c50\u2c51\u2c52\u2c53\u2c54\u2c55\u2c56\u2c57\u2c58\u2c59\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2c60\u2c61\u2c62\u2c63\u2c64\u2c65\u2c66\u2c67\u2c68\u2c69\u2c6a\u2c6b\u2c6c\u2c6d\u2c6e\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2c80\u2c81\u2c82\u2c83\u2c84\u2c85\u2c86\u2c87\u2c88\u2c89\u2c8a\u2c8b\u2c8c\u2c8d\u2c8e\u2c8f\u2c90\u2c91\u2c92\u2c93\u2c94\u2c95\u2c96\u2c97\u2c98\u2c99\u2c9a\u2c9b\u2c9c\u2c9d\u2c9e\u2c9f\u2ca0\u2ca1\u2ca2\u2ca3\u2ca4\u2ca5\u2ca6\u2ca7\u2ca8\u2ca9\u2caa\u2cab\u2cac\u2cad\u2cae\u2caf\u2cb0\u2cb1\u2cb2\u2cb3\u2cb4\u2cb5\u2cb6\u2cb7\u2cb8\u2cb9\u2cba\u2cbb\u2cbc\u2cbd\u2cbe\u2cbf\u2cc0\u2cc1\u2cc2\u2cc3\u2cc4\u2cc5\u2cc6\u2cc7\u2cc8\u2cc9\u2cca\u2ccb\u2ccc\u2ccd\u2cce\u2ccf\u2cd0\u2cd1\u2cd2\u2cd3\u2cd4\u2cd5\u2cd6\u2cd7\u2cd8\u2cd9\u2cda\u2cdb\u2cdc\u2cdd\u2cde\u2cdf\u2ce0\u2ce1\u2ce2\u2ce3\u2ce4\u2ceb\u2cec\u2ced\u2cee\u2cf2\u2cf3\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\u2d27\u2d2d\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d66\u2d67\u2d6f\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u2e2f\u3005\u3006\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3031\u3032\u3033\u3034\u3035\u3038\u3039\u303a\u303b\u303c\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309d\u309e\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30fc\u30fd\u30fe\u3105\u3106\u3107\u3108\u3109\u310a\u310b\u310c\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311b\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312a\u312b\u312c\u312d\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313b\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31b8\u31b9\u31ba\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u3463\u3464\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u346e\u346f\u3470\u3471\u3472\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u3499\u349a\u349b\u349c\u349d\u349e\u349f\u34a0\u34a1\u34a2\u34a3\u34a4\u34a5\u34a6\u34a7\u34a8\u34a9\u34aa\u34ab\u34ac\u34ad\u34ae\u34af\u34b0\u34b1\u34b2\u34b3\u34b4\u34b5\u34b6\u34b7\u34b8\u34b9\u34ba\u34bb\u34bc\u34bd\u34be\u34bf\u34c0\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cb\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d3\u34d4\u34d5\u34d6\u34d7\u34d8\u34d9\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u34e7\u34e8\u34e9\u34ea\u34eb\u34ec\u34ed\u34ee\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u350c\u350d\u350e\u350f\u3510\u3511\u3512\u3513\u3514\u3515\u3516\u3517\u3518\u3519\u351a\u351b\u351c\u351d\u351e\u351f\u3520\u3521\u3522\u3523\u3524\u3525\u3526\u3527\u3528\u3529\u352a\u352b\u352c\u352d\u352e\u352f\u3530\u3531\u3532\u3533\u3534\u3535\u3536\u3537\u3538\u3539\u353a\u353b\u353c\u353d\u353e\u353f\u3540\u3541\u3542\u3543\u3544\u3545\u3546\u3547\u3548\u3549\u354a\u354b\u354c\u354d\u354e\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558\u3559\u355a\u355b\u355c\u355d\u355e\u355f\u3560\u3561\u3562\u3563\u3564\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3605\u3606\u3607\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u3677\u3678\u3679\u367a\u367b\u367c\u367d\u367e\u367f\u3680\u3681\u3682\u3683\u3684\u3685\u3686\u3687\u3688\u3689\u368a\u368b\u368c\u368d\u368e\u368f\u3690\u3691\u3692\u3693\u3694\u3695\u3696\u3697\u3698\u3699\u369a\u369b\u369c\u369d\u369e\u369f\u36a0\u36a1\u36a2\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e0\u36e1\u36e2\u36e3\u36e4\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u3723\u3724\u3725\u3726\u3727\u3728\u3729\u372a\u372b\u372c\u372d\u372e\u372f\u3730\u3731\u3732\u3733\u3734\u3735\u3736\u3737\u3738\u3739\u373a\u373b\u373c\u373d\u373e\u373f\u3740\u3741\u3742\u3743\u3744\u3745\u3746\u3747\u3748\u3749\u374a\u374b\u374c\u374d\u374e\u374f\u3750\u3751\u3752\u3753\u3754\u3755\u3756\u3757\u3758\u3759\u375a\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u3762\u3763\u3764\u3765\u3766\u3767\u3768\u3769\u376a\u376b\u376c\u376d\u376e\u376f\u3770\u3771\u3772\u3773\u3774\u3775\u3776\u3777\u3778\u3779\u377a\u377b\u377c\u377d\u377e\u377f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u3787\u3788\u3789\u378a\u378b\u378c\u378d\u378e\u378f\u3790\u3791\u3792\u3793\u3794\u3795\u3796\u3797\u3798\u3799\u379a\u379b\u379c\u379d\u379e\u379f\u37a0\u37a1\u37a2\u37a3\u37a4\u37a5\u37a6\u37a7\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b7\u37b8\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u37c4\u37c5\u37c6\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9a\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da3\u3da4\u3da5\u3da6\u3da7\u3da8\u3da9\u3daa\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e36\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f75\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3fef\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u408c\u408d\u408e\u408f\u4090\u4091\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u409e\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40df\u40e0\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u40f0\u40f1\u40f2\u40f3\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4100\u4101\u4102\u4103\u4104\u4105\u4106\u4107\u4108\u4109\u410a\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4122\u4123\u4124\u4125\u4126\u4127\u4128\u4129\u412a\u412b\u412c\u412d\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u417e\u417f\u4180\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u4188\u4189\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4191\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a3\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c2\u41c3\u41c4\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d3\u41d4\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4274\u4275\u4276\u4277\u4278\u4279\u427a\u427b\u427c\u427d\u427e\u427f\u4280\u4281\u4282\u4283\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4290\u4291\u4292\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u429a\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b4\u42b5\u42b6\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u4316\u4317\u4318\u4319\u431a\u431b\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u432e\u432f\u4330\u4331\u4332\u4333\u4334\u4335\u4336\u4337\u4338\u4339\u433a\u433b\u433c\u433d\u433e\u433f\u4340\u4341\u4342\u4343\u4344\u4345\u4346\u4347\u4348\u4349\u434a\u434b\u434c\u434d\u434e\u434f\u4350\u4351\u4352\u4353\u4354\u4355\u4356\u4357\u4358\u4359\u435a\u435b\u435c\u435d\u435e\u435f\u4360\u4361\u4362\u4363\u4364\u4365\u4366\u4367\u4368\u4369\u436a\u436b\u436c\u436d\u436e\u436f\u4370\u4371\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u437f\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4390\u4391\u4392\u4393\u4394\u4395\u4396\u4397\u4398\u4399\u439a\u439b\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43aa\u43ab\u43ac\u43ad\u43ae\u43af\u43b0\u43b1\u43b2\u43b3\u43b4\u43b5\u43b6\u43b7\u43b8\u43b9\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c0\u43c1\u43c2\u43c3\u43c4\u43c5\u43c6\u43c7\u43c8\u43c9\u43ca\u43cb\u43cc\u43cd\u43ce\u43cf\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u443e\u443f\u4440\u4441\u4442\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445b\u445c\u445d\u445e\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u45d6\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u460b\u460c\u460d\u460e\u460f\u4610\u4611\u4612\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u4651\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u466e\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u4721\u4722\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u472b\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u4754\u4755\u4756\u4757\u4758\u4759\u475a\u475b\u475c\u475d\u475e\u475f\u4760\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u4775\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u47b9\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u47c7\u47c8\u47c9\u47ca\u47cb\u47cc\u47cd\u47ce\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d6\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fc\u47fd\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u481e\u481f\u4820\u4821\u4822\u4823\u4824\u4825\u4826\u4827\u4828\u4829\u482a\u482b\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u4899\u489a\u489b\u489c\u489d\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u496f\u4970\u4971\u4972\u4973\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u497f\u4980\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a1b\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u4a30\u4a31\u4a32\u4a33\u4a34\u4a35\u4a36\u4a37\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4a3f\u4a40\u4a41\u4a42\u4a43\u4a44\u4a45\u4a46\u4a47\u4a48\u4a49\u4a4a\u4a4b\u4a4c\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u4a5f\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u4a85\u4a86\u4a87\u4a88\u4a89\u4a8a\u4a8b\u4a8c\u4a8d\u4a8e\u4a8f\u4a90\u4a91\u4a92\u4a93\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aab\u4aac\u4aad\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab4\u4ab5\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u4abf\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u4ae8\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af8\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4be0\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u4bf5\u4bf6\u4bf7\u4bf8\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d2a\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d41\u4d42\u4d43\u4d44\u4d45\u4d46\u4d47\u4d48\u4d49\u4d4a\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u4d51\u4d52\u4d53\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5b\u4d5c\u4d5d\u4d5e\u4d5f\u4d60\u4d61\u4d62\u4d63\u4d64\u4d65\u4d66\u4d67\u4d68\u4d69\u4d6a\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d75\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7b\u4d7c\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d86\u4d87\u4d88\u4d89\u4d8a\u4d8b\u4d8c\u4d8d\u4d8e\u4d8f\u4d90\u4d91\u4d92\u4d93\u4d94\u4d95\u4d96\u4d97\u4d98\u4d99\u4d9a\u4d9b\u4d9c\u4d9d\u4d9e\u4d9f\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5\u4da6\u4da7\u4da8\u4da9\u4daa\u4dab\u4dac\u4dad\u4dae\u4daf\u4db0\u4db1\u4db2\u4db3\u4db4\u4db5\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e16\u4e17\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e21\u4e22\u4e23\u4e24\u4e25\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e39\u4e3a\u4e3b\u4e3c\u4e3d\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u4e45\u4e46\u4e47\u4e48\u4e49\u4e4a\u4e4b\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e62\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u4e79\u4e7a\u4e7b\u4e7c\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e83\u4e84\u4e85\u4e86\u4e87\u4e88\u4e89\u4e8a\u4e8b\u4e8c\u4e8d\u4e8e\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u4ea8\u4ea9\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4eb8\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512b\u512c\u512d\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513a\u513b\u513c\u513d\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u5159\u515a\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u5166\u5167\u5168\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u5177\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5180\u5181\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u5195\u5196\u5197\u5198\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u51a9\u51aa\u51ab\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d6\u51d7\u51d8\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u5268\u5269\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5272\u5273\u5274\u5275\u5276\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u5280\u5281\u5282\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u5290\u5291\u5292\u5293\u5294\u5295\u5296\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d6\u52d7\u52d8\u52d9\u52da\u52db\u52dc\u52dd\u52de\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u5311\u5312\u5313\u5314\u5315\u5316\u5317\u5318\u5319\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u5326\u5327\u5328\u5329\u532a\u532b\u532c\u532d\u532e\u532f\u5330\u5331\u5332\u5333\u5334\u5335\u5336\u5337\u5338\u5339\u533a\u533b\u533c\u533d\u533e\u533f\u5340\u5341\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u534b\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u5354\u5355\u5356\u5357\u5358\u5359\u535a\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u536b\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u5379\u537a\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u538e\u538f\u5390\u5391\u5392\u5393\u5394\u5395\u5396\u5397\u5398\u5399\u539a\u539b\u539c\u539d\u539e\u539f\u53a0\u53a1\u53a2\u53a3\u53a4\u53a5\u53a6\u53a7\u53a8\u53a9\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5651\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u56ba\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56cc\u56cd\u56ce\u56cf\u56d0\u56d1\u56d2\u56d3\u56d4\u56d5\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u56ff\u5700\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u5725\u5726\u5727\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5900\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a90\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b34\u5b35\u5b36\u5b37\u5b38\u5b39\u5b3a\u5b3b\u5b3c\u5b3d\u5b3e\u5b3f\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b4f\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u5b68\u5b69\u5b6a\u5b6b\u5b6c\u5b6d\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b74\u5b75\u5b76\u5b77\u5b78\u5b79\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b81\u5b82\u5b83\u5b84\u5b85\u5b86\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba7\u5ba8\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c2d\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u5c5e\u5c5f\u5c60\u5c61\u5c62\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d\u5c6e\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4a\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u61f6\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u6203\u6204\u6205\u6206\u6207\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u6214\u6215\u6216\u6217\u6218\u6219\u621a\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6226\u6227\u6228\u6229\u622a\u622b\u622c\u622d\u622e\u622f\u6230\u6231\u6232\u6233\u6234\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u623d\u623e\u623f\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u625f\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6278\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b2\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u6526\u6527\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u658b\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u66ee\u66ef\u66f0\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u66fd\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6715\u6716\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6994\u6995\u6996\u6997\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6aeb\u6aec\u6aed\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0c\u6b0d\u6b0e\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b23\u6b24\u6b25\u6b26\u6b27\u6b28\u6b29\u6b2a\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b5e\u6b5f\u6b60\u6b61\u6b62\u6b63\u6b64\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b6f\u6b70\u6b71\u6b72\u6b73\u6b74\u6b75\u6b76\u6b77\u6b78\u6b79\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u6bac\u6bad\u6bae\u6baf\u6bb0\u6bb1\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bba\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc5\u6bc6\u6bc7\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u6bd9\u6bda\u6bdb\u6bdc\u6bdd\u6bde\u6bdf\u6be0\u6be1\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u6beb\u6bec\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0d\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d16\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecb\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edc\u6edd\u6ede\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3d\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd2\u6fd3\u6fd4\u6fd5\u6fd6\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u7179\u717a\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a6\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u7245\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7260\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u727a\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7345\u7346\u7347\u7348\u7349\u734a\u734b\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u7375\u7376\u7377\u7378\u7379\u737a\u737b\u737c\u737d\u737e\u737f\u7380\u7381\u7382\u7383\u7384\u7385\u7386\u7387\u7388\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74e3\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u750f\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751b\u751c\u751d\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u7527\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7568\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7572\u7573\u7574\u7575\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u757f\u7580\u7581\u7582\u7583\u7584\u7585\u7586\u7587\u7588\u7589\u758a\u758b\u758c\u758d\u758e\u758f\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u7629\u762a\u762b\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u764d\u764e\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76bf\u76c0\u76c1\u76c2\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e0\u76e1\u76e2\u76e3\u76e4\u76e5\u76e6\u76e7\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7\u77d8\u77d9\u77da\u77db\u77dc\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u7878\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u79a9\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79b7\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a76\u7a77\u7a78\u7a79\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac5\u7ac6\u7ac7\u7ac8\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc0\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc0\u7cc1\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u7ce8\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd0\u7dd1\u7dd2\u7dd3\u7dd4\u7dd5\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4b\u7e4c\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e71\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e93\u7e94\u7e95\u7e96\u7e97\u7e98\u7e99\u7e9a\u7e9b\u7e9c\u7e9d\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u7f35\u7f36\u7f37\u7f38\u7f39\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f3f\u7f40\u7f41\u7f42\u7f43\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u7f50\u7f51\u7f52\u7f53\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f65\u7f66\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8061\u8062\u8063\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8073\u8074\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a4\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81dc\u81dd\u81de\u81df\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u81e6\u81e7\u81e8\u81e9\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u81f5\u81f6\u81f7\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u8211\u8212\u8213\u8214\u8215\u8216\u8217\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u821f\u8220\u8221\u8222\u8223\u8224\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u823d\u823e\u823f\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8279\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u842a\u842b\u842c\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u8613\u8614\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ab\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d6\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968\u8969\u896a\u896b\u896c\u896d\u896e\u896f\u8970\u8971\u8972\u8973\u8974\u8975\u8976\u8977\u8978\u8979\u897a\u897b\u897c\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8990\u8991\u8992\u8993\u8994\u8995\u8996\u8997\u8998\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a0\u89a1\u89a2\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89be\u89bf\u89c0\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89e8\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u89ef\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8ae9\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c76\u8c77\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u8d19\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8db6\u8db7\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6e\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u8e80\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u8e9d\u8e9e\u8e9f\u8ea0\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8ea9\u8eaa\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u8eb1\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ebe\u8ebf\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8faf\u8fb0\u8fb1\u8fb2\u8fb3\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u908c\u908d\u908e\u908f\u9090\u9091\u9092\u9093\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9144\u9145\u9146\u9147\u9148\u9149\u914a\u914b\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf\u91c0\u91c1\u91c2\u91c3\u91c4\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93f8\u93f9\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u9467\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u9577\u9578\u9579\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u95de\u95df\u95e0\u95e1\u95e2\u95e3\u95e4\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u974b\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u9860\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u986d\u986e\u986f\u9870\u9871\u9872\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98aa\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u9a5d\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u9ab8\u9ab9\u9aba\u9abb\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac1\u9ac2\u9ac3\u9ac4\u9ac5\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add\u9ade\u9adf\u9ae0\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u9b03\u9b04\u9b05\u9b06\u9b07\u9b08\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b33\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u9b43\u9b44\u9b45\u9b46\u9b47\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b61\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfb\u9bfc\u9bfd\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c1c\u9c1d\u9c1e\u9c1f\u9c20\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d64\u9d65\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d90\u9d91\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcb\u9dcc\u9dcd\u9dce\u9dcf\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9dfc\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e16\u9e17\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u9e77\u9e78\u9e79\u9e7a\u9e7b\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e87\u9e88\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ecd\u9ece\u9ecf\u9ed0\u9ed1\u9ed2\u9ed3\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9edc\u9edd\u9ede\u9edf\u9ee0\u9ee1\u9ee2\u9ee3\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eed\u9eee\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef5\u9ef6\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f05\u9f06\u9f07\u9f08\u9f09\u9f0a\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f14\u9f15\u9f16\u9f17\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u9f22\u9f23\u9f24\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f33\u9f34\u9f35\u9f36\u9f37\u9f38\u9f39\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u9f56\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fab\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fb4\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcc\u9fcd\u9fce\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua015\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua610\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua62a\ua62b\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua64e\ua64f\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua658\ua659\ua65a\ua65b\ua65c\ua65d\ua65e\ua65f\ua660\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua668\ua669\ua66a\ua66b\ua66c\ua66d\ua66e\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68d\ua68e\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua698\ua699\ua69a\ua69b\ua69c\ua69d\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua722\ua723\ua724\ua725\ua726\ua727\ua728\ua729\ua72a\ua72b\ua72c\ua72d\ua72e\ua72f\ua730\ua731\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua740\ua741\ua742\ua743\ua744\ua745\ua746\ua747\ua748\ua749\ua74a\ua74b\ua74c\ua74d\ua74e\ua74f\ua750\ua751\ua752\ua753\ua754\ua755\ua756\ua757\ua758\ua759\ua75a\ua75b\ua75c\ua75d\ua75e\ua75f\ua760\ua761\ua762\ua763\ua764\ua765\ua766\ua767\ua768\ua769\ua76a\ua76b\ua76c\ua76d\ua76e\ua76f\ua770\ua771\ua772\ua773\ua774\ua775\ua776\ua777\ua778\ua779\ua77a\ua77b\ua77c\ua77d\ua77e\ua77f\ua780\ua781\ua782\ua783\ua784\ua785\ua786\ua787\ua788\ua78b\ua78c\ua78d\ua78e\ua78f\ua790\ua791\ua792\ua793\ua794\ua795\ua796\ua797\ua798\ua799\ua79a\ua79b\ua79c\ua79d\ua79e\ua79f\ua7a0\ua7a1\ua7a2\ua7a3\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7ae\ua7b0\ua7b1\ua7b2\ua7b3\ua7b4\ua7b5\ua7b6\ua7b7\ua7f7\ua7f8\ua7f9\ua7fa\ua7fb\ua7fc\ua7fd\ua7fe\ua7ff\ua800\ua801\ua803\ua804\ua805\ua807\ua808\ua809\ua80a\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua854\ua855\ua856\ua857\ua858\ua859\ua85a\ua85b\ua85c\ua85d\ua85e\ua85f\ua860\ua861\ua862\ua863\ua864\ua865\ua866\ua867\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8fb\ua8fd\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9ab\ua9ac\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9cf\ua9e0\ua9e1\ua9e2\ua9e3\ua9e4\ua9e6\ua9e7\ua9e8\ua9e9\ua9ea\ua9eb\ua9ec\ua9ed\ua9ee\ua9ef\ua9fa\ua9fb\ua9fc\ua9fd\ua9fe\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa40\uaa41\uaa42\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa60\uaa61\uaa62\uaa63\uaa64\uaa65\uaa66\uaa67\uaa68\uaa69\uaa6a\uaa6b\uaa6c\uaa6d\uaa6e\uaa6f\uaa70\uaa71\uaa72\uaa73\uaa74\uaa75\uaa76\uaa7a\uaa7e\uaa7f\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab1\uaab5\uaab6\uaab9\uaaba\uaabb\uaabc\uaabd\uaac0\uaac2\uaadb\uaadc\uaadd\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uaaf2\uaaf3\uaaf4\uab01\uab02\uab03\uab04\uab05\uab06\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\uab11\uab12\uab13\uab14\uab15\uab16\uab20\uab21\uab22\uab23\uab24\uab25\uab26\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\uab30\uab31\uab32\uab33\uab34\uab35\uab36\uab37\uab38\uab39\uab3a\uab3b\uab3c\uab3d\uab3e\uab3f\uab40\uab41\uab42\uab43\uab44\uab45\uab46\uab47\uab48\uab49\uab4a\uab4b\uab4c\uab4d\uab4e\uab4f\uab50\uab51\uab52\uab53\uab54\uab55\uab56\uab57\uab58\uab59\uab5a\uab5c\uab5d\uab5e\uab5f\uab60\uab61\uab62\uab63\uab64\uab65\uab70\uab71\uab72\uab73\uab74\uab75\uab76\uab77\uab78\uab79\uab7a\uab7b\uab7c\uab7d\uab7e\uab7f\uab80\uab81\uab82\uab83\uab84\uab85\uab86\uab87\uab88\uab89\uab8a\uab8b\uab8c\uab8d\uab8e\uab8f\uab90\uab91\uab92\uab93\uab94\uab95\uab96\uab97\uab98\uab99\uab9a\uab9b\uab9c\uab9d\uab9e\uab9f\uaba0\uaba1\uaba2\uaba3\uaba4\uaba5\uaba6\uaba7\uaba8\uaba9\uabaa\uabab\uabac\uabad\uabae\uabaf\uabb0\uabb1\uabb2\uabb3\uabb4\uabb5\uabb6\uabb7\uabb8\uabb9\uabba\uabbb\uabbc\uabbd\uabbe\uabbf\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uac00\uac01\uac02\uac03\uac04\uac05\uac06\uac07\uac08\uac09\uac0a\uac0b\uac0c\uac0d\uac0e\uac0f\uac10\uac11\uac12\uac13\uac14\uac15\uac16\uac17\uac18\uac19\uac1a\uac1b\uac1c\uac1d\uac1e\uac1f\uac20\uac21\uac22\uac23\uac24\uac25\uac26\uac27\uac28\uac29\uac2a\uac2b\uac2c\uac2d\uac2e\uac2f\uac30\uac31\uac32\uac33\uac34\uac35\uac36\uac37\uac38\uac39\uac3a\uac3b\uac3c\uac3d\uac3e\uac3f\uac40\uac41\uac42\uac43\uac44\uac45\uac46\uac47\uac48\uac49\uac4a\uac4b\uac4c\uac4d\uac4e\uac4f\uac50\uac51\uac52\uac53\uac54\uac55\uac56\uac57\uac58\uac59\uac5a\uac5b\uac5c\uac5d\uac5e\uac5f\uac60\uac61\uac62\uac63\uac64\uac65\uac66\uac67\uac68\uac69\uac6a\uac6b\uac6c\uac6d\uac6e\uac6f\uac70\uac71\uac72\uac73\uac74\uac75\uac76\uac77\uac78\uac79\uac7a\uac7b\uac7c\uac7d\uac7e\uac7f\uac80\uac81\uac82\uac83\uac84\uac85\uac86\uac87\uac88\uac89\uac8a\uac8b\uac8c\uac8d\uac8e\uac8f\uac90\uac91\uac92\uac93\uac94\uac95\uac96\uac97\uac98\uac99\uac9a\uac9b\uac9c\uac9d\uac9e\uac9f\uaca0\uaca1\uaca2\uaca3\uaca4\uaca5\uaca6\uaca7\uaca8\uaca9\uacaa\uacab\uacac\uacad\uacae\uacaf\uacb0\uacb1\uacb2\uacb3\uacb4\uacb5\uacb6\uacb7\uacb8\uacb9\uacba\uacbb\uacbc\uacbd\uacbe\uacbf\uacc0\uacc1\uacc2\uacc3\uacc4\uacc5\uacc6\uacc7\uacc8\uacc9\uacca\uaccb\uaccc\uaccd\uacce\uaccf\uacd0\uacd1\uacd2\uacd3\uacd4\uacd5\uacd6\uacd7\uacd8\uacd9\uacda\uacdb\uacdc\uacdd\uacde\uacdf\uace0\uace1\uace2\uace3\uace4\uace5\uace6\uace7\uace8\uace9\uacea\uaceb\uacec\uaced\uacee\uacef\uacf0\uacf1\uacf2\uacf3\uacf4\uacf5\uacf6\uacf7\uacf8\uacf9\uacfa\uacfb\uacfc\uacfd\uacfe\uacff\uad00\uad01\uad02\uad03\uad04\uad05\uad06\uad07\uad08\uad09\uad0a\uad0b\uad0c\uad0d\uad0e\uad0f\uad10\uad11\uad12\uad13\uad14\uad15\uad16\uad17\uad18\uad19\uad1a\uad1b\uad1c\uad1d\uad1e\uad1f\uad20\uad21\uad22\uad23\uad24\uad25\uad26\uad27\uad28\uad29\uad2a\uad2b\uad2c\uad2d\uad2e\uad2f\uad30\uad31\uad32\uad33\uad34\uad35\uad36\uad37\uad38\uad39\uad3a\uad3b\uad3c\uad3d\uad3e\uad3f\uad40\uad41\uad42\uad43\uad44\uad45\uad46\uad47\uad48\uad49\uad4a\uad4b\uad4c\uad4d\uad4e\uad4f\uad50\uad51\uad52\uad53\uad54\uad55\uad56\uad57\uad58\uad59\uad5a\uad5b\uad5c\uad5d\uad5e\uad5f\uad60\uad61\uad62\uad63\uad64\uad65\uad66\uad67\uad68\uad69\uad6a\uad6b\uad6c\uad6d\uad6e\uad6f\uad70\uad71\uad72\uad73\uad74\uad75\uad76\uad77\uad78\uad79\uad7a\uad7b\uad7c\uad7d\uad7e\uad7f\uad80\uad81\uad82\uad83\uad84\uad85\uad86\uad87\uad88\uad89\uad8a\uad8b\uad8c\uad8d\uad8e\uad8f\uad90\uad91\uad92\uad93\uad94\uad95\uad96\uad97\uad98\uad99\uad9a\uad9b\uad9c\uad9d\uad9e\uad9f\uada0\uada1\uada2\uada3\uada4\uada5\uada6\uada7\uada8\uada9\uadaa\uadab\uadac\uadad\uadae\uadaf\uadb0\uadb1\uadb2\uadb3\uadb4\uadb5\uadb6\uadb7\uadb8\uadb9\uadba\uadbb\uadbc\uadbd\uadbe\uadbf\uadc0\uadc1\uadc2\uadc3\uadc4\uadc5\uadc6\uadc7\uadc8\uadc9\uadca\uadcb\uadcc\uadcd\uadce\uadcf\uadd0\uadd1\uadd2\uadd3\uadd4\uadd5\uadd6\uadd7\uadd8\uadd9\uadda\uaddb\uaddc\uaddd\uadde\uaddf\uade0\uade1\uade2\uade3\uade4\uade5\uade6\uade7\uade8\uade9\uadea\uadeb\uadec\uaded\uadee\uadef\uadf0\uadf1\uadf2\uadf3\uadf4\uadf5\uadf6\uadf7\uadf8\uadf9\uadfa\uadfb\uadfc\uadfd\uadfe\uadff\uae00\uae01\uae02\uae03\uae04\uae05\uae06\uae07\uae08\uae09\uae0a\uae0b\uae0c\uae0d\uae0e\uae0f\uae10\uae11\uae12\uae13\uae14\uae15\uae16\uae17\uae18\uae19\uae1a\uae1b\uae1c\uae1d\uae1e\uae1f\uae20\uae21\uae22\uae23\uae24\uae25\uae26\uae27\uae28\uae29\uae2a\uae2b\uae2c\uae2d\uae2e\uae2f\uae30\uae31\uae32\uae33\uae34\uae35\uae36\uae37\uae38\uae39\uae3a\uae3b\uae3c\uae3d\uae3e\uae3f\uae40\uae41\uae42\uae43\uae44\uae45\uae46\uae47\uae48\uae49\uae4a\uae4b\uae4c\uae4d\uae4e\uae4f\uae50\uae51\uae52\uae53\uae54\uae55\uae56\uae57\uae58\uae59\uae5a\uae5b\uae5c\uae5d\uae5e\uae5f\uae60\uae61\uae62\uae63\uae64\uae65\uae66\uae67\uae68\uae69\uae6a\uae6b\uae6c\uae6d\uae6e\uae6f\uae70\uae71\uae72\uae73\uae74\uae75\uae76\uae77\uae78\uae79\uae7a\uae7b\uae7c\uae7d\uae7e\uae7f\uae80\uae81\uae82\uae83\uae84\uae85\uae86\uae87\uae88\uae89\uae8a\uae8b\uae8c\uae8d\uae8e\uae8f\uae90\uae91\uae92\uae93\uae94\uae95\uae96\uae97\uae98\uae99\uae9a\uae9b\uae9c\uae9d\uae9e\uae9f\uaea0\uaea1\uaea2\uaea3\uaea4\uaea5\uaea6\uaea7\uaea8\uaea9\uaeaa\uaeab\uaeac\uaead\uaeae\uaeaf\uaeb0\uaeb1\uaeb2\uaeb3\uaeb4\uaeb5\uaeb6\uaeb7\uaeb8\uaeb9\uaeba\uaebb\uaebc\uaebd\uaebe\uaebf\uaec0\uaec1\uaec2\uaec3\uaec4\uaec5\uaec6\uaec7\uaec8\uaec9\uaeca\uaecb\uaecc\uaecd\uaece\uaecf\uaed0\uaed1\uaed2\uaed3\uaed4\uaed5\uaed6\uaed7\uaed8\uaed9\uaeda\uaedb\uaedc\uaedd\uaede\uaedf\uaee0\uaee1\uaee2\uaee3\uaee4\uaee5\uaee6\uaee7\uaee8\uaee9\uaeea\uaeeb\uaeec\uaeed\uaeee\uaeef\uaef0\uaef1\uaef2\uaef3\uaef4\uaef5\uaef6\uaef7\uaef8\uaef9\uaefa\uaefb\uaefc\uaefd\uaefe\uaeff\uaf00\uaf01\uaf02\uaf03\uaf04\uaf05\uaf06\uaf07\uaf08\uaf09\uaf0a\uaf0b\uaf0c\uaf0d\uaf0e\uaf0f\uaf10\uaf11\uaf12\uaf13\uaf14\uaf15\uaf16\uaf17\uaf18\uaf19\uaf1a\uaf1b\uaf1c\uaf1d\uaf1e\uaf1f\uaf20\uaf21\uaf22\uaf23\uaf24\uaf25\uaf26\uaf27\uaf28\uaf29\uaf2a\uaf2b\uaf2c\uaf2d\uaf2e\uaf2f\uaf30\uaf31\uaf32\uaf33\uaf34\uaf35\uaf36\uaf37\uaf38\uaf39\uaf3a\uaf3b\uaf3c\uaf3d\uaf3e\uaf3f\uaf40\uaf41\uaf42\uaf43\uaf44\uaf45\uaf46\uaf47\uaf48\uaf49\uaf4a\uaf4b\uaf4c\uaf4d\uaf4e\uaf4f\uaf50\uaf51\uaf52\uaf53\uaf54\uaf55\uaf56\uaf57\uaf58\uaf59\uaf5a\uaf5b\uaf5c\uaf5d\uaf5e\uaf5f\uaf60\uaf61\uaf62\uaf63\uaf64\uaf65\uaf66\uaf67\uaf68\uaf69\uaf6a\uaf6b\uaf6c\uaf6d\uaf6e\uaf6f\uaf70\uaf71\uaf72\uaf73\uaf74\uaf75\uaf76\uaf77\uaf78\uaf79\uaf7a\uaf7b\uaf7c\uaf7d\uaf7e\uaf7f\uaf80\uaf81\uaf82\uaf83\uaf84\uaf85\uaf86\uaf87\uaf88\uaf89\uaf8a\uaf8b\uaf8c\uaf8d\uaf8e\uaf8f\uaf90\uaf91\uaf92\uaf93\uaf94\uaf95\uaf96\uaf97\uaf98\uaf99\uaf9a\uaf9b\uaf9c\uaf9d\uaf9e\uaf9f\uafa0\uafa1\uafa2\uafa3\uafa4\uafa5\uafa6\uafa7\uafa8\uafa9\uafaa\uafab\uafac\uafad\uafae\uafaf\uafb0\uafb1\uafb2\uafb3\uafb4\uafb5\uafb6\uafb7\uafb8\uafb9\uafba\uafbb\uafbc\uafbd\uafbe\uafbf\uafc0\uafc1\uafc2\uafc3\uafc4\uafc5\uafc6\uafc7\uafc8\uafc9\uafca\uafcb\uafcc\uafcd\uafce\uafcf\uafd0\uafd1\uafd2\uafd3\uafd4\uafd5\uafd6\uafd7\uafd8\uafd9\uafda\uafdb\uafdc\uafdd\uafde\uafdf\uafe0\uafe1\uafe2\uafe3\uafe4\uafe5\uafe6\uafe7\uafe8\uafe9\uafea\uafeb\uafec\uafed\uafee\uafef\uaff0\uaff1\uaff2\uaff3\uaff4\uaff5\uaff6\uaff7\uaff8\uaff9\uaffa\uaffb\uaffc\uaffd\uaffe\uafff\ub000\ub001\ub002\ub003\ub004\ub005\ub006\ub007\ub008\ub009\ub00a\ub00b\ub00c\ub00d\ub00e\ub00f\ub010\ub011\ub012\ub013\ub014\ub015\ub016\ub017\ub018\ub019\ub01a\ub01b\ub01c\ub01d\ub01e\ub01f\ub020\ub021\ub022\ub023\ub024\ub025\ub026\ub027\ub028\ub029\ub02a\ub02b\ub02c\ub02d\ub02e\ub02f\ub030\ub031\ub032\ub033\ub034\ub035\ub036\ub037\ub038\ub039\ub03a\ub03b\ub03c\ub03d\ub03e\ub03f\ub040\ub041\ub042\ub043\ub044\ub045\ub046\ub047\ub048\ub049\ub04a\ub04b\ub04c\ub04d\ub04e\ub04f\ub050\ub051\ub052\ub053\ub054\ub055\ub056\ub057\ub058\ub059\ub05a\ub05b\ub05c\ub05d\ub05e\ub05f\ub060\ub061\ub062\ub063\ub064\ub065\ub066\ub067\ub068\ub069\ub06a\ub06b\ub06c\ub06d\ub06e\ub06f\ub070\ub071\ub072\ub073\ub074\ub075\ub076\ub077\ub078\ub079\ub07a\ub07b\ub07c\ub07d\ub07e\ub07f\ub080\ub081\ub082\ub083\ub084\ub085\ub086\ub087\ub088\ub089\ub08a\ub08b\ub08c\ub08d\ub08e\ub08f\ub090\ub091\ub092\ub093\ub094\ub095\ub096\ub097\ub098\ub099\ub09a\ub09b\ub09c\ub09d\ub09e\ub09f\ub0a0\ub0a1\ub0a2\ub0a3\ub0a4\ub0a5\ub0a6\ub0a7\ub0a8\ub0a9\ub0aa\ub0ab\ub0ac\ub0ad\ub0ae\ub0af\ub0b0\ub0b1\ub0b2\ub0b3\ub0b4\ub0b5\ub0b6\ub0b7\ub0b8\ub0b9\ub0ba\ub0bb\ub0bc\ub0bd\ub0be\ub0bf\ub0c0\ub0c1\ub0c2\ub0c3\ub0c4\ub0c5\ub0c6\ub0c7\ub0c8\ub0c9\ub0ca\ub0cb\ub0cc\ub0cd\ub0ce\ub0cf\ub0d0\ub0d1\ub0d2\ub0d3\ub0d4\ub0d5\ub0d6\ub0d7\ub0d8\ub0d9\ub0da\ub0db\ub0dc\ub0dd\ub0de\ub0df\ub0e0\ub0e1\ub0e2\ub0e3\ub0e4\ub0e5\ub0e6\ub0e7\ub0e8\ub0e9\ub0ea\ub0eb\ub0ec\ub0ed\ub0ee\ub0ef\ub0f0\ub0f1\ub0f2\ub0f3\ub0f4\ub0f5\ub0f6\ub0f7\ub0f8\ub0f9\ub0fa\ub0fb\ub0fc\ub0fd\ub0fe\ub0ff\ub100\ub101\ub102\ub103\ub104\ub105\ub106\ub107\ub108\ub109\ub10a\ub10b\ub10c\ub10d\ub10e\ub10f\ub110\ub111\ub112\ub113\ub114\ub115\ub116\ub117\ub118\ub119\ub11a\ub11b\ub11c\ub11d\ub11e\ub11f\ub120\ub121\ub122\ub123\ub124\ub125\ub126\ub127\ub128\ub129\ub12a\ub12b\ub12c\ub12d\ub12e\ub12f\ub130\ub131\ub132\ub133\ub134\ub135\ub136\ub137\ub138\ub139\ub13a\ub13b\ub13c\ub13d\ub13e\ub13f\ub140\ub141\ub142\ub143\ub144\ub145\ub146\ub147\ub148\ub149\ub14a\ub14b\ub14c\ub14d\ub14e\ub14f\ub150\ub151\ub152\ub153\ub154\ub155\ub156\ub157\ub158\ub159\ub15a\ub15b\ub15c\ub15d\ub15e\ub15f\ub160\ub161\ub162\ub163\ub164\ub165\ub166\ub167\ub168\ub169\ub16a\ub16b\ub16c\ub16d\ub16e\ub16f\ub170\ub171\ub172\ub173\ub174\ub175\ub176\ub177\ub178\ub179\ub17a\ub17b\ub17c\ub17d\ub17e\ub17f\ub180\ub181\ub182\ub183\ub184\ub185\ub186\ub187\ub188\ub189\ub18a\ub18b\ub18c\ub18d\ub18e\ub18f\ub190\ub191\ub192\ub193\ub194\ub195\ub196\ub197\ub198\ub199\ub19a\ub19b\ub19c\ub19d\ub19e\ub19f\ub1a0\ub1a1\ub1a2\ub1a3\ub1a4\ub1a5\ub1a6\ub1a7\ub1a8\ub1a9\ub1aa\ub1ab\ub1ac\ub1ad\ub1ae\ub1af\ub1b0\ub1b1\ub1b2\ub1b3\ub1b4\ub1b5\ub1b6\ub1b7\ub1b8\ub1b9\ub1ba\ub1bb\ub1bc\ub1bd\ub1be\ub1bf\ub1c0\ub1c1\ub1c2\ub1c3\ub1c4\ub1c5\ub1c6\ub1c7\ub1c8\ub1c9\ub1ca\ub1cb\ub1cc\ub1cd\ub1ce\ub1cf\ub1d0\ub1d1\ub1d2\ub1d3\ub1d4\ub1d5\ub1d6\ub1d7\ub1d8\ub1d9\ub1da\ub1db\ub1dc\ub1dd\ub1de\ub1df\ub1e0\ub1e1\ub1e2\ub1e3\ub1e4\ub1e5\ub1e6\ub1e7\ub1e8\ub1e9\ub1ea\ub1eb\ub1ec\ub1ed\ub1ee\ub1ef\ub1f0\ub1f1\ub1f2\ub1f3\ub1f4\ub1f5\ub1f6\ub1f7\ub1f8\ub1f9\ub1fa\ub1fb\ub1fc\ub1fd\ub1fe\ub1ff\ub200\ub201\ub202\ub203\ub204\ub205\ub206\ub207\ub208\ub209\ub20a\ub20b\ub20c\ub20d\ub20e\ub20f\ub210\ub211\ub212\ub213\ub214\ub215\ub216\ub217\ub218\ub219\ub21a\ub21b\ub21c\ub21d\ub21e\ub21f\ub220\ub221\ub222\ub223\ub224\ub225\ub226\ub227\ub228\ub229\ub22a\ub22b\ub22c\ub22d\ub22e\ub22f\ub230\ub231\ub232\ub233\ub234\ub235\ub236\ub237\ub238\ub239\ub23a\ub23b\ub23c\ub23d\ub23e\ub23f\ub240\ub241\ub242\ub243\ub244\ub245\ub246\ub247\ub248\ub249\ub24a\ub24b\ub24c\ub24d\ub24e\ub24f\ub250\ub251\ub252\ub253\ub254\ub255\ub256\ub257\ub258\ub259\ub25a\ub25b\ub25c\ub25d\ub25e\ub25f\ub260\ub261\ub262\ub263\ub264\ub265\ub266\ub267\ub268\ub269\ub26a\ub26b\ub26c\ub26d\ub26e\ub26f\ub270\ub271\ub272\ub273\ub274\ub275\ub276\ub277\ub278\ub279\ub27a\ub27b\ub27c\ub27d\ub27e\ub27f\ub280\ub281\ub282\ub283\ub284\ub285\ub286\ub287\ub288\ub289\ub28a\ub28b\ub28c\ub28d\ub28e\ub28f\ub290\ub291\ub292\ub293\ub294\ub295\ub296\ub297\ub298\ub299\ub29a\ub29b\ub29c\ub29d\ub29e\ub29f\ub2a0\ub2a1\ub2a2\ub2a3\ub2a4\ub2a5\ub2a6\ub2a7\ub2a8\ub2a9\ub2aa\ub2ab\ub2ac\ub2ad\ub2ae\ub2af\ub2b0\ub2b1\ub2b2\ub2b3\ub2b4\ub2b5\ub2b6\ub2b7\ub2b8\ub2b9\ub2ba\ub2bb\ub2bc\ub2bd\ub2be\ub2bf\ub2c0\ub2c1\ub2c2\ub2c3\ub2c4\ub2c5\ub2c6\ub2c7\ub2c8\ub2c9\ub2ca\ub2cb\ub2cc\ub2cd\ub2ce\ub2cf\ub2d0\ub2d1\ub2d2\ub2d3\ub2d4\ub2d5\ub2d6\ub2d7\ub2d8\ub2d9\ub2da\ub2db\ub2dc\ub2dd\ub2de\ub2df\ub2e0\ub2e1\ub2e2\ub2e3\ub2e4\ub2e5\ub2e6\ub2e7\ub2e8\ub2e9\ub2ea\ub2eb\ub2ec\ub2ed\ub2ee\ub2ef\ub2f0\ub2f1\ub2f2\ub2f3\ub2f4\ub2f5\ub2f6\ub2f7\ub2f8\ub2f9\ub2fa\ub2fb\ub2fc\ub2fd\ub2fe\ub2ff\ub300\ub301\ub302\ub303\ub304\ub305\ub306\ub307\ub308\ub309\ub30a\ub30b\ub30c\ub30d\ub30e\ub30f\ub310\ub311\ub312\ub313\ub314\ub315\ub316\ub317\ub318\ub319\ub31a\ub31b\ub31c\ub31d\ub31e\ub31f\ub320\ub321\ub322\ub323\ub324\ub325\ub326\ub327\ub328\ub329\ub32a\ub32b\ub32c\ub32d\ub32e\ub32f\ub330\ub331\ub332\ub333\ub334\ub335\ub336\ub337\ub338\ub339\ub33a\ub33b\ub33c\ub33d\ub33e\ub33f\ub340\ub341\ub342\ub343\ub344\ub345\ub346\ub347\ub348\ub349\ub34a\ub34b\ub34c\ub34d\ub34e\ub34f\ub350\ub351\ub352\ub353\ub354\ub355\ub356\ub357\ub358\ub359\ub35a\ub35b\ub35c\ub35d\ub35e\ub35f\ub360\ub361\ub362\ub363\ub364\ub365\ub366\ub367\ub368\ub369\ub36a\ub36b\ub36c\ub36d\ub36e\ub36f\ub370\ub371\ub372\ub373\ub374\ub375\ub376\ub377\ub378\ub379\ub37a\ub37b\ub37c\ub37d\ub37e\ub37f\ub380\ub381\ub382\ub383\ub384\ub385\ub386\ub387\ub388\ub389\ub38a\ub38b\ub38c\ub38d\ub38e\ub38f\ub390\ub391\ub392\ub393\ub394\ub395\ub396\ub397\ub398\ub399\ub39a\ub39b\ub39c\ub39d\ub39e\ub39f\ub3a0\ub3a1\ub3a2\ub3a3\ub3a4\ub3a5\ub3a6\ub3a7\ub3a8\ub3a9\ub3aa\ub3ab\ub3ac\ub3ad\ub3ae\ub3af\ub3b0\ub3b1\ub3b2\ub3b3\ub3b4\ub3b5\ub3b6\ub3b7\ub3b8\ub3b9\ub3ba\ub3bb\ub3bc\ub3bd\ub3be\ub3bf\ub3c0\ub3c1\ub3c2\ub3c3\ub3c4\ub3c5\ub3c6\ub3c7\ub3c8\ub3c9\ub3ca\ub3cb\ub3cc\ub3cd\ub3ce\ub3cf\ub3d0\ub3d1\ub3d2\ub3d3\ub3d4\ub3d5\ub3d6\ub3d7\ub3d8\ub3d9\ub3da\ub3db\ub3dc\ub3dd\ub3de\ub3df\ub3e0\ub3e1\ub3e2\ub3e3\ub3e4\ub3e5\ub3e6\ub3e7\ub3e8\ub3e9\ub3ea\ub3eb\ub3ec\ub3ed\ub3ee\ub3ef\ub3f0\ub3f1\ub3f2\ub3f3\ub3f4\ub3f5\ub3f6\ub3f7\ub3f8\ub3f9\ub3fa\ub3fb\ub3fc\ub3fd\ub3fe\ub3ff\ub400\ub401\ub402\ub403\ub404\ub405\ub406\ub407\ub408\ub409\ub40a\ub40b\ub40c\ub40d\ub40e\ub40f\ub410\ub411\ub412\ub413\ub414\ub415\ub416\ub417\ub418\ub419\ub41a\ub41b\ub41c\ub41d\ub41e\ub41f\ub420\ub421\ub422\ub423\ub424\ub425\ub426\ub427\ub428\ub429\ub42a\ub42b\ub42c\ub42d\ub42e\ub42f\ub430\ub431\ub432\ub433\ub434\ub435\ub436\ub437\ub438\ub439\ub43a\ub43b\ub43c\ub43d\ub43e\ub43f\ub440\ub441\ub442\ub443\ub444\ub445\ub446\ub447\ub448\ub449\ub44a\ub44b\ub44c\ub44d\ub44e\ub44f\ub450\ub451\ub452\ub453\ub454\ub455\ub456\ub457\ub458\ub459\ub45a\ub45b\ub45c\ub45d\ub45e\ub45f\ub460\ub461\ub462\ub463\ub464\ub465\ub466\ub467\ub468\ub469\ub46a\ub46b\ub46c\ub46d\ub46e\ub46f\ub470\ub471\ub472\ub473\ub474\ub475\ub476\ub477\ub478\ub479\ub47a\ub47b\ub47c\ub47d\ub47e\ub47f\ub480\ub481\ub482\ub483\ub484\ub485\ub486\ub487\ub488\ub489\ub48a\ub48b\ub48c\ub48d\ub48e\ub48f\ub490\ub491\ub492\ub493\ub494\ub495\ub496\ub497\ub498\ub499\ub49a\ub49b\ub49c\ub49d\ub49e\ub49f\ub4a0\ub4a1\ub4a2\ub4a3\ub4a4\ub4a5\ub4a6\ub4a7\ub4a8\ub4a9\ub4aa\ub4ab\ub4ac\ub4ad\ub4ae\ub4af\ub4b0\ub4b1\ub4b2\ub4b3\ub4b4\ub4b5\ub4b6\ub4b7\ub4b8\ub4b9\ub4ba\ub4bb\ub4bc\ub4bd\ub4be\ub4bf\ub4c0\ub4c1\ub4c2\ub4c3\ub4c4\ub4c5\ub4c6\ub4c7\ub4c8\ub4c9\ub4ca\ub4cb\ub4cc\ub4cd\ub4ce\ub4cf\ub4d0\ub4d1\ub4d2\ub4d3\ub4d4\ub4d5\ub4d6\ub4d7\ub4d8\ub4d9\ub4da\ub4db\ub4dc\ub4dd\ub4de\ub4df\ub4e0\ub4e1\ub4e2\ub4e3\ub4e4\ub4e5\ub4e6\ub4e7\ub4e8\ub4e9\ub4ea\ub4eb\ub4ec\ub4ed\ub4ee\ub4ef\ub4f0\ub4f1\ub4f2\ub4f3\ub4f4\ub4f5\ub4f6\ub4f7\ub4f8\ub4f9\ub4fa\ub4fb\ub4fc\ub4fd\ub4fe\ub4ff\ub500\ub501\ub502\ub503\ub504\ub505\ub506\ub507\ub508\ub509\ub50a\ub50b\ub50c\ub50d\ub50e\ub50f\ub510\ub511\ub512\ub513\ub514\ub515\ub516\ub517\ub518\ub519\ub51a\ub51b\ub51c\ub51d\ub51e\ub51f\ub520\ub521\ub522\ub523\ub524\ub525\ub526\ub527\ub528\ub529\ub52a\ub52b\ub52c\ub52d\ub52e\ub52f\ub530\ub531\ub532\ub533\ub534\ub535\ub536\ub537\ub538\ub539\ub53a\ub53b\ub53c\ub53d\ub53e\ub53f\ub540\ub541\ub542\ub543\ub544\ub545\ub546\ub547\ub548\ub549\ub54a\ub54b\ub54c\ub54d\ub54e\ub54f\ub550\ub551\ub552\ub553\ub554\ub555\ub556\ub557\ub558\ub559\ub55a\ub55b\ub55c\ub55d\ub55e\ub55f\ub560\ub561\ub562\ub563\ub564\ub565\ub566\ub567\ub568\ub569\ub56a\ub56b\ub56c\ub56d\ub56e\ub56f\ub570\ub571\ub572\ub573\ub574\ub575\ub576\ub577\ub578\ub579\ub57a\ub57b\ub57c\ub57d\ub57e\ub57f\ub580\ub581\ub582\ub583\ub584\ub585\ub586\ub587\ub588\ub589\ub58a\ub58b\ub58c\ub58d\ub58e\ub58f\ub590\ub591\ub592\ub593\ub594\ub595\ub596\ub597\ub598\ub599\ub59a\ub59b\ub59c\ub59d\ub59e\ub59f\ub5a0\ub5a1\ub5a2\ub5a3\ub5a4\ub5a5\ub5a6\ub5a7\ub5a8\ub5a9\ub5aa\ub5ab\ub5ac\ub5ad\ub5ae\ub5af\ub5b0\ub5b1\ub5b2\ub5b3\ub5b4\ub5b5\ub5b6\ub5b7\ub5b8\ub5b9\ub5ba\ub5bb\ub5bc\ub5bd\ub5be\ub5bf\ub5c0\ub5c1\ub5c2\ub5c3\ub5c4\ub5c5\ub5c6\ub5c7\ub5c8\ub5c9\ub5ca\ub5cb\ub5cc\ub5cd\ub5ce\ub5cf\ub5d0\ub5d1\ub5d2\ub5d3\ub5d4\ub5d5\ub5d6\ub5d7\ub5d8\ub5d9\ub5da\ub5db\ub5dc\ub5dd\ub5de\ub5df\ub5e0\ub5e1\ub5e2\ub5e3\ub5e4\ub5e5\ub5e6\ub5e7\ub5e8\ub5e9\ub5ea\ub5eb\ub5ec\ub5ed\ub5ee\ub5ef\ub5f0\ub5f1\ub5f2\ub5f3\ub5f4\ub5f5\ub5f6\ub5f7\ub5f8\ub5f9\ub5fa\ub5fb\ub5fc\ub5fd\ub5fe\ub5ff\ub600\ub601\ub602\ub603\ub604\ub605\ub606\ub607\ub608\ub609\ub60a\ub60b\ub60c\ub60d\ub60e\ub60f\ub610\ub611\ub612\ub613\ub614\ub615\ub616\ub617\ub618\ub619\ub61a\ub61b\ub61c\ub61d\ub61e\ub61f\ub620\ub621\ub622\ub623\ub624\ub625\ub626\ub627\ub628\ub629\ub62a\ub62b\ub62c\ub62d\ub62e\ub62f\ub630\ub631\ub632\ub633\ub634\ub635\ub636\ub637\ub638\ub639\ub63a\ub63b\ub63c\ub63d\ub63e\ub63f\ub640\ub641\ub642\ub643\ub644\ub645\ub646\ub647\ub648\ub649\ub64a\ub64b\ub64c\ub64d\ub64e\ub64f\ub650\ub651\ub652\ub653\ub654\ub655\ub656\ub657\ub658\ub659\ub65a\ub65b\ub65c\ub65d\ub65e\ub65f\ub660\ub661\ub662\ub663\ub664\ub665\ub666\ub667\ub668\ub669\ub66a\ub66b\ub66c\ub66d\ub66e\ub66f\ub670\ub671\ub672\ub673\ub674\ub675\ub676\ub677\ub678\ub679\ub67a\ub67b\ub67c\ub67d\ub67e\ub67f\ub680\ub681\ub682\ub683\ub684\ub685\ub686\ub687\ub688\ub689\ub68a\ub68b\ub68c\ub68d\ub68e\ub68f\ub690\ub691\ub692\ub693\ub694\ub695\ub696\ub697\ub698\ub699\ub69a\ub69b\ub69c\ub69d\ub69e\ub69f\ub6a0\ub6a1\ub6a2\ub6a3\ub6a4\ub6a5\ub6a6\ub6a7\ub6a8\ub6a9\ub6aa\ub6ab\ub6ac\ub6ad\ub6ae\ub6af\ub6b0\ub6b1\ub6b2\ub6b3\ub6b4\ub6b5\ub6b6\ub6b7\ub6b8\ub6b9\ub6ba\ub6bb\ub6bc\ub6bd\ub6be\ub6bf\ub6c0\ub6c1\ub6c2\ub6c3\ub6c4\ub6c5\ub6c6\ub6c7\ub6c8\ub6c9\ub6ca\ub6cb\ub6cc\ub6cd\ub6ce\ub6cf\ub6d0\ub6d1\ub6d2\ub6d3\ub6d4\ub6d5\ub6d6\ub6d7\ub6d8\ub6d9\ub6da\ub6db\ub6dc\ub6dd\ub6de\ub6df\ub6e0\ub6e1\ub6e2\ub6e3\ub6e4\ub6e5\ub6e6\ub6e7\ub6e8\ub6e9\ub6ea\ub6eb\ub6ec\ub6ed\ub6ee\ub6ef\ub6f0\ub6f1\ub6f2\ub6f3\ub6f4\ub6f5\ub6f6\ub6f7\ub6f8\ub6f9\ub6fa\ub6fb\ub6fc\ub6fd\ub6fe\ub6ff\ub700\ub701\ub702\ub703\ub704\ub705\ub706\ub707\ub708\ub709\ub70a\ub70b\ub70c\ub70d\ub70e\ub70f\ub710\ub711\ub712\ub713\ub714\ub715\ub716\ub717\ub718\ub719\ub71a\ub71b\ub71c\ub71d\ub71e\ub71f\ub720\ub721\ub722\ub723\ub724\ub725\ub726\ub727\ub728\ub729\ub72a\ub72b\ub72c\ub72d\ub72e\ub72f\ub730\ub731\ub732\ub733\ub734\ub735\ub736\ub737\ub738\ub739\ub73a\ub73b\ub73c\ub73d\ub73e\ub73f\ub740\ub741\ub742\ub743\ub744\ub745\ub746\ub747\ub748\ub749\ub74a\ub74b\ub74c\ub74d\ub74e\ub74f\ub750\ub751\ub752\ub753\ub754\ub755\ub756\ub757\ub758\ub759\ub75a\ub75b\ub75c\ub75d\ub75e\ub75f\ub760\ub761\ub762\ub763\ub764\ub765\ub766\ub767\ub768\ub769\ub76a\ub76b\ub76c\ub76d\ub76e\ub76f\ub770\ub771\ub772\ub773\ub774\ub775\ub776\ub777\ub778\ub779\ub77a\ub77b\ub77c\ub77d\ub77e\ub77f\ub780\ub781\ub782\ub783\ub784\ub785\ub786\ub787\ub788\ub789\ub78a\ub78b\ub78c\ub78d\ub78e\ub78f\ub790\ub791\ub792\ub793\ub794\ub795\ub796\ub797\ub798\ub799\ub79a\ub79b\ub79c\ub79d\ub79e\ub79f\ub7a0\ub7a1\ub7a2\ub7a3\ub7a4\ub7a5\ub7a6\ub7a7\ub7a8\ub7a9\ub7aa\ub7ab\ub7ac\ub7ad\ub7ae\ub7af\ub7b0\ub7b1\ub7b2\ub7b3\ub7b4\ub7b5\ub7b6\ub7b7\ub7b8\ub7b9\ub7ba\ub7bb\ub7bc\ub7bd\ub7be\ub7bf\ub7c0\ub7c1\ub7c2\ub7c3\ub7c4\ub7c5\ub7c6\ub7c7\ub7c8\ub7c9\ub7ca\ub7cb\ub7cc\ub7cd\ub7ce\ub7cf\ub7d0\ub7d1\ub7d2\ub7d3\ub7d4\ub7d5\ub7d6\ub7d7\ub7d8\ub7d9\ub7da\ub7db\ub7dc\ub7dd\ub7de\ub7df\ub7e0\ub7e1\ub7e2\ub7e3\ub7e4\ub7e5\ub7e6\ub7e7\ub7e8\ub7e9\ub7ea\ub7eb\ub7ec\ub7ed\ub7ee\ub7ef\ub7f0\ub7f1\ub7f2\ub7f3\ub7f4\ub7f5\ub7f6\ub7f7\ub7f8\ub7f9\ub7fa\ub7fb\ub7fc\ub7fd\ub7fe\ub7ff\ub800\ub801\ub802\ub803\ub804\ub805\ub806\ub807\ub808\ub809\ub80a\ub80b\ub80c\ub80d\ub80e\ub80f\ub810\ub811\ub812\ub813\ub814\ub815\ub816\ub817\ub818\ub819\ub81a\ub81b\ub81c\ub81d\ub81e\ub81f\ub820\ub821\ub822\ub823\ub824\ub825\ub826\ub827\ub828\ub829\ub82a\ub82b\ub82c\ub82d\ub82e\ub82f\ub830\ub831\ub832\ub833\ub834\ub835\ub836\ub837\ub838\ub839\ub83a\ub83b\ub83c\ub83d\ub83e\ub83f\ub840\ub841\ub842\ub843\ub844\ub845\ub846\ub847\ub848\ub849\ub84a\ub84b\ub84c\ub84d\ub84e\ub84f\ub850\ub851\ub852\ub853\ub854\ub855\ub856\ub857\ub858\ub859\ub85a\ub85b\ub85c\ub85d\ub85e\ub85f\ub860\ub861\ub862\ub863\ub864\ub865\ub866\ub867\ub868\ub869\ub86a\ub86b\ub86c\ub86d\ub86e\ub86f\ub870\ub871\ub872\ub873\ub874\ub875\ub876\ub877\ub878\ub879\ub87a\ub87b\ub87c\ub87d\ub87e\ub87f\ub880\ub881\ub882\ub883\ub884\ub885\ub886\ub887\ub888\ub889\ub88a\ub88b\ub88c\ub88d\ub88e\ub88f\ub890\ub891\ub892\ub893\ub894\ub895\ub896\ub897\ub898\ub899\ub89a\ub89b\ub89c\ub89d\ub89e\ub89f\ub8a0\ub8a1\ub8a2\ub8a3\ub8a4\ub8a5\ub8a6\ub8a7\ub8a8\ub8a9\ub8aa\ub8ab\ub8ac\ub8ad\ub8ae\ub8af\ub8b0\ub8b1\ub8b2\ub8b3\ub8b4\ub8b5\ub8b6\ub8b7\ub8b8\ub8b9\ub8ba\ub8bb\ub8bc\ub8bd\ub8be\ub8bf\ub8c0\ub8c1\ub8c2\ub8c3\ub8c4\ub8c5\ub8c6\ub8c7\ub8c8\ub8c9\ub8ca\ub8cb\ub8cc\ub8cd\ub8ce\ub8cf\ub8d0\ub8d1\ub8d2\ub8d3\ub8d4\ub8d5\ub8d6\ub8d7\ub8d8\ub8d9\ub8da\ub8db\ub8dc\ub8dd\ub8de\ub8df\ub8e0\ub8e1\ub8e2\ub8e3\ub8e4\ub8e5\ub8e6\ub8e7\ub8e8\ub8e9\ub8ea\ub8eb\ub8ec\ub8ed\ub8ee\ub8ef\ub8f0\ub8f1\ub8f2\ub8f3\ub8f4\ub8f5\ub8f6\ub8f7\ub8f8\ub8f9\ub8fa\ub8fb\ub8fc\ub8fd\ub8fe\ub8ff\ub900\ub901\ub902\ub903\ub904\ub905\ub906\ub907\ub908\ub909\ub90a\ub90b\ub90c\ub90d\ub90e\ub90f\ub910\ub911\ub912\ub913\ub914\ub915\ub916\ub917\ub918\ub919\ub91a\ub91b\ub91c\ub91d\ub91e\ub91f\ub920\ub921\ub922\ub923\ub924\ub925\ub926\ub927\ub928\ub929\ub92a\ub92b\ub92c\ub92d\ub92e\ub92f\ub930\ub931\ub932\ub933\ub934\ub935\ub936\ub937\ub938\ub939\ub93a\ub93b\ub93c\ub93d\ub93e\ub93f\ub940\ub941\ub942\ub943\ub944\ub945\ub946\ub947\ub948\ub949\ub94a\ub94b\ub94c\ub94d\ub94e\ub94f\ub950\ub951\ub952\ub953\ub954\ub955\ub956\ub957\ub958\ub959\ub95a\ub95b\ub95c\ub95d\ub95e\ub95f\ub960\ub961\ub962\ub963\ub964\ub965\ub966\ub967\ub968\ub969\ub96a\ub96b\ub96c\ub96d\ub96e\ub96f\ub970\ub971\ub972\ub973\ub974\ub975\ub976\ub977\ub978\ub979\ub97a\ub97b\ub97c\ub97d\ub97e\ub97f\ub980\ub981\ub982\ub983\ub984\ub985\ub986\ub987\ub988\ub989\ub98a\ub98b\ub98c\ub98d\ub98e\ub98f\ub990\ub991\ub992\ub993\ub994\ub995\ub996\ub997\ub998\ub999\ub99a\ub99b\ub99c\ub99d\ub99e\ub99f\ub9a0\ub9a1\ub9a2\ub9a3\ub9a4\ub9a5\ub9a6\ub9a7\ub9a8\ub9a9\ub9aa\ub9ab\ub9ac\ub9ad\ub9ae\ub9af\ub9b0\ub9b1\ub9b2\ub9b3\ub9b4\ub9b5\ub9b6\ub9b7\ub9b8\ub9b9\ub9ba\ub9bb\ub9bc\ub9bd\ub9be\ub9bf\ub9c0\ub9c1\ub9c2\ub9c3\ub9c4\ub9c5\ub9c6\ub9c7\ub9c8\ub9c9\ub9ca\ub9cb\ub9cc\ub9cd\ub9ce\ub9cf\ub9d0\ub9d1\ub9d2\ub9d3\ub9d4\ub9d5\ub9d6\ub9d7\ub9d8\ub9d9\ub9da\ub9db\ub9dc\ub9dd\ub9de\ub9df\ub9e0\ub9e1\ub9e2\ub9e3\ub9e4\ub9e5\ub9e6\ub9e7\ub9e8\ub9e9\ub9ea\ub9eb\ub9ec\ub9ed\ub9ee\ub9ef\ub9f0\ub9f1\ub9f2\ub9f3\ub9f4\ub9f5\ub9f6\ub9f7\ub9f8\ub9f9\ub9fa\ub9fb\ub9fc\ub9fd\ub9fe\ub9ff\uba00\uba01\uba02\uba03\uba04\uba05\uba06\uba07\uba08\uba09\uba0a\uba0b\uba0c\uba0d\uba0e\uba0f\uba10\uba11\uba12\uba13\uba14\uba15\uba16\uba17\uba18\uba19\uba1a\uba1b\uba1c\uba1d\uba1e\uba1f\uba20\uba21\uba22\uba23\uba24\uba25\uba26\uba27\uba28\uba29\uba2a\uba2b\uba2c\uba2d\uba2e\uba2f\uba30\uba31\uba32\uba33\uba34\uba35\uba36\uba37\uba38\uba39\uba3a\uba3b\uba3c\uba3d\uba3e\uba3f\uba40\uba41\uba42\uba43\uba44\uba45\uba46\uba47\uba48\uba49\uba4a\uba4b\uba4c\uba4d\uba4e\uba4f\uba50\uba51\uba52\uba53\uba54\uba55\uba56\uba57\uba58\uba59\uba5a\uba5b\uba5c\uba5d\uba5e\uba5f\uba60\uba61\uba62\uba63\uba64\uba65\uba66\uba67\uba68\uba69\uba6a\uba6b\uba6c\uba6d\uba6e\uba6f\uba70\uba71\uba72\uba73\uba74\uba75\uba76\uba77\uba78\uba79\uba7a\uba7b\uba7c\uba7d\uba7e\uba7f\uba80\uba81\uba82\uba83\uba84\uba85\uba86\uba87\uba88\uba89\uba8a\uba8b\uba8c\uba8d\uba8e\uba8f\uba90\uba91\uba92\uba93\uba94\uba95\uba96\uba97\uba98\uba99\uba9a\uba9b\uba9c\uba9d\uba9e\uba9f\ubaa0\ubaa1\ubaa2\ubaa3\ubaa4\ubaa5\ubaa6\ubaa7\ubaa8\ubaa9\ubaaa\ubaab\ubaac\ubaad\ubaae\ubaaf\ubab0\ubab1\ubab2\ubab3\ubab4\ubab5\ubab6\ubab7\ubab8\ubab9\ubaba\ubabb\ubabc\ubabd\ubabe\ubabf\ubac0\ubac1\ubac2\ubac3\ubac4\ubac5\ubac6\ubac7\ubac8\ubac9\ubaca\ubacb\ubacc\ubacd\ubace\ubacf\ubad0\ubad1\ubad2\ubad3\ubad4\ubad5\ubad6\ubad7\ubad8\ubad9\ubada\ubadb\ubadc\ubadd\ubade\ubadf\ubae0\ubae1\ubae2\ubae3\ubae4\ubae5\ubae6\ubae7\ubae8\ubae9\ubaea\ubaeb\ubaec\ubaed\ubaee\ubaef\ubaf0\ubaf1\ubaf2\ubaf3\ubaf4\ubaf5\ubaf6\ubaf7\ubaf8\ubaf9\ubafa\ubafb\ubafc\ubafd\ubafe\ubaff\ubb00\ubb01\ubb02\ubb03\ubb04\ubb05\ubb06\ubb07\ubb08\ubb09\ubb0a\ubb0b\ubb0c\ubb0d\ubb0e\ubb0f\ubb10\ubb11\ubb12\ubb13\ubb14\ubb15\ubb16\ubb17\ubb18\ubb19\ubb1a\ubb1b\ubb1c\ubb1d\ubb1e\ubb1f\ubb20\ubb21\ubb22\ubb23\ubb24\ubb25\ubb26\ubb27\ubb28\ubb29\ubb2a\ubb2b\ubb2c\ubb2d\ubb2e\ubb2f\ubb30\ubb31\ubb32\ubb33\ubb34\ubb35\ubb36\ubb37\ubb38\ubb39\ubb3a\ubb3b\ubb3c\ubb3d\ubb3e\ubb3f\ubb40\ubb41\ubb42\ubb43\ubb44\ubb45\ubb46\ubb47\ubb48\ubb49\ubb4a\ubb4b\ubb4c\ubb4d\ubb4e\ubb4f\ubb50\ubb51\ubb52\ubb53\ubb54\ubb55\ubb56\ubb57\ubb58\ubb59\ubb5a\ubb5b\ubb5c\ubb5d\ubb5e\ubb5f\ubb60\ubb61\ubb62\ubb63\ubb64\ubb65\ubb66\ubb67\ubb68\ubb69\ubb6a\ubb6b\ubb6c\ubb6d\ubb6e\ubb6f\ubb70\ubb71\ubb72\ubb73\ubb74\ubb75\ubb76\ubb77\ubb78\ubb79\ubb7a\ubb7b\ubb7c\ubb7d\ubb7e\ubb7f\ubb80\ubb81\ubb82\ubb83\ubb84\ubb85\ubb86\ubb87\ubb88\ubb89\ubb8a\ubb8b\ubb8c\ubb8d\ubb8e\ubb8f\ubb90\ubb91\ubb92\ubb93\ubb94\ubb95\ubb96\ubb97\ubb98\ubb99\ubb9a\ubb9b\ubb9c\ubb9d\ubb9e\ubb9f\ubba0\ubba1\ubba2\ubba3\ubba4\ubba5\ubba6\ubba7\ubba8\ubba9\ubbaa\ubbab\ubbac\ubbad\ubbae\ubbaf\ubbb0\ubbb1\ubbb2\ubbb3\ubbb4\ubbb5\ubbb6\ubbb7\ubbb8\ubbb9\ubbba\ubbbb\ubbbc\ubbbd\ubbbe\ubbbf\ubbc0\ubbc1\ubbc2\ubbc3\ubbc4\ubbc5\ubbc6\ubbc7\ubbc8\ubbc9\ubbca\ubbcb\ubbcc\ubbcd\ubbce\ubbcf\ubbd0\ubbd1\ubbd2\ubbd3\ubbd4\ubbd5\ubbd6\ubbd7\ubbd8\ubbd9\ubbda\ubbdb\ubbdc\ubbdd\ubbde\ubbdf\ubbe0\ubbe1\ubbe2\ubbe3\ubbe4\ubbe5\ubbe6\ubbe7\ubbe8\ubbe9\ubbea\ubbeb\ubbec\ubbed\ubbee\ubbef\ubbf0\ubbf1\ubbf2\ubbf3\ubbf4\ubbf5\ubbf6\ubbf7\ubbf8\ubbf9\ubbfa\ubbfb\ubbfc\ubbfd\ubbfe\ubbff\ubc00\ubc01\ubc02\ubc03\ubc04\ubc05\ubc06\ubc07\ubc08\ubc09\ubc0a\ubc0b\ubc0c\ubc0d\ubc0e\ubc0f\ubc10\ubc11\ubc12\ubc13\ubc14\ubc15\ubc16\ubc17\ubc18\ubc19\ubc1a\ubc1b\ubc1c\ubc1d\ubc1e\ubc1f\ubc20\ubc21\ubc22\ubc23\ubc24\ubc25\ubc26\ubc27\ubc28\ubc29\ubc2a\ubc2b\ubc2c\ubc2d\ubc2e\ubc2f\ubc30\ubc31\ubc32\ubc33\ubc34\ubc35\ubc36\ubc37\ubc38\ubc39\ubc3a\ubc3b\ubc3c\ubc3d\ubc3e\ubc3f\ubc40\ubc41\ubc42\ubc43\ubc44\ubc45\ubc46\ubc47\ubc48\ubc49\ubc4a\ubc4b\ubc4c\ubc4d\ubc4e\ubc4f\ubc50\ubc51\ubc52\ubc53\ubc54\ubc55\ubc56\ubc57\ubc58\ubc59\ubc5a\ubc5b\ubc5c\ubc5d\ubc5e\ubc5f\ubc60\ubc61\ubc62\ubc63\ubc64\ubc65\ubc66\ubc67\ubc68\ubc69\ubc6a\ubc6b\ubc6c\ubc6d\ubc6e\ubc6f\ubc70\ubc71\ubc72\ubc73\ubc74\ubc75\ubc76\ubc77\ubc78\ubc79\ubc7a\ubc7b\ubc7c\ubc7d\ubc7e\ubc7f\ubc80\ubc81\ubc82\ubc83\ubc84\ubc85\ubc86\ubc87\ubc88\ubc89\ubc8a\ubc8b\ubc8c\ubc8d\ubc8e\ubc8f\ubc90\ubc91\ubc92\ubc93\ubc94\ubc95\ubc96\ubc97\ubc98\ubc99\ubc9a\ubc9b\ubc9c\ubc9d\ubc9e\ubc9f\ubca0\ubca1\ubca2\ubca3\ubca4\ubca5\ubca6\ubca7\ubca8\ubca9\ubcaa\ubcab\ubcac\ubcad\ubcae\ubcaf\ubcb0\ubcb1\ubcb2\ubcb3\ubcb4\ubcb5\ubcb6\ubcb7\ubcb8\ubcb9\ubcba\ubcbb\ubcbc\ubcbd\ubcbe\ubcbf\ubcc0\ubcc1\ubcc2\ubcc3\ubcc4\ubcc5\ubcc6\ubcc7\ubcc8\ubcc9\ubcca\ubccb\ubccc\ubccd\ubcce\ubccf\ubcd0\ubcd1\ubcd2\ubcd3\ubcd4\ubcd5\ubcd6\ubcd7\ubcd8\ubcd9\ubcda\ubcdb\ubcdc\ubcdd\ubcde\ubcdf\ubce0\ubce1\ubce2\ubce3\ubce4\ubce5\ubce6\ubce7\ubce8\ubce9\ubcea\ubceb\ubcec\ubced\ubcee\ubcef\ubcf0\ubcf1\ubcf2\ubcf3\ubcf4\ubcf5\ubcf6\ubcf7\ubcf8\ubcf9\ubcfa\ubcfb\ubcfc\ubcfd\ubcfe\ubcff\ubd00\ubd01\ubd02\ubd03\ubd04\ubd05\ubd06\ubd07\ubd08\ubd09\ubd0a\ubd0b\ubd0c\ubd0d\ubd0e\ubd0f\ubd10\ubd11\ubd12\ubd13\ubd14\ubd15\ubd16\ubd17\ubd18\ubd19\ubd1a\ubd1b\ubd1c\ubd1d\ubd1e\ubd1f\ubd20\ubd21\ubd22\ubd23\ubd24\ubd25\ubd26\ubd27\ubd28\ubd29\ubd2a\ubd2b\ubd2c\ubd2d\ubd2e\ubd2f\ubd30\ubd31\ubd32\ubd33\ubd34\ubd35\ubd36\ubd37\ubd38\ubd39\ubd3a\ubd3b\ubd3c\ubd3d\ubd3e\ubd3f\ubd40\ubd41\ubd42\ubd43\ubd44\ubd45\ubd46\ubd47\ubd48\ubd49\ubd4a\ubd4b\ubd4c\ubd4d\ubd4e\ubd4f\ubd50\ubd51\ubd52\ubd53\ubd54\ubd55\ubd56\ubd57\ubd58\ubd59\ubd5a\ubd5b\ubd5c\ubd5d\ubd5e\ubd5f\ubd60\ubd61\ubd62\ubd63\ubd64\ubd65\ubd66\ubd67\ubd68\ubd69\ubd6a\ubd6b\ubd6c\ubd6d\ubd6e\ubd6f\ubd70\ubd71\ubd72\ubd73\ubd74\ubd75\ubd76\ubd77\ubd78\ubd79\ubd7a\ubd7b\ubd7c\ubd7d\ubd7e\ubd7f\ubd80\ubd81\ubd82\ubd83\ubd84\ubd85\ubd86\ubd87\ubd88\ubd89\ubd8a\ubd8b\ubd8c\ubd8d\ubd8e\ubd8f\ubd90\ubd91\ubd92\ubd93\ubd94\ubd95\ubd96\ubd97\ubd98\ubd99\ubd9a\ubd9b\ubd9c\ubd9d\ubd9e\ubd9f\ubda0\ubda1\ubda2\ubda3\ubda4\ubda5\ubda6\ubda7\ubda8\ubda9\ubdaa\ubdab\ubdac\ubdad\ubdae\ubdaf\ubdb0\ubdb1\ubdb2\ubdb3\ubdb4\ubdb5\ubdb6\ubdb7\ubdb8\ubdb9\ubdba\ubdbb\ubdbc\ubdbd\ubdbe\ubdbf\ubdc0\ubdc1\ubdc2\ubdc3\ubdc4\ubdc5\ubdc6\ubdc7\ubdc8\ubdc9\ubdca\ubdcb\ubdcc\ubdcd\ubdce\ubdcf\ubdd0\ubdd1\ubdd2\ubdd3\ubdd4\ubdd5\ubdd6\ubdd7\ubdd8\ubdd9\ubdda\ubddb\ubddc\ubddd\ubdde\ubddf\ubde0\ubde1\ubde2\ubde3\ubde4\ubde5\ubde6\ubde7\ubde8\ubde9\ubdea\ubdeb\ubdec\ubded\ubdee\ubdef\ubdf0\ubdf1\ubdf2\ubdf3\ubdf4\ubdf5\ubdf6\ubdf7\ubdf8\ubdf9\ubdfa\ubdfb\ubdfc\ubdfd\ubdfe\ubdff\ube00\ube01\ube02\ube03\ube04\ube05\ube06\ube07\ube08\ube09\ube0a\ube0b\ube0c\ube0d\ube0e\ube0f\ube10\ube11\ube12\ube13\ube14\ube15\ube16\ube17\ube18\ube19\ube1a\ube1b\ube1c\ube1d\ube1e\ube1f\ube20\ube21\ube22\ube23\ube24\ube25\ube26\ube27\ube28\ube29\ube2a\ube2b\ube2c\ube2d\ube2e\ube2f\ube30\ube31\ube32\ube33\ube34\ube35\ube36\ube37\ube38\ube39\ube3a\ube3b\ube3c\ube3d\ube3e\ube3f\ube40\ube41\ube42\ube43\ube44\ube45\ube46\ube47\ube48\ube49\ube4a\ube4b\ube4c\ube4d\ube4e\ube4f\ube50\ube51\ube52\ube53\ube54\ube55\ube56\ube57\ube58\ube59\ube5a\ube5b\ube5c\ube5d\ube5e\ube5f\ube60\ube61\ube62\ube63\ube64\ube65\ube66\ube67\ube68\ube69\ube6a\ube6b\ube6c\ube6d\ube6e\ube6f\ube70\ube71\ube72\ube73\ube74\ube75\ube76\ube77\ube78\ube79\ube7a\ube7b\ube7c\ube7d\ube7e\ube7f\ube80\ube81\ube82\ube83\ube84\ube85\ube86\ube87\ube88\ube89\ube8a\ube8b\ube8c\ube8d\ube8e\ube8f\ube90\ube91\ube92\ube93\ube94\ube95\ube96\ube97\ube98\ube99\ube9a\ube9b\ube9c\ube9d\ube9e\ube9f\ubea0\ubea1\ubea2\ubea3\ubea4\ubea5\ubea6\ubea7\ubea8\ubea9\ubeaa\ubeab\ubeac\ubead\ubeae\ubeaf\ubeb0\ubeb1\ubeb2\ubeb3\ubeb4\ubeb5\ubeb6\ubeb7\ubeb8\ubeb9\ubeba\ubebb\ubebc\ubebd\ubebe\ubebf\ubec0\ubec1\ubec2\ubec3\ubec4\ubec5\ubec6\ubec7\ubec8\ubec9\ubeca\ubecb\ubecc\ubecd\ubece\ubecf\ubed0\ubed1\ubed2\ubed3\ubed4\ubed5\ubed6\ubed7\ubed8\ubed9\ubeda\ubedb\ubedc\ubedd\ubede\ubedf\ubee0\ubee1\ubee2\ubee3\ubee4\ubee5\ubee6\ubee7\ubee8\ubee9\ubeea\ubeeb\ubeec\ubeed\ubeee\ubeef\ubef0\ubef1\ubef2\ubef3\ubef4\ubef5\ubef6\ubef7\ubef8\ubef9\ubefa\ubefb\ubefc\ubefd\ubefe\ubeff\ubf00\ubf01\ubf02\ubf03\ubf04\ubf05\ubf06\ubf07\ubf08\ubf09\ubf0a\ubf0b\ubf0c\ubf0d\ubf0e\ubf0f\ubf10\ubf11\ubf12\ubf13\ubf14\ubf15\ubf16\ubf17\ubf18\ubf19\ubf1a\ubf1b\ubf1c\ubf1d\ubf1e\ubf1f\ubf20\ubf21\ubf22\ubf23\ubf24\ubf25\ubf26\ubf27\ubf28\ubf29\ubf2a\ubf2b\ubf2c\ubf2d\ubf2e\ubf2f\ubf30\ubf31\ubf32\ubf33\ubf34\ubf35\ubf36\ubf37\ubf38\ubf39\ubf3a\ubf3b\ubf3c\ubf3d\ubf3e\ubf3f\ubf40\ubf41\ubf42\ubf43\ubf44\ubf45\ubf46\ubf47\ubf48\ubf49\ubf4a\ubf4b\ubf4c\ubf4d\ubf4e\ubf4f\ubf50\ubf51\ubf52\ubf53\ubf54\ubf55\ubf56\ubf57\ubf58\ubf59\ubf5a\ubf5b\ubf5c\ubf5d\ubf5e\ubf5f\ubf60\ubf61\ubf62\ubf63\ubf64\ubf65\ubf66\ubf67\ubf68\ubf69\ubf6a\ubf6b\ubf6c\ubf6d\ubf6e\ubf6f\ubf70\ubf71\ubf72\ubf73\ubf74\ubf75\ubf76\ubf77\ubf78\ubf79\ubf7a\ubf7b\ubf7c\ubf7d\ubf7e\ubf7f\ubf80\ubf81\ubf82\ubf83\ubf84\ubf85\ubf86\ubf87\ubf88\ubf89\ubf8a\ubf8b\ubf8c\ubf8d\ubf8e\ubf8f\ubf90\ubf91\ubf92\ubf93\ubf94\ubf95\ubf96\ubf97\ubf98\ubf99\ubf9a\ubf9b\ubf9c\ubf9d\ubf9e\ubf9f\ubfa0\ubfa1\ubfa2\ubfa3\ubfa4\ubfa5\ubfa6\ubfa7\ubfa8\ubfa9\ubfaa\ubfab\ubfac\ubfad\ubfae\ubfaf\ubfb0\ubfb1\ubfb2\ubfb3\ubfb4\ubfb5\ubfb6\ubfb7\ubfb8\ubfb9\ubfba\ubfbb\ubfbc\ubfbd\ubfbe\ubfbf\ubfc0\ubfc1\ubfc2\ubfc3\ubfc4\ubfc5\ubfc6\ubfc7\ubfc8\ubfc9\ubfca\ubfcb\ubfcc\ubfcd\ubfce\ubfcf\ubfd0\ubfd1\ubfd2\ubfd3\ubfd4\ubfd5\ubfd6\ubfd7\ubfd8\ubfd9\ubfda\ubfdb\ubfdc\ubfdd\ubfde\ubfdf\ubfe0\ubfe1\ubfe2\ubfe3\ubfe4\ubfe5\ubfe6\ubfe7\ubfe8\ubfe9\ubfea\ubfeb\ubfec\ubfed\ubfee\ubfef\ubff0\ubff1\ubff2\ubff3\ubff4\ubff5\ubff6\ubff7\ubff8\ubff9\ubffa\ubffb\ubffc\ubffd\ubffe\ubfff\uc000\uc001\uc002\uc003\uc004\uc005\uc006\uc007\uc008\uc009\uc00a\uc00b\uc00c\uc00d\uc00e\uc00f\uc010\uc011\uc012\uc013\uc014\uc015\uc016\uc017\uc018\uc019\uc01a\uc01b\uc01c\uc01d\uc01e\uc01f\uc020\uc021\uc022\uc023\uc024\uc025\uc026\uc027\uc028\uc029\uc02a\uc02b\uc02c\uc02d\uc02e\uc02f\uc030\uc031\uc032\uc033\uc034\uc035\uc036\uc037\uc038\uc039\uc03a\uc03b\uc03c\uc03d\uc03e\uc03f\uc040\uc041\uc042\uc043\uc044\uc045\uc046\uc047\uc048\uc049\uc04a\uc04b\uc04c\uc04d\uc04e\uc04f\uc050\uc051\uc052\uc053\uc054\uc055\uc056\uc057\uc058\uc059\uc05a\uc05b\uc05c\uc05d\uc05e\uc05f\uc060\uc061\uc062\uc063\uc064\uc065\uc066\uc067\uc068\uc069\uc06a\uc06b\uc06c\uc06d\uc06e\uc06f\uc070\uc071\uc072\uc073\uc074\uc075\uc076\uc077\uc078\uc079\uc07a\uc07b\uc07c\uc07d\uc07e\uc07f\uc080\uc081\uc082\uc083\uc084\uc085\uc086\uc087\uc088\uc089\uc08a\uc08b\uc08c\uc08d\uc08e\uc08f\uc090\uc091\uc092\uc093\uc094\uc095\uc096\uc097\uc098\uc099\uc09a\uc09b\uc09c\uc09d\uc09e\uc09f\uc0a0\uc0a1\uc0a2\uc0a3\uc0a4\uc0a5\uc0a6\uc0a7\uc0a8\uc0a9\uc0aa\uc0ab\uc0ac\uc0ad\uc0ae\uc0af\uc0b0\uc0b1\uc0b2\uc0b3\uc0b4\uc0b5\uc0b6\uc0b7\uc0b8\uc0b9\uc0ba\uc0bb\uc0bc\uc0bd\uc0be\uc0bf\uc0c0\uc0c1\uc0c2\uc0c3\uc0c4\uc0c5\uc0c6\uc0c7\uc0c8\uc0c9\uc0ca\uc0cb\uc0cc\uc0cd\uc0ce\uc0cf\uc0d0\uc0d1\uc0d2\uc0d3\uc0d4\uc0d5\uc0d6\uc0d7\uc0d8\uc0d9\uc0da\uc0db\uc0dc\uc0dd\uc0de\uc0df\uc0e0\uc0e1\uc0e2\uc0e3\uc0e4\uc0e5\uc0e6\uc0e7\uc0e8\uc0e9\uc0ea\uc0eb\uc0ec\uc0ed\uc0ee\uc0ef\uc0f0\uc0f1\uc0f2\uc0f3\uc0f4\uc0f5\uc0f6\uc0f7\uc0f8\uc0f9\uc0fa\uc0fb\uc0fc\uc0fd\uc0fe\uc0ff\uc100\uc101\uc102\uc103\uc104\uc105\uc106\uc107\uc108\uc109\uc10a\uc10b\uc10c\uc10d\uc10e\uc10f\uc110\uc111\uc112\uc113\uc114\uc115\uc116\uc117\uc118\uc119\uc11a\uc11b\uc11c\uc11d\uc11e\uc11f\uc120\uc121\uc122\uc123\uc124\uc125\uc126\uc127\uc128\uc129\uc12a\uc12b\uc12c\uc12d\uc12e\uc12f\uc130\uc131\uc132\uc133\uc134\uc135\uc136\uc137\uc138\uc139\uc13a\uc13b\uc13c\uc13d\uc13e\uc13f\uc140\uc141\uc142\uc143\uc144\uc145\uc146\uc147\uc148\uc149\uc14a\uc14b\uc14c\uc14d\uc14e\uc14f\uc150\uc151\uc152\uc153\uc154\uc155\uc156\uc157\uc158\uc159\uc15a\uc15b\uc15c\uc15d\uc15e\uc15f\uc160\uc161\uc162\uc163\uc164\uc165\uc166\uc167\uc168\uc169\uc16a\uc16b\uc16c\uc16d\uc16e\uc16f\uc170\uc171\uc172\uc173\uc174\uc175\uc176\uc177\uc178\uc179\uc17a\uc17b\uc17c\uc17d\uc17e\uc17f\uc180\uc181\uc182\uc183\uc184\uc185\uc186\uc187\uc188\uc189\uc18a\uc18b\uc18c\uc18d\uc18e\uc18f\uc190\uc191\uc192\uc193\uc194\uc195\uc196\uc197\uc198\uc199\uc19a\uc19b\uc19c\uc19d\uc19e\uc19f\uc1a0\uc1a1\uc1a2\uc1a3\uc1a4\uc1a5\uc1a6\uc1a7\uc1a8\uc1a9\uc1aa\uc1ab\uc1ac\uc1ad\uc1ae\uc1af\uc1b0\uc1b1\uc1b2\uc1b3\uc1b4\uc1b5\uc1b6\uc1b7\uc1b8\uc1b9\uc1ba\uc1bb\uc1bc\uc1bd\uc1be\uc1bf\uc1c0\uc1c1\uc1c2\uc1c3\uc1c4\uc1c5\uc1c6\uc1c7\uc1c8\uc1c9\uc1ca\uc1cb\uc1cc\uc1cd\uc1ce\uc1cf\uc1d0\uc1d1\uc1d2\uc1d3\uc1d4\uc1d5\uc1d6\uc1d7\uc1d8\uc1d9\uc1da\uc1db\uc1dc\uc1dd\uc1de\uc1df\uc1e0\uc1e1\uc1e2\uc1e3\uc1e4\uc1e5\uc1e6\uc1e7\uc1e8\uc1e9\uc1ea\uc1eb\uc1ec\uc1ed\uc1ee\uc1ef\uc1f0\uc1f1\uc1f2\uc1f3\uc1f4\uc1f5\uc1f6\uc1f7\uc1f8\uc1f9\uc1fa\uc1fb\uc1fc\uc1fd\uc1fe\uc1ff\uc200\uc201\uc202\uc203\uc204\uc205\uc206\uc207\uc208\uc209\uc20a\uc20b\uc20c\uc20d\uc20e\uc20f\uc210\uc211\uc212\uc213\uc214\uc215\uc216\uc217\uc218\uc219\uc21a\uc21b\uc21c\uc21d\uc21e\uc21f\uc220\uc221\uc222\uc223\uc224\uc225\uc226\uc227\uc228\uc229\uc22a\uc22b\uc22c\uc22d\uc22e\uc22f\uc230\uc231\uc232\uc233\uc234\uc235\uc236\uc237\uc238\uc239\uc23a\uc23b\uc23c\uc23d\uc23e\uc23f\uc240\uc241\uc242\uc243\uc244\uc245\uc246\uc247\uc248\uc249\uc24a\uc24b\uc24c\uc24d\uc24e\uc24f\uc250\uc251\uc252\uc253\uc254\uc255\uc256\uc257\uc258\uc259\uc25a\uc25b\uc25c\uc25d\uc25e\uc25f\uc260\uc261\uc262\uc263\uc264\uc265\uc266\uc267\uc268\uc269\uc26a\uc26b\uc26c\uc26d\uc26e\uc26f\uc270\uc271\uc272\uc273\uc274\uc275\uc276\uc277\uc278\uc279\uc27a\uc27b\uc27c\uc27d\uc27e\uc27f\uc280\uc281\uc282\uc283\uc284\uc285\uc286\uc287\uc288\uc289\uc28a\uc28b\uc28c\uc28d\uc28e\uc28f\uc290\uc291\uc292\uc293\uc294\uc295\uc296\uc297\uc298\uc299\uc29a\uc29b\uc29c\uc29d\uc29e\uc29f\uc2a0\uc2a1\uc2a2\uc2a3\uc2a4\uc2a5\uc2a6\uc2a7\uc2a8\uc2a9\uc2aa\uc2ab\uc2ac\uc2ad\uc2ae\uc2af\uc2b0\uc2b1\uc2b2\uc2b3\uc2b4\uc2b5\uc2b6\uc2b7\uc2b8\uc2b9\uc2ba\uc2bb\uc2bc\uc2bd\uc2be\uc2bf\uc2c0\uc2c1\uc2c2\uc2c3\uc2c4\uc2c5\uc2c6\uc2c7\uc2c8\uc2c9\uc2ca\uc2cb\uc2cc\uc2cd\uc2ce\uc2cf\uc2d0\uc2d1\uc2d2\uc2d3\uc2d4\uc2d5\uc2d6\uc2d7\uc2d8\uc2d9\uc2da\uc2db\uc2dc\uc2dd\uc2de\uc2df\uc2e0\uc2e1\uc2e2\uc2e3\uc2e4\uc2e5\uc2e6\uc2e7\uc2e8\uc2e9\uc2ea\uc2eb\uc2ec\uc2ed\uc2ee\uc2ef\uc2f0\uc2f1\uc2f2\uc2f3\uc2f4\uc2f5\uc2f6\uc2f7\uc2f8\uc2f9\uc2fa\uc2fb\uc2fc\uc2fd\uc2fe\uc2ff\uc300\uc301\uc302\uc303\uc304\uc305\uc306\uc307\uc308\uc309\uc30a\uc30b\uc30c\uc30d\uc30e\uc30f\uc310\uc311\uc312\uc313\uc314\uc315\uc316\uc317\uc318\uc319\uc31a\uc31b\uc31c\uc31d\uc31e\uc31f\uc320\uc321\uc322\uc323\uc324\uc325\uc326\uc327\uc328\uc329\uc32a\uc32b\uc32c\uc32d\uc32e\uc32f\uc330\uc331\uc332\uc333\uc334\uc335\uc336\uc337\uc338\uc339\uc33a\uc33b\uc33c\uc33d\uc33e\uc33f\uc340\uc341\uc342\uc343\uc344\uc345\uc346\uc347\uc348\uc349\uc34a\uc34b\uc34c\uc34d\uc34e\uc34f\uc350\uc351\uc352\uc353\uc354\uc355\uc356\uc357\uc358\uc359\uc35a\uc35b\uc35c\uc35d\uc35e\uc35f\uc360\uc361\uc362\uc363\uc364\uc365\uc366\uc367\uc368\uc369\uc36a\uc36b\uc36c\uc36d\uc36e\uc36f\uc370\uc371\uc372\uc373\uc374\uc375\uc376\uc377\uc378\uc379\uc37a\uc37b\uc37c\uc37d\uc37e\uc37f\uc380\uc381\uc382\uc383\uc384\uc385\uc386\uc387\uc388\uc389\uc38a\uc38b\uc38c\uc38d\uc38e\uc38f\uc390\uc391\uc392\uc393\uc394\uc395\uc396\uc397\uc398\uc399\uc39a\uc39b\uc39c\uc39d\uc39e\uc39f\uc3a0\uc3a1\uc3a2\uc3a3\uc3a4\uc3a5\uc3a6\uc3a7\uc3a8\uc3a9\uc3aa\uc3ab\uc3ac\uc3ad\uc3ae\uc3af\uc3b0\uc3b1\uc3b2\uc3b3\uc3b4\uc3b5\uc3b6\uc3b7\uc3b8\uc3b9\uc3ba\uc3bb\uc3bc\uc3bd\uc3be\uc3bf\uc3c0\uc3c1\uc3c2\uc3c3\uc3c4\uc3c5\uc3c6\uc3c7\uc3c8\uc3c9\uc3ca\uc3cb\uc3cc\uc3cd\uc3ce\uc3cf\uc3d0\uc3d1\uc3d2\uc3d3\uc3d4\uc3d5\uc3d6\uc3d7\uc3d8\uc3d9\uc3da\uc3db\uc3dc\uc3dd\uc3de\uc3df\uc3e0\uc3e1\uc3e2\uc3e3\uc3e4\uc3e5\uc3e6\uc3e7\uc3e8\uc3e9\uc3ea\uc3eb\uc3ec\uc3ed\uc3ee\uc3ef\uc3f0\uc3f1\uc3f2\uc3f3\uc3f4\uc3f5\uc3f6\uc3f7\uc3f8\uc3f9\uc3fa\uc3fb\uc3fc\uc3fd\uc3fe\uc3ff\uc400\uc401\uc402\uc403\uc404\uc405\uc406\uc407\uc408\uc409\uc40a\uc40b\uc40c\uc40d\uc40e\uc40f\uc410\uc411\uc412\uc413\uc414\uc415\uc416\uc417\uc418\uc419\uc41a\uc41b\uc41c\uc41d\uc41e\uc41f\uc420\uc421\uc422\uc423\uc424\uc425\uc426\uc427\uc428\uc429\uc42a\uc42b\uc42c\uc42d\uc42e\uc42f\uc430\uc431\uc432\uc433\uc434\uc435\uc436\uc437\uc438\uc439\uc43a\uc43b\uc43c\uc43d\uc43e\uc43f\uc440\uc441\uc442\uc443\uc444\uc445\uc446\uc447\uc448\uc449\uc44a\uc44b\uc44c\uc44d\uc44e\uc44f\uc450\uc451\uc452\uc453\uc454\uc455\uc456\uc457\uc458\uc459\uc45a\uc45b\uc45c\uc45d\uc45e\uc45f\uc460\uc461\uc462\uc463\uc464\uc465\uc466\uc467\uc468\uc469\uc46a\uc46b\uc46c\uc46d\uc46e\uc46f\uc470\uc471\uc472\uc473\uc474\uc475\uc476\uc477\uc478\uc479\uc47a\uc47b\uc47c\uc47d\uc47e\uc47f\uc480\uc481\uc482\uc483\uc484\uc485\uc486\uc487\uc488\uc489\uc48a\uc48b\uc48c\uc48d\uc48e\uc48f\uc490\uc491\uc492\uc493\uc494\uc495\uc496\uc497\uc498\uc499\uc49a\uc49b\uc49c\uc49d\uc49e\uc49f\uc4a0\uc4a1\uc4a2\uc4a3\uc4a4\uc4a5\uc4a6\uc4a7\uc4a8\uc4a9\uc4aa\uc4ab\uc4ac\uc4ad\uc4ae\uc4af\uc4b0\uc4b1\uc4b2\uc4b3\uc4b4\uc4b5\uc4b6\uc4b7\uc4b8\uc4b9\uc4ba\uc4bb\uc4bc\uc4bd\uc4be\uc4bf\uc4c0\uc4c1\uc4c2\uc4c3\uc4c4\uc4c5\uc4c6\uc4c7\uc4c8\uc4c9\uc4ca\uc4cb\uc4cc\uc4cd\uc4ce\uc4cf\uc4d0\uc4d1\uc4d2\uc4d3\uc4d4\uc4d5\uc4d6\uc4d7\uc4d8\uc4d9\uc4da\uc4db\uc4dc\uc4dd\uc4de\uc4df\uc4e0\uc4e1\uc4e2\uc4e3\uc4e4\uc4e5\uc4e6\uc4e7\uc4e8\uc4e9\uc4ea\uc4eb\uc4ec\uc4ed\uc4ee\uc4ef\uc4f0\uc4f1\uc4f2\uc4f3\uc4f4\uc4f5\uc4f6\uc4f7\uc4f8\uc4f9\uc4fa\uc4fb\uc4fc\uc4fd\uc4fe\uc4ff\uc500\uc501\uc502\uc503\uc504\uc505\uc506\uc507\uc508\uc509\uc50a\uc50b\uc50c\uc50d\uc50e\uc50f\uc510\uc511\uc512\uc513\uc514\uc515\uc516\uc517\uc518\uc519\uc51a\uc51b\uc51c\uc51d\uc51e\uc51f\uc520\uc521\uc522\uc523\uc524\uc525\uc526\uc527\uc528\uc529\uc52a\uc52b\uc52c\uc52d\uc52e\uc52f\uc530\uc531\uc532\uc533\uc534\uc535\uc536\uc537\uc538\uc539\uc53a\uc53b\uc53c\uc53d\uc53e\uc53f\uc540\uc541\uc542\uc543\uc544\uc545\uc546\uc547\uc548\uc549\uc54a\uc54b\uc54c\uc54d\uc54e\uc54f\uc550\uc551\uc552\uc553\uc554\uc555\uc556\uc557\uc558\uc559\uc55a\uc55b\uc55c\uc55d\uc55e\uc55f\uc560\uc561\uc562\uc563\uc564\uc565\uc566\uc567\uc568\uc569\uc56a\uc56b\uc56c\uc56d\uc56e\uc56f\uc570\uc571\uc572\uc573\uc574\uc575\uc576\uc577\uc578\uc579\uc57a\uc57b\uc57c\uc57d\uc57e\uc57f\uc580\uc581\uc582\uc583\uc584\uc585\uc586\uc587\uc588\uc589\uc58a\uc58b\uc58c\uc58d\uc58e\uc58f\uc590\uc591\uc592\uc593\uc594\uc595\uc596\uc597\uc598\uc599\uc59a\uc59b\uc59c\uc59d\uc59e\uc59f\uc5a0\uc5a1\uc5a2\uc5a3\uc5a4\uc5a5\uc5a6\uc5a7\uc5a8\uc5a9\uc5aa\uc5ab\uc5ac\uc5ad\uc5ae\uc5af\uc5b0\uc5b1\uc5b2\uc5b3\uc5b4\uc5b5\uc5b6\uc5b7\uc5b8\uc5b9\uc5ba\uc5bb\uc5bc\uc5bd\uc5be\uc5bf\uc5c0\uc5c1\uc5c2\uc5c3\uc5c4\uc5c5\uc5c6\uc5c7\uc5c8\uc5c9\uc5ca\uc5cb\uc5cc\uc5cd\uc5ce\uc5cf\uc5d0\uc5d1\uc5d2\uc5d3\uc5d4\uc5d5\uc5d6\uc5d7\uc5d8\uc5d9\uc5da\uc5db\uc5dc\uc5dd\uc5de\uc5df\uc5e0\uc5e1\uc5e2\uc5e3\uc5e4\uc5e5\uc5e6\uc5e7\uc5e8\uc5e9\uc5ea\uc5eb\uc5ec\uc5ed\uc5ee\uc5ef\uc5f0\uc5f1\uc5f2\uc5f3\uc5f4\uc5f5\uc5f6\uc5f7\uc5f8\uc5f9\uc5fa\uc5fb\uc5fc\uc5fd\uc5fe\uc5ff\uc600\uc601\uc602\uc603\uc604\uc605\uc606\uc607\uc608\uc609\uc60a\uc60b\uc60c\uc60d\uc60e\uc60f\uc610\uc611\uc612\uc613\uc614\uc615\uc616\uc617\uc618\uc619\uc61a\uc61b\uc61c\uc61d\uc61e\uc61f\uc620\uc621\uc622\uc623\uc624\uc625\uc626\uc627\uc628\uc629\uc62a\uc62b\uc62c\uc62d\uc62e\uc62f\uc630\uc631\uc632\uc633\uc634\uc635\uc636\uc637\uc638\uc639\uc63a\uc63b\uc63c\uc63d\uc63e\uc63f\uc640\uc641\uc642\uc643\uc644\uc645\uc646\uc647\uc648\uc649\uc64a\uc64b\uc64c\uc64d\uc64e\uc64f\uc650\uc651\uc652\uc653\uc654\uc655\uc656\uc657\uc658\uc659\uc65a\uc65b\uc65c\uc65d\uc65e\uc65f\uc660\uc661\uc662\uc663\uc664\uc665\uc666\uc667\uc668\uc669\uc66a\uc66b\uc66c\uc66d\uc66e\uc66f\uc670\uc671\uc672\uc673\uc674\uc675\uc676\uc677\uc678\uc679\uc67a\uc67b\uc67c\uc67d\uc67e\uc67f\uc680\uc681\uc682\uc683\uc684\uc685\uc686\uc687\uc688\uc689\uc68a\uc68b\uc68c\uc68d\uc68e\uc68f\uc690\uc691\uc692\uc693\uc694\uc695\uc696\uc697\uc698\uc699\uc69a\uc69b\uc69c\uc69d\uc69e\uc69f\uc6a0\uc6a1\uc6a2\uc6a3\uc6a4\uc6a5\uc6a6\uc6a7\uc6a8\uc6a9\uc6aa\uc6ab\uc6ac\uc6ad\uc6ae\uc6af\uc6b0\uc6b1\uc6b2\uc6b3\uc6b4\uc6b5\uc6b6\uc6b7\uc6b8\uc6b9\uc6ba\uc6bb\uc6bc\uc6bd\uc6be\uc6bf\uc6c0\uc6c1\uc6c2\uc6c3\uc6c4\uc6c5\uc6c6\uc6c7\uc6c8\uc6c9\uc6ca\uc6cb\uc6cc\uc6cd\uc6ce\uc6cf\uc6d0\uc6d1\uc6d2\uc6d3\uc6d4\uc6d5\uc6d6\uc6d7\uc6d8\uc6d9\uc6da\uc6db\uc6dc\uc6dd\uc6de\uc6df\uc6e0\uc6e1\uc6e2\uc6e3\uc6e4\uc6e5\uc6e6\uc6e7\uc6e8\uc6e9\uc6ea\uc6eb\uc6ec\uc6ed\uc6ee\uc6ef\uc6f0\uc6f1\uc6f2\uc6f3\uc6f4\uc6f5\uc6f6\uc6f7\uc6f8\uc6f9\uc6fa\uc6fb\uc6fc\uc6fd\uc6fe\uc6ff\uc700\uc701\uc702\uc703\uc704\uc705\uc706\uc707\uc708\uc709\uc70a\uc70b\uc70c\uc70d\uc70e\uc70f\uc710\uc711\uc712\uc713\uc714\uc715\uc716\uc717\uc718\uc719\uc71a\uc71b\uc71c\uc71d\uc71e\uc71f\uc720\uc721\uc722\uc723\uc724\uc725\uc726\uc727\uc728\uc729\uc72a\uc72b\uc72c\uc72d\uc72e\uc72f\uc730\uc731\uc732\uc733\uc734\uc735\uc736\uc737\uc738\uc739\uc73a\uc73b\uc73c\uc73d\uc73e\uc73f\uc740\uc741\uc742\uc743\uc744\uc745\uc746\uc747\uc748\uc749\uc74a\uc74b\uc74c\uc74d\uc74e\uc74f\uc750\uc751\uc752\uc753\uc754\uc755\uc756\uc757\uc758\uc759\uc75a\uc75b\uc75c\uc75d\uc75e\uc75f\uc760\uc761\uc762\uc763\uc764\uc765\uc766\uc767\uc768\uc769\uc76a\uc76b\uc76c\uc76d\uc76e\uc76f\uc770\uc771\uc772\uc773\uc774\uc775\uc776\uc777\uc778\uc779\uc77a\uc77b\uc77c\uc77d\uc77e\uc77f\uc780\uc781\uc782\uc783\uc784\uc785\uc786\uc787\uc788\uc789\uc78a\uc78b\uc78c\uc78d\uc78e\uc78f\uc790\uc791\uc792\uc793\uc794\uc795\uc796\uc797\uc798\uc799\uc79a\uc79b\uc79c\uc79d\uc79e\uc79f\uc7a0\uc7a1\uc7a2\uc7a3\uc7a4\uc7a5\uc7a6\uc7a7\uc7a8\uc7a9\uc7aa\uc7ab\uc7ac\uc7ad\uc7ae\uc7af\uc7b0\uc7b1\uc7b2\uc7b3\uc7b4\uc7b5\uc7b6\uc7b7\uc7b8\uc7b9\uc7ba\uc7bb\uc7bc\uc7bd\uc7be\uc7bf\uc7c0\uc7c1\uc7c2\uc7c3\uc7c4\uc7c5\uc7c6\uc7c7\uc7c8\uc7c9\uc7ca\uc7cb\uc7cc\uc7cd\uc7ce\uc7cf\uc7d0\uc7d1\uc7d2\uc7d3\uc7d4\uc7d5\uc7d6\uc7d7\uc7d8\uc7d9\uc7da\uc7db\uc7dc\uc7dd\uc7de\uc7df\uc7e0\uc7e1\uc7e2\uc7e3\uc7e4\uc7e5\uc7e6\uc7e7\uc7e8\uc7e9\uc7ea\uc7eb\uc7ec\uc7ed\uc7ee\uc7ef\uc7f0\uc7f1\uc7f2\uc7f3\uc7f4\uc7f5\uc7f6\uc7f7\uc7f8\uc7f9\uc7fa\uc7fb\uc7fc\uc7fd\uc7fe\uc7ff\uc800\uc801\uc802\uc803\uc804\uc805\uc806\uc807\uc808\uc809\uc80a\uc80b\uc80c\uc80d\uc80e\uc80f\uc810\uc811\uc812\uc813\uc814\uc815\uc816\uc817\uc818\uc819\uc81a\uc81b\uc81c\uc81d\uc81e\uc81f\uc820\uc821\uc822\uc823\uc824\uc825\uc826\uc827\uc828\uc829\uc82a\uc82b\uc82c\uc82d\uc82e\uc82f\uc830\uc831\uc832\uc833\uc834\uc835\uc836\uc837\uc838\uc839\uc83a\uc83b\uc83c\uc83d\uc83e\uc83f\uc840\uc841\uc842\uc843\uc844\uc845\uc846\uc847\uc848\uc849\uc84a\uc84b\uc84c\uc84d\uc84e\uc84f\uc850\uc851\uc852\uc853\uc854\uc855\uc856\uc857\uc858\uc859\uc85a\uc85b\uc85c\uc85d\uc85e\uc85f\uc860\uc861\uc862\uc863\uc864\uc865\uc866\uc867\uc868\uc869\uc86a\uc86b\uc86c\uc86d\uc86e\uc86f\uc870\uc871\uc872\uc873\uc874\uc875\uc876\uc877\uc878\uc879\uc87a\uc87b\uc87c\uc87d\uc87e\uc87f\uc880\uc881\uc882\uc883\uc884\uc885\uc886\uc887\uc888\uc889\uc88a\uc88b\uc88c\uc88d\uc88e\uc88f\uc890\uc891\uc892\uc893\uc894\uc895\uc896\uc897\uc898\uc899\uc89a\uc89b\uc89c\uc89d\uc89e\uc89f\uc8a0\uc8a1\uc8a2\uc8a3\uc8a4\uc8a5\uc8a6\uc8a7\uc8a8\uc8a9\uc8aa\uc8ab\uc8ac\uc8ad\uc8ae\uc8af\uc8b0\uc8b1\uc8b2\uc8b3\uc8b4\uc8b5\uc8b6\uc8b7\uc8b8\uc8b9\uc8ba\uc8bb\uc8bc\uc8bd\uc8be\uc8bf\uc8c0\uc8c1\uc8c2\uc8c3\uc8c4\uc8c5\uc8c6\uc8c7\uc8c8\uc8c9\uc8ca\uc8cb\uc8cc\uc8cd\uc8ce\uc8cf\uc8d0\uc8d1\uc8d2\uc8d3\uc8d4\uc8d5\uc8d6\uc8d7\uc8d8\uc8d9\uc8da\uc8db\uc8dc\uc8dd\uc8de\uc8df\uc8e0\uc8e1\uc8e2\uc8e3\uc8e4\uc8e5\uc8e6\uc8e7\uc8e8\uc8e9\uc8ea\uc8eb\uc8ec\uc8ed\uc8ee\uc8ef\uc8f0\uc8f1\uc8f2\uc8f3\uc8f4\uc8f5\uc8f6\uc8f7\uc8f8\uc8f9\uc8fa\uc8fb\uc8fc\uc8fd\uc8fe\uc8ff\uc900\uc901\uc902\uc903\uc904\uc905\uc906\uc907\uc908\uc909\uc90a\uc90b\uc90c\uc90d\uc90e\uc90f\uc910\uc911\uc912\uc913\uc914\uc915\uc916\uc917\uc918\uc919\uc91a\uc91b\uc91c\uc91d\uc91e\uc91f\uc920\uc921\uc922\uc923\uc924\uc925\uc926\uc927\uc928\uc929\uc92a\uc92b\uc92c\uc92d\uc92e\uc92f\uc930\uc931\uc932\uc933\uc934\uc935\uc936\uc937\uc938\uc939\uc93a\uc93b\uc93c\uc93d\uc93e\uc93f\uc940\uc941\uc942\uc943\uc944\uc945\uc946\uc947\uc948\uc949\uc94a\uc94b\uc94c\uc94d\uc94e\uc94f\uc950\uc951\uc952\uc953\uc954\uc955\uc956\uc957\uc958\uc959\uc95a\uc95b\uc95c\uc95d\uc95e\uc95f\uc960\uc961\uc962\uc963\uc964\uc965\uc966\uc967\uc968\uc969\uc96a\uc96b\uc96c\uc96d\uc96e\uc96f\uc970\uc971\uc972\uc973\uc974\uc975\uc976\uc977\uc978\uc979\uc97a\uc97b\uc97c\uc97d\uc97e\uc97f\uc980\uc981\uc982\uc983\uc984\uc985\uc986\uc987\uc988\uc989\uc98a\uc98b\uc98c\uc98d\uc98e\uc98f\uc990\uc991\uc992\uc993\uc994\uc995\uc996\uc997\uc998\uc999\uc99a\uc99b\uc99c\uc99d\uc99e\uc99f\uc9a0\uc9a1\uc9a2\uc9a3\uc9a4\uc9a5\uc9a6\uc9a7\uc9a8\uc9a9\uc9aa\uc9ab\uc9ac\uc9ad\uc9ae\uc9af\uc9b0\uc9b1\uc9b2\uc9b3\uc9b4\uc9b5\uc9b6\uc9b7\uc9b8\uc9b9\uc9ba\uc9bb\uc9bc\uc9bd\uc9be\uc9bf\uc9c0\uc9c1\uc9c2\uc9c3\uc9c4\uc9c5\uc9c6\uc9c7\uc9c8\uc9c9\uc9ca\uc9cb\uc9cc\uc9cd\uc9ce\uc9cf\uc9d0\uc9d1\uc9d2\uc9d3\uc9d4\uc9d5\uc9d6\uc9d7\uc9d8\uc9d9\uc9da\uc9db\uc9dc\uc9dd\uc9de\uc9df\uc9e0\uc9e1\uc9e2\uc9e3\uc9e4\uc9e5\uc9e6\uc9e7\uc9e8\uc9e9\uc9ea\uc9eb\uc9ec\uc9ed\uc9ee\uc9ef\uc9f0\uc9f1\uc9f2\uc9f3\uc9f4\uc9f5\uc9f6\uc9f7\uc9f8\uc9f9\uc9fa\uc9fb\uc9fc\uc9fd\uc9fe\uc9ff\uca00\uca01\uca02\uca03\uca04\uca05\uca06\uca07\uca08\uca09\uca0a\uca0b\uca0c\uca0d\uca0e\uca0f\uca10\uca11\uca12\uca13\uca14\uca15\uca16\uca17\uca18\uca19\uca1a\uca1b\uca1c\uca1d\uca1e\uca1f\uca20\uca21\uca22\uca23\uca24\uca25\uca26\uca27\uca28\uca29\uca2a\uca2b\uca2c\uca2d\uca2e\uca2f\uca30\uca31\uca32\uca33\uca34\uca35\uca36\uca37\uca38\uca39\uca3a\uca3b\uca3c\uca3d\uca3e\uca3f\uca40\uca41\uca42\uca43\uca44\uca45\uca46\uca47\uca48\uca49\uca4a\uca4b\uca4c\uca4d\uca4e\uca4f\uca50\uca51\uca52\uca53\uca54\uca55\uca56\uca57\uca58\uca59\uca5a\uca5b\uca5c\uca5d\uca5e\uca5f\uca60\uca61\uca62\uca63\uca64\uca65\uca66\uca67\uca68\uca69\uca6a\uca6b\uca6c\uca6d\uca6e\uca6f\uca70\uca71\uca72\uca73\uca74\uca75\uca76\uca77\uca78\uca79\uca7a\uca7b\uca7c\uca7d\uca7e\uca7f\uca80\uca81\uca82\uca83\uca84\uca85\uca86\uca87\uca88\uca89\uca8a\uca8b\uca8c\uca8d\uca8e\uca8f\uca90\uca91\uca92\uca93\uca94\uca95\uca96\uca97\uca98\uca99\uca9a\uca9b\uca9c\uca9d\uca9e\uca9f\ucaa0\ucaa1\ucaa2\ucaa3\ucaa4\ucaa5\ucaa6\ucaa7\ucaa8\ucaa9\ucaaa\ucaab\ucaac\ucaad\ucaae\ucaaf\ucab0\ucab1\ucab2\ucab3\ucab4\ucab5\ucab6\ucab7\ucab8\ucab9\ucaba\ucabb\ucabc\ucabd\ucabe\ucabf\ucac0\ucac1\ucac2\ucac3\ucac4\ucac5\ucac6\ucac7\ucac8\ucac9\ucaca\ucacb\ucacc\ucacd\ucace\ucacf\ucad0\ucad1\ucad2\ucad3\ucad4\ucad5\ucad6\ucad7\ucad8\ucad9\ucada\ucadb\ucadc\ucadd\ucade\ucadf\ucae0\ucae1\ucae2\ucae3\ucae4\ucae5\ucae6\ucae7\ucae8\ucae9\ucaea\ucaeb\ucaec\ucaed\ucaee\ucaef\ucaf0\ucaf1\ucaf2\ucaf3\ucaf4\ucaf5\ucaf6\ucaf7\ucaf8\ucaf9\ucafa\ucafb\ucafc\ucafd\ucafe\ucaff\ucb00\ucb01\ucb02\ucb03\ucb04\ucb05\ucb06\ucb07\ucb08\ucb09\ucb0a\ucb0b\ucb0c\ucb0d\ucb0e\ucb0f\ucb10\ucb11\ucb12\ucb13\ucb14\ucb15\ucb16\ucb17\ucb18\ucb19\ucb1a\ucb1b\ucb1c\ucb1d\ucb1e\ucb1f\ucb20\ucb21\ucb22\ucb23\ucb24\ucb25\ucb26\ucb27\ucb28\ucb29\ucb2a\ucb2b\ucb2c\ucb2d\ucb2e\ucb2f\ucb30\ucb31\ucb32\ucb33\ucb34\ucb35\ucb36\ucb37\ucb38\ucb39\ucb3a\ucb3b\ucb3c\ucb3d\ucb3e\ucb3f\ucb40\ucb41\ucb42\ucb43\ucb44\ucb45\ucb46\ucb47\ucb48\ucb49\ucb4a\ucb4b\ucb4c\ucb4d\ucb4e\ucb4f\ucb50\ucb51\ucb52\ucb53\ucb54\ucb55\ucb56\ucb57\ucb58\ucb59\ucb5a\ucb5b\ucb5c\ucb5d\ucb5e\ucb5f\ucb60\ucb61\ucb62\ucb63\ucb64\ucb65\ucb66\ucb67\ucb68\ucb69\ucb6a\ucb6b\ucb6c\ucb6d\ucb6e\ucb6f\ucb70\ucb71\ucb72\ucb73\ucb74\ucb75\ucb76\ucb77\ucb78\ucb79\ucb7a\ucb7b\ucb7c\ucb7d\ucb7e\ucb7f\ucb80\ucb81\ucb82\ucb83\ucb84\ucb85\ucb86\ucb87\ucb88\ucb89\ucb8a\ucb8b\ucb8c\ucb8d\ucb8e\ucb8f\ucb90\ucb91\ucb92\ucb93\ucb94\ucb95\ucb96\ucb97\ucb98\ucb99\ucb9a\ucb9b\ucb9c\ucb9d\ucb9e\ucb9f\ucba0\ucba1\ucba2\ucba3\ucba4\ucba5\ucba6\ucba7\ucba8\ucba9\ucbaa\ucbab\ucbac\ucbad\ucbae\ucbaf\ucbb0\ucbb1\ucbb2\ucbb3\ucbb4\ucbb5\ucbb6\ucbb7\ucbb8\ucbb9\ucbba\ucbbb\ucbbc\ucbbd\ucbbe\ucbbf\ucbc0\ucbc1\ucbc2\ucbc3\ucbc4\ucbc5\ucbc6\ucbc7\ucbc8\ucbc9\ucbca\ucbcb\ucbcc\ucbcd\ucbce\ucbcf\ucbd0\ucbd1\ucbd2\ucbd3\ucbd4\ucbd5\ucbd6\ucbd7\ucbd8\ucbd9\ucbda\ucbdb\ucbdc\ucbdd\ucbde\ucbdf\ucbe0\ucbe1\ucbe2\ucbe3\ucbe4\ucbe5\ucbe6\ucbe7\ucbe8\ucbe9\ucbea\ucbeb\ucbec\ucbed\ucbee\ucbef\ucbf0\ucbf1\ucbf2\ucbf3\ucbf4\ucbf5\ucbf6\ucbf7\ucbf8\ucbf9\ucbfa\ucbfb\ucbfc\ucbfd\ucbfe\ucbff\ucc00\ucc01\ucc02\ucc03\ucc04\ucc05\ucc06\ucc07\ucc08\ucc09\ucc0a\ucc0b\ucc0c\ucc0d\ucc0e\ucc0f\ucc10\ucc11\ucc12\ucc13\ucc14\ucc15\ucc16\ucc17\ucc18\ucc19\ucc1a\ucc1b\ucc1c\ucc1d\ucc1e\ucc1f\ucc20\ucc21\ucc22\ucc23\ucc24\ucc25\ucc26\ucc27\ucc28\ucc29\ucc2a\ucc2b\ucc2c\ucc2d\ucc2e\ucc2f\ucc30\ucc31\ucc32\ucc33\ucc34\ucc35\ucc36\ucc37\ucc38\ucc39\ucc3a\ucc3b\ucc3c\ucc3d\ucc3e\ucc3f\ucc40\ucc41\ucc42\ucc43\ucc44\ucc45\ucc46\ucc47\ucc48\ucc49\ucc4a\ucc4b\ucc4c\ucc4d\ucc4e\ucc4f\ucc50\ucc51\ucc52\ucc53\ucc54\ucc55\ucc56\ucc57\ucc58\ucc59\ucc5a\ucc5b\ucc5c\ucc5d\ucc5e\ucc5f\ucc60\ucc61\ucc62\ucc63\ucc64\ucc65\ucc66\ucc67\ucc68\ucc69\ucc6a\ucc6b\ucc6c\ucc6d\ucc6e\ucc6f\ucc70\ucc71\ucc72\ucc73\ucc74\ucc75\ucc76\ucc77\ucc78\ucc79\ucc7a\ucc7b\ucc7c\ucc7d\ucc7e\ucc7f\ucc80\ucc81\ucc82\ucc83\ucc84\ucc85\ucc86\ucc87\ucc88\ucc89\ucc8a\ucc8b\ucc8c\ucc8d\ucc8e\ucc8f\ucc90\ucc91\ucc92\ucc93\ucc94\ucc95\ucc96\ucc97\ucc98\ucc99\ucc9a\ucc9b\ucc9c\ucc9d\ucc9e\ucc9f\ucca0\ucca1\ucca2\ucca3\ucca4\ucca5\ucca6\ucca7\ucca8\ucca9\uccaa\uccab\uccac\uccad\uccae\uccaf\uccb0\uccb1\uccb2\uccb3\uccb4\uccb5\uccb6\uccb7\uccb8\uccb9\uccba\uccbb\uccbc\uccbd\uccbe\uccbf\uccc0\uccc1\uccc2\uccc3\uccc4\uccc5\uccc6\uccc7\uccc8\uccc9\uccca\ucccb\ucccc\ucccd\uccce\ucccf\uccd0\uccd1\uccd2\uccd3\uccd4\uccd5\uccd6\uccd7\uccd8\uccd9\uccda\uccdb\uccdc\uccdd\uccde\uccdf\ucce0\ucce1\ucce2\ucce3\ucce4\ucce5\ucce6\ucce7\ucce8\ucce9\uccea\ucceb\uccec\ucced\uccee\uccef\uccf0\uccf1\uccf2\uccf3\uccf4\uccf5\uccf6\uccf7\uccf8\uccf9\uccfa\uccfb\uccfc\uccfd\uccfe\uccff\ucd00\ucd01\ucd02\ucd03\ucd04\ucd05\ucd06\ucd07\ucd08\ucd09\ucd0a\ucd0b\ucd0c\ucd0d\ucd0e\ucd0f\ucd10\ucd11\ucd12\ucd13\ucd14\ucd15\ucd16\ucd17\ucd18\ucd19\ucd1a\ucd1b\ucd1c\ucd1d\ucd1e\ucd1f\ucd20\ucd21\ucd22\ucd23\ucd24\ucd25\ucd26\ucd27\ucd28\ucd29\ucd2a\ucd2b\ucd2c\ucd2d\ucd2e\ucd2f\ucd30\ucd31\ucd32\ucd33\ucd34\ucd35\ucd36\ucd37\ucd38\ucd39\ucd3a\ucd3b\ucd3c\ucd3d\ucd3e\ucd3f\ucd40\ucd41\ucd42\ucd43\ucd44\ucd45\ucd46\ucd47\ucd48\ucd49\ucd4a\ucd4b\ucd4c\ucd4d\ucd4e\ucd4f\ucd50\ucd51\ucd52\ucd53\ucd54\ucd55\ucd56\ucd57\ucd58\ucd59\ucd5a\ucd5b\ucd5c\ucd5d\ucd5e\ucd5f\ucd60\ucd61\ucd62\ucd63\ucd64\ucd65\ucd66\ucd67\ucd68\ucd69\ucd6a\ucd6b\ucd6c\ucd6d\ucd6e\ucd6f\ucd70\ucd71\ucd72\ucd73\ucd74\ucd75\ucd76\ucd77\ucd78\ucd79\ucd7a\ucd7b\ucd7c\ucd7d\ucd7e\ucd7f\ucd80\ucd81\ucd82\ucd83\ucd84\ucd85\ucd86\ucd87\ucd88\ucd89\ucd8a\ucd8b\ucd8c\ucd8d\ucd8e\ucd8f\ucd90\ucd91\ucd92\ucd93\ucd94\ucd95\ucd96\ucd97\ucd98\ucd99\ucd9a\ucd9b\ucd9c\ucd9d\ucd9e\ucd9f\ucda0\ucda1\ucda2\ucda3\ucda4\ucda5\ucda6\ucda7\ucda8\ucda9\ucdaa\ucdab\ucdac\ucdad\ucdae\ucdaf\ucdb0\ucdb1\ucdb2\ucdb3\ucdb4\ucdb5\ucdb6\ucdb7\ucdb8\ucdb9\ucdba\ucdbb\ucdbc\ucdbd\ucdbe\ucdbf\ucdc0\ucdc1\ucdc2\ucdc3\ucdc4\ucdc5\ucdc6\ucdc7\ucdc8\ucdc9\ucdca\ucdcb\ucdcc\ucdcd\ucdce\ucdcf\ucdd0\ucdd1\ucdd2\ucdd3\ucdd4\ucdd5\ucdd6\ucdd7\ucdd8\ucdd9\ucdda\ucddb\ucddc\ucddd\ucdde\ucddf\ucde0\ucde1\ucde2\ucde3\ucde4\ucde5\ucde6\ucde7\ucde8\ucde9\ucdea\ucdeb\ucdec\ucded\ucdee\ucdef\ucdf0\ucdf1\ucdf2\ucdf3\ucdf4\ucdf5\ucdf6\ucdf7\ucdf8\ucdf9\ucdfa\ucdfb\ucdfc\ucdfd\ucdfe\ucdff\uce00\uce01\uce02\uce03\uce04\uce05\uce06\uce07\uce08\uce09\uce0a\uce0b\uce0c\uce0d\uce0e\uce0f\uce10\uce11\uce12\uce13\uce14\uce15\uce16\uce17\uce18\uce19\uce1a\uce1b\uce1c\uce1d\uce1e\uce1f\uce20\uce21\uce22\uce23\uce24\uce25\uce26\uce27\uce28\uce29\uce2a\uce2b\uce2c\uce2d\uce2e\uce2f\uce30\uce31\uce32\uce33\uce34\uce35\uce36\uce37\uce38\uce39\uce3a\uce3b\uce3c\uce3d\uce3e\uce3f\uce40\uce41\uce42\uce43\uce44\uce45\uce46\uce47\uce48\uce49\uce4a\uce4b\uce4c\uce4d\uce4e\uce4f\uce50\uce51\uce52\uce53\uce54\uce55\uce56\uce57\uce58\uce59\uce5a\uce5b\uce5c\uce5d\uce5e\uce5f\uce60\uce61\uce62\uce63\uce64\uce65\uce66\uce67\uce68\uce69\uce6a\uce6b\uce6c\uce6d\uce6e\uce6f\uce70\uce71\uce72\uce73\uce74\uce75\uce76\uce77\uce78\uce79\uce7a\uce7b\uce7c\uce7d\uce7e\uce7f\uce80\uce81\uce82\uce83\uce84\uce85\uce86\uce87\uce88\uce89\uce8a\uce8b\uce8c\uce8d\uce8e\uce8f\uce90\uce91\uce92\uce93\uce94\uce95\uce96\uce97\uce98\uce99\uce9a\uce9b\uce9c\uce9d\uce9e\uce9f\ucea0\ucea1\ucea2\ucea3\ucea4\ucea5\ucea6\ucea7\ucea8\ucea9\uceaa\uceab\uceac\ucead\uceae\uceaf\uceb0\uceb1\uceb2\uceb3\uceb4\uceb5\uceb6\uceb7\uceb8\uceb9\uceba\ucebb\ucebc\ucebd\ucebe\ucebf\ucec0\ucec1\ucec2\ucec3\ucec4\ucec5\ucec6\ucec7\ucec8\ucec9\uceca\ucecb\ucecc\ucecd\ucece\ucecf\uced0\uced1\uced2\uced3\uced4\uced5\uced6\uced7\uced8\uced9\uceda\ucedb\ucedc\ucedd\ucede\ucedf\ucee0\ucee1\ucee2\ucee3\ucee4\ucee5\ucee6\ucee7\ucee8\ucee9\uceea\uceeb\uceec\uceed\uceee\uceef\ucef0\ucef1\ucef2\ucef3\ucef4\ucef5\ucef6\ucef7\ucef8\ucef9\ucefa\ucefb\ucefc\ucefd\ucefe\uceff\ucf00\ucf01\ucf02\ucf03\ucf04\ucf05\ucf06\ucf07\ucf08\ucf09\ucf0a\ucf0b\ucf0c\ucf0d\ucf0e\ucf0f\ucf10\ucf11\ucf12\ucf13\ucf14\ucf15\ucf16\ucf17\ucf18\ucf19\ucf1a\ucf1b\ucf1c\ucf1d\ucf1e\ucf1f\ucf20\ucf21\ucf22\ucf23\ucf24\ucf25\ucf26\ucf27\ucf28\ucf29\ucf2a\ucf2b\ucf2c\ucf2d\ucf2e\ucf2f\ucf30\ucf31\ucf32\ucf33\ucf34\ucf35\ucf36\ucf37\ucf38\ucf39\ucf3a\ucf3b\ucf3c\ucf3d\ucf3e\ucf3f\ucf40\ucf41\ucf42\ucf43\ucf44\ucf45\ucf46\ucf47\ucf48\ucf49\ucf4a\ucf4b\ucf4c\ucf4d\ucf4e\ucf4f\ucf50\ucf51\ucf52\ucf53\ucf54\ucf55\ucf56\ucf57\ucf58\ucf59\ucf5a\ucf5b\ucf5c\ucf5d\ucf5e\ucf5f\ucf60\ucf61\ucf62\ucf63\ucf64\ucf65\ucf66\ucf67\ucf68\ucf69\ucf6a\ucf6b\ucf6c\ucf6d\ucf6e\ucf6f\ucf70\ucf71\ucf72\ucf73\ucf74\ucf75\ucf76\ucf77\ucf78\ucf79\ucf7a\ucf7b\ucf7c\ucf7d\ucf7e\ucf7f\ucf80\ucf81\ucf82\ucf83\ucf84\ucf85\ucf86\ucf87\ucf88\ucf89\ucf8a\ucf8b\ucf8c\ucf8d\ucf8e\ucf8f\ucf90\ucf91\ucf92\ucf93\ucf94\ucf95\ucf96\ucf97\ucf98\ucf99\ucf9a\ucf9b\ucf9c\ucf9d\ucf9e\ucf9f\ucfa0\ucfa1\ucfa2\ucfa3\ucfa4\ucfa5\ucfa6\ucfa7\ucfa8\ucfa9\ucfaa\ucfab\ucfac\ucfad\ucfae\ucfaf\ucfb0\ucfb1\ucfb2\ucfb3\ucfb4\ucfb5\ucfb6\ucfb7\ucfb8\ucfb9\ucfba\ucfbb\ucfbc\ucfbd\ucfbe\ucfbf\ucfc0\ucfc1\ucfc2\ucfc3\ucfc4\ucfc5\ucfc6\ucfc7\ucfc8\ucfc9\ucfca\ucfcb\ucfcc\ucfcd\ucfce\ucfcf\ucfd0\ucfd1\ucfd2\ucfd3\ucfd4\ucfd5\ucfd6\ucfd7\ucfd8\ucfd9\ucfda\ucfdb\ucfdc\ucfdd\ucfde\ucfdf\ucfe0\ucfe1\ucfe2\ucfe3\ucfe4\ucfe5\ucfe6\ucfe7\ucfe8\ucfe9\ucfea\ucfeb\ucfec\ucfed\ucfee\ucfef\ucff0\ucff1\ucff2\ucff3\ucff4\ucff5\ucff6\ucff7\ucff8\ucff9\ucffa\ucffb\ucffc\ucffd\ucffe\ucfff\ud000\ud001\ud002\ud003\ud004\ud005\ud006\ud007\ud008\ud009\ud00a\ud00b\ud00c\ud00d\ud00e\ud00f\ud010\ud011\ud012\ud013\ud014\ud015\ud016\ud017\ud018\ud019\ud01a\ud01b\ud01c\ud01d\ud01e\ud01f\ud020\ud021\ud022\ud023\ud024\ud025\ud026\ud027\ud028\ud029\ud02a\ud02b\ud02c\ud02d\ud02e\ud02f\ud030\ud031\ud032\ud033\ud034\ud035\ud036\ud037\ud038\ud039\ud03a\ud03b\ud03c\ud03d\ud03e\ud03f\ud040\ud041\ud042\ud043\ud044\ud045\ud046\ud047\ud048\ud049\ud04a\ud04b\ud04c\ud04d\ud04e\ud04f\ud050\ud051\ud052\ud053\ud054\ud055\ud056\ud057\ud058\ud059\ud05a\ud05b\ud05c\ud05d\ud05e\ud05f\ud060\ud061\ud062\ud063\ud064\ud065\ud066\ud067\ud068\ud069\ud06a\ud06b\ud06c\ud06d\ud06e\ud06f\ud070\ud071\ud072\ud073\ud074\ud075\ud076\ud077\ud078\ud079\ud07a\ud07b\ud07c\ud07d\ud07e\ud07f\ud080\ud081\ud082\ud083\ud084\ud085\ud086\ud087\ud088\ud089\ud08a\ud08b\ud08c\ud08d\ud08e\ud08f\ud090\ud091\ud092\ud093\ud094\ud095\ud096\ud097\ud098\ud099\ud09a\ud09b\ud09c\ud09d\ud09e\ud09f\ud0a0\ud0a1\ud0a2\ud0a3\ud0a4\ud0a5\ud0a6\ud0a7\ud0a8\ud0a9\ud0aa\ud0ab\ud0ac\ud0ad\ud0ae\ud0af\ud0b0\ud0b1\ud0b2\ud0b3\ud0b4\ud0b5\ud0b6\ud0b7\ud0b8\ud0b9\ud0ba\ud0bb\ud0bc\ud0bd\ud0be\ud0bf\ud0c0\ud0c1\ud0c2\ud0c3\ud0c4\ud0c5\ud0c6\ud0c7\ud0c8\ud0c9\ud0ca\ud0cb\ud0cc\ud0cd\ud0ce\ud0cf\ud0d0\ud0d1\ud0d2\ud0d3\ud0d4\ud0d5\ud0d6\ud0d7\ud0d8\ud0d9\ud0da\ud0db\ud0dc\ud0dd\ud0de\ud0df\ud0e0\ud0e1\ud0e2\ud0e3\ud0e4\ud0e5\ud0e6\ud0e7\ud0e8\ud0e9\ud0ea\ud0eb\ud0ec\ud0ed\ud0ee\ud0ef\ud0f0\ud0f1\ud0f2\ud0f3\ud0f4\ud0f5\ud0f6\ud0f7\ud0f8\ud0f9\ud0fa\ud0fb\ud0fc\ud0fd\ud0fe\ud0ff\ud100\ud101\ud102\ud103\ud104\ud105\ud106\ud107\ud108\ud109\ud10a\ud10b\ud10c\ud10d\ud10e\ud10f\ud110\ud111\ud112\ud113\ud114\ud115\ud116\ud117\ud118\ud119\ud11a\ud11b\ud11c\ud11d\ud11e\ud11f\ud120\ud121\ud122\ud123\ud124\ud125\ud126\ud127\ud128\ud129\ud12a\ud12b\ud12c\ud12d\ud12e\ud12f\ud130\ud131\ud132\ud133\ud134\ud135\ud136\ud137\ud138\ud139\ud13a\ud13b\ud13c\ud13d\ud13e\ud13f\ud140\ud141\ud142\ud143\ud144\ud145\ud146\ud147\ud148\ud149\ud14a\ud14b\ud14c\ud14d\ud14e\ud14f\ud150\ud151\ud152\ud153\ud154\ud155\ud156\ud157\ud158\ud159\ud15a\ud15b\ud15c\ud15d\ud15e\ud15f\ud160\ud161\ud162\ud163\ud164\ud165\ud166\ud167\ud168\ud169\ud16a\ud16b\ud16c\ud16d\ud16e\ud16f\ud170\ud171\ud172\ud173\ud174\ud175\ud176\ud177\ud178\ud179\ud17a\ud17b\ud17c\ud17d\ud17e\ud17f\ud180\ud181\ud182\ud183\ud184\ud185\ud186\ud187\ud188\ud189\ud18a\ud18b\ud18c\ud18d\ud18e\ud18f\ud190\ud191\ud192\ud193\ud194\ud195\ud196\ud197\ud198\ud199\ud19a\ud19b\ud19c\ud19d\ud19e\ud19f\ud1a0\ud1a1\ud1a2\ud1a3\ud1a4\ud1a5\ud1a6\ud1a7\ud1a8\ud1a9\ud1aa\ud1ab\ud1ac\ud1ad\ud1ae\ud1af\ud1b0\ud1b1\ud1b2\ud1b3\ud1b4\ud1b5\ud1b6\ud1b7\ud1b8\ud1b9\ud1ba\ud1bb\ud1bc\ud1bd\ud1be\ud1bf\ud1c0\ud1c1\ud1c2\ud1c3\ud1c4\ud1c5\ud1c6\ud1c7\ud1c8\ud1c9\ud1ca\ud1cb\ud1cc\ud1cd\ud1ce\ud1cf\ud1d0\ud1d1\ud1d2\ud1d3\ud1d4\ud1d5\ud1d6\ud1d7\ud1d8\ud1d9\ud1da\ud1db\ud1dc\ud1dd\ud1de\ud1df\ud1e0\ud1e1\ud1e2\ud1e3\ud1e4\ud1e5\ud1e6\ud1e7\ud1e8\ud1e9\ud1ea\ud1eb\ud1ec\ud1ed\ud1ee\ud1ef\ud1f0\ud1f1\ud1f2\ud1f3\ud1f4\ud1f5\ud1f6\ud1f7\ud1f8\ud1f9\ud1fa\ud1fb\ud1fc\ud1fd\ud1fe\ud1ff\ud200\ud201\ud202\ud203\ud204\ud205\ud206\ud207\ud208\ud209\ud20a\ud20b\ud20c\ud20d\ud20e\ud20f\ud210\ud211\ud212\ud213\ud214\ud215\ud216\ud217\ud218\ud219\ud21a\ud21b\ud21c\ud21d\ud21e\ud21f\ud220\ud221\ud222\ud223\ud224\ud225\ud226\ud227\ud228\ud229\ud22a\ud22b\ud22c\ud22d\ud22e\ud22f\ud230\ud231\ud232\ud233\ud234\ud235\ud236\ud237\ud238\ud239\ud23a\ud23b\ud23c\ud23d\ud23e\ud23f\ud240\ud241\ud242\ud243\ud244\ud245\ud246\ud247\ud248\ud249\ud24a\ud24b\ud24c\ud24d\ud24e\ud24f\ud250\ud251\ud252\ud253\ud254\ud255\ud256\ud257\ud258\ud259\ud25a\ud25b\ud25c\ud25d\ud25e\ud25f\ud260\ud261\ud262\ud263\ud264\ud265\ud266\ud267\ud268\ud269\ud26a\ud26b\ud26c\ud26d\ud26e\ud26f\ud270\ud271\ud272\ud273\ud274\ud275\ud276\ud277\ud278\ud279\ud27a\ud27b\ud27c\ud27d\ud27e\ud27f\ud280\ud281\ud282\ud283\ud284\ud285\ud286\ud287\ud288\ud289\ud28a\ud28b\ud28c\ud28d\ud28e\ud28f\ud290\ud291\ud292\ud293\ud294\ud295\ud296\ud297\ud298\ud299\ud29a\ud29b\ud29c\ud29d\ud29e\ud29f\ud2a0\ud2a1\ud2a2\ud2a3\ud2a4\ud2a5\ud2a6\ud2a7\ud2a8\ud2a9\ud2aa\ud2ab\ud2ac\ud2ad\ud2ae\ud2af\ud2b0\ud2b1\ud2b2\ud2b3\ud2b4\ud2b5\ud2b6\ud2b7\ud2b8\ud2b9\ud2ba\ud2bb\ud2bc\ud2bd\ud2be\ud2bf\ud2c0\ud2c1\ud2c2\ud2c3\ud2c4\ud2c5\ud2c6\ud2c7\ud2c8\ud2c9\ud2ca\ud2cb\ud2cc\ud2cd\ud2ce\ud2cf\ud2d0\ud2d1\ud2d2\ud2d3\ud2d4\ud2d5\ud2d6\ud2d7\ud2d8\ud2d9\ud2da\ud2db\ud2dc\ud2dd\ud2de\ud2df\ud2e0\ud2e1\ud2e2\ud2e3\ud2e4\ud2e5\ud2e6\ud2e7\ud2e8\ud2e9\ud2ea\ud2eb\ud2ec\ud2ed\ud2ee\ud2ef\ud2f0\ud2f1\ud2f2\ud2f3\ud2f4\ud2f5\ud2f6\ud2f7\ud2f8\ud2f9\ud2fa\ud2fb\ud2fc\ud2fd\ud2fe\ud2ff\ud300\ud301\ud302\ud303\ud304\ud305\ud306\ud307\ud308\ud309\ud30a\ud30b\ud30c\ud30d\ud30e\ud30f\ud310\ud311\ud312\ud313\ud314\ud315\ud316\ud317\ud318\ud319\ud31a\ud31b\ud31c\ud31d\ud31e\ud31f\ud320\ud321\ud322\ud323\ud324\ud325\ud326\ud327\ud328\ud329\ud32a\ud32b\ud32c\ud32d\ud32e\ud32f\ud330\ud331\ud332\ud333\ud334\ud335\ud336\ud337\ud338\ud339\ud33a\ud33b\ud33c\ud33d\ud33e\ud33f\ud340\ud341\ud342\ud343\ud344\ud345\ud346\ud347\ud348\ud349\ud34a\ud34b\ud34c\ud34d\ud34e\ud34f\ud350\ud351\ud352\ud353\ud354\ud355\ud356\ud357\ud358\ud359\ud35a\ud35b\ud35c\ud35d\ud35e\ud35f\ud360\ud361\ud362\ud363\ud364\ud365\ud366\ud367\ud368\ud369\ud36a\ud36b\ud36c\ud36d\ud36e\ud36f\ud370\ud371\ud372\ud373\ud374\ud375\ud376\ud377\ud378\ud379\ud37a\ud37b\ud37c\ud37d\ud37e\ud37f\ud380\ud381\ud382\ud383\ud384\ud385\ud386\ud387\ud388\ud389\ud38a\ud38b\ud38c\ud38d\ud38e\ud38f\ud390\ud391\ud392\ud393\ud394\ud395\ud396\ud397\ud398\ud399\ud39a\ud39b\ud39c\ud39d\ud39e\ud39f\ud3a0\ud3a1\ud3a2\ud3a3\ud3a4\ud3a5\ud3a6\ud3a7\ud3a8\ud3a9\ud3aa\ud3ab\ud3ac\ud3ad\ud3ae\ud3af\ud3b0\ud3b1\ud3b2\ud3b3\ud3b4\ud3b5\ud3b6\ud3b7\ud3b8\ud3b9\ud3ba\ud3bb\ud3bc\ud3bd\ud3be\ud3bf\ud3c0\ud3c1\ud3c2\ud3c3\ud3c4\ud3c5\ud3c6\ud3c7\ud3c8\ud3c9\ud3ca\ud3cb\ud3cc\ud3cd\ud3ce\ud3cf\ud3d0\ud3d1\ud3d2\ud3d3\ud3d4\ud3d5\ud3d6\ud3d7\ud3d8\ud3d9\ud3da\ud3db\ud3dc\ud3dd\ud3de\ud3df\ud3e0\ud3e1\ud3e2\ud3e3\ud3e4\ud3e5\ud3e6\ud3e7\ud3e8\ud3e9\ud3ea\ud3eb\ud3ec\ud3ed\ud3ee\ud3ef\ud3f0\ud3f1\ud3f2\ud3f3\ud3f4\ud3f5\ud3f6\ud3f7\ud3f8\ud3f9\ud3fa\ud3fb\ud3fc\ud3fd\ud3fe\ud3ff\ud400\ud401\ud402\ud403\ud404\ud405\ud406\ud407\ud408\ud409\ud40a\ud40b\ud40c\ud40d\ud40e\ud40f\ud410\ud411\ud412\ud413\ud414\ud415\ud416\ud417\ud418\ud419\ud41a\ud41b\ud41c\ud41d\ud41e\ud41f\ud420\ud421\ud422\ud423\ud424\ud425\ud426\ud427\ud428\ud429\ud42a\ud42b\ud42c\ud42d\ud42e\ud42f\ud430\ud431\ud432\ud433\ud434\ud435\ud436\ud437\ud438\ud439\ud43a\ud43b\ud43c\ud43d\ud43e\ud43f\ud440\ud441\ud442\ud443\ud444\ud445\ud446\ud447\ud448\ud449\ud44a\ud44b\ud44c\ud44d\ud44e\ud44f\ud450\ud451\ud452\ud453\ud454\ud455\ud456\ud457\ud458\ud459\ud45a\ud45b\ud45c\ud45d\ud45e\ud45f\ud460\ud461\ud462\ud463\ud464\ud465\ud466\ud467\ud468\ud469\ud46a\ud46b\ud46c\ud46d\ud46e\ud46f\ud470\ud471\ud472\ud473\ud474\ud475\ud476\ud477\ud478\ud479\ud47a\ud47b\ud47c\ud47d\ud47e\ud47f\ud480\ud481\ud482\ud483\ud484\ud485\ud486\ud487\ud488\ud489\ud48a\ud48b\ud48c\ud48d\ud48e\ud48f\ud490\ud491\ud492\ud493\ud494\ud495\ud496\ud497\ud498\ud499\ud49a\ud49b\ud49c\ud49d\ud49e\ud49f\ud4a0\ud4a1\ud4a2\ud4a3\ud4a4\ud4a5\ud4a6\ud4a7\ud4a8\ud4a9\ud4aa\ud4ab\ud4ac\ud4ad\ud4ae\ud4af\ud4b0\ud4b1\ud4b2\ud4b3\ud4b4\ud4b5\ud4b6\ud4b7\ud4b8\ud4b9\ud4ba\ud4bb\ud4bc\ud4bd\ud4be\ud4bf\ud4c0\ud4c1\ud4c2\ud4c3\ud4c4\ud4c5\ud4c6\ud4c7\ud4c8\ud4c9\ud4ca\ud4cb\ud4cc\ud4cd\ud4ce\ud4cf\ud4d0\ud4d1\ud4d2\ud4d3\ud4d4\ud4d5\ud4d6\ud4d7\ud4d8\ud4d9\ud4da\ud4db\ud4dc\ud4dd\ud4de\ud4df\ud4e0\ud4e1\ud4e2\ud4e3\ud4e4\ud4e5\ud4e6\ud4e7\ud4e8\ud4e9\ud4ea\ud4eb\ud4ec\ud4ed\ud4ee\ud4ef\ud4f0\ud4f1\ud4f2\ud4f3\ud4f4\ud4f5\ud4f6\ud4f7\ud4f8\ud4f9\ud4fa\ud4fb\ud4fc\ud4fd\ud4fe\ud4ff\ud500\ud501\ud502\ud503\ud504\ud505\ud506\ud507\ud508\ud509\ud50a\ud50b\ud50c\ud50d\ud50e\ud50f\ud510\ud511\ud512\ud513\ud514\ud515\ud516\ud517\ud518\ud519\ud51a\ud51b\ud51c\ud51d\ud51e\ud51f\ud520\ud521\ud522\ud523\ud524\ud525\ud526\ud527\ud528\ud529\ud52a\ud52b\ud52c\ud52d\ud52e\ud52f\ud530\ud531\ud532\ud533\ud534\ud535\ud536\ud537\ud538\ud539\ud53a\ud53b\ud53c\ud53d\ud53e\ud53f\ud540\ud541\ud542\ud543\ud544\ud545\ud546\ud547\ud548\ud549\ud54a\ud54b\ud54c\ud54d\ud54e\ud54f\ud550\ud551\ud552\ud553\ud554\ud555\ud556\ud557\ud558\ud559\ud55a\ud55b\ud55c\ud55d\ud55e\ud55f\ud560\ud561\ud562\ud563\ud564\ud565\ud566\ud567\ud568\ud569\ud56a\ud56b\ud56c\ud56d\ud56e\ud56f\ud570\ud571\ud572\ud573\ud574\ud575\ud576\ud577\ud578\ud579\ud57a\ud57b\ud57c\ud57d\ud57e\ud57f\ud580\ud581\ud582\ud583\ud584\ud585\ud586\ud587\ud588\ud589\ud58a\ud58b\ud58c\ud58d\ud58e\ud58f\ud590\ud591\ud592\ud593\ud594\ud595\ud596\ud597\ud598\ud599\ud59a\ud59b\ud59c\ud59d\ud59e\ud59f\ud5a0\ud5a1\ud5a2\ud5a3\ud5a4\ud5a5\ud5a6\ud5a7\ud5a8\ud5a9\ud5aa\ud5ab\ud5ac\ud5ad\ud5ae\ud5af\ud5b0\ud5b1\ud5b2\ud5b3\ud5b4\ud5b5\ud5b6\ud5b7\ud5b8\ud5b9\ud5ba\ud5bb\ud5bc\ud5bd\ud5be\ud5bf\ud5c0\ud5c1\ud5c2\ud5c3\ud5c4\ud5c5\ud5c6\ud5c7\ud5c8\ud5c9\ud5ca\ud5cb\ud5cc\ud5cd\ud5ce\ud5cf\ud5d0\ud5d1\ud5d2\ud5d3\ud5d4\ud5d5\ud5d6\ud5d7\ud5d8\ud5d9\ud5da\ud5db\ud5dc\ud5dd\ud5de\ud5df\ud5e0\ud5e1\ud5e2\ud5e3\ud5e4\ud5e5\ud5e6\ud5e7\ud5e8\ud5e9\ud5ea\ud5eb\ud5ec\ud5ed\ud5ee\ud5ef\ud5f0\ud5f1\ud5f2\ud5f3\ud5f4\ud5f5\ud5f6\ud5f7\ud5f8\ud5f9\ud5fa\ud5fb\ud5fc\ud5fd\ud5fe\ud5ff\ud600\ud601\ud602\ud603\ud604\ud605\ud606\ud607\ud608\ud609\ud60a\ud60b\ud60c\ud60d\ud60e\ud60f\ud610\ud611\ud612\ud613\ud614\ud615\ud616\ud617\ud618\ud619\ud61a\ud61b\ud61c\ud61d\ud61e\ud61f\ud620\ud621\ud622\ud623\ud624\ud625\ud626\ud627\ud628\ud629\ud62a\ud62b\ud62c\ud62d\ud62e\ud62f\ud630\ud631\ud632\ud633\ud634\ud635\ud636\ud637\ud638\ud639\ud63a\ud63b\ud63c\ud63d\ud63e\ud63f\ud640\ud641\ud642\ud643\ud644\ud645\ud646\ud647\ud648\ud649\ud64a\ud64b\ud64c\ud64d\ud64e\ud64f\ud650\ud651\ud652\ud653\ud654\ud655\ud656\ud657\ud658\ud659\ud65a\ud65b\ud65c\ud65d\ud65e\ud65f\ud660\ud661\ud662\ud663\ud664\ud665\ud666\ud667\ud668\ud669\ud66a\ud66b\ud66c\ud66d\ud66e\ud66f\ud670\ud671\ud672\ud673\ud674\ud675\ud676\ud677\ud678\ud679\ud67a\ud67b\ud67c\ud67d\ud67e\ud67f\ud680\ud681\ud682\ud683\ud684\ud685\ud686\ud687\ud688\ud689\ud68a\ud68b\ud68c\ud68d\ud68e\ud68f\ud690\ud691\ud692\ud693\ud694\ud695\ud696\ud697\ud698\ud699\ud69a\ud69b\ud69c\ud69d\ud69e\ud69f\ud6a0\ud6a1\ud6a2\ud6a3\ud6a4\ud6a5\ud6a6\ud6a7\ud6a8\ud6a9\ud6aa\ud6ab\ud6ac\ud6ad\ud6ae\ud6af\ud6b0\ud6b1\ud6b2\ud6b3\ud6b4\ud6b5\ud6b6\ud6b7\ud6b8\ud6b9\ud6ba\ud6bb\ud6bc\ud6bd\ud6be\ud6bf\ud6c0\ud6c1\ud6c2\ud6c3\ud6c4\ud6c5\ud6c6\ud6c7\ud6c8\ud6c9\ud6ca\ud6cb\ud6cc\ud6cd\ud6ce\ud6cf\ud6d0\ud6d1\ud6d2\ud6d3\ud6d4\ud6d5\ud6d6\ud6d7\ud6d8\ud6d9\ud6da\ud6db\ud6dc\ud6dd\ud6de\ud6df\ud6e0\ud6e1\ud6e2\ud6e3\ud6e4\ud6e5\ud6e6\ud6e7\ud6e8\ud6e9\ud6ea\ud6eb\ud6ec\ud6ed\ud6ee\ud6ef\ud6f0\ud6f1\ud6f2\ud6f3\ud6f4\ud6f5\ud6f6\ud6f7\ud6f8\ud6f9\ud6fa\ud6fb\ud6fc\ud6fd\ud6fe\ud6ff\ud700\ud701\ud702\ud703\ud704\ud705\ud706\ud707\ud708\ud709\ud70a\ud70b\ud70c\ud70d\ud70e\ud70f\ud710\ud711\ud712\ud713\ud714\ud715\ud716\ud717\ud718\ud719\ud71a\ud71b\ud71c\ud71d\ud71e\ud71f\ud720\ud721\ud722\ud723\ud724\ud725\ud726\ud727\ud728\ud729\ud72a\ud72b\ud72c\ud72d\ud72e\ud72f\ud730\ud731\ud732\ud733\ud734\ud735\ud736\ud737\ud738\ud739\ud73a\ud73b\ud73c\ud73d\ud73e\ud73f\ud740\ud741\ud742\ud743\ud744\ud745\ud746\ud747\ud748\ud749\ud74a\ud74b\ud74c\ud74d\ud74e\ud74f\ud750\ud751\ud752\ud753\ud754\ud755\ud756\ud757\ud758\ud759\ud75a\ud75b\ud75c\ud75d\ud75e\ud75f\ud760\ud761\ud762\ud763\ud764\ud765\ud766\ud767\ud768\ud769\ud76a\ud76b\ud76c\ud76d\ud76e\ud76f\ud770\ud771\ud772\ud773\ud774\ud775\ud776\ud777\ud778\ud779\ud77a\ud77b\ud77c\ud77d\ud77e\ud77f\ud780\ud781\ud782\ud783\ud784\ud785\ud786\ud787\ud788\ud789\ud78a\ud78b\ud78c\ud78d\ud78e\ud78f\ud790\ud791\ud792\ud793\ud794\ud795\ud796\ud797\ud798\ud799\ud79a\ud79b\ud79c\ud79d\ud79e\ud79f\ud7a0\ud7a1\ud7a2\ud7a3\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\uf900\uf901\uf902\uf903\uf904\uf905\uf906\uf907\uf908\uf909\uf90a\uf90b\uf90c\uf90d\uf90e\uf90f\uf910\uf911\uf912\uf913\uf914\uf915\uf916\uf917\uf918\uf919\uf91a\uf91b\uf91c\uf91d\uf91e\uf91f\uf920\uf921\uf922\uf923\uf924\uf925\uf926\uf927\uf928\uf929\uf92a\uf92b\uf92c\uf92d\uf92e\uf92f\uf930\uf931\uf932\uf933\uf934\uf935\uf936\uf937\uf938\uf939\uf93a\uf93b\uf93c\uf93d\uf93e\uf93f\uf940\uf941\uf942\uf943\uf944\uf945\uf946\uf947\uf948\uf949\uf94a\uf94b\uf94c\uf94d\uf94e\uf94f\uf950\uf951\uf952\uf953\uf954\uf955\uf956\uf957\uf958\uf959\uf95a\uf95b\uf95c\uf95d\uf95e\uf95f\uf960\uf961\uf962\uf963\uf964\uf965\uf966\uf967\uf968\uf969\uf96a\uf96b\uf96c\uf96d\uf96e\uf96f\uf970\uf971\uf972\uf973\uf974\uf975\uf976\uf977\uf978\uf979\uf97a\uf97b\uf97c\uf97d\uf97e\uf97f\uf980\uf981\uf982\uf983\uf984\uf985\uf986\uf987\uf988\uf989\uf98a\uf98b\uf98c\uf98d\uf98e\uf98f\uf990\uf991\uf992\uf993\uf994\uf995\uf996\uf997\uf998\uf999\uf99a\uf99b\uf99c\uf99d\uf99e\uf99f\uf9a0\uf9a1\uf9a2\uf9a3\uf9a4\uf9a5\uf9a6\uf9a7\uf9a8\uf9a9\uf9aa\uf9ab\uf9ac\uf9ad\uf9ae\uf9af\uf9b0\uf9b1\uf9b2\uf9b3\uf9b4\uf9b5\uf9b6\uf9b7\uf9b8\uf9b9\uf9ba\uf9bb\uf9bc\uf9bd\uf9be\uf9bf\uf9c0\uf9c1\uf9c2\uf9c3\uf9c4\uf9c5\uf9c6\uf9c7\uf9c8\uf9c9\uf9ca\uf9cb\uf9cc\uf9cd\uf9ce\uf9cf\uf9d0\uf9d1\uf9d2\uf9d3\uf9d4\uf9d5\uf9d6\uf9d7\uf9d8\uf9d9\uf9da\uf9db\uf9dc\uf9dd\uf9de\uf9df\uf9e0\uf9e1\uf9e2\uf9e3\uf9e4\uf9e5\uf9e6\uf9e7\uf9e8\uf9e9\uf9ea\uf9eb\uf9ec\uf9ed\uf9ee\uf9ef\uf9f0\uf9f1\uf9f2\uf9f3\uf9f4\uf9f5\uf9f6\uf9f7\uf9f8\uf9f9\uf9fa\uf9fb\uf9fc\uf9fd\uf9fe\uf9ff\ufa00\ufa01\ufa02\ufa03\ufa04\ufa05\ufa06\ufa07\ufa08\ufa09\ufa0a\ufa0b\ufa0c\ufa0d\ufa0e\ufa0f\ufa10\ufa11\ufa12\ufa13\ufa14\ufa15\ufa16\ufa17\ufa18\ufa19\ufa1a\ufa1b\ufa1c\ufa1d\ufa1e\ufa1f\ufa20\ufa21\ufa22\ufa23\ufa24\ufa25\ufa26\ufa27\ufa28\ufa29\ufa2a\ufa2b\ufa2c\ufa2d\ufa2e\ufa2f\ufa30\ufa31\ufa32\ufa33\ufa34\ufa35\ufa36\ufa37\ufa38\ufa39\ufa3a\ufa3b\ufa3c\ufa3d\ufa3e\ufa3f\ufa40\ufa41\ufa42\ufa43\ufa44\ufa45\ufa46\ufa47\ufa48\ufa49\ufa4a\ufa4b\ufa4c\ufa4d\ufa4e\ufa4f\ufa50\ufa51\ufa52\ufa53\ufa54\ufa55\ufa56\ufa57\ufa58\ufa59\ufa5a\ufa5b\ufa5c\ufa5d\ufa5e\ufa5f\ufa60\ufa61\ufa62\ufa63\ufa64\ufa65\ufa66\ufa67\ufa68\ufa69\ufa6a\ufa6b\ufa6d\ufa70\ufa71\ufa72\ufa73\ufa74\ufa75\ufa76\ufa77\ufa78\ufa79\ufa7a\ufa7b\ufa7c\ufa7d\ufa7e\ufa7f\ufa80\ufa81\ufa82\ufa83\ufa84\ufa85\ufa86\ufa87\ufa88\ufa89\ufa8a\ufa8b\ufa8c\ufa8d\ufa8e\ufa8f\ufa90\ufa91\ufa92\ufa93\ufa94\ufa95\ufa96\ufa97\ufa98\ufa99\ufa9a\ufa9b\ufa9c\ufa9d\ufa9e\ufa9f\ufaa0\ufaa1\ufaa2\ufaa3\ufaa4\ufaa5\ufaa6\ufaa7\ufaa8\ufaa9\ufaaa\ufaab\ufaac\ufaad\ufaae\ufaaf\ufab0\ufab1\ufab2\ufab3\ufab4\ufab5\ufab6\ufab7\ufab8\ufab9\ufaba\ufabb\ufabc\ufabd\ufabe\ufabf\ufac0\ufac1\ufac2\ufac3\ufac4\ufac5\ufac6\ufac7\ufac8\ufac9\ufaca\ufacb\ufacc\ufacd\uface\ufad2\ufad3\ufad4\ufad8\ufad9\ufb20\ufb21\ufb22\ufb23\ufb24\ufb25\ufb26\ufb27\ufb28\ufb50\ufb51\ufb52\ufb53\ufb54\ufb55\ufb56\ufb57\ufb58\ufb59\ufb5a\ufb5b\ufb5c\ufb5d\ufb5e\ufb5f\ufb60\ufb61\ufb62\ufb63\ufb64\ufb65\ufb66\ufb67\ufb68\ufb69\ufb6a\ufb6b\ufb6c\ufb6d\ufb6e\ufb6f\ufb70\ufb71\ufb72\ufb73\ufb74\ufb75\ufb76\ufb77\ufb78\ufb79\ufb7a\ufb7b\ufb7c\ufb7d\ufb7e\ufb7f\ufb80\ufb81\ufb82\ufb83\ufb84\ufb85\ufb86\ufb87\ufb88\ufb89\ufb8a\ufb8b\ufb8c\ufb8d\ufb8e\ufb8f\ufb90\ufb91\ufb92\ufb93\ufb94\ufb95\ufb96\ufb97\ufb98\ufb99\ufb9a\ufb9b\ufb9c\ufb9d\ufb9e\ufb9f\ufba0\ufba1\ufba2\ufba3\ufba4\ufba5\ufba6\ufba7\ufba8\ufba9\ufbaa\ufbab\ufbac\ufbad\ufbae\ufbaf\ufbb0\ufbb1\ufbd3\ufbd4\ufbd5\ufbd6\ufbd7\ufbd8\ufbd9\ufbda\ufbdb\ufbdc\ufbde\ufbdf\ufbe0\ufbe1\ufbe2\ufbe3\ufbe4\ufbe5\ufbe6\ufbe7\ufbe8\ufbe9\ufbfc\ufbfd\ufbfe\ufbff\ufe33\ufe34\ufe4d\ufe4e\ufe4f\ufe73\ufe80\ufe81\ufe82\ufe83\ufe84\ufe85\ufe86\ufe87\ufe88\ufe89\ufe8a\ufe8b\ufe8c\ufe8d\ufe8e\ufe8f\ufe90\ufe91\ufe92\ufe93\ufe94\ufe95\ufe96\ufe97\ufe98\ufe99\ufe9a\ufe9b\ufe9c\ufe9d\ufe9e\ufe9f\ufea0\ufea1\ufea2\ufea3\ufea4\ufea5\ufea6\ufea7\ufea8\ufea9\ufeaa\ufeab\ufeac\ufead\ufeae\ufeaf\ufeb0\ufeb1\ufeb2\ufeb3\ufeb4\ufeb5\ufeb6\ufeb7\ufeb8\ufeb9\ufeba\ufebb\ufebc\ufebd\ufebe\ufebf\ufec0\ufec1\ufec2\ufec3\ufec4\ufec5\ufec6\ufec7\ufec8\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed2\ufed3\ufed4\ufed5\ufed6\ufed7\ufed8\ufed9\ufeda\ufedb\ufedc\ufedd\ufede\ufedf\ufee0\ufee1\ufee2\ufee3\ufee4\ufee5\ufee6\ufee7\ufee8\ufee9\ufeea\ufeeb\ufeec\ufeed\ufeee\ufeef\ufef0\ufef1\ufef2\ufef3\ufef4\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a\uff3f\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a\uff66\uff67\uff68\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff70\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d\uffa0\uffa1\uffa2\uffa3\uffa4\uffa5\uffa6\uffa7\uffa8\uffa9\uffaa\uffab\uffac\uffad\uffae\uffaf\uffb0\uffb1\uffb2\uffb3\uffb4\uffb5\uffb6\uffb7\uffb8\uffb9\uffba\uffbb\uffbc\uffbd\uffbe\uffc2\uffc3\uffc4\uffc5\uffc6\uffc7\uffca\uffcb\uffcc\uffcd\uffce\uffcf\uffd2\uffd3\uffd4\uffd5\uffd6\uffd7\uffda\uffdb\uffdc' +xid_continue = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\xaa\xb5\xb7\xba\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0100\u0101\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115\u0116\u0117\u0118\u0119\u011a\u011b\u011c\u011d\u011e\u011f\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0138\u0139\u013a\u013b\u013c\u013d\u013e\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014a\u014b\u014c\u014d\u014e\u014f\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d\u017e\u017f\u0180\u0181\u0182\u0183\u0184\u0185\u0186\u0187\u0188\u0189\u018a\u018b\u018c\u018d\u018e\u018f\u0190\u0191\u0192\u0193\u0194\u0195\u0196\u0197\u0198\u0199\u019a\u019b\u019c\u019d\u019e\u019f\u01a0\u01a1\u01a2\u01a3\u01a4\u01a5\u01a6\u01a7\u01a8\u01a9\u01aa\u01ab\u01ac\u01ad\u01ae\u01af\u01b0\u01b1\u01b2\u01b3\u01b4\u01b5\u01b6\u01b7\u01b8\u01b9\u01ba\u01bb\u01bc\u01bd\u01be\u01bf\u01c0\u01c1\u01c2\u01c3\u01cd\u01ce\u01cf\u01d0\u01d1\u01d2\u01d3\u01d4\u01d5\u01d6\u01d7\u01d8\u01d9\u01da\u01db\u01dc\u01dd\u01de\u01df\u01e0\u01e1\u01e2\u01e3\u01e4\u01e5\u01e6\u01e7\u01e8\u01e9\u01ea\u01eb\u01ec\u01ed\u01ee\u01ef\u01f0\u01f4\u01f5\u01f6\u01f7\u01f8\u01f9\u01fa\u01fb\u01fc\u01fd\u01fe\u01ff\u0200\u0201\u0202\u0203\u0204\u0205\u0206\u0207\u0208\u0209\u020a\u020b\u020c\u020d\u020e\u020f\u0210\u0211\u0212\u0213\u0214\u0215\u0216\u0217\u0218\u0219\u021a\u021b\u021c\u021d\u021e\u021f\u0220\u0221\u0222\u0223\u0224\u0225\u0226\u0227\u0228\u0229\u022a\u022b\u022c\u022d\u022e\u022f\u0230\u0231\u0232\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023a\u023b\u023c\u023d\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u02ae\u02af\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02b9\u02ba\u02bb\u02bc\u02bd\u02be\u02bf\u02c0\u02c1\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d0\u02d1\u02e0\u02e1\u02e2\u02e3\u02e4\u02ec\u02ee\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030c\u030d\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033a\u033b\u033c\u033d\u033e\u033f\u0340\u0341\u0342\u0343\u0345\u0346\u0347\u0348\u0349\u034a\u034b\u034c\u034d\u034e\u034f\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035a\u035b\u035c\u035d\u035e\u035f\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036a\u036b\u036c\u036d\u036e\u036f\u0370\u0371\u0372\u0373\u0374\u0376\u0377\u037b\u037c\u037d\u037f\u0386\u0387\u0388\u0389\u038a\u038c\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03cf\u03d0\u03d1\u03d2\u03d3\u03d4\u03d5\u03d6\u03d7\u03d8\u03d9\u03da\u03db\u03dc\u03dd\u03de\u03df\u03e0\u03e1\u03e2\u03e3\u03e4\u03e5\u03e6\u03e7\u03e8\u03e9\u03ea\u03eb\u03ec\u03ed\u03ee\u03ef\u03f0\u03f1\u03f2\u03f3\u03f4\u03f5\u03f7\u03f8\u03f9\u03fa\u03fb\u03fc\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0460\u0461\u0462\u0463\u0464\u0465\u0466\u0467\u0468\u0469\u046a\u046b\u046c\u046d\u046e\u046f\u0470\u0471\u0472\u0473\u0474\u0475\u0476\u0477\u0478\u0479\u047a\u047b\u047c\u047d\u047e\u047f\u0480\u0481\u0483\u0484\u0485\u0486\u0487\u048a\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u0492\u0493\u0494\u0495\u0496\u0497\u0498\u0499\u049a\u049b\u049c\u049d\u049e\u049f\u04a0\u04a1\u04a2\u04a3\u04a4\u04a5\u04a6\u04a7\u04a8\u04a9\u04aa\u04ab\u04ac\u04ad\u04ae\u04af\u04b0\u04b1\u04b2\u04b3\u04b4\u04b5\u04b6\u04b7\u04b8\u04b9\u04ba\u04bb\u04bc\u04bd\u04be\u04bf\u04c0\u04c1\u04c2\u04c3\u04c4\u04c5\u04c6\u04c7\u04c8\u04c9\u04ca\u04cb\u04cc\u04cd\u04ce\u04cf\u04d0\u04d1\u04d2\u04d3\u04d4\u04d5\u04d6\u04d7\u04d8\u04d9\u04da\u04db\u04dc\u04dd\u04de\u04df\u04e0\u04e1\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u04f3\u04f4\u04f5\u04f6\u04f7\u04f8\u04f9\u04fa\u04fb\u04fc\u04fd\u04fe\u04ff\u0500\u0501\u0502\u0503\u0504\u0505\u0506\u0507\u0508\u0509\u050a\u050b\u050c\u050d\u050e\u050f\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u0559\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059a\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u05a9\u05aa\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05ba\u05bb\u05bc\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u0610\u0611\u0612\u0613\u0614\u0615\u0616\u0617\u0618\u0619\u061a\u0620\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u063b\u063c\u063d\u063e\u063f\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u065f\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u066e\u066f\u0670\u0671\u0672\u0673\u0674\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u069c\u069d\u069e\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a5\u06a6\u06a7\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d5\u06d6\u06d7\u06d8\u06d9\u06da\u06db\u06dc\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e5\u06e6\u06e7\u06e8\u06ea\u06eb\u06ec\u06ed\u06ee\u06ef\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u06fa\u06fb\u06fc\u06ff\u0710\u0711\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071d\u071e\u071f\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u073b\u073c\u073d\u073e\u073f\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u07af\u07b0\u07b1\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07fa\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u082d\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08d4\u08d5\u08d6\u08d7\u08d8\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u08e0\u08e1\u08e3\u08e4\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u08ee\u08ef\u08f0\u08f1\u08f2\u08f3\u08f4\u08f5\u08f6\u08f7\u08f8\u08f9\u08fa\u08fb\u08fc\u08fd\u08fe\u08ff\u0900\u0901\u0902\u0903\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093a\u093b\u093c\u093d\u093e\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0949\u094a\u094b\u094c\u094d\u094e\u094f\u0950\u0951\u0952\u0953\u0954\u0955\u0956\u0957\u0960\u0961\u0962\u0963\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097d\u097e\u097f\u0980\u0981\u0982\u0983\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b2\u09b6\u09b7\u09b8\u09b9\u09bc\u09bd\u09be\u09bf\u09c0\u09c1\u09c2\u09c3\u09c4\u09c7\u09c8\u09cb\u09cc\u09cd\u09ce\u09d7\u09e0\u09e1\u09e2\u09e3\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09f0\u09f1\u0a01\u0a02\u0a03\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0f\u0a10\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a32\u0a35\u0a38\u0a39\u0a3c\u0a3e\u0a3f\u0a40\u0a41\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a4d\u0a51\u0a5c\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a70\u0a71\u0a72\u0a73\u0a74\u0a75\u0a81\u0a82\u0a83\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab3\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0abc\u0abd\u0abe\u0abf\u0ac0\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac7\u0ac8\u0ac9\u0acb\u0acc\u0acd\u0ad0\u0ae0\u0ae1\u0ae2\u0ae3\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0af9\u0b01\u0b02\u0b03\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b32\u0b33\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3c\u0b3d\u0b3e\u0b3f\u0b40\u0b41\u0b42\u0b43\u0b44\u0b47\u0b48\u0b4b\u0b4c\u0b4d\u0b56\u0b57\u0b5f\u0b60\u0b61\u0b62\u0b63\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0b71\u0b82\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0ba9\u0baa\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0bbe\u0bbf\u0bc0\u0bc1\u0bc2\u0bc6\u0bc7\u0bc8\u0bca\u0bcb\u0bcc\u0bcd\u0bd0\u0bd7\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c00\u0c01\u0c02\u0c03\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c34\u0c35\u0c36\u0c37\u0c38\u0c39\u0c3d\u0c3e\u0c3f\u0c40\u0c41\u0c42\u0c43\u0c44\u0c46\u0c47\u0c48\u0c4a\u0c4b\u0c4c\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c5a\u0c60\u0c61\u0c62\u0c63\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0c80\u0c81\u0c82\u0c83\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cbc\u0cbd\u0cbe\u0cbf\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc6\u0cc7\u0cc8\u0cca\u0ccb\u0ccc\u0ccd\u0cd5\u0cd6\u0cde\u0ce0\u0ce1\u0ce2\u0ce3\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0cf1\u0cf2\u0d01\u0d02\u0d03\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43\u0d44\u0d46\u0d47\u0d48\u0d4a\u0d4b\u0d4c\u0d4d\u0d4e\u0d54\u0d55\u0d56\u0d57\u0d5f\u0d60\u0d61\u0d62\u0d63\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d82\u0d83\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0dca\u0dcf\u0dd0\u0dd1\u0dd2\u0dd3\u0dd4\u0dd6\u0dd8\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0ddf\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df2\u0df3\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eaf\u0eb0\u0eb1\u0eb2\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebb\u0ebc\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec6\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0ede\u0edf\u0f00\u0f18\u0f19\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f40\u0f41\u0f42\u0f44\u0f45\u0f46\u0f47\u0f49\u0f4a\u0f4b\u0f4c\u0f4e\u0f4f\u0f50\u0f51\u0f53\u0f54\u0f55\u0f56\u0f58\u0f59\u0f5a\u0f5b\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f6a\u0f6b\u0f6c\u0f71\u0f72\u0f74\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f7f\u0f80\u0f82\u0f83\u0f84\u0f86\u0f87\u0f88\u0f89\u0f8a\u0f8b\u0f8c\u0f8d\u0f8e\u0f8f\u0f90\u0f91\u0f92\u0f94\u0f95\u0f96\u0f97\u0f99\u0f9a\u0f9b\u0f9c\u0f9e\u0f9f\u0fa0\u0fa1\u0fa3\u0fa4\u0fa5\u0fa6\u0fa8\u0fa9\u0faa\u0fab\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fba\u0fbb\u0fbc\u0fc6\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u100d\u100e\u100f\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101a\u101b\u101c\u101d\u101e\u101f\u1020\u1021\u1022\u1023\u1024\u1025\u1026\u1027\u1028\u1029\u102a\u102b\u102c\u102d\u102e\u102f\u1030\u1031\u1032\u1033\u1034\u1035\u1036\u1037\u1038\u1039\u103a\u103b\u103c\u103d\u103e\u103f\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1050\u1051\u1052\u1053\u1054\u1055\u1056\u1057\u1058\u1059\u105a\u105b\u105c\u105d\u105e\u105f\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106a\u106b\u106c\u106d\u106e\u106f\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108a\u108b\u108c\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u10c7\u10cd\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6\u10f7\u10f8\u10f9\u10fa\u10fc\u10fd\u10fe\u10ff\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110d\u110e\u110f\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111a\u111b\u111c\u111d\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112a\u112b\u112c\u112d\u112e\u112f\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115a\u115b\u115c\u115d\u115e\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u116b\u116c\u116d\u116e\u116f\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u119f\u11a0\u11a1\u11a2\u11a3\u11a4\u11a5\u11a6\u11a7\u11a8\u11a9\u11aa\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b4\u11b5\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u11d5\u11d6\u11d7\u11d8\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135a\u135d\u135e\u135f\u1369\u1370\u1371\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u138e\u138f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u13ab\u13ac\u13ad\u13ae\u13af\u13b0\u13b1\u13b2\u13b3\u13b4\u13b5\u13b6\u13b7\u13b8\u13b9\u13ba\u13bb\u13bc\u13bd\u13be\u13bf\u13c0\u13c1\u13c2\u13c3\u13c4\u13c5\u13c6\u13c7\u13c8\u13c9\u13ca\u13cb\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u13d8\u13d9\u13da\u13db\u13dc\u13dd\u13de\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u13ee\u13ef\u13f0\u13f1\u13f2\u13f3\u13f4\u13f5\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157c\u157d\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u166f\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u16ee\u16ef\u16f0\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1712\u1713\u1714\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1732\u1733\u1734\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1752\u1753\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1772\u1773\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17b4\u17b5\u17b6\u17b7\u17b8\u17b9\u17ba\u17bb\u17bc\u17bd\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17c6\u17c7\u17c8\u17c9\u17ca\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17d2\u17d3\u17d7\u17dc\u17dd\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u180b\u180c\u180d\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182a\u182b\u182c\u182d\u182e\u182f\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183a\u183b\u183c\u183d\u183e\u183f\u1840\u1841\u1842\u1843\u1844\u1845\u1846\u1847\u1848\u1849\u184a\u184b\u184c\u184d\u184e\u184f\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185a\u185b\u185c\u185d\u185e\u185f\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186a\u186b\u186c\u186d\u186e\u186f\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188a\u188b\u188c\u188d\u188e\u188f\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189a\u189b\u189c\u189d\u189e\u189f\u18a0\u18a1\u18a2\u18a3\u18a4\u18a5\u18a6\u18a7\u18a8\u18a9\u18aa\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190a\u190b\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u191d\u191e\u1920\u1921\u1922\u1923\u1924\u1925\u1926\u1927\u1928\u1929\u192a\u192b\u1930\u1931\u1932\u1933\u1934\u1935\u1936\u1937\u1938\u1939\u193a\u193b\u1946\u1947\u1948\u1949\u194a\u194b\u194c\u194d\u194e\u194f\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19aa\u19ab\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u19c8\u19c9\u19d0\u19d1\u19d2\u19d3\u19d4\u19d5\u19d6\u19d7\u19d8\u19d9\u19da\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u1a17\u1a18\u1a19\u1a1a\u1a1b\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a53\u1a54\u1a55\u1a56\u1a57\u1a58\u1a59\u1a5a\u1a5b\u1a5c\u1a5d\u1a5e\u1a60\u1a61\u1a62\u1a63\u1a64\u1a65\u1a66\u1a67\u1a68\u1a69\u1a6a\u1a6b\u1a6c\u1a6d\u1a6e\u1a6f\u1a70\u1a71\u1a72\u1a73\u1a74\u1a75\u1a76\u1a77\u1a78\u1a79\u1a7a\u1a7b\u1a7c\u1a7f\u1a80\u1a81\u1a82\u1a83\u1a84\u1a85\u1a86\u1a87\u1a88\u1a89\u1a90\u1a91\u1a92\u1a93\u1a94\u1a95\u1a96\u1a97\u1a98\u1a99\u1aa7\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abb\u1abc\u1abd\u1b00\u1b01\u1b02\u1b03\u1b04\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b23\u1b24\u1b25\u1b26\u1b27\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u1b34\u1b35\u1b36\u1b37\u1b38\u1b39\u1b3a\u1b3b\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u1b50\u1b51\u1b52\u1b53\u1b54\u1b55\u1b56\u1b57\u1b58\u1b59\u1b6b\u1b6c\u1b6d\u1b6e\u1b6f\u1b70\u1b71\u1b72\u1b73\u1b80\u1b81\u1b82\u1b83\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u1ba1\u1ba2\u1ba3\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u1bb1\u1bb2\u1bb3\u1bb4\u1bb5\u1bb6\u1bb7\u1bb8\u1bb9\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1be6\u1be7\u1be8\u1be9\u1bea\u1beb\u1bec\u1bed\u1bee\u1bef\u1bf0\u1bf1\u1bf2\u1bf3\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c1b\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c24\u1c25\u1c26\u1c27\u1c28\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\u1c36\u1c37\u1c40\u1c41\u1c42\u1c43\u1c44\u1c45\u1c46\u1c47\u1c48\u1c49\u1c4d\u1c4e\u1c4f\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c80\u1c81\u1c82\u1c83\u1c84\u1c85\u1c86\u1c87\u1c88\u1cd0\u1cd1\u1cd2\u1cd4\u1cd5\u1cd6\u1cd7\u1cd8\u1cd9\u1cda\u1cdb\u1cdc\u1cdd\u1cde\u1cdf\u1ce0\u1ce1\u1ce2\u1ce3\u1ce4\u1ce5\u1ce6\u1ce7\u1ce8\u1ce9\u1cea\u1ceb\u1cec\u1ced\u1cee\u1cef\u1cf0\u1cf1\u1cf2\u1cf3\u1cf4\u1cf5\u1cf6\u1cf8\u1cf9\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u1d06\u1d07\u1d08\u1d09\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u1d0f\u1d10\u1d11\u1d12\u1d13\u1d14\u1d15\u1d16\u1d17\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u1d24\u1d25\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u1d36\u1d37\u1d38\u1d39\u1d3a\u1d3b\u1d3c\u1d3d\u1d3e\u1d3f\u1d40\u1d41\u1d42\u1d43\u1d44\u1d45\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d54\u1d55\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5c\u1d5d\u1d5e\u1d5f\u1d60\u1d61\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u1d70\u1d71\u1d72\u1d73\u1d74\u1d75\u1d76\u1d77\u1d78\u1d79\u1d7a\u1d7b\u1d7c\u1d7d\u1d7e\u1d7f\u1d80\u1d81\u1d82\u1d83\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1d9b\u1d9c\u1d9d\u1d9e\u1d9f\u1da0\u1da1\u1da2\u1da3\u1da4\u1da5\u1da6\u1da7\u1da8\u1da9\u1daa\u1dab\u1dac\u1dad\u1dae\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u1dbc\u1dbd\u1dbe\u1dbf\u1dc0\u1dc1\u1dc2\u1dc3\u1dc4\u1dc5\u1dc6\u1dc7\u1dc8\u1dc9\u1dca\u1dcb\u1dcc\u1dcd\u1dce\u1dcf\u1dd0\u1dd1\u1dd2\u1dd3\u1dd4\u1dd5\u1dd6\u1dd7\u1dd8\u1dd9\u1dda\u1ddb\u1ddc\u1ddd\u1dde\u1ddf\u1de0\u1de1\u1de2\u1de3\u1de4\u1de5\u1de6\u1de7\u1de8\u1de9\u1dea\u1deb\u1dec\u1ded\u1dee\u1def\u1df0\u1df1\u1df2\u1df3\u1df4\u1df5\u1dfb\u1dfc\u1dfd\u1dfe\u1dff\u1e00\u1e01\u1e02\u1e03\u1e04\u1e05\u1e06\u1e07\u1e08\u1e09\u1e0a\u1e0b\u1e0c\u1e0d\u1e0e\u1e0f\u1e10\u1e11\u1e12\u1e13\u1e14\u1e15\u1e16\u1e17\u1e18\u1e19\u1e1a\u1e1b\u1e1c\u1e1d\u1e1e\u1e1f\u1e20\u1e21\u1e22\u1e23\u1e24\u1e25\u1e26\u1e27\u1e28\u1e29\u1e2a\u1e2b\u1e2c\u1e2d\u1e2e\u1e2f\u1e30\u1e31\u1e32\u1e33\u1e34\u1e35\u1e36\u1e37\u1e38\u1e39\u1e3a\u1e3b\u1e3c\u1e3d\u1e3e\u1e3f\u1e40\u1e41\u1e42\u1e43\u1e44\u1e45\u1e46\u1e47\u1e48\u1e49\u1e4a\u1e4b\u1e4c\u1e4d\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u1e54\u1e55\u1e56\u1e57\u1e58\u1e59\u1e5a\u1e5b\u1e5c\u1e5d\u1e5e\u1e5f\u1e60\u1e61\u1e62\u1e63\u1e64\u1e65\u1e66\u1e67\u1e68\u1e69\u1e6a\u1e6b\u1e6c\u1e6d\u1e6e\u1e6f\u1e70\u1e71\u1e72\u1e73\u1e74\u1e75\u1e76\u1e77\u1e78\u1e79\u1e7a\u1e7b\u1e7c\u1e7d\u1e7e\u1e7f\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1e86\u1e87\u1e88\u1e89\u1e8a\u1e8b\u1e8c\u1e8d\u1e8e\u1e8f\u1e90\u1e91\u1e92\u1e93\u1e94\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9b\u1e9c\u1e9d\u1e9e\u1e9f\u1ea0\u1ea1\u1ea2\u1ea3\u1ea4\u1ea5\u1ea6\u1ea7\u1ea8\u1ea9\u1eaa\u1eab\u1eac\u1ead\u1eae\u1eaf\u1eb0\u1eb1\u1eb2\u1eb3\u1eb4\u1eb5\u1eb6\u1eb7\u1eb8\u1eb9\u1eba\u1ebb\u1ebc\u1ebd\u1ebe\u1ebf\u1ec0\u1ec1\u1ec2\u1ec3\u1ec4\u1ec5\u1ec6\u1ec7\u1ec8\u1ec9\u1eca\u1ecb\u1ecc\u1ecd\u1ece\u1ecf\u1ed0\u1ed1\u1ed2\u1ed3\u1ed4\u1ed5\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u1edf\u1ee0\u1ee1\u1ee2\u1ee3\u1ee4\u1ee5\u1ee6\u1ee7\u1ee8\u1ee9\u1eea\u1eeb\u1eec\u1eed\u1eee\u1eef\u1ef0\u1ef1\u1ef2\u1ef3\u1ef4\u1ef5\u1ef6\u1ef7\u1ef8\u1ef9\u1efa\u1efb\u1efc\u1efd\u1efe\u1eff\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f59\u1f5b\u1f5d\u1f5f\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f88\u1f89\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fa8\u1fa9\u1faa\u1fab\u1fac\u1fad\u1fae\u1faf\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fb8\u1fb9\u1fba\u1fbb\u1fbc\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fc8\u1fc9\u1fca\u1fcb\u1fcc\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fd8\u1fd9\u1fda\u1fdb\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u1ff8\u1ff9\u1ffa\u1ffb\u1ffc\u203f\u2040\u2054\u2071\u207f\u2090\u2091\u2092\u2093\u2094\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u20d0\u20d1\u20d2\u20d3\u20d4\u20d5\u20d6\u20d7\u20d8\u20d9\u20da\u20db\u20dc\u20e1\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u20ec\u20ed\u20ee\u20ef\u20f0\u2102\u2107\u210a\u210b\u210c\u210d\u210e\u210f\u2110\u2111\u2112\u2113\u2115\u2118\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u212e\u212f\u2130\u2131\u2132\u2133\u2134\u2135\u2136\u2137\u2138\u2139\u213c\u213d\u213e\u213f\u2145\u2146\u2147\u2148\u2149\u214e\u2160\u2164\u2169\u216c\u216d\u216e\u216f\u2170\u2174\u2179\u217c\u217d\u217e\u217f\u2180\u2181\u2182\u2183\u2184\u2185\u2186\u2187\u2188\u2c00\u2c01\u2c02\u2c03\u2c04\u2c05\u2c06\u2c07\u2c08\u2c09\u2c0a\u2c0b\u2c0c\u2c0d\u2c0e\u2c0f\u2c10\u2c11\u2c12\u2c13\u2c14\u2c15\u2c16\u2c17\u2c18\u2c19\u2c1a\u2c1b\u2c1c\u2c1d\u2c1e\u2c1f\u2c20\u2c21\u2c22\u2c23\u2c24\u2c25\u2c26\u2c27\u2c28\u2c29\u2c2a\u2c2b\u2c2c\u2c2d\u2c2e\u2c30\u2c31\u2c32\u2c33\u2c34\u2c35\u2c36\u2c37\u2c38\u2c39\u2c3a\u2c3b\u2c3c\u2c3d\u2c3e\u2c3f\u2c40\u2c41\u2c42\u2c43\u2c44\u2c45\u2c46\u2c47\u2c48\u2c49\u2c4a\u2c4b\u2c4c\u2c4d\u2c4e\u2c4f\u2c50\u2c51\u2c52\u2c53\u2c54\u2c55\u2c56\u2c57\u2c58\u2c59\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2c60\u2c61\u2c62\u2c63\u2c64\u2c65\u2c66\u2c67\u2c68\u2c69\u2c6a\u2c6b\u2c6c\u2c6d\u2c6e\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2c80\u2c81\u2c82\u2c83\u2c84\u2c85\u2c86\u2c87\u2c88\u2c89\u2c8a\u2c8b\u2c8c\u2c8d\u2c8e\u2c8f\u2c90\u2c91\u2c92\u2c93\u2c94\u2c95\u2c96\u2c97\u2c98\u2c99\u2c9a\u2c9b\u2c9c\u2c9d\u2c9e\u2c9f\u2ca0\u2ca1\u2ca2\u2ca3\u2ca4\u2ca5\u2ca6\u2ca7\u2ca8\u2ca9\u2caa\u2cab\u2cac\u2cad\u2cae\u2caf\u2cb0\u2cb1\u2cb2\u2cb3\u2cb4\u2cb5\u2cb6\u2cb7\u2cb8\u2cb9\u2cba\u2cbb\u2cbc\u2cbd\u2cbe\u2cbf\u2cc0\u2cc1\u2cc2\u2cc3\u2cc4\u2cc5\u2cc6\u2cc7\u2cc8\u2cc9\u2cca\u2ccb\u2ccc\u2ccd\u2cce\u2ccf\u2cd0\u2cd1\u2cd2\u2cd3\u2cd4\u2cd5\u2cd6\u2cd7\u2cd8\u2cd9\u2cda\u2cdb\u2cdc\u2cdd\u2cde\u2cdf\u2ce0\u2ce1\u2ce2\u2ce3\u2ce4\u2ceb\u2cec\u2ced\u2cee\u2cef\u2cf0\u2cf1\u2cf2\u2cf3\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\u2d27\u2d2d\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d66\u2d67\u2d6f\u2d7f\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u2de0\u2de1\u2de2\u2de3\u2de4\u2de5\u2de6\u2de7\u2de8\u2de9\u2dea\u2deb\u2dec\u2ded\u2dee\u2def\u2df0\u2df1\u2df2\u2df3\u2df4\u2df5\u2df6\u2df7\u2df8\u2df9\u2dfa\u2dfb\u2dfc\u2dfd\u2dfe\u2dff\u2e2f\u3005\u3006\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u302a\u302b\u302c\u302d\u302e\u302f\u3031\u3032\u3033\u3034\u3035\u3038\u3039\u303a\u303b\u303c\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u3099\u309a\u309d\u309e\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30fc\u30fd\u30fe\u3105\u3106\u3107\u3108\u3109\u310a\u310b\u310c\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311b\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312a\u312b\u312c\u312d\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313b\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31b8\u31b9\u31ba\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u3463\u3464\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u346e\u346f\u3470\u3471\u3472\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u3499\u349a\u349b\u349c\u349d\u349e\u349f\u34a0\u34a1\u34a2\u34a3\u34a4\u34a5\u34a6\u34a7\u34a8\u34a9\u34aa\u34ab\u34ac\u34ad\u34ae\u34af\u34b0\u34b1\u34b2\u34b3\u34b4\u34b5\u34b6\u34b7\u34b8\u34b9\u34ba\u34bb\u34bc\u34bd\u34be\u34bf\u34c0\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cb\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d3\u34d4\u34d5\u34d6\u34d7\u34d8\u34d9\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u34e7\u34e8\u34e9\u34ea\u34eb\u34ec\u34ed\u34ee\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u350c\u350d\u350e\u350f\u3510\u3511\u3512\u3513\u3514\u3515\u3516\u3517\u3518\u3519\u351a\u351b\u351c\u351d\u351e\u351f\u3520\u3521\u3522\u3523\u3524\u3525\u3526\u3527\u3528\u3529\u352a\u352b\u352c\u352d\u352e\u352f\u3530\u3531\u3532\u3533\u3534\u3535\u3536\u3537\u3538\u3539\u353a\u353b\u353c\u353d\u353e\u353f\u3540\u3541\u3542\u3543\u3544\u3545\u3546\u3547\u3548\u3549\u354a\u354b\u354c\u354d\u354e\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558\u3559\u355a\u355b\u355c\u355d\u355e\u355f\u3560\u3561\u3562\u3563\u3564\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3605\u3606\u3607\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u3677\u3678\u3679\u367a\u367b\u367c\u367d\u367e\u367f\u3680\u3681\u3682\u3683\u3684\u3685\u3686\u3687\u3688\u3689\u368a\u368b\u368c\u368d\u368e\u368f\u3690\u3691\u3692\u3693\u3694\u3695\u3696\u3697\u3698\u3699\u369a\u369b\u369c\u369d\u369e\u369f\u36a0\u36a1\u36a2\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e0\u36e1\u36e2\u36e3\u36e4\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u3723\u3724\u3725\u3726\u3727\u3728\u3729\u372a\u372b\u372c\u372d\u372e\u372f\u3730\u3731\u3732\u3733\u3734\u3735\u3736\u3737\u3738\u3739\u373a\u373b\u373c\u373d\u373e\u373f\u3740\u3741\u3742\u3743\u3744\u3745\u3746\u3747\u3748\u3749\u374a\u374b\u374c\u374d\u374e\u374f\u3750\u3751\u3752\u3753\u3754\u3755\u3756\u3757\u3758\u3759\u375a\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u3762\u3763\u3764\u3765\u3766\u3767\u3768\u3769\u376a\u376b\u376c\u376d\u376e\u376f\u3770\u3771\u3772\u3773\u3774\u3775\u3776\u3777\u3778\u3779\u377a\u377b\u377c\u377d\u377e\u377f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u3787\u3788\u3789\u378a\u378b\u378c\u378d\u378e\u378f\u3790\u3791\u3792\u3793\u3794\u3795\u3796\u3797\u3798\u3799\u379a\u379b\u379c\u379d\u379e\u379f\u37a0\u37a1\u37a2\u37a3\u37a4\u37a5\u37a6\u37a7\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b7\u37b8\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u37c4\u37c5\u37c6\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9a\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da3\u3da4\u3da5\u3da6\u3da7\u3da8\u3da9\u3daa\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e36\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f75\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3fef\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u408c\u408d\u408e\u408f\u4090\u4091\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u409e\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40df\u40e0\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u40f0\u40f1\u40f2\u40f3\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4100\u4101\u4102\u4103\u4104\u4105\u4106\u4107\u4108\u4109\u410a\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4122\u4123\u4124\u4125\u4126\u4127\u4128\u4129\u412a\u412b\u412c\u412d\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u417e\u417f\u4180\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u4188\u4189\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4191\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a3\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c2\u41c3\u41c4\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d3\u41d4\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4274\u4275\u4276\u4277\u4278\u4279\u427a\u427b\u427c\u427d\u427e\u427f\u4280\u4281\u4282\u4283\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4290\u4291\u4292\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u429a\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b4\u42b5\u42b6\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u4316\u4317\u4318\u4319\u431a\u431b\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u432e\u432f\u4330\u4331\u4332\u4333\u4334\u4335\u4336\u4337\u4338\u4339\u433a\u433b\u433c\u433d\u433e\u433f\u4340\u4341\u4342\u4343\u4344\u4345\u4346\u4347\u4348\u4349\u434a\u434b\u434c\u434d\u434e\u434f\u4350\u4351\u4352\u4353\u4354\u4355\u4356\u4357\u4358\u4359\u435a\u435b\u435c\u435d\u435e\u435f\u4360\u4361\u4362\u4363\u4364\u4365\u4366\u4367\u4368\u4369\u436a\u436b\u436c\u436d\u436e\u436f\u4370\u4371\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u437f\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4390\u4391\u4392\u4393\u4394\u4395\u4396\u4397\u4398\u4399\u439a\u439b\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43aa\u43ab\u43ac\u43ad\u43ae\u43af\u43b0\u43b1\u43b2\u43b3\u43b4\u43b5\u43b6\u43b7\u43b8\u43b9\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c0\u43c1\u43c2\u43c3\u43c4\u43c5\u43c6\u43c7\u43c8\u43c9\u43ca\u43cb\u43cc\u43cd\u43ce\u43cf\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u443e\u443f\u4440\u4441\u4442\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445b\u445c\u445d\u445e\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u45d6\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u460b\u460c\u460d\u460e\u460f\u4610\u4611\u4612\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u4651\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u466e\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u4721\u4722\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u472b\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u4754\u4755\u4756\u4757\u4758\u4759\u475a\u475b\u475c\u475d\u475e\u475f\u4760\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u4775\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u47b9\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u47c7\u47c8\u47c9\u47ca\u47cb\u47cc\u47cd\u47ce\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d6\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fc\u47fd\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u481e\u481f\u4820\u4821\u4822\u4823\u4824\u4825\u4826\u4827\u4828\u4829\u482a\u482b\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u4899\u489a\u489b\u489c\u489d\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u496f\u4970\u4971\u4972\u4973\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u497f\u4980\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a1b\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u4a30\u4a31\u4a32\u4a33\u4a34\u4a35\u4a36\u4a37\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4a3f\u4a40\u4a41\u4a42\u4a43\u4a44\u4a45\u4a46\u4a47\u4a48\u4a49\u4a4a\u4a4b\u4a4c\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u4a5f\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u4a85\u4a86\u4a87\u4a88\u4a89\u4a8a\u4a8b\u4a8c\u4a8d\u4a8e\u4a8f\u4a90\u4a91\u4a92\u4a93\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aab\u4aac\u4aad\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab4\u4ab5\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u4abf\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u4ae8\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af8\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4be0\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u4bf5\u4bf6\u4bf7\u4bf8\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d2a\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d41\u4d42\u4d43\u4d44\u4d45\u4d46\u4d47\u4d48\u4d49\u4d4a\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u4d51\u4d52\u4d53\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5b\u4d5c\u4d5d\u4d5e\u4d5f\u4d60\u4d61\u4d62\u4d63\u4d64\u4d65\u4d66\u4d67\u4d68\u4d69\u4d6a\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d75\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7b\u4d7c\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d86\u4d87\u4d88\u4d89\u4d8a\u4d8b\u4d8c\u4d8d\u4d8e\u4d8f\u4d90\u4d91\u4d92\u4d93\u4d94\u4d95\u4d96\u4d97\u4d98\u4d99\u4d9a\u4d9b\u4d9c\u4d9d\u4d9e\u4d9f\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5\u4da6\u4da7\u4da8\u4da9\u4daa\u4dab\u4dac\u4dad\u4dae\u4daf\u4db0\u4db1\u4db2\u4db3\u4db4\u4db5\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e16\u4e17\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e21\u4e22\u4e23\u4e24\u4e25\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e39\u4e3a\u4e3b\u4e3c\u4e3d\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u4e45\u4e46\u4e47\u4e48\u4e49\u4e4a\u4e4b\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e62\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u4e79\u4e7a\u4e7b\u4e7c\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e83\u4e84\u4e85\u4e86\u4e87\u4e88\u4e89\u4e8a\u4e8b\u4e8c\u4e8d\u4e8e\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u4ea8\u4ea9\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4eb8\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512b\u512c\u512d\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513a\u513b\u513c\u513d\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u5159\u515a\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u5166\u5167\u5168\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u5177\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5180\u5181\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u5195\u5196\u5197\u5198\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u51a9\u51aa\u51ab\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d6\u51d7\u51d8\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u5268\u5269\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5272\u5273\u5274\u5275\u5276\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u5280\u5281\u5282\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u5290\u5291\u5292\u5293\u5294\u5295\u5296\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d6\u52d7\u52d8\u52d9\u52da\u52db\u52dc\u52dd\u52de\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u5311\u5312\u5313\u5314\u5315\u5316\u5317\u5318\u5319\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u5326\u5327\u5328\u5329\u532a\u532b\u532c\u532d\u532e\u532f\u5330\u5331\u5332\u5333\u5334\u5335\u5336\u5337\u5338\u5339\u533a\u533b\u533c\u533d\u533e\u533f\u5340\u5341\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u534b\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u5354\u5355\u5356\u5357\u5358\u5359\u535a\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u536b\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u5379\u537a\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u538e\u538f\u5390\u5391\u5392\u5393\u5394\u5395\u5396\u5397\u5398\u5399\u539a\u539b\u539c\u539d\u539e\u539f\u53a0\u53a1\u53a2\u53a3\u53a4\u53a5\u53a6\u53a7\u53a8\u53a9\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5651\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u56ba\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56cc\u56cd\u56ce\u56cf\u56d0\u56d1\u56d2\u56d3\u56d4\u56d5\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u56ff\u5700\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u5725\u5726\u5727\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5900\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a90\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b34\u5b35\u5b36\u5b37\u5b38\u5b39\u5b3a\u5b3b\u5b3c\u5b3d\u5b3e\u5b3f\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b4f\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u5b68\u5b69\u5b6a\u5b6b\u5b6c\u5b6d\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b74\u5b75\u5b76\u5b77\u5b78\u5b79\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b81\u5b82\u5b83\u5b84\u5b85\u5b86\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba7\u5ba8\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c2d\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u5c5e\u5c5f\u5c60\u5c61\u5c62\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d\u5c6e\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4a\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u61f6\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u6203\u6204\u6205\u6206\u6207\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u6214\u6215\u6216\u6217\u6218\u6219\u621a\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6226\u6227\u6228\u6229\u622a\u622b\u622c\u622d\u622e\u622f\u6230\u6231\u6232\u6233\u6234\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u623d\u623e\u623f\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u625f\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6278\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b2\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u6526\u6527\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u658b\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u66ee\u66ef\u66f0\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u66fd\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6715\u6716\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6994\u6995\u6996\u6997\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6aeb\u6aec\u6aed\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0c\u6b0d\u6b0e\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b23\u6b24\u6b25\u6b26\u6b27\u6b28\u6b29\u6b2a\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b5e\u6b5f\u6b60\u6b61\u6b62\u6b63\u6b64\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b6f\u6b70\u6b71\u6b72\u6b73\u6b74\u6b75\u6b76\u6b77\u6b78\u6b79\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u6bac\u6bad\u6bae\u6baf\u6bb0\u6bb1\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bba\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc5\u6bc6\u6bc7\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u6bd9\u6bda\u6bdb\u6bdc\u6bdd\u6bde\u6bdf\u6be0\u6be1\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u6beb\u6bec\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0d\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d16\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecb\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edc\u6edd\u6ede\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3d\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd2\u6fd3\u6fd4\u6fd5\u6fd6\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u7179\u717a\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a6\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u7245\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7260\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u727a\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7345\u7346\u7347\u7348\u7349\u734a\u734b\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u7375\u7376\u7377\u7378\u7379\u737a\u737b\u737c\u737d\u737e\u737f\u7380\u7381\u7382\u7383\u7384\u7385\u7386\u7387\u7388\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74e3\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u750f\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751b\u751c\u751d\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u7527\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7568\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7572\u7573\u7574\u7575\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u757f\u7580\u7581\u7582\u7583\u7584\u7585\u7586\u7587\u7588\u7589\u758a\u758b\u758c\u758d\u758e\u758f\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u7629\u762a\u762b\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u764d\u764e\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76bf\u76c0\u76c1\u76c2\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e0\u76e1\u76e2\u76e3\u76e4\u76e5\u76e6\u76e7\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7\u77d8\u77d9\u77da\u77db\u77dc\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u7878\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u79a9\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79b7\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a76\u7a77\u7a78\u7a79\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac5\u7ac6\u7ac7\u7ac8\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc0\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc0\u7cc1\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u7ce8\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd0\u7dd1\u7dd2\u7dd3\u7dd4\u7dd5\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4b\u7e4c\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e71\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e93\u7e94\u7e95\u7e96\u7e97\u7e98\u7e99\u7e9a\u7e9b\u7e9c\u7e9d\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u7f35\u7f36\u7f37\u7f38\u7f39\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f3f\u7f40\u7f41\u7f42\u7f43\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u7f50\u7f51\u7f52\u7f53\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f65\u7f66\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8061\u8062\u8063\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8073\u8074\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a4\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81dc\u81dd\u81de\u81df\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u81e6\u81e7\u81e8\u81e9\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u81f5\u81f6\u81f7\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u8211\u8212\u8213\u8214\u8215\u8216\u8217\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u821f\u8220\u8221\u8222\u8223\u8224\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u823d\u823e\u823f\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8279\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u842a\u842b\u842c\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u8613\u8614\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ab\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d6\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968\u8969\u896a\u896b\u896c\u896d\u896e\u896f\u8970\u8971\u8972\u8973\u8974\u8975\u8976\u8977\u8978\u8979\u897a\u897b\u897c\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8990\u8991\u8992\u8993\u8994\u8995\u8996\u8997\u8998\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a0\u89a1\u89a2\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89be\u89bf\u89c0\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89e8\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u89ef\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8ae9\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c76\u8c77\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u8d19\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8db6\u8db7\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6e\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u8e80\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u8e9d\u8e9e\u8e9f\u8ea0\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8ea9\u8eaa\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u8eb1\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ebe\u8ebf\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8faf\u8fb0\u8fb1\u8fb2\u8fb3\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u908c\u908d\u908e\u908f\u9090\u9091\u9092\u9093\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9144\u9145\u9146\u9147\u9148\u9149\u914a\u914b\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf\u91c0\u91c1\u91c2\u91c3\u91c4\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93f8\u93f9\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u9467\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u9577\u9578\u9579\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u95de\u95df\u95e0\u95e1\u95e2\u95e3\u95e4\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u974b\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u9860\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u986d\u986e\u986f\u9870\u9871\u9872\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98aa\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u9a5d\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u9ab8\u9ab9\u9aba\u9abb\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac1\u9ac2\u9ac3\u9ac4\u9ac5\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add\u9ade\u9adf\u9ae0\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u9b03\u9b04\u9b05\u9b06\u9b07\u9b08\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b33\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u9b43\u9b44\u9b45\u9b46\u9b47\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b61\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfb\u9bfc\u9bfd\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c1c\u9c1d\u9c1e\u9c1f\u9c20\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d64\u9d65\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d90\u9d91\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcb\u9dcc\u9dcd\u9dce\u9dcf\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9dfc\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e16\u9e17\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u9e77\u9e78\u9e79\u9e7a\u9e7b\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e87\u9e88\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ecd\u9ece\u9ecf\u9ed0\u9ed1\u9ed2\u9ed3\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9edc\u9edd\u9ede\u9edf\u9ee0\u9ee1\u9ee2\u9ee3\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eed\u9eee\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef5\u9ef6\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f05\u9f06\u9f07\u9f08\u9f09\u9f0a\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f14\u9f15\u9f16\u9f17\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u9f22\u9f23\u9f24\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f33\u9f34\u9f35\u9f36\u9f37\u9f38\u9f39\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u9f56\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fab\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fb4\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcc\u9fcd\u9fce\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua015\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua610\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua620\ua621\ua622\ua623\ua624\ua625\ua626\ua627\ua628\ua629\ua62a\ua62b\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua64e\ua64f\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua658\ua659\ua65a\ua65b\ua65c\ua65d\ua65e\ua65f\ua660\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua668\ua669\ua66a\ua66b\ua66c\ua66d\ua66e\ua66f\ua674\ua675\ua676\ua677\ua678\ua679\ua67a\ua67b\ua67c\ua67d\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68d\ua68e\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua698\ua699\ua69a\ua69b\ua69c\ua69d\ua69e\ua69f\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua6f0\ua6f1\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua722\ua723\ua724\ua725\ua726\ua727\ua728\ua729\ua72a\ua72b\ua72c\ua72d\ua72e\ua72f\ua730\ua731\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua740\ua741\ua742\ua743\ua744\ua745\ua746\ua747\ua748\ua749\ua74a\ua74b\ua74c\ua74d\ua74e\ua74f\ua750\ua751\ua752\ua753\ua754\ua755\ua756\ua757\ua758\ua759\ua75a\ua75b\ua75c\ua75d\ua75e\ua75f\ua760\ua761\ua762\ua763\ua764\ua765\ua766\ua767\ua768\ua769\ua76a\ua76b\ua76c\ua76d\ua76e\ua76f\ua770\ua771\ua772\ua773\ua774\ua775\ua776\ua777\ua778\ua779\ua77a\ua77b\ua77c\ua77d\ua77e\ua77f\ua780\ua781\ua782\ua783\ua784\ua785\ua786\ua787\ua788\ua78b\ua78c\ua78d\ua78e\ua78f\ua790\ua791\ua792\ua793\ua794\ua795\ua796\ua797\ua798\ua799\ua79a\ua79b\ua79c\ua79d\ua79e\ua79f\ua7a0\ua7a1\ua7a2\ua7a3\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7ae\ua7b0\ua7b1\ua7b2\ua7b3\ua7b4\ua7b5\ua7b6\ua7b7\ua7f7\ua7f8\ua7f9\ua7fa\ua7fb\ua7fc\ua7fd\ua7fe\ua7ff\ua800\ua801\ua802\ua803\ua804\ua805\ua806\ua807\ua808\ua809\ua80a\ua80b\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\ua823\ua824\ua825\ua826\ua827\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua854\ua855\ua856\ua857\ua858\ua859\ua85a\ua85b\ua85c\ua85d\ua85e\ua85f\ua860\ua861\ua862\ua863\ua864\ua865\ua866\ua867\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua880\ua881\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8b4\ua8b5\ua8b6\ua8b7\ua8b8\ua8b9\ua8ba\ua8bb\ua8bc\ua8bd\ua8be\ua8bf\ua8c0\ua8c1\ua8c2\ua8c3\ua8c4\ua8c5\ua8d0\ua8d1\ua8d2\ua8d3\ua8d4\ua8d5\ua8d6\ua8d7\ua8d8\ua8d9\ua8e0\ua8e1\ua8e2\ua8e3\ua8e4\ua8e5\ua8e6\ua8e7\ua8e8\ua8e9\ua8ea\ua8eb\ua8ec\ua8ed\ua8ee\ua8ef\ua8f0\ua8f1\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8fb\ua8fd\ua900\ua901\ua902\ua903\ua904\ua905\ua906\ua907\ua908\ua909\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua926\ua927\ua928\ua929\ua92a\ua92b\ua92c\ua92d\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua947\ua948\ua949\ua94a\ua94b\ua94c\ua94d\ua94e\ua94f\ua950\ua951\ua952\ua953\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\ua980\ua981\ua982\ua983\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9ab\ua9ac\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9b3\ua9b4\ua9b5\ua9b6\ua9b7\ua9b8\ua9b9\ua9ba\ua9bb\ua9bc\ua9bd\ua9be\ua9bf\ua9c0\ua9cf\ua9d0\ua9d1\ua9d2\ua9d3\ua9d4\ua9d5\ua9d6\ua9d7\ua9d8\ua9d9\ua9e0\ua9e1\ua9e2\ua9e3\ua9e4\ua9e5\ua9e6\ua9e7\ua9e8\ua9e9\ua9ea\ua9eb\ua9ec\ua9ed\ua9ee\ua9ef\ua9f0\ua9f1\ua9f2\ua9f3\ua9f4\ua9f5\ua9f6\ua9f7\ua9f8\ua9f9\ua9fa\ua9fb\ua9fc\ua9fd\ua9fe\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa29\uaa2a\uaa2b\uaa2c\uaa2d\uaa2e\uaa2f\uaa30\uaa31\uaa32\uaa33\uaa34\uaa35\uaa36\uaa40\uaa41\uaa42\uaa43\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa4c\uaa4d\uaa50\uaa51\uaa52\uaa53\uaa54\uaa55\uaa56\uaa57\uaa58\uaa59\uaa60\uaa61\uaa62\uaa63\uaa64\uaa65\uaa66\uaa67\uaa68\uaa69\uaa6a\uaa6b\uaa6c\uaa6d\uaa6e\uaa6f\uaa70\uaa71\uaa72\uaa73\uaa74\uaa75\uaa76\uaa7a\uaa7b\uaa7c\uaa7d\uaa7e\uaa7f\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab0\uaab1\uaab2\uaab3\uaab4\uaab5\uaab6\uaab7\uaab8\uaab9\uaaba\uaabb\uaabc\uaabd\uaabe\uaabf\uaac0\uaac1\uaac2\uaadb\uaadc\uaadd\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uaaeb\uaaec\uaaed\uaaee\uaaef\uaaf2\uaaf3\uaaf4\uaaf5\uaaf6\uab01\uab02\uab03\uab04\uab05\uab06\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\uab11\uab12\uab13\uab14\uab15\uab16\uab20\uab21\uab22\uab23\uab24\uab25\uab26\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\uab30\uab31\uab32\uab33\uab34\uab35\uab36\uab37\uab38\uab39\uab3a\uab3b\uab3c\uab3d\uab3e\uab3f\uab40\uab41\uab42\uab43\uab44\uab45\uab46\uab47\uab48\uab49\uab4a\uab4b\uab4c\uab4d\uab4e\uab4f\uab50\uab51\uab52\uab53\uab54\uab55\uab56\uab57\uab58\uab59\uab5a\uab5c\uab5d\uab5e\uab5f\uab60\uab61\uab62\uab63\uab64\uab65\uab70\uab71\uab72\uab73\uab74\uab75\uab76\uab77\uab78\uab79\uab7a\uab7b\uab7c\uab7d\uab7e\uab7f\uab80\uab81\uab82\uab83\uab84\uab85\uab86\uab87\uab88\uab89\uab8a\uab8b\uab8c\uab8d\uab8e\uab8f\uab90\uab91\uab92\uab93\uab94\uab95\uab96\uab97\uab98\uab99\uab9a\uab9b\uab9c\uab9d\uab9e\uab9f\uaba0\uaba1\uaba2\uaba3\uaba4\uaba5\uaba6\uaba7\uaba8\uaba9\uabaa\uabab\uabac\uabad\uabae\uabaf\uabb0\uabb1\uabb2\uabb3\uabb4\uabb5\uabb6\uabb7\uabb8\uabb9\uabba\uabbb\uabbc\uabbd\uabbe\uabbf\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uabe3\uabe4\uabe5\uabe6\uabe7\uabe8\uabe9\uabea\uabec\uabed\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9\uac00\uac01\uac02\uac03\uac04\uac05\uac06\uac07\uac08\uac09\uac0a\uac0b\uac0c\uac0d\uac0e\uac0f\uac10\uac11\uac12\uac13\uac14\uac15\uac16\uac17\uac18\uac19\uac1a\uac1b\uac1c\uac1d\uac1e\uac1f\uac20\uac21\uac22\uac23\uac24\uac25\uac26\uac27\uac28\uac29\uac2a\uac2b\uac2c\uac2d\uac2e\uac2f\uac30\uac31\uac32\uac33\uac34\uac35\uac36\uac37\uac38\uac39\uac3a\uac3b\uac3c\uac3d\uac3e\uac3f\uac40\uac41\uac42\uac43\uac44\uac45\uac46\uac47\uac48\uac49\uac4a\uac4b\uac4c\uac4d\uac4e\uac4f\uac50\uac51\uac52\uac53\uac54\uac55\uac56\uac57\uac58\uac59\uac5a\uac5b\uac5c\uac5d\uac5e\uac5f\uac60\uac61\uac62\uac63\uac64\uac65\uac66\uac67\uac68\uac69\uac6a\uac6b\uac6c\uac6d\uac6e\uac6f\uac70\uac71\uac72\uac73\uac74\uac75\uac76\uac77\uac78\uac79\uac7a\uac7b\uac7c\uac7d\uac7e\uac7f\uac80\uac81\uac82\uac83\uac84\uac85\uac86\uac87\uac88\uac89\uac8a\uac8b\uac8c\uac8d\uac8e\uac8f\uac90\uac91\uac92\uac93\uac94\uac95\uac96\uac97\uac98\uac99\uac9a\uac9b\uac9c\uac9d\uac9e\uac9f\uaca0\uaca1\uaca2\uaca3\uaca4\uaca5\uaca6\uaca7\uaca8\uaca9\uacaa\uacab\uacac\uacad\uacae\uacaf\uacb0\uacb1\uacb2\uacb3\uacb4\uacb5\uacb6\uacb7\uacb8\uacb9\uacba\uacbb\uacbc\uacbd\uacbe\uacbf\uacc0\uacc1\uacc2\uacc3\uacc4\uacc5\uacc6\uacc7\uacc8\uacc9\uacca\uaccb\uaccc\uaccd\uacce\uaccf\uacd0\uacd1\uacd2\uacd3\uacd4\uacd5\uacd6\uacd7\uacd8\uacd9\uacda\uacdb\uacdc\uacdd\uacde\uacdf\uace0\uace1\uace2\uace3\uace4\uace5\uace6\uace7\uace8\uace9\uacea\uaceb\uacec\uaced\uacee\uacef\uacf0\uacf1\uacf2\uacf3\uacf4\uacf5\uacf6\uacf7\uacf8\uacf9\uacfa\uacfb\uacfc\uacfd\uacfe\uacff\uad00\uad01\uad02\uad03\uad04\uad05\uad06\uad07\uad08\uad09\uad0a\uad0b\uad0c\uad0d\uad0e\uad0f\uad10\uad11\uad12\uad13\uad14\uad15\uad16\uad17\uad18\uad19\uad1a\uad1b\uad1c\uad1d\uad1e\uad1f\uad20\uad21\uad22\uad23\uad24\uad25\uad26\uad27\uad28\uad29\uad2a\uad2b\uad2c\uad2d\uad2e\uad2f\uad30\uad31\uad32\uad33\uad34\uad35\uad36\uad37\uad38\uad39\uad3a\uad3b\uad3c\uad3d\uad3e\uad3f\uad40\uad41\uad42\uad43\uad44\uad45\uad46\uad47\uad48\uad49\uad4a\uad4b\uad4c\uad4d\uad4e\uad4f\uad50\uad51\uad52\uad53\uad54\uad55\uad56\uad57\uad58\uad59\uad5a\uad5b\uad5c\uad5d\uad5e\uad5f\uad60\uad61\uad62\uad63\uad64\uad65\uad66\uad67\uad68\uad69\uad6a\uad6b\uad6c\uad6d\uad6e\uad6f\uad70\uad71\uad72\uad73\uad74\uad75\uad76\uad77\uad78\uad79\uad7a\uad7b\uad7c\uad7d\uad7e\uad7f\uad80\uad81\uad82\uad83\uad84\uad85\uad86\uad87\uad88\uad89\uad8a\uad8b\uad8c\uad8d\uad8e\uad8f\uad90\uad91\uad92\uad93\uad94\uad95\uad96\uad97\uad98\uad99\uad9a\uad9b\uad9c\uad9d\uad9e\uad9f\uada0\uada1\uada2\uada3\uada4\uada5\uada6\uada7\uada8\uada9\uadaa\uadab\uadac\uadad\uadae\uadaf\uadb0\uadb1\uadb2\uadb3\uadb4\uadb5\uadb6\uadb7\uadb8\uadb9\uadba\uadbb\uadbc\uadbd\uadbe\uadbf\uadc0\uadc1\uadc2\uadc3\uadc4\uadc5\uadc6\uadc7\uadc8\uadc9\uadca\uadcb\uadcc\uadcd\uadce\uadcf\uadd0\uadd1\uadd2\uadd3\uadd4\uadd5\uadd6\uadd7\uadd8\uadd9\uadda\uaddb\uaddc\uaddd\uadde\uaddf\uade0\uade1\uade2\uade3\uade4\uade5\uade6\uade7\uade8\uade9\uadea\uadeb\uadec\uaded\uadee\uadef\uadf0\uadf1\uadf2\uadf3\uadf4\uadf5\uadf6\uadf7\uadf8\uadf9\uadfa\uadfb\uadfc\uadfd\uadfe\uadff\uae00\uae01\uae02\uae03\uae04\uae05\uae06\uae07\uae08\uae09\uae0a\uae0b\uae0c\uae0d\uae0e\uae0f\uae10\uae11\uae12\uae13\uae14\uae15\uae16\uae17\uae18\uae19\uae1a\uae1b\uae1c\uae1d\uae1e\uae1f\uae20\uae21\uae22\uae23\uae24\uae25\uae26\uae27\uae28\uae29\uae2a\uae2b\uae2c\uae2d\uae2e\uae2f\uae30\uae31\uae32\uae33\uae34\uae35\uae36\uae37\uae38\uae39\uae3a\uae3b\uae3c\uae3d\uae3e\uae3f\uae40\uae41\uae42\uae43\uae44\uae45\uae46\uae47\uae48\uae49\uae4a\uae4b\uae4c\uae4d\uae4e\uae4f\uae50\uae51\uae52\uae53\uae54\uae55\uae56\uae57\uae58\uae59\uae5a\uae5b\uae5c\uae5d\uae5e\uae5f\uae60\uae61\uae62\uae63\uae64\uae65\uae66\uae67\uae68\uae69\uae6a\uae6b\uae6c\uae6d\uae6e\uae6f\uae70\uae71\uae72\uae73\uae74\uae75\uae76\uae77\uae78\uae79\uae7a\uae7b\uae7c\uae7d\uae7e\uae7f\uae80\uae81\uae82\uae83\uae84\uae85\uae86\uae87\uae88\uae89\uae8a\uae8b\uae8c\uae8d\uae8e\uae8f\uae90\uae91\uae92\uae93\uae94\uae95\uae96\uae97\uae98\uae99\uae9a\uae9b\uae9c\uae9d\uae9e\uae9f\uaea0\uaea1\uaea2\uaea3\uaea4\uaea5\uaea6\uaea7\uaea8\uaea9\uaeaa\uaeab\uaeac\uaead\uaeae\uaeaf\uaeb0\uaeb1\uaeb2\uaeb3\uaeb4\uaeb5\uaeb6\uaeb7\uaeb8\uaeb9\uaeba\uaebb\uaebc\uaebd\uaebe\uaebf\uaec0\uaec1\uaec2\uaec3\uaec4\uaec5\uaec6\uaec7\uaec8\uaec9\uaeca\uaecb\uaecc\uaecd\uaece\uaecf\uaed0\uaed1\uaed2\uaed3\uaed4\uaed5\uaed6\uaed7\uaed8\uaed9\uaeda\uaedb\uaedc\uaedd\uaede\uaedf\uaee0\uaee1\uaee2\uaee3\uaee4\uaee5\uaee6\uaee7\uaee8\uaee9\uaeea\uaeeb\uaeec\uaeed\uaeee\uaeef\uaef0\uaef1\uaef2\uaef3\uaef4\uaef5\uaef6\uaef7\uaef8\uaef9\uaefa\uaefb\uaefc\uaefd\uaefe\uaeff\uaf00\uaf01\uaf02\uaf03\uaf04\uaf05\uaf06\uaf07\uaf08\uaf09\uaf0a\uaf0b\uaf0c\uaf0d\uaf0e\uaf0f\uaf10\uaf11\uaf12\uaf13\uaf14\uaf15\uaf16\uaf17\uaf18\uaf19\uaf1a\uaf1b\uaf1c\uaf1d\uaf1e\uaf1f\uaf20\uaf21\uaf22\uaf23\uaf24\uaf25\uaf26\uaf27\uaf28\uaf29\uaf2a\uaf2b\uaf2c\uaf2d\uaf2e\uaf2f\uaf30\uaf31\uaf32\uaf33\uaf34\uaf35\uaf36\uaf37\uaf38\uaf39\uaf3a\uaf3b\uaf3c\uaf3d\uaf3e\uaf3f\uaf40\uaf41\uaf42\uaf43\uaf44\uaf45\uaf46\uaf47\uaf48\uaf49\uaf4a\uaf4b\uaf4c\uaf4d\uaf4e\uaf4f\uaf50\uaf51\uaf52\uaf53\uaf54\uaf55\uaf56\uaf57\uaf58\uaf59\uaf5a\uaf5b\uaf5c\uaf5d\uaf5e\uaf5f\uaf60\uaf61\uaf62\uaf63\uaf64\uaf65\uaf66\uaf67\uaf68\uaf69\uaf6a\uaf6b\uaf6c\uaf6d\uaf6e\uaf6f\uaf70\uaf71\uaf72\uaf73\uaf74\uaf75\uaf76\uaf77\uaf78\uaf79\uaf7a\uaf7b\uaf7c\uaf7d\uaf7e\uaf7f\uaf80\uaf81\uaf82\uaf83\uaf84\uaf85\uaf86\uaf87\uaf88\uaf89\uaf8a\uaf8b\uaf8c\uaf8d\uaf8e\uaf8f\uaf90\uaf91\uaf92\uaf93\uaf94\uaf95\uaf96\uaf97\uaf98\uaf99\uaf9a\uaf9b\uaf9c\uaf9d\uaf9e\uaf9f\uafa0\uafa1\uafa2\uafa3\uafa4\uafa5\uafa6\uafa7\uafa8\uafa9\uafaa\uafab\uafac\uafad\uafae\uafaf\uafb0\uafb1\uafb2\uafb3\uafb4\uafb5\uafb6\uafb7\uafb8\uafb9\uafba\uafbb\uafbc\uafbd\uafbe\uafbf\uafc0\uafc1\uafc2\uafc3\uafc4\uafc5\uafc6\uafc7\uafc8\uafc9\uafca\uafcb\uafcc\uafcd\uafce\uafcf\uafd0\uafd1\uafd2\uafd3\uafd4\uafd5\uafd6\uafd7\uafd8\uafd9\uafda\uafdb\uafdc\uafdd\uafde\uafdf\uafe0\uafe1\uafe2\uafe3\uafe4\uafe5\uafe6\uafe7\uafe8\uafe9\uafea\uafeb\uafec\uafed\uafee\uafef\uaff0\uaff1\uaff2\uaff3\uaff4\uaff5\uaff6\uaff7\uaff8\uaff9\uaffa\uaffb\uaffc\uaffd\uaffe\uafff\ub000\ub001\ub002\ub003\ub004\ub005\ub006\ub007\ub008\ub009\ub00a\ub00b\ub00c\ub00d\ub00e\ub00f\ub010\ub011\ub012\ub013\ub014\ub015\ub016\ub017\ub018\ub019\ub01a\ub01b\ub01c\ub01d\ub01e\ub01f\ub020\ub021\ub022\ub023\ub024\ub025\ub026\ub027\ub028\ub029\ub02a\ub02b\ub02c\ub02d\ub02e\ub02f\ub030\ub031\ub032\ub033\ub034\ub035\ub036\ub037\ub038\ub039\ub03a\ub03b\ub03c\ub03d\ub03e\ub03f\ub040\ub041\ub042\ub043\ub044\ub045\ub046\ub047\ub048\ub049\ub04a\ub04b\ub04c\ub04d\ub04e\ub04f\ub050\ub051\ub052\ub053\ub054\ub055\ub056\ub057\ub058\ub059\ub05a\ub05b\ub05c\ub05d\ub05e\ub05f\ub060\ub061\ub062\ub063\ub064\ub065\ub066\ub067\ub068\ub069\ub06a\ub06b\ub06c\ub06d\ub06e\ub06f\ub070\ub071\ub072\ub073\ub074\ub075\ub076\ub077\ub078\ub079\ub07a\ub07b\ub07c\ub07d\ub07e\ub07f\ub080\ub081\ub082\ub083\ub084\ub085\ub086\ub087\ub088\ub089\ub08a\ub08b\ub08c\ub08d\ub08e\ub08f\ub090\ub091\ub092\ub093\ub094\ub095\ub096\ub097\ub098\ub099\ub09a\ub09b\ub09c\ub09d\ub09e\ub09f\ub0a0\ub0a1\ub0a2\ub0a3\ub0a4\ub0a5\ub0a6\ub0a7\ub0a8\ub0a9\ub0aa\ub0ab\ub0ac\ub0ad\ub0ae\ub0af\ub0b0\ub0b1\ub0b2\ub0b3\ub0b4\ub0b5\ub0b6\ub0b7\ub0b8\ub0b9\ub0ba\ub0bb\ub0bc\ub0bd\ub0be\ub0bf\ub0c0\ub0c1\ub0c2\ub0c3\ub0c4\ub0c5\ub0c6\ub0c7\ub0c8\ub0c9\ub0ca\ub0cb\ub0cc\ub0cd\ub0ce\ub0cf\ub0d0\ub0d1\ub0d2\ub0d3\ub0d4\ub0d5\ub0d6\ub0d7\ub0d8\ub0d9\ub0da\ub0db\ub0dc\ub0dd\ub0de\ub0df\ub0e0\ub0e1\ub0e2\ub0e3\ub0e4\ub0e5\ub0e6\ub0e7\ub0e8\ub0e9\ub0ea\ub0eb\ub0ec\ub0ed\ub0ee\ub0ef\ub0f0\ub0f1\ub0f2\ub0f3\ub0f4\ub0f5\ub0f6\ub0f7\ub0f8\ub0f9\ub0fa\ub0fb\ub0fc\ub0fd\ub0fe\ub0ff\ub100\ub101\ub102\ub103\ub104\ub105\ub106\ub107\ub108\ub109\ub10a\ub10b\ub10c\ub10d\ub10e\ub10f\ub110\ub111\ub112\ub113\ub114\ub115\ub116\ub117\ub118\ub119\ub11a\ub11b\ub11c\ub11d\ub11e\ub11f\ub120\ub121\ub122\ub123\ub124\ub125\ub126\ub127\ub128\ub129\ub12a\ub12b\ub12c\ub12d\ub12e\ub12f\ub130\ub131\ub132\ub133\ub134\ub135\ub136\ub137\ub138\ub139\ub13a\ub13b\ub13c\ub13d\ub13e\ub13f\ub140\ub141\ub142\ub143\ub144\ub145\ub146\ub147\ub148\ub149\ub14a\ub14b\ub14c\ub14d\ub14e\ub14f\ub150\ub151\ub152\ub153\ub154\ub155\ub156\ub157\ub158\ub159\ub15a\ub15b\ub15c\ub15d\ub15e\ub15f\ub160\ub161\ub162\ub163\ub164\ub165\ub166\ub167\ub168\ub169\ub16a\ub16b\ub16c\ub16d\ub16e\ub16f\ub170\ub171\ub172\ub173\ub174\ub175\ub176\ub177\ub178\ub179\ub17a\ub17b\ub17c\ub17d\ub17e\ub17f\ub180\ub181\ub182\ub183\ub184\ub185\ub186\ub187\ub188\ub189\ub18a\ub18b\ub18c\ub18d\ub18e\ub18f\ub190\ub191\ub192\ub193\ub194\ub195\ub196\ub197\ub198\ub199\ub19a\ub19b\ub19c\ub19d\ub19e\ub19f\ub1a0\ub1a1\ub1a2\ub1a3\ub1a4\ub1a5\ub1a6\ub1a7\ub1a8\ub1a9\ub1aa\ub1ab\ub1ac\ub1ad\ub1ae\ub1af\ub1b0\ub1b1\ub1b2\ub1b3\ub1b4\ub1b5\ub1b6\ub1b7\ub1b8\ub1b9\ub1ba\ub1bb\ub1bc\ub1bd\ub1be\ub1bf\ub1c0\ub1c1\ub1c2\ub1c3\ub1c4\ub1c5\ub1c6\ub1c7\ub1c8\ub1c9\ub1ca\ub1cb\ub1cc\ub1cd\ub1ce\ub1cf\ub1d0\ub1d1\ub1d2\ub1d3\ub1d4\ub1d5\ub1d6\ub1d7\ub1d8\ub1d9\ub1da\ub1db\ub1dc\ub1dd\ub1de\ub1df\ub1e0\ub1e1\ub1e2\ub1e3\ub1e4\ub1e5\ub1e6\ub1e7\ub1e8\ub1e9\ub1ea\ub1eb\ub1ec\ub1ed\ub1ee\ub1ef\ub1f0\ub1f1\ub1f2\ub1f3\ub1f4\ub1f5\ub1f6\ub1f7\ub1f8\ub1f9\ub1fa\ub1fb\ub1fc\ub1fd\ub1fe\ub1ff\ub200\ub201\ub202\ub203\ub204\ub205\ub206\ub207\ub208\ub209\ub20a\ub20b\ub20c\ub20d\ub20e\ub20f\ub210\ub211\ub212\ub213\ub214\ub215\ub216\ub217\ub218\ub219\ub21a\ub21b\ub21c\ub21d\ub21e\ub21f\ub220\ub221\ub222\ub223\ub224\ub225\ub226\ub227\ub228\ub229\ub22a\ub22b\ub22c\ub22d\ub22e\ub22f\ub230\ub231\ub232\ub233\ub234\ub235\ub236\ub237\ub238\ub239\ub23a\ub23b\ub23c\ub23d\ub23e\ub23f\ub240\ub241\ub242\ub243\ub244\ub245\ub246\ub247\ub248\ub249\ub24a\ub24b\ub24c\ub24d\ub24e\ub24f\ub250\ub251\ub252\ub253\ub254\ub255\ub256\ub257\ub258\ub259\ub25a\ub25b\ub25c\ub25d\ub25e\ub25f\ub260\ub261\ub262\ub263\ub264\ub265\ub266\ub267\ub268\ub269\ub26a\ub26b\ub26c\ub26d\ub26e\ub26f\ub270\ub271\ub272\ub273\ub274\ub275\ub276\ub277\ub278\ub279\ub27a\ub27b\ub27c\ub27d\ub27e\ub27f\ub280\ub281\ub282\ub283\ub284\ub285\ub286\ub287\ub288\ub289\ub28a\ub28b\ub28c\ub28d\ub28e\ub28f\ub290\ub291\ub292\ub293\ub294\ub295\ub296\ub297\ub298\ub299\ub29a\ub29b\ub29c\ub29d\ub29e\ub29f\ub2a0\ub2a1\ub2a2\ub2a3\ub2a4\ub2a5\ub2a6\ub2a7\ub2a8\ub2a9\ub2aa\ub2ab\ub2ac\ub2ad\ub2ae\ub2af\ub2b0\ub2b1\ub2b2\ub2b3\ub2b4\ub2b5\ub2b6\ub2b7\ub2b8\ub2b9\ub2ba\ub2bb\ub2bc\ub2bd\ub2be\ub2bf\ub2c0\ub2c1\ub2c2\ub2c3\ub2c4\ub2c5\ub2c6\ub2c7\ub2c8\ub2c9\ub2ca\ub2cb\ub2cc\ub2cd\ub2ce\ub2cf\ub2d0\ub2d1\ub2d2\ub2d3\ub2d4\ub2d5\ub2d6\ub2d7\ub2d8\ub2d9\ub2da\ub2db\ub2dc\ub2dd\ub2de\ub2df\ub2e0\ub2e1\ub2e2\ub2e3\ub2e4\ub2e5\ub2e6\ub2e7\ub2e8\ub2e9\ub2ea\ub2eb\ub2ec\ub2ed\ub2ee\ub2ef\ub2f0\ub2f1\ub2f2\ub2f3\ub2f4\ub2f5\ub2f6\ub2f7\ub2f8\ub2f9\ub2fa\ub2fb\ub2fc\ub2fd\ub2fe\ub2ff\ub300\ub301\ub302\ub303\ub304\ub305\ub306\ub307\ub308\ub309\ub30a\ub30b\ub30c\ub30d\ub30e\ub30f\ub310\ub311\ub312\ub313\ub314\ub315\ub316\ub317\ub318\ub319\ub31a\ub31b\ub31c\ub31d\ub31e\ub31f\ub320\ub321\ub322\ub323\ub324\ub325\ub326\ub327\ub328\ub329\ub32a\ub32b\ub32c\ub32d\ub32e\ub32f\ub330\ub331\ub332\ub333\ub334\ub335\ub336\ub337\ub338\ub339\ub33a\ub33b\ub33c\ub33d\ub33e\ub33f\ub340\ub341\ub342\ub343\ub344\ub345\ub346\ub347\ub348\ub349\ub34a\ub34b\ub34c\ub34d\ub34e\ub34f\ub350\ub351\ub352\ub353\ub354\ub355\ub356\ub357\ub358\ub359\ub35a\ub35b\ub35c\ub35d\ub35e\ub35f\ub360\ub361\ub362\ub363\ub364\ub365\ub366\ub367\ub368\ub369\ub36a\ub36b\ub36c\ub36d\ub36e\ub36f\ub370\ub371\ub372\ub373\ub374\ub375\ub376\ub377\ub378\ub379\ub37a\ub37b\ub37c\ub37d\ub37e\ub37f\ub380\ub381\ub382\ub383\ub384\ub385\ub386\ub387\ub388\ub389\ub38a\ub38b\ub38c\ub38d\ub38e\ub38f\ub390\ub391\ub392\ub393\ub394\ub395\ub396\ub397\ub398\ub399\ub39a\ub39b\ub39c\ub39d\ub39e\ub39f\ub3a0\ub3a1\ub3a2\ub3a3\ub3a4\ub3a5\ub3a6\ub3a7\ub3a8\ub3a9\ub3aa\ub3ab\ub3ac\ub3ad\ub3ae\ub3af\ub3b0\ub3b1\ub3b2\ub3b3\ub3b4\ub3b5\ub3b6\ub3b7\ub3b8\ub3b9\ub3ba\ub3bb\ub3bc\ub3bd\ub3be\ub3bf\ub3c0\ub3c1\ub3c2\ub3c3\ub3c4\ub3c5\ub3c6\ub3c7\ub3c8\ub3c9\ub3ca\ub3cb\ub3cc\ub3cd\ub3ce\ub3cf\ub3d0\ub3d1\ub3d2\ub3d3\ub3d4\ub3d5\ub3d6\ub3d7\ub3d8\ub3d9\ub3da\ub3db\ub3dc\ub3dd\ub3de\ub3df\ub3e0\ub3e1\ub3e2\ub3e3\ub3e4\ub3e5\ub3e6\ub3e7\ub3e8\ub3e9\ub3ea\ub3eb\ub3ec\ub3ed\ub3ee\ub3ef\ub3f0\ub3f1\ub3f2\ub3f3\ub3f4\ub3f5\ub3f6\ub3f7\ub3f8\ub3f9\ub3fa\ub3fb\ub3fc\ub3fd\ub3fe\ub3ff\ub400\ub401\ub402\ub403\ub404\ub405\ub406\ub407\ub408\ub409\ub40a\ub40b\ub40c\ub40d\ub40e\ub40f\ub410\ub411\ub412\ub413\ub414\ub415\ub416\ub417\ub418\ub419\ub41a\ub41b\ub41c\ub41d\ub41e\ub41f\ub420\ub421\ub422\ub423\ub424\ub425\ub426\ub427\ub428\ub429\ub42a\ub42b\ub42c\ub42d\ub42e\ub42f\ub430\ub431\ub432\ub433\ub434\ub435\ub436\ub437\ub438\ub439\ub43a\ub43b\ub43c\ub43d\ub43e\ub43f\ub440\ub441\ub442\ub443\ub444\ub445\ub446\ub447\ub448\ub449\ub44a\ub44b\ub44c\ub44d\ub44e\ub44f\ub450\ub451\ub452\ub453\ub454\ub455\ub456\ub457\ub458\ub459\ub45a\ub45b\ub45c\ub45d\ub45e\ub45f\ub460\ub461\ub462\ub463\ub464\ub465\ub466\ub467\ub468\ub469\ub46a\ub46b\ub46c\ub46d\ub46e\ub46f\ub470\ub471\ub472\ub473\ub474\ub475\ub476\ub477\ub478\ub479\ub47a\ub47b\ub47c\ub47d\ub47e\ub47f\ub480\ub481\ub482\ub483\ub484\ub485\ub486\ub487\ub488\ub489\ub48a\ub48b\ub48c\ub48d\ub48e\ub48f\ub490\ub491\ub492\ub493\ub494\ub495\ub496\ub497\ub498\ub499\ub49a\ub49b\ub49c\ub49d\ub49e\ub49f\ub4a0\ub4a1\ub4a2\ub4a3\ub4a4\ub4a5\ub4a6\ub4a7\ub4a8\ub4a9\ub4aa\ub4ab\ub4ac\ub4ad\ub4ae\ub4af\ub4b0\ub4b1\ub4b2\ub4b3\ub4b4\ub4b5\ub4b6\ub4b7\ub4b8\ub4b9\ub4ba\ub4bb\ub4bc\ub4bd\ub4be\ub4bf\ub4c0\ub4c1\ub4c2\ub4c3\ub4c4\ub4c5\ub4c6\ub4c7\ub4c8\ub4c9\ub4ca\ub4cb\ub4cc\ub4cd\ub4ce\ub4cf\ub4d0\ub4d1\ub4d2\ub4d3\ub4d4\ub4d5\ub4d6\ub4d7\ub4d8\ub4d9\ub4da\ub4db\ub4dc\ub4dd\ub4de\ub4df\ub4e0\ub4e1\ub4e2\ub4e3\ub4e4\ub4e5\ub4e6\ub4e7\ub4e8\ub4e9\ub4ea\ub4eb\ub4ec\ub4ed\ub4ee\ub4ef\ub4f0\ub4f1\ub4f2\ub4f3\ub4f4\ub4f5\ub4f6\ub4f7\ub4f8\ub4f9\ub4fa\ub4fb\ub4fc\ub4fd\ub4fe\ub4ff\ub500\ub501\ub502\ub503\ub504\ub505\ub506\ub507\ub508\ub509\ub50a\ub50b\ub50c\ub50d\ub50e\ub50f\ub510\ub511\ub512\ub513\ub514\ub515\ub516\ub517\ub518\ub519\ub51a\ub51b\ub51c\ub51d\ub51e\ub51f\ub520\ub521\ub522\ub523\ub524\ub525\ub526\ub527\ub528\ub529\ub52a\ub52b\ub52c\ub52d\ub52e\ub52f\ub530\ub531\ub532\ub533\ub534\ub535\ub536\ub537\ub538\ub539\ub53a\ub53b\ub53c\ub53d\ub53e\ub53f\ub540\ub541\ub542\ub543\ub544\ub545\ub546\ub547\ub548\ub549\ub54a\ub54b\ub54c\ub54d\ub54e\ub54f\ub550\ub551\ub552\ub553\ub554\ub555\ub556\ub557\ub558\ub559\ub55a\ub55b\ub55c\ub55d\ub55e\ub55f\ub560\ub561\ub562\ub563\ub564\ub565\ub566\ub567\ub568\ub569\ub56a\ub56b\ub56c\ub56d\ub56e\ub56f\ub570\ub571\ub572\ub573\ub574\ub575\ub576\ub577\ub578\ub579\ub57a\ub57b\ub57c\ub57d\ub57e\ub57f\ub580\ub581\ub582\ub583\ub584\ub585\ub586\ub587\ub588\ub589\ub58a\ub58b\ub58c\ub58d\ub58e\ub58f\ub590\ub591\ub592\ub593\ub594\ub595\ub596\ub597\ub598\ub599\ub59a\ub59b\ub59c\ub59d\ub59e\ub59f\ub5a0\ub5a1\ub5a2\ub5a3\ub5a4\ub5a5\ub5a6\ub5a7\ub5a8\ub5a9\ub5aa\ub5ab\ub5ac\ub5ad\ub5ae\ub5af\ub5b0\ub5b1\ub5b2\ub5b3\ub5b4\ub5b5\ub5b6\ub5b7\ub5b8\ub5b9\ub5ba\ub5bb\ub5bc\ub5bd\ub5be\ub5bf\ub5c0\ub5c1\ub5c2\ub5c3\ub5c4\ub5c5\ub5c6\ub5c7\ub5c8\ub5c9\ub5ca\ub5cb\ub5cc\ub5cd\ub5ce\ub5cf\ub5d0\ub5d1\ub5d2\ub5d3\ub5d4\ub5d5\ub5d6\ub5d7\ub5d8\ub5d9\ub5da\ub5db\ub5dc\ub5dd\ub5de\ub5df\ub5e0\ub5e1\ub5e2\ub5e3\ub5e4\ub5e5\ub5e6\ub5e7\ub5e8\ub5e9\ub5ea\ub5eb\ub5ec\ub5ed\ub5ee\ub5ef\ub5f0\ub5f1\ub5f2\ub5f3\ub5f4\ub5f5\ub5f6\ub5f7\ub5f8\ub5f9\ub5fa\ub5fb\ub5fc\ub5fd\ub5fe\ub5ff\ub600\ub601\ub602\ub603\ub604\ub605\ub606\ub607\ub608\ub609\ub60a\ub60b\ub60c\ub60d\ub60e\ub60f\ub610\ub611\ub612\ub613\ub614\ub615\ub616\ub617\ub618\ub619\ub61a\ub61b\ub61c\ub61d\ub61e\ub61f\ub620\ub621\ub622\ub623\ub624\ub625\ub626\ub627\ub628\ub629\ub62a\ub62b\ub62c\ub62d\ub62e\ub62f\ub630\ub631\ub632\ub633\ub634\ub635\ub636\ub637\ub638\ub639\ub63a\ub63b\ub63c\ub63d\ub63e\ub63f\ub640\ub641\ub642\ub643\ub644\ub645\ub646\ub647\ub648\ub649\ub64a\ub64b\ub64c\ub64d\ub64e\ub64f\ub650\ub651\ub652\ub653\ub654\ub655\ub656\ub657\ub658\ub659\ub65a\ub65b\ub65c\ub65d\ub65e\ub65f\ub660\ub661\ub662\ub663\ub664\ub665\ub666\ub667\ub668\ub669\ub66a\ub66b\ub66c\ub66d\ub66e\ub66f\ub670\ub671\ub672\ub673\ub674\ub675\ub676\ub677\ub678\ub679\ub67a\ub67b\ub67c\ub67d\ub67e\ub67f\ub680\ub681\ub682\ub683\ub684\ub685\ub686\ub687\ub688\ub689\ub68a\ub68b\ub68c\ub68d\ub68e\ub68f\ub690\ub691\ub692\ub693\ub694\ub695\ub696\ub697\ub698\ub699\ub69a\ub69b\ub69c\ub69d\ub69e\ub69f\ub6a0\ub6a1\ub6a2\ub6a3\ub6a4\ub6a5\ub6a6\ub6a7\ub6a8\ub6a9\ub6aa\ub6ab\ub6ac\ub6ad\ub6ae\ub6af\ub6b0\ub6b1\ub6b2\ub6b3\ub6b4\ub6b5\ub6b6\ub6b7\ub6b8\ub6b9\ub6ba\ub6bb\ub6bc\ub6bd\ub6be\ub6bf\ub6c0\ub6c1\ub6c2\ub6c3\ub6c4\ub6c5\ub6c6\ub6c7\ub6c8\ub6c9\ub6ca\ub6cb\ub6cc\ub6cd\ub6ce\ub6cf\ub6d0\ub6d1\ub6d2\ub6d3\ub6d4\ub6d5\ub6d6\ub6d7\ub6d8\ub6d9\ub6da\ub6db\ub6dc\ub6dd\ub6de\ub6df\ub6e0\ub6e1\ub6e2\ub6e3\ub6e4\ub6e5\ub6e6\ub6e7\ub6e8\ub6e9\ub6ea\ub6eb\ub6ec\ub6ed\ub6ee\ub6ef\ub6f0\ub6f1\ub6f2\ub6f3\ub6f4\ub6f5\ub6f6\ub6f7\ub6f8\ub6f9\ub6fa\ub6fb\ub6fc\ub6fd\ub6fe\ub6ff\ub700\ub701\ub702\ub703\ub704\ub705\ub706\ub707\ub708\ub709\ub70a\ub70b\ub70c\ub70d\ub70e\ub70f\ub710\ub711\ub712\ub713\ub714\ub715\ub716\ub717\ub718\ub719\ub71a\ub71b\ub71c\ub71d\ub71e\ub71f\ub720\ub721\ub722\ub723\ub724\ub725\ub726\ub727\ub728\ub729\ub72a\ub72b\ub72c\ub72d\ub72e\ub72f\ub730\ub731\ub732\ub733\ub734\ub735\ub736\ub737\ub738\ub739\ub73a\ub73b\ub73c\ub73d\ub73e\ub73f\ub740\ub741\ub742\ub743\ub744\ub745\ub746\ub747\ub748\ub749\ub74a\ub74b\ub74c\ub74d\ub74e\ub74f\ub750\ub751\ub752\ub753\ub754\ub755\ub756\ub757\ub758\ub759\ub75a\ub75b\ub75c\ub75d\ub75e\ub75f\ub760\ub761\ub762\ub763\ub764\ub765\ub766\ub767\ub768\ub769\ub76a\ub76b\ub76c\ub76d\ub76e\ub76f\ub770\ub771\ub772\ub773\ub774\ub775\ub776\ub777\ub778\ub779\ub77a\ub77b\ub77c\ub77d\ub77e\ub77f\ub780\ub781\ub782\ub783\ub784\ub785\ub786\ub787\ub788\ub789\ub78a\ub78b\ub78c\ub78d\ub78e\ub78f\ub790\ub791\ub792\ub793\ub794\ub795\ub796\ub797\ub798\ub799\ub79a\ub79b\ub79c\ub79d\ub79e\ub79f\ub7a0\ub7a1\ub7a2\ub7a3\ub7a4\ub7a5\ub7a6\ub7a7\ub7a8\ub7a9\ub7aa\ub7ab\ub7ac\ub7ad\ub7ae\ub7af\ub7b0\ub7b1\ub7b2\ub7b3\ub7b4\ub7b5\ub7b6\ub7b7\ub7b8\ub7b9\ub7ba\ub7bb\ub7bc\ub7bd\ub7be\ub7bf\ub7c0\ub7c1\ub7c2\ub7c3\ub7c4\ub7c5\ub7c6\ub7c7\ub7c8\ub7c9\ub7ca\ub7cb\ub7cc\ub7cd\ub7ce\ub7cf\ub7d0\ub7d1\ub7d2\ub7d3\ub7d4\ub7d5\ub7d6\ub7d7\ub7d8\ub7d9\ub7da\ub7db\ub7dc\ub7dd\ub7de\ub7df\ub7e0\ub7e1\ub7e2\ub7e3\ub7e4\ub7e5\ub7e6\ub7e7\ub7e8\ub7e9\ub7ea\ub7eb\ub7ec\ub7ed\ub7ee\ub7ef\ub7f0\ub7f1\ub7f2\ub7f3\ub7f4\ub7f5\ub7f6\ub7f7\ub7f8\ub7f9\ub7fa\ub7fb\ub7fc\ub7fd\ub7fe\ub7ff\ub800\ub801\ub802\ub803\ub804\ub805\ub806\ub807\ub808\ub809\ub80a\ub80b\ub80c\ub80d\ub80e\ub80f\ub810\ub811\ub812\ub813\ub814\ub815\ub816\ub817\ub818\ub819\ub81a\ub81b\ub81c\ub81d\ub81e\ub81f\ub820\ub821\ub822\ub823\ub824\ub825\ub826\ub827\ub828\ub829\ub82a\ub82b\ub82c\ub82d\ub82e\ub82f\ub830\ub831\ub832\ub833\ub834\ub835\ub836\ub837\ub838\ub839\ub83a\ub83b\ub83c\ub83d\ub83e\ub83f\ub840\ub841\ub842\ub843\ub844\ub845\ub846\ub847\ub848\ub849\ub84a\ub84b\ub84c\ub84d\ub84e\ub84f\ub850\ub851\ub852\ub853\ub854\ub855\ub856\ub857\ub858\ub859\ub85a\ub85b\ub85c\ub85d\ub85e\ub85f\ub860\ub861\ub862\ub863\ub864\ub865\ub866\ub867\ub868\ub869\ub86a\ub86b\ub86c\ub86d\ub86e\ub86f\ub870\ub871\ub872\ub873\ub874\ub875\ub876\ub877\ub878\ub879\ub87a\ub87b\ub87c\ub87d\ub87e\ub87f\ub880\ub881\ub882\ub883\ub884\ub885\ub886\ub887\ub888\ub889\ub88a\ub88b\ub88c\ub88d\ub88e\ub88f\ub890\ub891\ub892\ub893\ub894\ub895\ub896\ub897\ub898\ub899\ub89a\ub89b\ub89c\ub89d\ub89e\ub89f\ub8a0\ub8a1\ub8a2\ub8a3\ub8a4\ub8a5\ub8a6\ub8a7\ub8a8\ub8a9\ub8aa\ub8ab\ub8ac\ub8ad\ub8ae\ub8af\ub8b0\ub8b1\ub8b2\ub8b3\ub8b4\ub8b5\ub8b6\ub8b7\ub8b8\ub8b9\ub8ba\ub8bb\ub8bc\ub8bd\ub8be\ub8bf\ub8c0\ub8c1\ub8c2\ub8c3\ub8c4\ub8c5\ub8c6\ub8c7\ub8c8\ub8c9\ub8ca\ub8cb\ub8cc\ub8cd\ub8ce\ub8cf\ub8d0\ub8d1\ub8d2\ub8d3\ub8d4\ub8d5\ub8d6\ub8d7\ub8d8\ub8d9\ub8da\ub8db\ub8dc\ub8dd\ub8de\ub8df\ub8e0\ub8e1\ub8e2\ub8e3\ub8e4\ub8e5\ub8e6\ub8e7\ub8e8\ub8e9\ub8ea\ub8eb\ub8ec\ub8ed\ub8ee\ub8ef\ub8f0\ub8f1\ub8f2\ub8f3\ub8f4\ub8f5\ub8f6\ub8f7\ub8f8\ub8f9\ub8fa\ub8fb\ub8fc\ub8fd\ub8fe\ub8ff\ub900\ub901\ub902\ub903\ub904\ub905\ub906\ub907\ub908\ub909\ub90a\ub90b\ub90c\ub90d\ub90e\ub90f\ub910\ub911\ub912\ub913\ub914\ub915\ub916\ub917\ub918\ub919\ub91a\ub91b\ub91c\ub91d\ub91e\ub91f\ub920\ub921\ub922\ub923\ub924\ub925\ub926\ub927\ub928\ub929\ub92a\ub92b\ub92c\ub92d\ub92e\ub92f\ub930\ub931\ub932\ub933\ub934\ub935\ub936\ub937\ub938\ub939\ub93a\ub93b\ub93c\ub93d\ub93e\ub93f\ub940\ub941\ub942\ub943\ub944\ub945\ub946\ub947\ub948\ub949\ub94a\ub94b\ub94c\ub94d\ub94e\ub94f\ub950\ub951\ub952\ub953\ub954\ub955\ub956\ub957\ub958\ub959\ub95a\ub95b\ub95c\ub95d\ub95e\ub95f\ub960\ub961\ub962\ub963\ub964\ub965\ub966\ub967\ub968\ub969\ub96a\ub96b\ub96c\ub96d\ub96e\ub96f\ub970\ub971\ub972\ub973\ub974\ub975\ub976\ub977\ub978\ub979\ub97a\ub97b\ub97c\ub97d\ub97e\ub97f\ub980\ub981\ub982\ub983\ub984\ub985\ub986\ub987\ub988\ub989\ub98a\ub98b\ub98c\ub98d\ub98e\ub98f\ub990\ub991\ub992\ub993\ub994\ub995\ub996\ub997\ub998\ub999\ub99a\ub99b\ub99c\ub99d\ub99e\ub99f\ub9a0\ub9a1\ub9a2\ub9a3\ub9a4\ub9a5\ub9a6\ub9a7\ub9a8\ub9a9\ub9aa\ub9ab\ub9ac\ub9ad\ub9ae\ub9af\ub9b0\ub9b1\ub9b2\ub9b3\ub9b4\ub9b5\ub9b6\ub9b7\ub9b8\ub9b9\ub9ba\ub9bb\ub9bc\ub9bd\ub9be\ub9bf\ub9c0\ub9c1\ub9c2\ub9c3\ub9c4\ub9c5\ub9c6\ub9c7\ub9c8\ub9c9\ub9ca\ub9cb\ub9cc\ub9cd\ub9ce\ub9cf\ub9d0\ub9d1\ub9d2\ub9d3\ub9d4\ub9d5\ub9d6\ub9d7\ub9d8\ub9d9\ub9da\ub9db\ub9dc\ub9dd\ub9de\ub9df\ub9e0\ub9e1\ub9e2\ub9e3\ub9e4\ub9e5\ub9e6\ub9e7\ub9e8\ub9e9\ub9ea\ub9eb\ub9ec\ub9ed\ub9ee\ub9ef\ub9f0\ub9f1\ub9f2\ub9f3\ub9f4\ub9f5\ub9f6\ub9f7\ub9f8\ub9f9\ub9fa\ub9fb\ub9fc\ub9fd\ub9fe\ub9ff\uba00\uba01\uba02\uba03\uba04\uba05\uba06\uba07\uba08\uba09\uba0a\uba0b\uba0c\uba0d\uba0e\uba0f\uba10\uba11\uba12\uba13\uba14\uba15\uba16\uba17\uba18\uba19\uba1a\uba1b\uba1c\uba1d\uba1e\uba1f\uba20\uba21\uba22\uba23\uba24\uba25\uba26\uba27\uba28\uba29\uba2a\uba2b\uba2c\uba2d\uba2e\uba2f\uba30\uba31\uba32\uba33\uba34\uba35\uba36\uba37\uba38\uba39\uba3a\uba3b\uba3c\uba3d\uba3e\uba3f\uba40\uba41\uba42\uba43\uba44\uba45\uba46\uba47\uba48\uba49\uba4a\uba4b\uba4c\uba4d\uba4e\uba4f\uba50\uba51\uba52\uba53\uba54\uba55\uba56\uba57\uba58\uba59\uba5a\uba5b\uba5c\uba5d\uba5e\uba5f\uba60\uba61\uba62\uba63\uba64\uba65\uba66\uba67\uba68\uba69\uba6a\uba6b\uba6c\uba6d\uba6e\uba6f\uba70\uba71\uba72\uba73\uba74\uba75\uba76\uba77\uba78\uba79\uba7a\uba7b\uba7c\uba7d\uba7e\uba7f\uba80\uba81\uba82\uba83\uba84\uba85\uba86\uba87\uba88\uba89\uba8a\uba8b\uba8c\uba8d\uba8e\uba8f\uba90\uba91\uba92\uba93\uba94\uba95\uba96\uba97\uba98\uba99\uba9a\uba9b\uba9c\uba9d\uba9e\uba9f\ubaa0\ubaa1\ubaa2\ubaa3\ubaa4\ubaa5\ubaa6\ubaa7\ubaa8\ubaa9\ubaaa\ubaab\ubaac\ubaad\ubaae\ubaaf\ubab0\ubab1\ubab2\ubab3\ubab4\ubab5\ubab6\ubab7\ubab8\ubab9\ubaba\ubabb\ubabc\ubabd\ubabe\ubabf\ubac0\ubac1\ubac2\ubac3\ubac4\ubac5\ubac6\ubac7\ubac8\ubac9\ubaca\ubacb\ubacc\ubacd\ubace\ubacf\ubad0\ubad1\ubad2\ubad3\ubad4\ubad5\ubad6\ubad7\ubad8\ubad9\ubada\ubadb\ubadc\ubadd\ubade\ubadf\ubae0\ubae1\ubae2\ubae3\ubae4\ubae5\ubae6\ubae7\ubae8\ubae9\ubaea\ubaeb\ubaec\ubaed\ubaee\ubaef\ubaf0\ubaf1\ubaf2\ubaf3\ubaf4\ubaf5\ubaf6\ubaf7\ubaf8\ubaf9\ubafa\ubafb\ubafc\ubafd\ubafe\ubaff\ubb00\ubb01\ubb02\ubb03\ubb04\ubb05\ubb06\ubb07\ubb08\ubb09\ubb0a\ubb0b\ubb0c\ubb0d\ubb0e\ubb0f\ubb10\ubb11\ubb12\ubb13\ubb14\ubb15\ubb16\ubb17\ubb18\ubb19\ubb1a\ubb1b\ubb1c\ubb1d\ubb1e\ubb1f\ubb20\ubb21\ubb22\ubb23\ubb24\ubb25\ubb26\ubb27\ubb28\ubb29\ubb2a\ubb2b\ubb2c\ubb2d\ubb2e\ubb2f\ubb30\ubb31\ubb32\ubb33\ubb34\ubb35\ubb36\ubb37\ubb38\ubb39\ubb3a\ubb3b\ubb3c\ubb3d\ubb3e\ubb3f\ubb40\ubb41\ubb42\ubb43\ubb44\ubb45\ubb46\ubb47\ubb48\ubb49\ubb4a\ubb4b\ubb4c\ubb4d\ubb4e\ubb4f\ubb50\ubb51\ubb52\ubb53\ubb54\ubb55\ubb56\ubb57\ubb58\ubb59\ubb5a\ubb5b\ubb5c\ubb5d\ubb5e\ubb5f\ubb60\ubb61\ubb62\ubb63\ubb64\ubb65\ubb66\ubb67\ubb68\ubb69\ubb6a\ubb6b\ubb6c\ubb6d\ubb6e\ubb6f\ubb70\ubb71\ubb72\ubb73\ubb74\ubb75\ubb76\ubb77\ubb78\ubb79\ubb7a\ubb7b\ubb7c\ubb7d\ubb7e\ubb7f\ubb80\ubb81\ubb82\ubb83\ubb84\ubb85\ubb86\ubb87\ubb88\ubb89\ubb8a\ubb8b\ubb8c\ubb8d\ubb8e\ubb8f\ubb90\ubb91\ubb92\ubb93\ubb94\ubb95\ubb96\ubb97\ubb98\ubb99\ubb9a\ubb9b\ubb9c\ubb9d\ubb9e\ubb9f\ubba0\ubba1\ubba2\ubba3\ubba4\ubba5\ubba6\ubba7\ubba8\ubba9\ubbaa\ubbab\ubbac\ubbad\ubbae\ubbaf\ubbb0\ubbb1\ubbb2\ubbb3\ubbb4\ubbb5\ubbb6\ubbb7\ubbb8\ubbb9\ubbba\ubbbb\ubbbc\ubbbd\ubbbe\ubbbf\ubbc0\ubbc1\ubbc2\ubbc3\ubbc4\ubbc5\ubbc6\ubbc7\ubbc8\ubbc9\ubbca\ubbcb\ubbcc\ubbcd\ubbce\ubbcf\ubbd0\ubbd1\ubbd2\ubbd3\ubbd4\ubbd5\ubbd6\ubbd7\ubbd8\ubbd9\ubbda\ubbdb\ubbdc\ubbdd\ubbde\ubbdf\ubbe0\ubbe1\ubbe2\ubbe3\ubbe4\ubbe5\ubbe6\ubbe7\ubbe8\ubbe9\ubbea\ubbeb\ubbec\ubbed\ubbee\ubbef\ubbf0\ubbf1\ubbf2\ubbf3\ubbf4\ubbf5\ubbf6\ubbf7\ubbf8\ubbf9\ubbfa\ubbfb\ubbfc\ubbfd\ubbfe\ubbff\ubc00\ubc01\ubc02\ubc03\ubc04\ubc05\ubc06\ubc07\ubc08\ubc09\ubc0a\ubc0b\ubc0c\ubc0d\ubc0e\ubc0f\ubc10\ubc11\ubc12\ubc13\ubc14\ubc15\ubc16\ubc17\ubc18\ubc19\ubc1a\ubc1b\ubc1c\ubc1d\ubc1e\ubc1f\ubc20\ubc21\ubc22\ubc23\ubc24\ubc25\ubc26\ubc27\ubc28\ubc29\ubc2a\ubc2b\ubc2c\ubc2d\ubc2e\ubc2f\ubc30\ubc31\ubc32\ubc33\ubc34\ubc35\ubc36\ubc37\ubc38\ubc39\ubc3a\ubc3b\ubc3c\ubc3d\ubc3e\ubc3f\ubc40\ubc41\ubc42\ubc43\ubc44\ubc45\ubc46\ubc47\ubc48\ubc49\ubc4a\ubc4b\ubc4c\ubc4d\ubc4e\ubc4f\ubc50\ubc51\ubc52\ubc53\ubc54\ubc55\ubc56\ubc57\ubc58\ubc59\ubc5a\ubc5b\ubc5c\ubc5d\ubc5e\ubc5f\ubc60\ubc61\ubc62\ubc63\ubc64\ubc65\ubc66\ubc67\ubc68\ubc69\ubc6a\ubc6b\ubc6c\ubc6d\ubc6e\ubc6f\ubc70\ubc71\ubc72\ubc73\ubc74\ubc75\ubc76\ubc77\ubc78\ubc79\ubc7a\ubc7b\ubc7c\ubc7d\ubc7e\ubc7f\ubc80\ubc81\ubc82\ubc83\ubc84\ubc85\ubc86\ubc87\ubc88\ubc89\ubc8a\ubc8b\ubc8c\ubc8d\ubc8e\ubc8f\ubc90\ubc91\ubc92\ubc93\ubc94\ubc95\ubc96\ubc97\ubc98\ubc99\ubc9a\ubc9b\ubc9c\ubc9d\ubc9e\ubc9f\ubca0\ubca1\ubca2\ubca3\ubca4\ubca5\ubca6\ubca7\ubca8\ubca9\ubcaa\ubcab\ubcac\ubcad\ubcae\ubcaf\ubcb0\ubcb1\ubcb2\ubcb3\ubcb4\ubcb5\ubcb6\ubcb7\ubcb8\ubcb9\ubcba\ubcbb\ubcbc\ubcbd\ubcbe\ubcbf\ubcc0\ubcc1\ubcc2\ubcc3\ubcc4\ubcc5\ubcc6\ubcc7\ubcc8\ubcc9\ubcca\ubccb\ubccc\ubccd\ubcce\ubccf\ubcd0\ubcd1\ubcd2\ubcd3\ubcd4\ubcd5\ubcd6\ubcd7\ubcd8\ubcd9\ubcda\ubcdb\ubcdc\ubcdd\ubcde\ubcdf\ubce0\ubce1\ubce2\ubce3\ubce4\ubce5\ubce6\ubce7\ubce8\ubce9\ubcea\ubceb\ubcec\ubced\ubcee\ubcef\ubcf0\ubcf1\ubcf2\ubcf3\ubcf4\ubcf5\ubcf6\ubcf7\ubcf8\ubcf9\ubcfa\ubcfb\ubcfc\ubcfd\ubcfe\ubcff\ubd00\ubd01\ubd02\ubd03\ubd04\ubd05\ubd06\ubd07\ubd08\ubd09\ubd0a\ubd0b\ubd0c\ubd0d\ubd0e\ubd0f\ubd10\ubd11\ubd12\ubd13\ubd14\ubd15\ubd16\ubd17\ubd18\ubd19\ubd1a\ubd1b\ubd1c\ubd1d\ubd1e\ubd1f\ubd20\ubd21\ubd22\ubd23\ubd24\ubd25\ubd26\ubd27\ubd28\ubd29\ubd2a\ubd2b\ubd2c\ubd2d\ubd2e\ubd2f\ubd30\ubd31\ubd32\ubd33\ubd34\ubd35\ubd36\ubd37\ubd38\ubd39\ubd3a\ubd3b\ubd3c\ubd3d\ubd3e\ubd3f\ubd40\ubd41\ubd42\ubd43\ubd44\ubd45\ubd46\ubd47\ubd48\ubd49\ubd4a\ubd4b\ubd4c\ubd4d\ubd4e\ubd4f\ubd50\ubd51\ubd52\ubd53\ubd54\ubd55\ubd56\ubd57\ubd58\ubd59\ubd5a\ubd5b\ubd5c\ubd5d\ubd5e\ubd5f\ubd60\ubd61\ubd62\ubd63\ubd64\ubd65\ubd66\ubd67\ubd68\ubd69\ubd6a\ubd6b\ubd6c\ubd6d\ubd6e\ubd6f\ubd70\ubd71\ubd72\ubd73\ubd74\ubd75\ubd76\ubd77\ubd78\ubd79\ubd7a\ubd7b\ubd7c\ubd7d\ubd7e\ubd7f\ubd80\ubd81\ubd82\ubd83\ubd84\ubd85\ubd86\ubd87\ubd88\ubd89\ubd8a\ubd8b\ubd8c\ubd8d\ubd8e\ubd8f\ubd90\ubd91\ubd92\ubd93\ubd94\ubd95\ubd96\ubd97\ubd98\ubd99\ubd9a\ubd9b\ubd9c\ubd9d\ubd9e\ubd9f\ubda0\ubda1\ubda2\ubda3\ubda4\ubda5\ubda6\ubda7\ubda8\ubda9\ubdaa\ubdab\ubdac\ubdad\ubdae\ubdaf\ubdb0\ubdb1\ubdb2\ubdb3\ubdb4\ubdb5\ubdb6\ubdb7\ubdb8\ubdb9\ubdba\ubdbb\ubdbc\ubdbd\ubdbe\ubdbf\ubdc0\ubdc1\ubdc2\ubdc3\ubdc4\ubdc5\ubdc6\ubdc7\ubdc8\ubdc9\ubdca\ubdcb\ubdcc\ubdcd\ubdce\ubdcf\ubdd0\ubdd1\ubdd2\ubdd3\ubdd4\ubdd5\ubdd6\ubdd7\ubdd8\ubdd9\ubdda\ubddb\ubddc\ubddd\ubdde\ubddf\ubde0\ubde1\ubde2\ubde3\ubde4\ubde5\ubde6\ubde7\ubde8\ubde9\ubdea\ubdeb\ubdec\ubded\ubdee\ubdef\ubdf0\ubdf1\ubdf2\ubdf3\ubdf4\ubdf5\ubdf6\ubdf7\ubdf8\ubdf9\ubdfa\ubdfb\ubdfc\ubdfd\ubdfe\ubdff\ube00\ube01\ube02\ube03\ube04\ube05\ube06\ube07\ube08\ube09\ube0a\ube0b\ube0c\ube0d\ube0e\ube0f\ube10\ube11\ube12\ube13\ube14\ube15\ube16\ube17\ube18\ube19\ube1a\ube1b\ube1c\ube1d\ube1e\ube1f\ube20\ube21\ube22\ube23\ube24\ube25\ube26\ube27\ube28\ube29\ube2a\ube2b\ube2c\ube2d\ube2e\ube2f\ube30\ube31\ube32\ube33\ube34\ube35\ube36\ube37\ube38\ube39\ube3a\ube3b\ube3c\ube3d\ube3e\ube3f\ube40\ube41\ube42\ube43\ube44\ube45\ube46\ube47\ube48\ube49\ube4a\ube4b\ube4c\ube4d\ube4e\ube4f\ube50\ube51\ube52\ube53\ube54\ube55\ube56\ube57\ube58\ube59\ube5a\ube5b\ube5c\ube5d\ube5e\ube5f\ube60\ube61\ube62\ube63\ube64\ube65\ube66\ube67\ube68\ube69\ube6a\ube6b\ube6c\ube6d\ube6e\ube6f\ube70\ube71\ube72\ube73\ube74\ube75\ube76\ube77\ube78\ube79\ube7a\ube7b\ube7c\ube7d\ube7e\ube7f\ube80\ube81\ube82\ube83\ube84\ube85\ube86\ube87\ube88\ube89\ube8a\ube8b\ube8c\ube8d\ube8e\ube8f\ube90\ube91\ube92\ube93\ube94\ube95\ube96\ube97\ube98\ube99\ube9a\ube9b\ube9c\ube9d\ube9e\ube9f\ubea0\ubea1\ubea2\ubea3\ubea4\ubea5\ubea6\ubea7\ubea8\ubea9\ubeaa\ubeab\ubeac\ubead\ubeae\ubeaf\ubeb0\ubeb1\ubeb2\ubeb3\ubeb4\ubeb5\ubeb6\ubeb7\ubeb8\ubeb9\ubeba\ubebb\ubebc\ubebd\ubebe\ubebf\ubec0\ubec1\ubec2\ubec3\ubec4\ubec5\ubec6\ubec7\ubec8\ubec9\ubeca\ubecb\ubecc\ubecd\ubece\ubecf\ubed0\ubed1\ubed2\ubed3\ubed4\ubed5\ubed6\ubed7\ubed8\ubed9\ubeda\ubedb\ubedc\ubedd\ubede\ubedf\ubee0\ubee1\ubee2\ubee3\ubee4\ubee5\ubee6\ubee7\ubee8\ubee9\ubeea\ubeeb\ubeec\ubeed\ubeee\ubeef\ubef0\ubef1\ubef2\ubef3\ubef4\ubef5\ubef6\ubef7\ubef8\ubef9\ubefa\ubefb\ubefc\ubefd\ubefe\ubeff\ubf00\ubf01\ubf02\ubf03\ubf04\ubf05\ubf06\ubf07\ubf08\ubf09\ubf0a\ubf0b\ubf0c\ubf0d\ubf0e\ubf0f\ubf10\ubf11\ubf12\ubf13\ubf14\ubf15\ubf16\ubf17\ubf18\ubf19\ubf1a\ubf1b\ubf1c\ubf1d\ubf1e\ubf1f\ubf20\ubf21\ubf22\ubf23\ubf24\ubf25\ubf26\ubf27\ubf28\ubf29\ubf2a\ubf2b\ubf2c\ubf2d\ubf2e\ubf2f\ubf30\ubf31\ubf32\ubf33\ubf34\ubf35\ubf36\ubf37\ubf38\ubf39\ubf3a\ubf3b\ubf3c\ubf3d\ubf3e\ubf3f\ubf40\ubf41\ubf42\ubf43\ubf44\ubf45\ubf46\ubf47\ubf48\ubf49\ubf4a\ubf4b\ubf4c\ubf4d\ubf4e\ubf4f\ubf50\ubf51\ubf52\ubf53\ubf54\ubf55\ubf56\ubf57\ubf58\ubf59\ubf5a\ubf5b\ubf5c\ubf5d\ubf5e\ubf5f\ubf60\ubf61\ubf62\ubf63\ubf64\ubf65\ubf66\ubf67\ubf68\ubf69\ubf6a\ubf6b\ubf6c\ubf6d\ubf6e\ubf6f\ubf70\ubf71\ubf72\ubf73\ubf74\ubf75\ubf76\ubf77\ubf78\ubf79\ubf7a\ubf7b\ubf7c\ubf7d\ubf7e\ubf7f\ubf80\ubf81\ubf82\ubf83\ubf84\ubf85\ubf86\ubf87\ubf88\ubf89\ubf8a\ubf8b\ubf8c\ubf8d\ubf8e\ubf8f\ubf90\ubf91\ubf92\ubf93\ubf94\ubf95\ubf96\ubf97\ubf98\ubf99\ubf9a\ubf9b\ubf9c\ubf9d\ubf9e\ubf9f\ubfa0\ubfa1\ubfa2\ubfa3\ubfa4\ubfa5\ubfa6\ubfa7\ubfa8\ubfa9\ubfaa\ubfab\ubfac\ubfad\ubfae\ubfaf\ubfb0\ubfb1\ubfb2\ubfb3\ubfb4\ubfb5\ubfb6\ubfb7\ubfb8\ubfb9\ubfba\ubfbb\ubfbc\ubfbd\ubfbe\ubfbf\ubfc0\ubfc1\ubfc2\ubfc3\ubfc4\ubfc5\ubfc6\ubfc7\ubfc8\ubfc9\ubfca\ubfcb\ubfcc\ubfcd\ubfce\ubfcf\ubfd0\ubfd1\ubfd2\ubfd3\ubfd4\ubfd5\ubfd6\ubfd7\ubfd8\ubfd9\ubfda\ubfdb\ubfdc\ubfdd\ubfde\ubfdf\ubfe0\ubfe1\ubfe2\ubfe3\ubfe4\ubfe5\ubfe6\ubfe7\ubfe8\ubfe9\ubfea\ubfeb\ubfec\ubfed\ubfee\ubfef\ubff0\ubff1\ubff2\ubff3\ubff4\ubff5\ubff6\ubff7\ubff8\ubff9\ubffa\ubffb\ubffc\ubffd\ubffe\ubfff\uc000\uc001\uc002\uc003\uc004\uc005\uc006\uc007\uc008\uc009\uc00a\uc00b\uc00c\uc00d\uc00e\uc00f\uc010\uc011\uc012\uc013\uc014\uc015\uc016\uc017\uc018\uc019\uc01a\uc01b\uc01c\uc01d\uc01e\uc01f\uc020\uc021\uc022\uc023\uc024\uc025\uc026\uc027\uc028\uc029\uc02a\uc02b\uc02c\uc02d\uc02e\uc02f\uc030\uc031\uc032\uc033\uc034\uc035\uc036\uc037\uc038\uc039\uc03a\uc03b\uc03c\uc03d\uc03e\uc03f\uc040\uc041\uc042\uc043\uc044\uc045\uc046\uc047\uc048\uc049\uc04a\uc04b\uc04c\uc04d\uc04e\uc04f\uc050\uc051\uc052\uc053\uc054\uc055\uc056\uc057\uc058\uc059\uc05a\uc05b\uc05c\uc05d\uc05e\uc05f\uc060\uc061\uc062\uc063\uc064\uc065\uc066\uc067\uc068\uc069\uc06a\uc06b\uc06c\uc06d\uc06e\uc06f\uc070\uc071\uc072\uc073\uc074\uc075\uc076\uc077\uc078\uc079\uc07a\uc07b\uc07c\uc07d\uc07e\uc07f\uc080\uc081\uc082\uc083\uc084\uc085\uc086\uc087\uc088\uc089\uc08a\uc08b\uc08c\uc08d\uc08e\uc08f\uc090\uc091\uc092\uc093\uc094\uc095\uc096\uc097\uc098\uc099\uc09a\uc09b\uc09c\uc09d\uc09e\uc09f\uc0a0\uc0a1\uc0a2\uc0a3\uc0a4\uc0a5\uc0a6\uc0a7\uc0a8\uc0a9\uc0aa\uc0ab\uc0ac\uc0ad\uc0ae\uc0af\uc0b0\uc0b1\uc0b2\uc0b3\uc0b4\uc0b5\uc0b6\uc0b7\uc0b8\uc0b9\uc0ba\uc0bb\uc0bc\uc0bd\uc0be\uc0bf\uc0c0\uc0c1\uc0c2\uc0c3\uc0c4\uc0c5\uc0c6\uc0c7\uc0c8\uc0c9\uc0ca\uc0cb\uc0cc\uc0cd\uc0ce\uc0cf\uc0d0\uc0d1\uc0d2\uc0d3\uc0d4\uc0d5\uc0d6\uc0d7\uc0d8\uc0d9\uc0da\uc0db\uc0dc\uc0dd\uc0de\uc0df\uc0e0\uc0e1\uc0e2\uc0e3\uc0e4\uc0e5\uc0e6\uc0e7\uc0e8\uc0e9\uc0ea\uc0eb\uc0ec\uc0ed\uc0ee\uc0ef\uc0f0\uc0f1\uc0f2\uc0f3\uc0f4\uc0f5\uc0f6\uc0f7\uc0f8\uc0f9\uc0fa\uc0fb\uc0fc\uc0fd\uc0fe\uc0ff\uc100\uc101\uc102\uc103\uc104\uc105\uc106\uc107\uc108\uc109\uc10a\uc10b\uc10c\uc10d\uc10e\uc10f\uc110\uc111\uc112\uc113\uc114\uc115\uc116\uc117\uc118\uc119\uc11a\uc11b\uc11c\uc11d\uc11e\uc11f\uc120\uc121\uc122\uc123\uc124\uc125\uc126\uc127\uc128\uc129\uc12a\uc12b\uc12c\uc12d\uc12e\uc12f\uc130\uc131\uc132\uc133\uc134\uc135\uc136\uc137\uc138\uc139\uc13a\uc13b\uc13c\uc13d\uc13e\uc13f\uc140\uc141\uc142\uc143\uc144\uc145\uc146\uc147\uc148\uc149\uc14a\uc14b\uc14c\uc14d\uc14e\uc14f\uc150\uc151\uc152\uc153\uc154\uc155\uc156\uc157\uc158\uc159\uc15a\uc15b\uc15c\uc15d\uc15e\uc15f\uc160\uc161\uc162\uc163\uc164\uc165\uc166\uc167\uc168\uc169\uc16a\uc16b\uc16c\uc16d\uc16e\uc16f\uc170\uc171\uc172\uc173\uc174\uc175\uc176\uc177\uc178\uc179\uc17a\uc17b\uc17c\uc17d\uc17e\uc17f\uc180\uc181\uc182\uc183\uc184\uc185\uc186\uc187\uc188\uc189\uc18a\uc18b\uc18c\uc18d\uc18e\uc18f\uc190\uc191\uc192\uc193\uc194\uc195\uc196\uc197\uc198\uc199\uc19a\uc19b\uc19c\uc19d\uc19e\uc19f\uc1a0\uc1a1\uc1a2\uc1a3\uc1a4\uc1a5\uc1a6\uc1a7\uc1a8\uc1a9\uc1aa\uc1ab\uc1ac\uc1ad\uc1ae\uc1af\uc1b0\uc1b1\uc1b2\uc1b3\uc1b4\uc1b5\uc1b6\uc1b7\uc1b8\uc1b9\uc1ba\uc1bb\uc1bc\uc1bd\uc1be\uc1bf\uc1c0\uc1c1\uc1c2\uc1c3\uc1c4\uc1c5\uc1c6\uc1c7\uc1c8\uc1c9\uc1ca\uc1cb\uc1cc\uc1cd\uc1ce\uc1cf\uc1d0\uc1d1\uc1d2\uc1d3\uc1d4\uc1d5\uc1d6\uc1d7\uc1d8\uc1d9\uc1da\uc1db\uc1dc\uc1dd\uc1de\uc1df\uc1e0\uc1e1\uc1e2\uc1e3\uc1e4\uc1e5\uc1e6\uc1e7\uc1e8\uc1e9\uc1ea\uc1eb\uc1ec\uc1ed\uc1ee\uc1ef\uc1f0\uc1f1\uc1f2\uc1f3\uc1f4\uc1f5\uc1f6\uc1f7\uc1f8\uc1f9\uc1fa\uc1fb\uc1fc\uc1fd\uc1fe\uc1ff\uc200\uc201\uc202\uc203\uc204\uc205\uc206\uc207\uc208\uc209\uc20a\uc20b\uc20c\uc20d\uc20e\uc20f\uc210\uc211\uc212\uc213\uc214\uc215\uc216\uc217\uc218\uc219\uc21a\uc21b\uc21c\uc21d\uc21e\uc21f\uc220\uc221\uc222\uc223\uc224\uc225\uc226\uc227\uc228\uc229\uc22a\uc22b\uc22c\uc22d\uc22e\uc22f\uc230\uc231\uc232\uc233\uc234\uc235\uc236\uc237\uc238\uc239\uc23a\uc23b\uc23c\uc23d\uc23e\uc23f\uc240\uc241\uc242\uc243\uc244\uc245\uc246\uc247\uc248\uc249\uc24a\uc24b\uc24c\uc24d\uc24e\uc24f\uc250\uc251\uc252\uc253\uc254\uc255\uc256\uc257\uc258\uc259\uc25a\uc25b\uc25c\uc25d\uc25e\uc25f\uc260\uc261\uc262\uc263\uc264\uc265\uc266\uc267\uc268\uc269\uc26a\uc26b\uc26c\uc26d\uc26e\uc26f\uc270\uc271\uc272\uc273\uc274\uc275\uc276\uc277\uc278\uc279\uc27a\uc27b\uc27c\uc27d\uc27e\uc27f\uc280\uc281\uc282\uc283\uc284\uc285\uc286\uc287\uc288\uc289\uc28a\uc28b\uc28c\uc28d\uc28e\uc28f\uc290\uc291\uc292\uc293\uc294\uc295\uc296\uc297\uc298\uc299\uc29a\uc29b\uc29c\uc29d\uc29e\uc29f\uc2a0\uc2a1\uc2a2\uc2a3\uc2a4\uc2a5\uc2a6\uc2a7\uc2a8\uc2a9\uc2aa\uc2ab\uc2ac\uc2ad\uc2ae\uc2af\uc2b0\uc2b1\uc2b2\uc2b3\uc2b4\uc2b5\uc2b6\uc2b7\uc2b8\uc2b9\uc2ba\uc2bb\uc2bc\uc2bd\uc2be\uc2bf\uc2c0\uc2c1\uc2c2\uc2c3\uc2c4\uc2c5\uc2c6\uc2c7\uc2c8\uc2c9\uc2ca\uc2cb\uc2cc\uc2cd\uc2ce\uc2cf\uc2d0\uc2d1\uc2d2\uc2d3\uc2d4\uc2d5\uc2d6\uc2d7\uc2d8\uc2d9\uc2da\uc2db\uc2dc\uc2dd\uc2de\uc2df\uc2e0\uc2e1\uc2e2\uc2e3\uc2e4\uc2e5\uc2e6\uc2e7\uc2e8\uc2e9\uc2ea\uc2eb\uc2ec\uc2ed\uc2ee\uc2ef\uc2f0\uc2f1\uc2f2\uc2f3\uc2f4\uc2f5\uc2f6\uc2f7\uc2f8\uc2f9\uc2fa\uc2fb\uc2fc\uc2fd\uc2fe\uc2ff\uc300\uc301\uc302\uc303\uc304\uc305\uc306\uc307\uc308\uc309\uc30a\uc30b\uc30c\uc30d\uc30e\uc30f\uc310\uc311\uc312\uc313\uc314\uc315\uc316\uc317\uc318\uc319\uc31a\uc31b\uc31c\uc31d\uc31e\uc31f\uc320\uc321\uc322\uc323\uc324\uc325\uc326\uc327\uc328\uc329\uc32a\uc32b\uc32c\uc32d\uc32e\uc32f\uc330\uc331\uc332\uc333\uc334\uc335\uc336\uc337\uc338\uc339\uc33a\uc33b\uc33c\uc33d\uc33e\uc33f\uc340\uc341\uc342\uc343\uc344\uc345\uc346\uc347\uc348\uc349\uc34a\uc34b\uc34c\uc34d\uc34e\uc34f\uc350\uc351\uc352\uc353\uc354\uc355\uc356\uc357\uc358\uc359\uc35a\uc35b\uc35c\uc35d\uc35e\uc35f\uc360\uc361\uc362\uc363\uc364\uc365\uc366\uc367\uc368\uc369\uc36a\uc36b\uc36c\uc36d\uc36e\uc36f\uc370\uc371\uc372\uc373\uc374\uc375\uc376\uc377\uc378\uc379\uc37a\uc37b\uc37c\uc37d\uc37e\uc37f\uc380\uc381\uc382\uc383\uc384\uc385\uc386\uc387\uc388\uc389\uc38a\uc38b\uc38c\uc38d\uc38e\uc38f\uc390\uc391\uc392\uc393\uc394\uc395\uc396\uc397\uc398\uc399\uc39a\uc39b\uc39c\uc39d\uc39e\uc39f\uc3a0\uc3a1\uc3a2\uc3a3\uc3a4\uc3a5\uc3a6\uc3a7\uc3a8\uc3a9\uc3aa\uc3ab\uc3ac\uc3ad\uc3ae\uc3af\uc3b0\uc3b1\uc3b2\uc3b3\uc3b4\uc3b5\uc3b6\uc3b7\uc3b8\uc3b9\uc3ba\uc3bb\uc3bc\uc3bd\uc3be\uc3bf\uc3c0\uc3c1\uc3c2\uc3c3\uc3c4\uc3c5\uc3c6\uc3c7\uc3c8\uc3c9\uc3ca\uc3cb\uc3cc\uc3cd\uc3ce\uc3cf\uc3d0\uc3d1\uc3d2\uc3d3\uc3d4\uc3d5\uc3d6\uc3d7\uc3d8\uc3d9\uc3da\uc3db\uc3dc\uc3dd\uc3de\uc3df\uc3e0\uc3e1\uc3e2\uc3e3\uc3e4\uc3e5\uc3e6\uc3e7\uc3e8\uc3e9\uc3ea\uc3eb\uc3ec\uc3ed\uc3ee\uc3ef\uc3f0\uc3f1\uc3f2\uc3f3\uc3f4\uc3f5\uc3f6\uc3f7\uc3f8\uc3f9\uc3fa\uc3fb\uc3fc\uc3fd\uc3fe\uc3ff\uc400\uc401\uc402\uc403\uc404\uc405\uc406\uc407\uc408\uc409\uc40a\uc40b\uc40c\uc40d\uc40e\uc40f\uc410\uc411\uc412\uc413\uc414\uc415\uc416\uc417\uc418\uc419\uc41a\uc41b\uc41c\uc41d\uc41e\uc41f\uc420\uc421\uc422\uc423\uc424\uc425\uc426\uc427\uc428\uc429\uc42a\uc42b\uc42c\uc42d\uc42e\uc42f\uc430\uc431\uc432\uc433\uc434\uc435\uc436\uc437\uc438\uc439\uc43a\uc43b\uc43c\uc43d\uc43e\uc43f\uc440\uc441\uc442\uc443\uc444\uc445\uc446\uc447\uc448\uc449\uc44a\uc44b\uc44c\uc44d\uc44e\uc44f\uc450\uc451\uc452\uc453\uc454\uc455\uc456\uc457\uc458\uc459\uc45a\uc45b\uc45c\uc45d\uc45e\uc45f\uc460\uc461\uc462\uc463\uc464\uc465\uc466\uc467\uc468\uc469\uc46a\uc46b\uc46c\uc46d\uc46e\uc46f\uc470\uc471\uc472\uc473\uc474\uc475\uc476\uc477\uc478\uc479\uc47a\uc47b\uc47c\uc47d\uc47e\uc47f\uc480\uc481\uc482\uc483\uc484\uc485\uc486\uc487\uc488\uc489\uc48a\uc48b\uc48c\uc48d\uc48e\uc48f\uc490\uc491\uc492\uc493\uc494\uc495\uc496\uc497\uc498\uc499\uc49a\uc49b\uc49c\uc49d\uc49e\uc49f\uc4a0\uc4a1\uc4a2\uc4a3\uc4a4\uc4a5\uc4a6\uc4a7\uc4a8\uc4a9\uc4aa\uc4ab\uc4ac\uc4ad\uc4ae\uc4af\uc4b0\uc4b1\uc4b2\uc4b3\uc4b4\uc4b5\uc4b6\uc4b7\uc4b8\uc4b9\uc4ba\uc4bb\uc4bc\uc4bd\uc4be\uc4bf\uc4c0\uc4c1\uc4c2\uc4c3\uc4c4\uc4c5\uc4c6\uc4c7\uc4c8\uc4c9\uc4ca\uc4cb\uc4cc\uc4cd\uc4ce\uc4cf\uc4d0\uc4d1\uc4d2\uc4d3\uc4d4\uc4d5\uc4d6\uc4d7\uc4d8\uc4d9\uc4da\uc4db\uc4dc\uc4dd\uc4de\uc4df\uc4e0\uc4e1\uc4e2\uc4e3\uc4e4\uc4e5\uc4e6\uc4e7\uc4e8\uc4e9\uc4ea\uc4eb\uc4ec\uc4ed\uc4ee\uc4ef\uc4f0\uc4f1\uc4f2\uc4f3\uc4f4\uc4f5\uc4f6\uc4f7\uc4f8\uc4f9\uc4fa\uc4fb\uc4fc\uc4fd\uc4fe\uc4ff\uc500\uc501\uc502\uc503\uc504\uc505\uc506\uc507\uc508\uc509\uc50a\uc50b\uc50c\uc50d\uc50e\uc50f\uc510\uc511\uc512\uc513\uc514\uc515\uc516\uc517\uc518\uc519\uc51a\uc51b\uc51c\uc51d\uc51e\uc51f\uc520\uc521\uc522\uc523\uc524\uc525\uc526\uc527\uc528\uc529\uc52a\uc52b\uc52c\uc52d\uc52e\uc52f\uc530\uc531\uc532\uc533\uc534\uc535\uc536\uc537\uc538\uc539\uc53a\uc53b\uc53c\uc53d\uc53e\uc53f\uc540\uc541\uc542\uc543\uc544\uc545\uc546\uc547\uc548\uc549\uc54a\uc54b\uc54c\uc54d\uc54e\uc54f\uc550\uc551\uc552\uc553\uc554\uc555\uc556\uc557\uc558\uc559\uc55a\uc55b\uc55c\uc55d\uc55e\uc55f\uc560\uc561\uc562\uc563\uc564\uc565\uc566\uc567\uc568\uc569\uc56a\uc56b\uc56c\uc56d\uc56e\uc56f\uc570\uc571\uc572\uc573\uc574\uc575\uc576\uc577\uc578\uc579\uc57a\uc57b\uc57c\uc57d\uc57e\uc57f\uc580\uc581\uc582\uc583\uc584\uc585\uc586\uc587\uc588\uc589\uc58a\uc58b\uc58c\uc58d\uc58e\uc58f\uc590\uc591\uc592\uc593\uc594\uc595\uc596\uc597\uc598\uc599\uc59a\uc59b\uc59c\uc59d\uc59e\uc59f\uc5a0\uc5a1\uc5a2\uc5a3\uc5a4\uc5a5\uc5a6\uc5a7\uc5a8\uc5a9\uc5aa\uc5ab\uc5ac\uc5ad\uc5ae\uc5af\uc5b0\uc5b1\uc5b2\uc5b3\uc5b4\uc5b5\uc5b6\uc5b7\uc5b8\uc5b9\uc5ba\uc5bb\uc5bc\uc5bd\uc5be\uc5bf\uc5c0\uc5c1\uc5c2\uc5c3\uc5c4\uc5c5\uc5c6\uc5c7\uc5c8\uc5c9\uc5ca\uc5cb\uc5cc\uc5cd\uc5ce\uc5cf\uc5d0\uc5d1\uc5d2\uc5d3\uc5d4\uc5d5\uc5d6\uc5d7\uc5d8\uc5d9\uc5da\uc5db\uc5dc\uc5dd\uc5de\uc5df\uc5e0\uc5e1\uc5e2\uc5e3\uc5e4\uc5e5\uc5e6\uc5e7\uc5e8\uc5e9\uc5ea\uc5eb\uc5ec\uc5ed\uc5ee\uc5ef\uc5f0\uc5f1\uc5f2\uc5f3\uc5f4\uc5f5\uc5f6\uc5f7\uc5f8\uc5f9\uc5fa\uc5fb\uc5fc\uc5fd\uc5fe\uc5ff\uc600\uc601\uc602\uc603\uc604\uc605\uc606\uc607\uc608\uc609\uc60a\uc60b\uc60c\uc60d\uc60e\uc60f\uc610\uc611\uc612\uc613\uc614\uc615\uc616\uc617\uc618\uc619\uc61a\uc61b\uc61c\uc61d\uc61e\uc61f\uc620\uc621\uc622\uc623\uc624\uc625\uc626\uc627\uc628\uc629\uc62a\uc62b\uc62c\uc62d\uc62e\uc62f\uc630\uc631\uc632\uc633\uc634\uc635\uc636\uc637\uc638\uc639\uc63a\uc63b\uc63c\uc63d\uc63e\uc63f\uc640\uc641\uc642\uc643\uc644\uc645\uc646\uc647\uc648\uc649\uc64a\uc64b\uc64c\uc64d\uc64e\uc64f\uc650\uc651\uc652\uc653\uc654\uc655\uc656\uc657\uc658\uc659\uc65a\uc65b\uc65c\uc65d\uc65e\uc65f\uc660\uc661\uc662\uc663\uc664\uc665\uc666\uc667\uc668\uc669\uc66a\uc66b\uc66c\uc66d\uc66e\uc66f\uc670\uc671\uc672\uc673\uc674\uc675\uc676\uc677\uc678\uc679\uc67a\uc67b\uc67c\uc67d\uc67e\uc67f\uc680\uc681\uc682\uc683\uc684\uc685\uc686\uc687\uc688\uc689\uc68a\uc68b\uc68c\uc68d\uc68e\uc68f\uc690\uc691\uc692\uc693\uc694\uc695\uc696\uc697\uc698\uc699\uc69a\uc69b\uc69c\uc69d\uc69e\uc69f\uc6a0\uc6a1\uc6a2\uc6a3\uc6a4\uc6a5\uc6a6\uc6a7\uc6a8\uc6a9\uc6aa\uc6ab\uc6ac\uc6ad\uc6ae\uc6af\uc6b0\uc6b1\uc6b2\uc6b3\uc6b4\uc6b5\uc6b6\uc6b7\uc6b8\uc6b9\uc6ba\uc6bb\uc6bc\uc6bd\uc6be\uc6bf\uc6c0\uc6c1\uc6c2\uc6c3\uc6c4\uc6c5\uc6c6\uc6c7\uc6c8\uc6c9\uc6ca\uc6cb\uc6cc\uc6cd\uc6ce\uc6cf\uc6d0\uc6d1\uc6d2\uc6d3\uc6d4\uc6d5\uc6d6\uc6d7\uc6d8\uc6d9\uc6da\uc6db\uc6dc\uc6dd\uc6de\uc6df\uc6e0\uc6e1\uc6e2\uc6e3\uc6e4\uc6e5\uc6e6\uc6e7\uc6e8\uc6e9\uc6ea\uc6eb\uc6ec\uc6ed\uc6ee\uc6ef\uc6f0\uc6f1\uc6f2\uc6f3\uc6f4\uc6f5\uc6f6\uc6f7\uc6f8\uc6f9\uc6fa\uc6fb\uc6fc\uc6fd\uc6fe\uc6ff\uc700\uc701\uc702\uc703\uc704\uc705\uc706\uc707\uc708\uc709\uc70a\uc70b\uc70c\uc70d\uc70e\uc70f\uc710\uc711\uc712\uc713\uc714\uc715\uc716\uc717\uc718\uc719\uc71a\uc71b\uc71c\uc71d\uc71e\uc71f\uc720\uc721\uc722\uc723\uc724\uc725\uc726\uc727\uc728\uc729\uc72a\uc72b\uc72c\uc72d\uc72e\uc72f\uc730\uc731\uc732\uc733\uc734\uc735\uc736\uc737\uc738\uc739\uc73a\uc73b\uc73c\uc73d\uc73e\uc73f\uc740\uc741\uc742\uc743\uc744\uc745\uc746\uc747\uc748\uc749\uc74a\uc74b\uc74c\uc74d\uc74e\uc74f\uc750\uc751\uc752\uc753\uc754\uc755\uc756\uc757\uc758\uc759\uc75a\uc75b\uc75c\uc75d\uc75e\uc75f\uc760\uc761\uc762\uc763\uc764\uc765\uc766\uc767\uc768\uc769\uc76a\uc76b\uc76c\uc76d\uc76e\uc76f\uc770\uc771\uc772\uc773\uc774\uc775\uc776\uc777\uc778\uc779\uc77a\uc77b\uc77c\uc77d\uc77e\uc77f\uc780\uc781\uc782\uc783\uc784\uc785\uc786\uc787\uc788\uc789\uc78a\uc78b\uc78c\uc78d\uc78e\uc78f\uc790\uc791\uc792\uc793\uc794\uc795\uc796\uc797\uc798\uc799\uc79a\uc79b\uc79c\uc79d\uc79e\uc79f\uc7a0\uc7a1\uc7a2\uc7a3\uc7a4\uc7a5\uc7a6\uc7a7\uc7a8\uc7a9\uc7aa\uc7ab\uc7ac\uc7ad\uc7ae\uc7af\uc7b0\uc7b1\uc7b2\uc7b3\uc7b4\uc7b5\uc7b6\uc7b7\uc7b8\uc7b9\uc7ba\uc7bb\uc7bc\uc7bd\uc7be\uc7bf\uc7c0\uc7c1\uc7c2\uc7c3\uc7c4\uc7c5\uc7c6\uc7c7\uc7c8\uc7c9\uc7ca\uc7cb\uc7cc\uc7cd\uc7ce\uc7cf\uc7d0\uc7d1\uc7d2\uc7d3\uc7d4\uc7d5\uc7d6\uc7d7\uc7d8\uc7d9\uc7da\uc7db\uc7dc\uc7dd\uc7de\uc7df\uc7e0\uc7e1\uc7e2\uc7e3\uc7e4\uc7e5\uc7e6\uc7e7\uc7e8\uc7e9\uc7ea\uc7eb\uc7ec\uc7ed\uc7ee\uc7ef\uc7f0\uc7f1\uc7f2\uc7f3\uc7f4\uc7f5\uc7f6\uc7f7\uc7f8\uc7f9\uc7fa\uc7fb\uc7fc\uc7fd\uc7fe\uc7ff\uc800\uc801\uc802\uc803\uc804\uc805\uc806\uc807\uc808\uc809\uc80a\uc80b\uc80c\uc80d\uc80e\uc80f\uc810\uc811\uc812\uc813\uc814\uc815\uc816\uc817\uc818\uc819\uc81a\uc81b\uc81c\uc81d\uc81e\uc81f\uc820\uc821\uc822\uc823\uc824\uc825\uc826\uc827\uc828\uc829\uc82a\uc82b\uc82c\uc82d\uc82e\uc82f\uc830\uc831\uc832\uc833\uc834\uc835\uc836\uc837\uc838\uc839\uc83a\uc83b\uc83c\uc83d\uc83e\uc83f\uc840\uc841\uc842\uc843\uc844\uc845\uc846\uc847\uc848\uc849\uc84a\uc84b\uc84c\uc84d\uc84e\uc84f\uc850\uc851\uc852\uc853\uc854\uc855\uc856\uc857\uc858\uc859\uc85a\uc85b\uc85c\uc85d\uc85e\uc85f\uc860\uc861\uc862\uc863\uc864\uc865\uc866\uc867\uc868\uc869\uc86a\uc86b\uc86c\uc86d\uc86e\uc86f\uc870\uc871\uc872\uc873\uc874\uc875\uc876\uc877\uc878\uc879\uc87a\uc87b\uc87c\uc87d\uc87e\uc87f\uc880\uc881\uc882\uc883\uc884\uc885\uc886\uc887\uc888\uc889\uc88a\uc88b\uc88c\uc88d\uc88e\uc88f\uc890\uc891\uc892\uc893\uc894\uc895\uc896\uc897\uc898\uc899\uc89a\uc89b\uc89c\uc89d\uc89e\uc89f\uc8a0\uc8a1\uc8a2\uc8a3\uc8a4\uc8a5\uc8a6\uc8a7\uc8a8\uc8a9\uc8aa\uc8ab\uc8ac\uc8ad\uc8ae\uc8af\uc8b0\uc8b1\uc8b2\uc8b3\uc8b4\uc8b5\uc8b6\uc8b7\uc8b8\uc8b9\uc8ba\uc8bb\uc8bc\uc8bd\uc8be\uc8bf\uc8c0\uc8c1\uc8c2\uc8c3\uc8c4\uc8c5\uc8c6\uc8c7\uc8c8\uc8c9\uc8ca\uc8cb\uc8cc\uc8cd\uc8ce\uc8cf\uc8d0\uc8d1\uc8d2\uc8d3\uc8d4\uc8d5\uc8d6\uc8d7\uc8d8\uc8d9\uc8da\uc8db\uc8dc\uc8dd\uc8de\uc8df\uc8e0\uc8e1\uc8e2\uc8e3\uc8e4\uc8e5\uc8e6\uc8e7\uc8e8\uc8e9\uc8ea\uc8eb\uc8ec\uc8ed\uc8ee\uc8ef\uc8f0\uc8f1\uc8f2\uc8f3\uc8f4\uc8f5\uc8f6\uc8f7\uc8f8\uc8f9\uc8fa\uc8fb\uc8fc\uc8fd\uc8fe\uc8ff\uc900\uc901\uc902\uc903\uc904\uc905\uc906\uc907\uc908\uc909\uc90a\uc90b\uc90c\uc90d\uc90e\uc90f\uc910\uc911\uc912\uc913\uc914\uc915\uc916\uc917\uc918\uc919\uc91a\uc91b\uc91c\uc91d\uc91e\uc91f\uc920\uc921\uc922\uc923\uc924\uc925\uc926\uc927\uc928\uc929\uc92a\uc92b\uc92c\uc92d\uc92e\uc92f\uc930\uc931\uc932\uc933\uc934\uc935\uc936\uc937\uc938\uc939\uc93a\uc93b\uc93c\uc93d\uc93e\uc93f\uc940\uc941\uc942\uc943\uc944\uc945\uc946\uc947\uc948\uc949\uc94a\uc94b\uc94c\uc94d\uc94e\uc94f\uc950\uc951\uc952\uc953\uc954\uc955\uc956\uc957\uc958\uc959\uc95a\uc95b\uc95c\uc95d\uc95e\uc95f\uc960\uc961\uc962\uc963\uc964\uc965\uc966\uc967\uc968\uc969\uc96a\uc96b\uc96c\uc96d\uc96e\uc96f\uc970\uc971\uc972\uc973\uc974\uc975\uc976\uc977\uc978\uc979\uc97a\uc97b\uc97c\uc97d\uc97e\uc97f\uc980\uc981\uc982\uc983\uc984\uc985\uc986\uc987\uc988\uc989\uc98a\uc98b\uc98c\uc98d\uc98e\uc98f\uc990\uc991\uc992\uc993\uc994\uc995\uc996\uc997\uc998\uc999\uc99a\uc99b\uc99c\uc99d\uc99e\uc99f\uc9a0\uc9a1\uc9a2\uc9a3\uc9a4\uc9a5\uc9a6\uc9a7\uc9a8\uc9a9\uc9aa\uc9ab\uc9ac\uc9ad\uc9ae\uc9af\uc9b0\uc9b1\uc9b2\uc9b3\uc9b4\uc9b5\uc9b6\uc9b7\uc9b8\uc9b9\uc9ba\uc9bb\uc9bc\uc9bd\uc9be\uc9bf\uc9c0\uc9c1\uc9c2\uc9c3\uc9c4\uc9c5\uc9c6\uc9c7\uc9c8\uc9c9\uc9ca\uc9cb\uc9cc\uc9cd\uc9ce\uc9cf\uc9d0\uc9d1\uc9d2\uc9d3\uc9d4\uc9d5\uc9d6\uc9d7\uc9d8\uc9d9\uc9da\uc9db\uc9dc\uc9dd\uc9de\uc9df\uc9e0\uc9e1\uc9e2\uc9e3\uc9e4\uc9e5\uc9e6\uc9e7\uc9e8\uc9e9\uc9ea\uc9eb\uc9ec\uc9ed\uc9ee\uc9ef\uc9f0\uc9f1\uc9f2\uc9f3\uc9f4\uc9f5\uc9f6\uc9f7\uc9f8\uc9f9\uc9fa\uc9fb\uc9fc\uc9fd\uc9fe\uc9ff\uca00\uca01\uca02\uca03\uca04\uca05\uca06\uca07\uca08\uca09\uca0a\uca0b\uca0c\uca0d\uca0e\uca0f\uca10\uca11\uca12\uca13\uca14\uca15\uca16\uca17\uca18\uca19\uca1a\uca1b\uca1c\uca1d\uca1e\uca1f\uca20\uca21\uca22\uca23\uca24\uca25\uca26\uca27\uca28\uca29\uca2a\uca2b\uca2c\uca2d\uca2e\uca2f\uca30\uca31\uca32\uca33\uca34\uca35\uca36\uca37\uca38\uca39\uca3a\uca3b\uca3c\uca3d\uca3e\uca3f\uca40\uca41\uca42\uca43\uca44\uca45\uca46\uca47\uca48\uca49\uca4a\uca4b\uca4c\uca4d\uca4e\uca4f\uca50\uca51\uca52\uca53\uca54\uca55\uca56\uca57\uca58\uca59\uca5a\uca5b\uca5c\uca5d\uca5e\uca5f\uca60\uca61\uca62\uca63\uca64\uca65\uca66\uca67\uca68\uca69\uca6a\uca6b\uca6c\uca6d\uca6e\uca6f\uca70\uca71\uca72\uca73\uca74\uca75\uca76\uca77\uca78\uca79\uca7a\uca7b\uca7c\uca7d\uca7e\uca7f\uca80\uca81\uca82\uca83\uca84\uca85\uca86\uca87\uca88\uca89\uca8a\uca8b\uca8c\uca8d\uca8e\uca8f\uca90\uca91\uca92\uca93\uca94\uca95\uca96\uca97\uca98\uca99\uca9a\uca9b\uca9c\uca9d\uca9e\uca9f\ucaa0\ucaa1\ucaa2\ucaa3\ucaa4\ucaa5\ucaa6\ucaa7\ucaa8\ucaa9\ucaaa\ucaab\ucaac\ucaad\ucaae\ucaaf\ucab0\ucab1\ucab2\ucab3\ucab4\ucab5\ucab6\ucab7\ucab8\ucab9\ucaba\ucabb\ucabc\ucabd\ucabe\ucabf\ucac0\ucac1\ucac2\ucac3\ucac4\ucac5\ucac6\ucac7\ucac8\ucac9\ucaca\ucacb\ucacc\ucacd\ucace\ucacf\ucad0\ucad1\ucad2\ucad3\ucad4\ucad5\ucad6\ucad7\ucad8\ucad9\ucada\ucadb\ucadc\ucadd\ucade\ucadf\ucae0\ucae1\ucae2\ucae3\ucae4\ucae5\ucae6\ucae7\ucae8\ucae9\ucaea\ucaeb\ucaec\ucaed\ucaee\ucaef\ucaf0\ucaf1\ucaf2\ucaf3\ucaf4\ucaf5\ucaf6\ucaf7\ucaf8\ucaf9\ucafa\ucafb\ucafc\ucafd\ucafe\ucaff\ucb00\ucb01\ucb02\ucb03\ucb04\ucb05\ucb06\ucb07\ucb08\ucb09\ucb0a\ucb0b\ucb0c\ucb0d\ucb0e\ucb0f\ucb10\ucb11\ucb12\ucb13\ucb14\ucb15\ucb16\ucb17\ucb18\ucb19\ucb1a\ucb1b\ucb1c\ucb1d\ucb1e\ucb1f\ucb20\ucb21\ucb22\ucb23\ucb24\ucb25\ucb26\ucb27\ucb28\ucb29\ucb2a\ucb2b\ucb2c\ucb2d\ucb2e\ucb2f\ucb30\ucb31\ucb32\ucb33\ucb34\ucb35\ucb36\ucb37\ucb38\ucb39\ucb3a\ucb3b\ucb3c\ucb3d\ucb3e\ucb3f\ucb40\ucb41\ucb42\ucb43\ucb44\ucb45\ucb46\ucb47\ucb48\ucb49\ucb4a\ucb4b\ucb4c\ucb4d\ucb4e\ucb4f\ucb50\ucb51\ucb52\ucb53\ucb54\ucb55\ucb56\ucb57\ucb58\ucb59\ucb5a\ucb5b\ucb5c\ucb5d\ucb5e\ucb5f\ucb60\ucb61\ucb62\ucb63\ucb64\ucb65\ucb66\ucb67\ucb68\ucb69\ucb6a\ucb6b\ucb6c\ucb6d\ucb6e\ucb6f\ucb70\ucb71\ucb72\ucb73\ucb74\ucb75\ucb76\ucb77\ucb78\ucb79\ucb7a\ucb7b\ucb7c\ucb7d\ucb7e\ucb7f\ucb80\ucb81\ucb82\ucb83\ucb84\ucb85\ucb86\ucb87\ucb88\ucb89\ucb8a\ucb8b\ucb8c\ucb8d\ucb8e\ucb8f\ucb90\ucb91\ucb92\ucb93\ucb94\ucb95\ucb96\ucb97\ucb98\ucb99\ucb9a\ucb9b\ucb9c\ucb9d\ucb9e\ucb9f\ucba0\ucba1\ucba2\ucba3\ucba4\ucba5\ucba6\ucba7\ucba8\ucba9\ucbaa\ucbab\ucbac\ucbad\ucbae\ucbaf\ucbb0\ucbb1\ucbb2\ucbb3\ucbb4\ucbb5\ucbb6\ucbb7\ucbb8\ucbb9\ucbba\ucbbb\ucbbc\ucbbd\ucbbe\ucbbf\ucbc0\ucbc1\ucbc2\ucbc3\ucbc4\ucbc5\ucbc6\ucbc7\ucbc8\ucbc9\ucbca\ucbcb\ucbcc\ucbcd\ucbce\ucbcf\ucbd0\ucbd1\ucbd2\ucbd3\ucbd4\ucbd5\ucbd6\ucbd7\ucbd8\ucbd9\ucbda\ucbdb\ucbdc\ucbdd\ucbde\ucbdf\ucbe0\ucbe1\ucbe2\ucbe3\ucbe4\ucbe5\ucbe6\ucbe7\ucbe8\ucbe9\ucbea\ucbeb\ucbec\ucbed\ucbee\ucbef\ucbf0\ucbf1\ucbf2\ucbf3\ucbf4\ucbf5\ucbf6\ucbf7\ucbf8\ucbf9\ucbfa\ucbfb\ucbfc\ucbfd\ucbfe\ucbff\ucc00\ucc01\ucc02\ucc03\ucc04\ucc05\ucc06\ucc07\ucc08\ucc09\ucc0a\ucc0b\ucc0c\ucc0d\ucc0e\ucc0f\ucc10\ucc11\ucc12\ucc13\ucc14\ucc15\ucc16\ucc17\ucc18\ucc19\ucc1a\ucc1b\ucc1c\ucc1d\ucc1e\ucc1f\ucc20\ucc21\ucc22\ucc23\ucc24\ucc25\ucc26\ucc27\ucc28\ucc29\ucc2a\ucc2b\ucc2c\ucc2d\ucc2e\ucc2f\ucc30\ucc31\ucc32\ucc33\ucc34\ucc35\ucc36\ucc37\ucc38\ucc39\ucc3a\ucc3b\ucc3c\ucc3d\ucc3e\ucc3f\ucc40\ucc41\ucc42\ucc43\ucc44\ucc45\ucc46\ucc47\ucc48\ucc49\ucc4a\ucc4b\ucc4c\ucc4d\ucc4e\ucc4f\ucc50\ucc51\ucc52\ucc53\ucc54\ucc55\ucc56\ucc57\ucc58\ucc59\ucc5a\ucc5b\ucc5c\ucc5d\ucc5e\ucc5f\ucc60\ucc61\ucc62\ucc63\ucc64\ucc65\ucc66\ucc67\ucc68\ucc69\ucc6a\ucc6b\ucc6c\ucc6d\ucc6e\ucc6f\ucc70\ucc71\ucc72\ucc73\ucc74\ucc75\ucc76\ucc77\ucc78\ucc79\ucc7a\ucc7b\ucc7c\ucc7d\ucc7e\ucc7f\ucc80\ucc81\ucc82\ucc83\ucc84\ucc85\ucc86\ucc87\ucc88\ucc89\ucc8a\ucc8b\ucc8c\ucc8d\ucc8e\ucc8f\ucc90\ucc91\ucc92\ucc93\ucc94\ucc95\ucc96\ucc97\ucc98\ucc99\ucc9a\ucc9b\ucc9c\ucc9d\ucc9e\ucc9f\ucca0\ucca1\ucca2\ucca3\ucca4\ucca5\ucca6\ucca7\ucca8\ucca9\uccaa\uccab\uccac\uccad\uccae\uccaf\uccb0\uccb1\uccb2\uccb3\uccb4\uccb5\uccb6\uccb7\uccb8\uccb9\uccba\uccbb\uccbc\uccbd\uccbe\uccbf\uccc0\uccc1\uccc2\uccc3\uccc4\uccc5\uccc6\uccc7\uccc8\uccc9\uccca\ucccb\ucccc\ucccd\uccce\ucccf\uccd0\uccd1\uccd2\uccd3\uccd4\uccd5\uccd6\uccd7\uccd8\uccd9\uccda\uccdb\uccdc\uccdd\uccde\uccdf\ucce0\ucce1\ucce2\ucce3\ucce4\ucce5\ucce6\ucce7\ucce8\ucce9\uccea\ucceb\uccec\ucced\uccee\uccef\uccf0\uccf1\uccf2\uccf3\uccf4\uccf5\uccf6\uccf7\uccf8\uccf9\uccfa\uccfb\uccfc\uccfd\uccfe\uccff\ucd00\ucd01\ucd02\ucd03\ucd04\ucd05\ucd06\ucd07\ucd08\ucd09\ucd0a\ucd0b\ucd0c\ucd0d\ucd0e\ucd0f\ucd10\ucd11\ucd12\ucd13\ucd14\ucd15\ucd16\ucd17\ucd18\ucd19\ucd1a\ucd1b\ucd1c\ucd1d\ucd1e\ucd1f\ucd20\ucd21\ucd22\ucd23\ucd24\ucd25\ucd26\ucd27\ucd28\ucd29\ucd2a\ucd2b\ucd2c\ucd2d\ucd2e\ucd2f\ucd30\ucd31\ucd32\ucd33\ucd34\ucd35\ucd36\ucd37\ucd38\ucd39\ucd3a\ucd3b\ucd3c\ucd3d\ucd3e\ucd3f\ucd40\ucd41\ucd42\ucd43\ucd44\ucd45\ucd46\ucd47\ucd48\ucd49\ucd4a\ucd4b\ucd4c\ucd4d\ucd4e\ucd4f\ucd50\ucd51\ucd52\ucd53\ucd54\ucd55\ucd56\ucd57\ucd58\ucd59\ucd5a\ucd5b\ucd5c\ucd5d\ucd5e\ucd5f\ucd60\ucd61\ucd62\ucd63\ucd64\ucd65\ucd66\ucd67\ucd68\ucd69\ucd6a\ucd6b\ucd6c\ucd6d\ucd6e\ucd6f\ucd70\ucd71\ucd72\ucd73\ucd74\ucd75\ucd76\ucd77\ucd78\ucd79\ucd7a\ucd7b\ucd7c\ucd7d\ucd7e\ucd7f\ucd80\ucd81\ucd82\ucd83\ucd84\ucd85\ucd86\ucd87\ucd88\ucd89\ucd8a\ucd8b\ucd8c\ucd8d\ucd8e\ucd8f\ucd90\ucd91\ucd92\ucd93\ucd94\ucd95\ucd96\ucd97\ucd98\ucd99\ucd9a\ucd9b\ucd9c\ucd9d\ucd9e\ucd9f\ucda0\ucda1\ucda2\ucda3\ucda4\ucda5\ucda6\ucda7\ucda8\ucda9\ucdaa\ucdab\ucdac\ucdad\ucdae\ucdaf\ucdb0\ucdb1\ucdb2\ucdb3\ucdb4\ucdb5\ucdb6\ucdb7\ucdb8\ucdb9\ucdba\ucdbb\ucdbc\ucdbd\ucdbe\ucdbf\ucdc0\ucdc1\ucdc2\ucdc3\ucdc4\ucdc5\ucdc6\ucdc7\ucdc8\ucdc9\ucdca\ucdcb\ucdcc\ucdcd\ucdce\ucdcf\ucdd0\ucdd1\ucdd2\ucdd3\ucdd4\ucdd5\ucdd6\ucdd7\ucdd8\ucdd9\ucdda\ucddb\ucddc\ucddd\ucdde\ucddf\ucde0\ucde1\ucde2\ucde3\ucde4\ucde5\ucde6\ucde7\ucde8\ucde9\ucdea\ucdeb\ucdec\ucded\ucdee\ucdef\ucdf0\ucdf1\ucdf2\ucdf3\ucdf4\ucdf5\ucdf6\ucdf7\ucdf8\ucdf9\ucdfa\ucdfb\ucdfc\ucdfd\ucdfe\ucdff\uce00\uce01\uce02\uce03\uce04\uce05\uce06\uce07\uce08\uce09\uce0a\uce0b\uce0c\uce0d\uce0e\uce0f\uce10\uce11\uce12\uce13\uce14\uce15\uce16\uce17\uce18\uce19\uce1a\uce1b\uce1c\uce1d\uce1e\uce1f\uce20\uce21\uce22\uce23\uce24\uce25\uce26\uce27\uce28\uce29\uce2a\uce2b\uce2c\uce2d\uce2e\uce2f\uce30\uce31\uce32\uce33\uce34\uce35\uce36\uce37\uce38\uce39\uce3a\uce3b\uce3c\uce3d\uce3e\uce3f\uce40\uce41\uce42\uce43\uce44\uce45\uce46\uce47\uce48\uce49\uce4a\uce4b\uce4c\uce4d\uce4e\uce4f\uce50\uce51\uce52\uce53\uce54\uce55\uce56\uce57\uce58\uce59\uce5a\uce5b\uce5c\uce5d\uce5e\uce5f\uce60\uce61\uce62\uce63\uce64\uce65\uce66\uce67\uce68\uce69\uce6a\uce6b\uce6c\uce6d\uce6e\uce6f\uce70\uce71\uce72\uce73\uce74\uce75\uce76\uce77\uce78\uce79\uce7a\uce7b\uce7c\uce7d\uce7e\uce7f\uce80\uce81\uce82\uce83\uce84\uce85\uce86\uce87\uce88\uce89\uce8a\uce8b\uce8c\uce8d\uce8e\uce8f\uce90\uce91\uce92\uce93\uce94\uce95\uce96\uce97\uce98\uce99\uce9a\uce9b\uce9c\uce9d\uce9e\uce9f\ucea0\ucea1\ucea2\ucea3\ucea4\ucea5\ucea6\ucea7\ucea8\ucea9\uceaa\uceab\uceac\ucead\uceae\uceaf\uceb0\uceb1\uceb2\uceb3\uceb4\uceb5\uceb6\uceb7\uceb8\uceb9\uceba\ucebb\ucebc\ucebd\ucebe\ucebf\ucec0\ucec1\ucec2\ucec3\ucec4\ucec5\ucec6\ucec7\ucec8\ucec9\uceca\ucecb\ucecc\ucecd\ucece\ucecf\uced0\uced1\uced2\uced3\uced4\uced5\uced6\uced7\uced8\uced9\uceda\ucedb\ucedc\ucedd\ucede\ucedf\ucee0\ucee1\ucee2\ucee3\ucee4\ucee5\ucee6\ucee7\ucee8\ucee9\uceea\uceeb\uceec\uceed\uceee\uceef\ucef0\ucef1\ucef2\ucef3\ucef4\ucef5\ucef6\ucef7\ucef8\ucef9\ucefa\ucefb\ucefc\ucefd\ucefe\uceff\ucf00\ucf01\ucf02\ucf03\ucf04\ucf05\ucf06\ucf07\ucf08\ucf09\ucf0a\ucf0b\ucf0c\ucf0d\ucf0e\ucf0f\ucf10\ucf11\ucf12\ucf13\ucf14\ucf15\ucf16\ucf17\ucf18\ucf19\ucf1a\ucf1b\ucf1c\ucf1d\ucf1e\ucf1f\ucf20\ucf21\ucf22\ucf23\ucf24\ucf25\ucf26\ucf27\ucf28\ucf29\ucf2a\ucf2b\ucf2c\ucf2d\ucf2e\ucf2f\ucf30\ucf31\ucf32\ucf33\ucf34\ucf35\ucf36\ucf37\ucf38\ucf39\ucf3a\ucf3b\ucf3c\ucf3d\ucf3e\ucf3f\ucf40\ucf41\ucf42\ucf43\ucf44\ucf45\ucf46\ucf47\ucf48\ucf49\ucf4a\ucf4b\ucf4c\ucf4d\ucf4e\ucf4f\ucf50\ucf51\ucf52\ucf53\ucf54\ucf55\ucf56\ucf57\ucf58\ucf59\ucf5a\ucf5b\ucf5c\ucf5d\ucf5e\ucf5f\ucf60\ucf61\ucf62\ucf63\ucf64\ucf65\ucf66\ucf67\ucf68\ucf69\ucf6a\ucf6b\ucf6c\ucf6d\ucf6e\ucf6f\ucf70\ucf71\ucf72\ucf73\ucf74\ucf75\ucf76\ucf77\ucf78\ucf79\ucf7a\ucf7b\ucf7c\ucf7d\ucf7e\ucf7f\ucf80\ucf81\ucf82\ucf83\ucf84\ucf85\ucf86\ucf87\ucf88\ucf89\ucf8a\ucf8b\ucf8c\ucf8d\ucf8e\ucf8f\ucf90\ucf91\ucf92\ucf93\ucf94\ucf95\ucf96\ucf97\ucf98\ucf99\ucf9a\ucf9b\ucf9c\ucf9d\ucf9e\ucf9f\ucfa0\ucfa1\ucfa2\ucfa3\ucfa4\ucfa5\ucfa6\ucfa7\ucfa8\ucfa9\ucfaa\ucfab\ucfac\ucfad\ucfae\ucfaf\ucfb0\ucfb1\ucfb2\ucfb3\ucfb4\ucfb5\ucfb6\ucfb7\ucfb8\ucfb9\ucfba\ucfbb\ucfbc\ucfbd\ucfbe\ucfbf\ucfc0\ucfc1\ucfc2\ucfc3\ucfc4\ucfc5\ucfc6\ucfc7\ucfc8\ucfc9\ucfca\ucfcb\ucfcc\ucfcd\ucfce\ucfcf\ucfd0\ucfd1\ucfd2\ucfd3\ucfd4\ucfd5\ucfd6\ucfd7\ucfd8\ucfd9\ucfda\ucfdb\ucfdc\ucfdd\ucfde\ucfdf\ucfe0\ucfe1\ucfe2\ucfe3\ucfe4\ucfe5\ucfe6\ucfe7\ucfe8\ucfe9\ucfea\ucfeb\ucfec\ucfed\ucfee\ucfef\ucff0\ucff1\ucff2\ucff3\ucff4\ucff5\ucff6\ucff7\ucff8\ucff9\ucffa\ucffb\ucffc\ucffd\ucffe\ucfff\ud000\ud001\ud002\ud003\ud004\ud005\ud006\ud007\ud008\ud009\ud00a\ud00b\ud00c\ud00d\ud00e\ud00f\ud010\ud011\ud012\ud013\ud014\ud015\ud016\ud017\ud018\ud019\ud01a\ud01b\ud01c\ud01d\ud01e\ud01f\ud020\ud021\ud022\ud023\ud024\ud025\ud026\ud027\ud028\ud029\ud02a\ud02b\ud02c\ud02d\ud02e\ud02f\ud030\ud031\ud032\ud033\ud034\ud035\ud036\ud037\ud038\ud039\ud03a\ud03b\ud03c\ud03d\ud03e\ud03f\ud040\ud041\ud042\ud043\ud044\ud045\ud046\ud047\ud048\ud049\ud04a\ud04b\ud04c\ud04d\ud04e\ud04f\ud050\ud051\ud052\ud053\ud054\ud055\ud056\ud057\ud058\ud059\ud05a\ud05b\ud05c\ud05d\ud05e\ud05f\ud060\ud061\ud062\ud063\ud064\ud065\ud066\ud067\ud068\ud069\ud06a\ud06b\ud06c\ud06d\ud06e\ud06f\ud070\ud071\ud072\ud073\ud074\ud075\ud076\ud077\ud078\ud079\ud07a\ud07b\ud07c\ud07d\ud07e\ud07f\ud080\ud081\ud082\ud083\ud084\ud085\ud086\ud087\ud088\ud089\ud08a\ud08b\ud08c\ud08d\ud08e\ud08f\ud090\ud091\ud092\ud093\ud094\ud095\ud096\ud097\ud098\ud099\ud09a\ud09b\ud09c\ud09d\ud09e\ud09f\ud0a0\ud0a1\ud0a2\ud0a3\ud0a4\ud0a5\ud0a6\ud0a7\ud0a8\ud0a9\ud0aa\ud0ab\ud0ac\ud0ad\ud0ae\ud0af\ud0b0\ud0b1\ud0b2\ud0b3\ud0b4\ud0b5\ud0b6\ud0b7\ud0b8\ud0b9\ud0ba\ud0bb\ud0bc\ud0bd\ud0be\ud0bf\ud0c0\ud0c1\ud0c2\ud0c3\ud0c4\ud0c5\ud0c6\ud0c7\ud0c8\ud0c9\ud0ca\ud0cb\ud0cc\ud0cd\ud0ce\ud0cf\ud0d0\ud0d1\ud0d2\ud0d3\ud0d4\ud0d5\ud0d6\ud0d7\ud0d8\ud0d9\ud0da\ud0db\ud0dc\ud0dd\ud0de\ud0df\ud0e0\ud0e1\ud0e2\ud0e3\ud0e4\ud0e5\ud0e6\ud0e7\ud0e8\ud0e9\ud0ea\ud0eb\ud0ec\ud0ed\ud0ee\ud0ef\ud0f0\ud0f1\ud0f2\ud0f3\ud0f4\ud0f5\ud0f6\ud0f7\ud0f8\ud0f9\ud0fa\ud0fb\ud0fc\ud0fd\ud0fe\ud0ff\ud100\ud101\ud102\ud103\ud104\ud105\ud106\ud107\ud108\ud109\ud10a\ud10b\ud10c\ud10d\ud10e\ud10f\ud110\ud111\ud112\ud113\ud114\ud115\ud116\ud117\ud118\ud119\ud11a\ud11b\ud11c\ud11d\ud11e\ud11f\ud120\ud121\ud122\ud123\ud124\ud125\ud126\ud127\ud128\ud129\ud12a\ud12b\ud12c\ud12d\ud12e\ud12f\ud130\ud131\ud132\ud133\ud134\ud135\ud136\ud137\ud138\ud139\ud13a\ud13b\ud13c\ud13d\ud13e\ud13f\ud140\ud141\ud142\ud143\ud144\ud145\ud146\ud147\ud148\ud149\ud14a\ud14b\ud14c\ud14d\ud14e\ud14f\ud150\ud151\ud152\ud153\ud154\ud155\ud156\ud157\ud158\ud159\ud15a\ud15b\ud15c\ud15d\ud15e\ud15f\ud160\ud161\ud162\ud163\ud164\ud165\ud166\ud167\ud168\ud169\ud16a\ud16b\ud16c\ud16d\ud16e\ud16f\ud170\ud171\ud172\ud173\ud174\ud175\ud176\ud177\ud178\ud179\ud17a\ud17b\ud17c\ud17d\ud17e\ud17f\ud180\ud181\ud182\ud183\ud184\ud185\ud186\ud187\ud188\ud189\ud18a\ud18b\ud18c\ud18d\ud18e\ud18f\ud190\ud191\ud192\ud193\ud194\ud195\ud196\ud197\ud198\ud199\ud19a\ud19b\ud19c\ud19d\ud19e\ud19f\ud1a0\ud1a1\ud1a2\ud1a3\ud1a4\ud1a5\ud1a6\ud1a7\ud1a8\ud1a9\ud1aa\ud1ab\ud1ac\ud1ad\ud1ae\ud1af\ud1b0\ud1b1\ud1b2\ud1b3\ud1b4\ud1b5\ud1b6\ud1b7\ud1b8\ud1b9\ud1ba\ud1bb\ud1bc\ud1bd\ud1be\ud1bf\ud1c0\ud1c1\ud1c2\ud1c3\ud1c4\ud1c5\ud1c6\ud1c7\ud1c8\ud1c9\ud1ca\ud1cb\ud1cc\ud1cd\ud1ce\ud1cf\ud1d0\ud1d1\ud1d2\ud1d3\ud1d4\ud1d5\ud1d6\ud1d7\ud1d8\ud1d9\ud1da\ud1db\ud1dc\ud1dd\ud1de\ud1df\ud1e0\ud1e1\ud1e2\ud1e3\ud1e4\ud1e5\ud1e6\ud1e7\ud1e8\ud1e9\ud1ea\ud1eb\ud1ec\ud1ed\ud1ee\ud1ef\ud1f0\ud1f1\ud1f2\ud1f3\ud1f4\ud1f5\ud1f6\ud1f7\ud1f8\ud1f9\ud1fa\ud1fb\ud1fc\ud1fd\ud1fe\ud1ff\ud200\ud201\ud202\ud203\ud204\ud205\ud206\ud207\ud208\ud209\ud20a\ud20b\ud20c\ud20d\ud20e\ud20f\ud210\ud211\ud212\ud213\ud214\ud215\ud216\ud217\ud218\ud219\ud21a\ud21b\ud21c\ud21d\ud21e\ud21f\ud220\ud221\ud222\ud223\ud224\ud225\ud226\ud227\ud228\ud229\ud22a\ud22b\ud22c\ud22d\ud22e\ud22f\ud230\ud231\ud232\ud233\ud234\ud235\ud236\ud237\ud238\ud239\ud23a\ud23b\ud23c\ud23d\ud23e\ud23f\ud240\ud241\ud242\ud243\ud244\ud245\ud246\ud247\ud248\ud249\ud24a\ud24b\ud24c\ud24d\ud24e\ud24f\ud250\ud251\ud252\ud253\ud254\ud255\ud256\ud257\ud258\ud259\ud25a\ud25b\ud25c\ud25d\ud25e\ud25f\ud260\ud261\ud262\ud263\ud264\ud265\ud266\ud267\ud268\ud269\ud26a\ud26b\ud26c\ud26d\ud26e\ud26f\ud270\ud271\ud272\ud273\ud274\ud275\ud276\ud277\ud278\ud279\ud27a\ud27b\ud27c\ud27d\ud27e\ud27f\ud280\ud281\ud282\ud283\ud284\ud285\ud286\ud287\ud288\ud289\ud28a\ud28b\ud28c\ud28d\ud28e\ud28f\ud290\ud291\ud292\ud293\ud294\ud295\ud296\ud297\ud298\ud299\ud29a\ud29b\ud29c\ud29d\ud29e\ud29f\ud2a0\ud2a1\ud2a2\ud2a3\ud2a4\ud2a5\ud2a6\ud2a7\ud2a8\ud2a9\ud2aa\ud2ab\ud2ac\ud2ad\ud2ae\ud2af\ud2b0\ud2b1\ud2b2\ud2b3\ud2b4\ud2b5\ud2b6\ud2b7\ud2b8\ud2b9\ud2ba\ud2bb\ud2bc\ud2bd\ud2be\ud2bf\ud2c0\ud2c1\ud2c2\ud2c3\ud2c4\ud2c5\ud2c6\ud2c7\ud2c8\ud2c9\ud2ca\ud2cb\ud2cc\ud2cd\ud2ce\ud2cf\ud2d0\ud2d1\ud2d2\ud2d3\ud2d4\ud2d5\ud2d6\ud2d7\ud2d8\ud2d9\ud2da\ud2db\ud2dc\ud2dd\ud2de\ud2df\ud2e0\ud2e1\ud2e2\ud2e3\ud2e4\ud2e5\ud2e6\ud2e7\ud2e8\ud2e9\ud2ea\ud2eb\ud2ec\ud2ed\ud2ee\ud2ef\ud2f0\ud2f1\ud2f2\ud2f3\ud2f4\ud2f5\ud2f6\ud2f7\ud2f8\ud2f9\ud2fa\ud2fb\ud2fc\ud2fd\ud2fe\ud2ff\ud300\ud301\ud302\ud303\ud304\ud305\ud306\ud307\ud308\ud309\ud30a\ud30b\ud30c\ud30d\ud30e\ud30f\ud310\ud311\ud312\ud313\ud314\ud315\ud316\ud317\ud318\ud319\ud31a\ud31b\ud31c\ud31d\ud31e\ud31f\ud320\ud321\ud322\ud323\ud324\ud325\ud326\ud327\ud328\ud329\ud32a\ud32b\ud32c\ud32d\ud32e\ud32f\ud330\ud331\ud332\ud333\ud334\ud335\ud336\ud337\ud338\ud339\ud33a\ud33b\ud33c\ud33d\ud33e\ud33f\ud340\ud341\ud342\ud343\ud344\ud345\ud346\ud347\ud348\ud349\ud34a\ud34b\ud34c\ud34d\ud34e\ud34f\ud350\ud351\ud352\ud353\ud354\ud355\ud356\ud357\ud358\ud359\ud35a\ud35b\ud35c\ud35d\ud35e\ud35f\ud360\ud361\ud362\ud363\ud364\ud365\ud366\ud367\ud368\ud369\ud36a\ud36b\ud36c\ud36d\ud36e\ud36f\ud370\ud371\ud372\ud373\ud374\ud375\ud376\ud377\ud378\ud379\ud37a\ud37b\ud37c\ud37d\ud37e\ud37f\ud380\ud381\ud382\ud383\ud384\ud385\ud386\ud387\ud388\ud389\ud38a\ud38b\ud38c\ud38d\ud38e\ud38f\ud390\ud391\ud392\ud393\ud394\ud395\ud396\ud397\ud398\ud399\ud39a\ud39b\ud39c\ud39d\ud39e\ud39f\ud3a0\ud3a1\ud3a2\ud3a3\ud3a4\ud3a5\ud3a6\ud3a7\ud3a8\ud3a9\ud3aa\ud3ab\ud3ac\ud3ad\ud3ae\ud3af\ud3b0\ud3b1\ud3b2\ud3b3\ud3b4\ud3b5\ud3b6\ud3b7\ud3b8\ud3b9\ud3ba\ud3bb\ud3bc\ud3bd\ud3be\ud3bf\ud3c0\ud3c1\ud3c2\ud3c3\ud3c4\ud3c5\ud3c6\ud3c7\ud3c8\ud3c9\ud3ca\ud3cb\ud3cc\ud3cd\ud3ce\ud3cf\ud3d0\ud3d1\ud3d2\ud3d3\ud3d4\ud3d5\ud3d6\ud3d7\ud3d8\ud3d9\ud3da\ud3db\ud3dc\ud3dd\ud3de\ud3df\ud3e0\ud3e1\ud3e2\ud3e3\ud3e4\ud3e5\ud3e6\ud3e7\ud3e8\ud3e9\ud3ea\ud3eb\ud3ec\ud3ed\ud3ee\ud3ef\ud3f0\ud3f1\ud3f2\ud3f3\ud3f4\ud3f5\ud3f6\ud3f7\ud3f8\ud3f9\ud3fa\ud3fb\ud3fc\ud3fd\ud3fe\ud3ff\ud400\ud401\ud402\ud403\ud404\ud405\ud406\ud407\ud408\ud409\ud40a\ud40b\ud40c\ud40d\ud40e\ud40f\ud410\ud411\ud412\ud413\ud414\ud415\ud416\ud417\ud418\ud419\ud41a\ud41b\ud41c\ud41d\ud41e\ud41f\ud420\ud421\ud422\ud423\ud424\ud425\ud426\ud427\ud428\ud429\ud42a\ud42b\ud42c\ud42d\ud42e\ud42f\ud430\ud431\ud432\ud433\ud434\ud435\ud436\ud437\ud438\ud439\ud43a\ud43b\ud43c\ud43d\ud43e\ud43f\ud440\ud441\ud442\ud443\ud444\ud445\ud446\ud447\ud448\ud449\ud44a\ud44b\ud44c\ud44d\ud44e\ud44f\ud450\ud451\ud452\ud453\ud454\ud455\ud456\ud457\ud458\ud459\ud45a\ud45b\ud45c\ud45d\ud45e\ud45f\ud460\ud461\ud462\ud463\ud464\ud465\ud466\ud467\ud468\ud469\ud46a\ud46b\ud46c\ud46d\ud46e\ud46f\ud470\ud471\ud472\ud473\ud474\ud475\ud476\ud477\ud478\ud479\ud47a\ud47b\ud47c\ud47d\ud47e\ud47f\ud480\ud481\ud482\ud483\ud484\ud485\ud486\ud487\ud488\ud489\ud48a\ud48b\ud48c\ud48d\ud48e\ud48f\ud490\ud491\ud492\ud493\ud494\ud495\ud496\ud497\ud498\ud499\ud49a\ud49b\ud49c\ud49d\ud49e\ud49f\ud4a0\ud4a1\ud4a2\ud4a3\ud4a4\ud4a5\ud4a6\ud4a7\ud4a8\ud4a9\ud4aa\ud4ab\ud4ac\ud4ad\ud4ae\ud4af\ud4b0\ud4b1\ud4b2\ud4b3\ud4b4\ud4b5\ud4b6\ud4b7\ud4b8\ud4b9\ud4ba\ud4bb\ud4bc\ud4bd\ud4be\ud4bf\ud4c0\ud4c1\ud4c2\ud4c3\ud4c4\ud4c5\ud4c6\ud4c7\ud4c8\ud4c9\ud4ca\ud4cb\ud4cc\ud4cd\ud4ce\ud4cf\ud4d0\ud4d1\ud4d2\ud4d3\ud4d4\ud4d5\ud4d6\ud4d7\ud4d8\ud4d9\ud4da\ud4db\ud4dc\ud4dd\ud4de\ud4df\ud4e0\ud4e1\ud4e2\ud4e3\ud4e4\ud4e5\ud4e6\ud4e7\ud4e8\ud4e9\ud4ea\ud4eb\ud4ec\ud4ed\ud4ee\ud4ef\ud4f0\ud4f1\ud4f2\ud4f3\ud4f4\ud4f5\ud4f6\ud4f7\ud4f8\ud4f9\ud4fa\ud4fb\ud4fc\ud4fd\ud4fe\ud4ff\ud500\ud501\ud502\ud503\ud504\ud505\ud506\ud507\ud508\ud509\ud50a\ud50b\ud50c\ud50d\ud50e\ud50f\ud510\ud511\ud512\ud513\ud514\ud515\ud516\ud517\ud518\ud519\ud51a\ud51b\ud51c\ud51d\ud51e\ud51f\ud520\ud521\ud522\ud523\ud524\ud525\ud526\ud527\ud528\ud529\ud52a\ud52b\ud52c\ud52d\ud52e\ud52f\ud530\ud531\ud532\ud533\ud534\ud535\ud536\ud537\ud538\ud539\ud53a\ud53b\ud53c\ud53d\ud53e\ud53f\ud540\ud541\ud542\ud543\ud544\ud545\ud546\ud547\ud548\ud549\ud54a\ud54b\ud54c\ud54d\ud54e\ud54f\ud550\ud551\ud552\ud553\ud554\ud555\ud556\ud557\ud558\ud559\ud55a\ud55b\ud55c\ud55d\ud55e\ud55f\ud560\ud561\ud562\ud563\ud564\ud565\ud566\ud567\ud568\ud569\ud56a\ud56b\ud56c\ud56d\ud56e\ud56f\ud570\ud571\ud572\ud573\ud574\ud575\ud576\ud577\ud578\ud579\ud57a\ud57b\ud57c\ud57d\ud57e\ud57f\ud580\ud581\ud582\ud583\ud584\ud585\ud586\ud587\ud588\ud589\ud58a\ud58b\ud58c\ud58d\ud58e\ud58f\ud590\ud591\ud592\ud593\ud594\ud595\ud596\ud597\ud598\ud599\ud59a\ud59b\ud59c\ud59d\ud59e\ud59f\ud5a0\ud5a1\ud5a2\ud5a3\ud5a4\ud5a5\ud5a6\ud5a7\ud5a8\ud5a9\ud5aa\ud5ab\ud5ac\ud5ad\ud5ae\ud5af\ud5b0\ud5b1\ud5b2\ud5b3\ud5b4\ud5b5\ud5b6\ud5b7\ud5b8\ud5b9\ud5ba\ud5bb\ud5bc\ud5bd\ud5be\ud5bf\ud5c0\ud5c1\ud5c2\ud5c3\ud5c4\ud5c5\ud5c6\ud5c7\ud5c8\ud5c9\ud5ca\ud5cb\ud5cc\ud5cd\ud5ce\ud5cf\ud5d0\ud5d1\ud5d2\ud5d3\ud5d4\ud5d5\ud5d6\ud5d7\ud5d8\ud5d9\ud5da\ud5db\ud5dc\ud5dd\ud5de\ud5df\ud5e0\ud5e1\ud5e2\ud5e3\ud5e4\ud5e5\ud5e6\ud5e7\ud5e8\ud5e9\ud5ea\ud5eb\ud5ec\ud5ed\ud5ee\ud5ef\ud5f0\ud5f1\ud5f2\ud5f3\ud5f4\ud5f5\ud5f6\ud5f7\ud5f8\ud5f9\ud5fa\ud5fb\ud5fc\ud5fd\ud5fe\ud5ff\ud600\ud601\ud602\ud603\ud604\ud605\ud606\ud607\ud608\ud609\ud60a\ud60b\ud60c\ud60d\ud60e\ud60f\ud610\ud611\ud612\ud613\ud614\ud615\ud616\ud617\ud618\ud619\ud61a\ud61b\ud61c\ud61d\ud61e\ud61f\ud620\ud621\ud622\ud623\ud624\ud625\ud626\ud627\ud628\ud629\ud62a\ud62b\ud62c\ud62d\ud62e\ud62f\ud630\ud631\ud632\ud633\ud634\ud635\ud636\ud637\ud638\ud639\ud63a\ud63b\ud63c\ud63d\ud63e\ud63f\ud640\ud641\ud642\ud643\ud644\ud645\ud646\ud647\ud648\ud649\ud64a\ud64b\ud64c\ud64d\ud64e\ud64f\ud650\ud651\ud652\ud653\ud654\ud655\ud656\ud657\ud658\ud659\ud65a\ud65b\ud65c\ud65d\ud65e\ud65f\ud660\ud661\ud662\ud663\ud664\ud665\ud666\ud667\ud668\ud669\ud66a\ud66b\ud66c\ud66d\ud66e\ud66f\ud670\ud671\ud672\ud673\ud674\ud675\ud676\ud677\ud678\ud679\ud67a\ud67b\ud67c\ud67d\ud67e\ud67f\ud680\ud681\ud682\ud683\ud684\ud685\ud686\ud687\ud688\ud689\ud68a\ud68b\ud68c\ud68d\ud68e\ud68f\ud690\ud691\ud692\ud693\ud694\ud695\ud696\ud697\ud698\ud699\ud69a\ud69b\ud69c\ud69d\ud69e\ud69f\ud6a0\ud6a1\ud6a2\ud6a3\ud6a4\ud6a5\ud6a6\ud6a7\ud6a8\ud6a9\ud6aa\ud6ab\ud6ac\ud6ad\ud6ae\ud6af\ud6b0\ud6b1\ud6b2\ud6b3\ud6b4\ud6b5\ud6b6\ud6b7\ud6b8\ud6b9\ud6ba\ud6bb\ud6bc\ud6bd\ud6be\ud6bf\ud6c0\ud6c1\ud6c2\ud6c3\ud6c4\ud6c5\ud6c6\ud6c7\ud6c8\ud6c9\ud6ca\ud6cb\ud6cc\ud6cd\ud6ce\ud6cf\ud6d0\ud6d1\ud6d2\ud6d3\ud6d4\ud6d5\ud6d6\ud6d7\ud6d8\ud6d9\ud6da\ud6db\ud6dc\ud6dd\ud6de\ud6df\ud6e0\ud6e1\ud6e2\ud6e3\ud6e4\ud6e5\ud6e6\ud6e7\ud6e8\ud6e9\ud6ea\ud6eb\ud6ec\ud6ed\ud6ee\ud6ef\ud6f0\ud6f1\ud6f2\ud6f3\ud6f4\ud6f5\ud6f6\ud6f7\ud6f8\ud6f9\ud6fa\ud6fb\ud6fc\ud6fd\ud6fe\ud6ff\ud700\ud701\ud702\ud703\ud704\ud705\ud706\ud707\ud708\ud709\ud70a\ud70b\ud70c\ud70d\ud70e\ud70f\ud710\ud711\ud712\ud713\ud714\ud715\ud716\ud717\ud718\ud719\ud71a\ud71b\ud71c\ud71d\ud71e\ud71f\ud720\ud721\ud722\ud723\ud724\ud725\ud726\ud727\ud728\ud729\ud72a\ud72b\ud72c\ud72d\ud72e\ud72f\ud730\ud731\ud732\ud733\ud734\ud735\ud736\ud737\ud738\ud739\ud73a\ud73b\ud73c\ud73d\ud73e\ud73f\ud740\ud741\ud742\ud743\ud744\ud745\ud746\ud747\ud748\ud749\ud74a\ud74b\ud74c\ud74d\ud74e\ud74f\ud750\ud751\ud752\ud753\ud754\ud755\ud756\ud757\ud758\ud759\ud75a\ud75b\ud75c\ud75d\ud75e\ud75f\ud760\ud761\ud762\ud763\ud764\ud765\ud766\ud767\ud768\ud769\ud76a\ud76b\ud76c\ud76d\ud76e\ud76f\ud770\ud771\ud772\ud773\ud774\ud775\ud776\ud777\ud778\ud779\ud77a\ud77b\ud77c\ud77d\ud77e\ud77f\ud780\ud781\ud782\ud783\ud784\ud785\ud786\ud787\ud788\ud789\ud78a\ud78b\ud78c\ud78d\ud78e\ud78f\ud790\ud791\ud792\ud793\ud794\ud795\ud796\ud797\ud798\ud799\ud79a\ud79b\ud79c\ud79d\ud79e\ud79f\ud7a0\ud7a1\ud7a2\ud7a3\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\uf900\uf901\uf902\uf903\uf904\uf905\uf906\uf907\uf908\uf909\uf90a\uf90b\uf90c\uf90d\uf90e\uf90f\uf910\uf911\uf912\uf913\uf914\uf915\uf916\uf917\uf918\uf919\uf91a\uf91b\uf91c\uf91d\uf91e\uf91f\uf920\uf921\uf922\uf923\uf924\uf925\uf926\uf927\uf928\uf929\uf92a\uf92b\uf92c\uf92d\uf92e\uf92f\uf930\uf931\uf932\uf933\uf934\uf935\uf936\uf937\uf938\uf939\uf93a\uf93b\uf93c\uf93d\uf93e\uf93f\uf940\uf941\uf942\uf943\uf944\uf945\uf946\uf947\uf948\uf949\uf94a\uf94b\uf94c\uf94d\uf94e\uf94f\uf950\uf951\uf952\uf953\uf954\uf955\uf956\uf957\uf958\uf959\uf95a\uf95b\uf95c\uf95d\uf95e\uf95f\uf960\uf961\uf962\uf963\uf964\uf965\uf966\uf967\uf968\uf969\uf96a\uf96b\uf96c\uf96d\uf96e\uf96f\uf970\uf971\uf972\uf973\uf974\uf975\uf976\uf977\uf978\uf979\uf97a\uf97b\uf97c\uf97d\uf97e\uf97f\uf980\uf981\uf982\uf983\uf984\uf985\uf986\uf987\uf988\uf989\uf98a\uf98b\uf98c\uf98d\uf98e\uf98f\uf990\uf991\uf992\uf993\uf994\uf995\uf996\uf997\uf998\uf999\uf99a\uf99b\uf99c\uf99d\uf99e\uf99f\uf9a0\uf9a1\uf9a2\uf9a3\uf9a4\uf9a5\uf9a6\uf9a7\uf9a8\uf9a9\uf9aa\uf9ab\uf9ac\uf9ad\uf9ae\uf9af\uf9b0\uf9b1\uf9b2\uf9b3\uf9b4\uf9b5\uf9b6\uf9b7\uf9b8\uf9b9\uf9ba\uf9bb\uf9bc\uf9bd\uf9be\uf9bf\uf9c0\uf9c1\uf9c2\uf9c3\uf9c4\uf9c5\uf9c6\uf9c7\uf9c8\uf9c9\uf9ca\uf9cb\uf9cc\uf9cd\uf9ce\uf9cf\uf9d0\uf9d1\uf9d2\uf9d3\uf9d4\uf9d5\uf9d6\uf9d7\uf9d8\uf9d9\uf9da\uf9db\uf9dc\uf9dd\uf9de\uf9df\uf9e0\uf9e1\uf9e2\uf9e3\uf9e4\uf9e5\uf9e6\uf9e7\uf9e8\uf9e9\uf9ea\uf9eb\uf9ec\uf9ed\uf9ee\uf9ef\uf9f0\uf9f1\uf9f2\uf9f3\uf9f4\uf9f5\uf9f6\uf9f7\uf9f8\uf9f9\uf9fa\uf9fb\uf9fc\uf9fd\uf9fe\uf9ff\ufa00\ufa01\ufa02\ufa03\ufa04\ufa05\ufa06\ufa07\ufa08\ufa09\ufa0a\ufa0b\ufa0c\ufa0d\ufa0e\ufa0f\ufa10\ufa11\ufa12\ufa13\ufa14\ufa15\ufa16\ufa17\ufa18\ufa19\ufa1a\ufa1b\ufa1c\ufa1d\ufa1e\ufa1f\ufa20\ufa21\ufa22\ufa23\ufa24\ufa25\ufa26\ufa27\ufa28\ufa29\ufa2a\ufa2b\ufa2c\ufa2d\ufa2e\ufa2f\ufa30\ufa31\ufa32\ufa33\ufa34\ufa35\ufa36\ufa37\ufa38\ufa39\ufa3a\ufa3b\ufa3c\ufa3d\ufa3e\ufa3f\ufa40\ufa41\ufa42\ufa43\ufa44\ufa45\ufa46\ufa47\ufa48\ufa49\ufa4a\ufa4b\ufa4c\ufa4d\ufa4e\ufa4f\ufa50\ufa51\ufa52\ufa53\ufa54\ufa55\ufa56\ufa57\ufa58\ufa59\ufa5a\ufa5b\ufa5c\ufa5d\ufa5e\ufa5f\ufa60\ufa61\ufa62\ufa63\ufa64\ufa65\ufa66\ufa67\ufa68\ufa69\ufa6a\ufa6b\ufa6d\ufa70\ufa71\ufa72\ufa73\ufa74\ufa75\ufa76\ufa77\ufa78\ufa79\ufa7a\ufa7b\ufa7c\ufa7d\ufa7e\ufa7f\ufa80\ufa81\ufa82\ufa83\ufa84\ufa85\ufa86\ufa87\ufa88\ufa89\ufa8a\ufa8b\ufa8c\ufa8d\ufa8e\ufa8f\ufa90\ufa91\ufa92\ufa93\ufa94\ufa95\ufa96\ufa97\ufa98\ufa99\ufa9a\ufa9b\ufa9c\ufa9d\ufa9e\ufa9f\ufaa0\ufaa1\ufaa2\ufaa3\ufaa4\ufaa5\ufaa6\ufaa7\ufaa8\ufaa9\ufaaa\ufaab\ufaac\ufaad\ufaae\ufaaf\ufab0\ufab1\ufab2\ufab3\ufab4\ufab5\ufab6\ufab7\ufab8\ufab9\ufaba\ufabb\ufabc\ufabd\ufabe\ufabf\ufac0\ufac1\ufac2\ufac3\ufac4\ufac5\ufac6\ufac7\ufac8\ufac9\ufaca\ufacb\ufacc\ufacd\uface\ufad2\ufad3\ufad4\ufad8\ufad9\ufb1e\ufb20\ufb21\ufb22\ufb23\ufb24\ufb25\ufb26\ufb27\ufb28\ufb50\ufb51\ufb52\ufb53\ufb54\ufb55\ufb56\ufb57\ufb58\ufb59\ufb5a\ufb5b\ufb5c\ufb5d\ufb5e\ufb5f\ufb60\ufb61\ufb62\ufb63\ufb64\ufb65\ufb66\ufb67\ufb68\ufb69\ufb6a\ufb6b\ufb6c\ufb6d\ufb6e\ufb6f\ufb70\ufb71\ufb72\ufb73\ufb74\ufb75\ufb76\ufb77\ufb78\ufb79\ufb7a\ufb7b\ufb7c\ufb7d\ufb7e\ufb7f\ufb80\ufb81\ufb82\ufb83\ufb84\ufb85\ufb86\ufb87\ufb88\ufb89\ufb8a\ufb8b\ufb8c\ufb8d\ufb8e\ufb8f\ufb90\ufb91\ufb92\ufb93\ufb94\ufb95\ufb96\ufb97\ufb98\ufb99\ufb9a\ufb9b\ufb9c\ufb9d\ufb9e\ufb9f\ufba0\ufba1\ufba2\ufba3\ufba4\ufba5\ufba6\ufba7\ufba8\ufba9\ufbaa\ufbab\ufbac\ufbad\ufbae\ufbaf\ufbb0\ufbb1\ufbd3\ufbd4\ufbd5\ufbd6\ufbd7\ufbd8\ufbd9\ufbda\ufbdb\ufbdc\ufbde\ufbdf\ufbe0\ufbe1\ufbe2\ufbe3\ufbe4\ufbe5\ufbe6\ufbe7\ufbe8\ufbe9\ufbfc\ufbfd\ufbfe\ufbff\ufe00\ufe01\ufe02\ufe03\ufe04\ufe05\ufe06\ufe07\ufe08\ufe09\ufe0a\ufe0b\ufe0c\ufe0d\ufe0e\ufe0f\ufe20\ufe21\ufe22\ufe23\ufe24\ufe25\ufe26\ufe27\ufe28\ufe29\ufe2a\ufe2b\ufe2c\ufe2d\ufe2e\ufe2f\ufe33\ufe34\ufe4d\ufe4e\ufe4f\ufe73\ufe80\ufe81\ufe82\ufe83\ufe84\ufe85\ufe86\ufe87\ufe88\ufe89\ufe8a\ufe8b\ufe8c\ufe8d\ufe8e\ufe8f\ufe90\ufe91\ufe92\ufe93\ufe94\ufe95\ufe96\ufe97\ufe98\ufe99\ufe9a\ufe9b\ufe9c\ufe9d\ufe9e\ufe9f\ufea0\ufea1\ufea2\ufea3\ufea4\ufea5\ufea6\ufea7\ufea8\ufea9\ufeaa\ufeab\ufeac\ufead\ufeae\ufeaf\ufeb0\ufeb1\ufeb2\ufeb3\ufeb4\ufeb5\ufeb6\ufeb7\ufeb8\ufeb9\ufeba\ufebb\ufebc\ufebd\ufebe\ufebf\ufec0\ufec1\ufec2\ufec3\ufec4\ufec5\ufec6\ufec7\ufec8\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed2\ufed3\ufed4\ufed5\ufed6\ufed7\ufed8\ufed9\ufeda\ufedb\ufedc\ufedd\ufede\ufedf\ufee0\ufee1\ufee2\ufee3\ufee4\ufee5\ufee6\ufee7\ufee8\ufee9\ufeea\ufeeb\ufeec\ufeed\ufeee\ufeef\ufef0\ufef1\ufef2\ufef3\ufef4\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a\uff3f\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a\uff66\uff67\uff68\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff70\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f\uffa0\uffa1\uffa2\uffa3\uffa4\uffa5\uffa6\uffa7\uffa8\uffa9\uffaa\uffab\uffac\uffad\uffae\uffaf\uffb0\uffb1\uffb2\uffb3\uffb4\uffb5\uffb6\uffb7\uffb8\uffb9\uffba\uffbb\uffbc\uffbd\uffbe\uffc2\uffc3\uffc4\uffc5\uffc6\uffc7\uffca\uffcb\uffcc\uffcd\uffce\uffcf\uffd2\uffd3\uffd4\uffd5\uffd6\uffd7\uffda\uffdb\uffdc' +# Generated code end + +if __name__ == '__main__': + import sys + import unicodedata + + if sys.version_info[0] < 3: + raise RuntimeError('This needs to run on python 3') + + categories = {} + + f = open(__file__.rstrip('co')) + try: + content = f.read() + finally: + f.close() + + start = '# Generated code start\n' + header = content[:content.find(start) + len(start)] + '\n' + footer = content[content.find("# Generated code end\n"):] + + for code in range(65535): + c = chr(code) + cat = unicodedata.category(c) + categories.setdefault(cat, []).append(c) + + # from 8.0.0 PropList (Other_ID_Start) + underscore + id_start = set(u'_\u2118\u212E\u309B\u309C') + for cat in 'Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl': + id_start.update(categories[cat]) + + # from 8.0.0 PropList (Other_ID_Continue) + id_continue = set(id_start) + id_continue.update(u'\u00B7\u0387\u1369\u1370\u1371\u19DA') + for cat in 'Mn', 'Mc', 'Nd', 'Pc': + id_continue.update(categories[cat]) + + xid_start = u''.join(sorted(c for c in id_continue if + unicodedata.normalize('NFKC', c) + in id_start)) + xid_continue = u''.join(sorted(c for c in id_continue if + unicodedata.normalize('NFKC', c) in + id_continue)) + + f = open(__file__, 'w') + f.write(header) + + f.write('xid_start = %s\nxid_continue = %s\n' % (ascii(xid_start), + ascii(xid_continue))) + + f.write(footer) + f.close() diff --git a/lib/spack/external/jinja2/asyncfilters.py b/lib/spack/external/jinja2/asyncfilters.py new file mode 100644 index 0000000000..5c1f46d7fa --- /dev/null +++ b/lib/spack/external/jinja2/asyncfilters.py @@ -0,0 +1,146 @@ +from functools import wraps + +from jinja2.asyncsupport import auto_aiter +from jinja2 import filters + + +async def auto_to_seq(value): + seq = [] + if hasattr(value, '__aiter__'): + async for item in value: + seq.append(item) + else: + for item in value: + seq.append(item) + return seq + + +async def async_select_or_reject(args, kwargs, modfunc, lookup_attr): + seq, func = filters.prepare_select_or_reject( + args, kwargs, modfunc, lookup_attr) + if seq: + async for item in auto_aiter(seq): + if func(item): + yield item + + +def dualfilter(normal_filter, async_filter): + wrap_evalctx = False + if getattr(normal_filter, 'environmentfilter', False): + is_async = lambda args: args[0].is_async + wrap_evalctx = False + else: + if not getattr(normal_filter, 'evalcontextfilter', False) and \ + not getattr(normal_filter, 'contextfilter', False): + wrap_evalctx = True + is_async = lambda args: args[0].environment.is_async + + @wraps(normal_filter) + def wrapper(*args, **kwargs): + b = is_async(args) + if wrap_evalctx: + args = args[1:] + if b: + return async_filter(*args, **kwargs) + return normal_filter(*args, **kwargs) + + if wrap_evalctx: + wrapper.evalcontextfilter = True + + wrapper.asyncfiltervariant = True + + return wrapper + + +def asyncfiltervariant(original): + def decorator(f): + return dualfilter(original, f) + return decorator + + +@asyncfiltervariant(filters.do_first) +async def do_first(environment, seq): + try: + return await auto_aiter(seq).__anext__() + except StopAsyncIteration: + return environment.undefined('No first item, sequence was empty.') + + +@asyncfiltervariant(filters.do_groupby) +async def do_groupby(environment, value, attribute): + expr = filters.make_attrgetter(environment, attribute) + return [filters._GroupTuple(key, await auto_to_seq(values)) + for key, values in filters.groupby(sorted( + await auto_to_seq(value), key=expr), expr)] + + +@asyncfiltervariant(filters.do_join) +async def do_join(eval_ctx, value, d=u'', attribute=None): + return filters.do_join(eval_ctx, await auto_to_seq(value), d, attribute) + + +@asyncfiltervariant(filters.do_list) +async def do_list(value): + return await auto_to_seq(value) + + +@asyncfiltervariant(filters.do_reject) +async def do_reject(*args, **kwargs): + return async_select_or_reject(args, kwargs, lambda x: not x, False) + + +@asyncfiltervariant(filters.do_rejectattr) +async def do_rejectattr(*args, **kwargs): + return async_select_or_reject(args, kwargs, lambda x: not x, True) + + +@asyncfiltervariant(filters.do_select) +async def do_select(*args, **kwargs): + return async_select_or_reject(args, kwargs, lambda x: x, False) + + +@asyncfiltervariant(filters.do_selectattr) +async def do_selectattr(*args, **kwargs): + return async_select_or_reject(args, kwargs, lambda x: x, True) + + +@asyncfiltervariant(filters.do_map) +async def do_map(*args, **kwargs): + seq, func = filters.prepare_map(args, kwargs) + if seq: + async for item in auto_aiter(seq): + yield func(item) + + +@asyncfiltervariant(filters.do_sum) +async def do_sum(environment, iterable, attribute=None, start=0): + rv = start + if attribute is not None: + func = filters.make_attrgetter(environment, attribute) + else: + func = lambda x: x + async for item in auto_aiter(iterable): + rv += func(item) + return rv + + +@asyncfiltervariant(filters.do_slice) +async def do_slice(value, slices, fill_with=None): + return filters.do_slice(await auto_to_seq(value), slices, fill_with) + + +ASYNC_FILTERS = { + 'first': do_first, + 'groupby': do_groupby, + 'join': do_join, + 'list': do_list, + # we intentionally do not support do_last because that would be + # ridiculous + 'reject': do_reject, + 'rejectattr': do_rejectattr, + 'map': do_map, + 'select': do_select, + 'selectattr': do_selectattr, + 'sum': do_sum, + 'slice': do_slice, +} diff --git a/lib/spack/external/jinja2/asyncsupport.py b/lib/spack/external/jinja2/asyncsupport.py new file mode 100644 index 0000000000..f4f264ad8c --- /dev/null +++ b/lib/spack/external/jinja2/asyncsupport.py @@ -0,0 +1,254 @@ +# -*- coding: utf-8 -*- +""" + jinja2.asyncsupport + ~~~~~~~~~~~~~~~~~~~ + + Has all the code for async support which is implemented as a patch + for supported Python versions. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +import sys +import asyncio +import inspect +from functools import update_wrapper + +from jinja2.utils import concat, internalcode, Markup +from jinja2.environment import TemplateModule +from jinja2.runtime import LoopContextBase, _last_iteration + + +async def concat_async(async_gen): + rv = [] + async def collect(): + async for event in async_gen: + rv.append(event) + await collect() + return concat(rv) + + +async def generate_async(self, *args, **kwargs): + vars = dict(*args, **kwargs) + try: + async for event in self.root_render_func(self.new_context(vars)): + yield event + except Exception: + exc_info = sys.exc_info() + else: + return + yield self.environment.handle_exception(exc_info, True) + + +def wrap_generate_func(original_generate): + def _convert_generator(self, loop, args, kwargs): + async_gen = self.generate_async(*args, **kwargs) + try: + while 1: + yield loop.run_until_complete(async_gen.__anext__()) + except StopAsyncIteration: + pass + def generate(self, *args, **kwargs): + if not self.environment.is_async: + return original_generate(self, *args, **kwargs) + return _convert_generator(self, asyncio.get_event_loop(), args, kwargs) + return update_wrapper(generate, original_generate) + + +async def render_async(self, *args, **kwargs): + if not self.environment.is_async: + raise RuntimeError('The environment was not created with async mode ' + 'enabled.') + + vars = dict(*args, **kwargs) + ctx = self.new_context(vars) + + try: + return await concat_async(self.root_render_func(ctx)) + except Exception: + exc_info = sys.exc_info() + return self.environment.handle_exception(exc_info, True) + + +def wrap_render_func(original_render): + def render(self, *args, **kwargs): + if not self.environment.is_async: + return original_render(self, *args, **kwargs) + loop = asyncio.get_event_loop() + return loop.run_until_complete(self.render_async(*args, **kwargs)) + return update_wrapper(render, original_render) + + +def wrap_block_reference_call(original_call): + @internalcode + async def async_call(self): + rv = await concat_async(self._stack[self._depth](self._context)) + if self._context.eval_ctx.autoescape: + rv = Markup(rv) + return rv + + @internalcode + def __call__(self): + if not self._context.environment.is_async: + return original_call(self) + return async_call(self) + + return update_wrapper(__call__, original_call) + + +def wrap_macro_invoke(original_invoke): + @internalcode + async def async_invoke(self, arguments, autoescape): + rv = await self._func(*arguments) + if autoescape: + rv = Markup(rv) + return rv + + @internalcode + def _invoke(self, arguments, autoescape): + if not self._environment.is_async: + return original_invoke(self, arguments, autoescape) + return async_invoke(self, arguments, autoescape) + return update_wrapper(_invoke, original_invoke) + + +@internalcode +async def get_default_module_async(self): + if self._module is not None: + return self._module + self._module = rv = await self.make_module_async() + return rv + + +def wrap_default_module(original_default_module): + @internalcode + def _get_default_module(self): + if self.environment.is_async: + raise RuntimeError('Template module attribute is unavailable ' + 'in async mode') + return original_default_module(self) + return _get_default_module + + +async def make_module_async(self, vars=None, shared=False, locals=None): + context = self.new_context(vars, shared, locals) + body_stream = [] + async for item in self.root_render_func(context): + body_stream.append(item) + return TemplateModule(self, context, body_stream) + + +def patch_template(): + from jinja2 import Template + Template.generate = wrap_generate_func(Template.generate) + Template.generate_async = update_wrapper( + generate_async, Template.generate_async) + Template.render_async = update_wrapper( + render_async, Template.render_async) + Template.render = wrap_render_func(Template.render) + Template._get_default_module = wrap_default_module( + Template._get_default_module) + Template._get_default_module_async = get_default_module_async + Template.make_module_async = update_wrapper( + make_module_async, Template.make_module_async) + + +def patch_runtime(): + from jinja2.runtime import BlockReference, Macro + BlockReference.__call__ = wrap_block_reference_call( + BlockReference.__call__) + Macro._invoke = wrap_macro_invoke(Macro._invoke) + + +def patch_filters(): + from jinja2.filters import FILTERS + from jinja2.asyncfilters import ASYNC_FILTERS + FILTERS.update(ASYNC_FILTERS) + + +def patch_all(): + patch_template() + patch_runtime() + patch_filters() + + +async def auto_await(value): + if inspect.isawaitable(value): + return await value + return value + + +async def auto_aiter(iterable): + if hasattr(iterable, '__aiter__'): + async for item in iterable: + yield item + return + for item in iterable: + yield item + + +class AsyncLoopContext(LoopContextBase): + + def __init__(self, async_iterator, after, length, recurse=None, + depth0=0): + LoopContextBase.__init__(self, recurse, depth0) + self._async_iterator = async_iterator + self._after = after + self._length = length + + @property + def length(self): + if self._length is None: + raise TypeError('Loop length for some iterators cannot be ' + 'lazily calculated in async mode') + return self._length + + def __aiter__(self): + return AsyncLoopContextIterator(self) + + +class AsyncLoopContextIterator(object): + __slots__ = ('context',) + + def __init__(self, context): + self.context = context + + def __aiter__(self): + return self + + async def __anext__(self): + ctx = self.context + ctx.index0 += 1 + if ctx._after is _last_iteration: + raise StopAsyncIteration() + next_elem = ctx._after + try: + ctx._after = await ctx._async_iterator.__anext__() + except StopAsyncIteration: + ctx._after = _last_iteration + return next_elem, ctx + + +async def make_async_loop_context(iterable, recurse=None, depth0=0): + # Length is more complicated and less efficient in async mode. The + # reason for this is that we cannot know if length will be used + # upfront but because length is a property we cannot lazily execute it + # later. This means that we need to buffer it up and measure :( + # + # We however only do this for actual iterators, not for async + # iterators as blocking here does not seem like the best idea in the + # world. + try: + length = len(iterable) + except (TypeError, AttributeError): + if not hasattr(iterable, '__aiter__'): + iterable = tuple(iterable) + length = len(iterable) + else: + length = None + async_iterator = auto_aiter(iterable) + try: + after = await async_iterator.__anext__() + except StopAsyncIteration: + after = _last_iteration + return AsyncLoopContext(async_iterator, after, length, recurse, depth0) diff --git a/lib/spack/external/jinja2/bccache.py b/lib/spack/external/jinja2/bccache.py new file mode 100644 index 0000000000..d687d036fb --- /dev/null +++ b/lib/spack/external/jinja2/bccache.py @@ -0,0 +1,362 @@ +# -*- coding: utf-8 -*- +""" + jinja2.bccache + ~~~~~~~~~~~~~~ + + This module implements the bytecode cache system Jinja is optionally + using. This is useful if you have very complex template situations and + the compiliation of all those templates slow down your application too + much. + + Situations where this is useful are often forking web applications that + are initialized on the first request. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD. +""" +from os import path, listdir +import os +import sys +import stat +import errno +import marshal +import tempfile +import fnmatch +from hashlib import sha1 +from jinja2.utils import open_if_exists +from jinja2._compat import BytesIO, pickle, PY2, text_type + + +# marshal works better on 3.x, one hack less required +if not PY2: + marshal_dump = marshal.dump + marshal_load = marshal.load +else: + + def marshal_dump(code, f): + if isinstance(f, file): + marshal.dump(code, f) + else: + f.write(marshal.dumps(code)) + + def marshal_load(f): + if isinstance(f, file): + return marshal.load(f) + return marshal.loads(f.read()) + + +bc_version = 3 + +# magic version used to only change with new jinja versions. With 2.6 +# we change this to also take Python version changes into account. The +# reason for this is that Python tends to segfault if fed earlier bytecode +# versions because someone thought it would be a good idea to reuse opcodes +# or make Python incompatible with earlier versions. +bc_magic = 'j2'.encode('ascii') + \ + pickle.dumps(bc_version, 2) + \ + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1]) + + +class Bucket(object): + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment, key, checksum): + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self): + """Resets the bucket (unloads the bytecode).""" + self.code = None + + def load_bytecode(self, f): + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal_load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f): + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError('can\'t write empty bucket') + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal_dump(self.code, f) + + def bytecode_from_string(self, string): + """Load bytecode from a string.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self): + """Return the bytecode as string.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache(object): + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja2. + """ + + def load_bytecode(self, bucket): + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket): + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self): + """Clears the cache. This method is not used by Jinja2 but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key(self, name, filename=None): + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode('utf-8')) + if filename is not None: + filename = '|' + filename + if isinstance(filename, text_type): + filename = filename.encode('utf-8') + hash.update(filename) + return hash.hexdigest() + + def get_source_checksum(self, source): + """Returns a checksum for the source.""" + return sha1(source.encode('utf-8')).hexdigest() + + def get_bucket(self, environment, name, filename, source): + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket): + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__(self, directory=None, pattern='__jinja2_%s.cache'): + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self): + def _unsafe_dir(): + raise RuntimeError('Cannot determine safe temp directory. You ' + 'need to explicitly provide one.') + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == 'nt': + return tmpdir + if not hasattr(os, 'getuid'): + _unsafe_dir() + + dirname = '_jinja2-cache-%d' % os.getuid() + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if actual_dir_stat.st_uid != os.getuid() \ + or not stat.S_ISDIR(actual_dir_stat.st_mode) \ + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU: + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if actual_dir_stat.st_uid != os.getuid() \ + or not stat.S_ISDIR(actual_dir_stat.st_mode) \ + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU: + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket): + return path.join(self.directory, self.pattern % bucket.key) + + def load_bytecode(self, bucket): + f = open_if_exists(self._get_cache_filename(bucket), 'rb') + if f is not None: + try: + bucket.load_bytecode(f) + finally: + f.close() + + def dump_bytecode(self, bucket): + f = open(self._get_cache_filename(bucket), 'wb') + try: + bucket.write_bytecode(f) + finally: + f.close() + + def clear(self): + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + files = fnmatch.filter(listdir(self.directory), self.pattern % '*') + for filename in files: + try: + remove(path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `werkzeug `_.contrib.cache + - `python-memcached `_ + - `cmemcache `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only unicode. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__(self, client, prefix='jinja2/bytecode/', timeout=None, + ignore_memcache_errors=True): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket): + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + code = None + if code is not None: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket): + args = (self.prefix + bucket.key, bucket.bytecode_to_string()) + if self.timeout is not None: + args += (self.timeout,) + try: + self.client.set(*args) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/lib/spack/external/jinja2/compiler.py b/lib/spack/external/jinja2/compiler.py new file mode 100644 index 0000000000..b2ab6fe6a8 --- /dev/null +++ b/lib/spack/external/jinja2/compiler.py @@ -0,0 +1,1653 @@ +# -*- coding: utf-8 -*- +""" + jinja2.compiler + ~~~~~~~~~~~~~~~ + + Compiles nodes into python code. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +from itertools import chain +from copy import deepcopy +from keyword import iskeyword as is_python_keyword +from functools import update_wrapper +from jinja2 import nodes +from jinja2.nodes import EvalContext +from jinja2.visitor import NodeVisitor +from jinja2.optimizer import Optimizer +from jinja2.exceptions import TemplateAssertionError +from jinja2.utils import Markup, concat, escape +from jinja2._compat import range_type, text_type, string_types, \ + iteritems, NativeStringIO, imap, izip +from jinja2.idtracking import Symbols, VAR_LOAD_PARAMETER, \ + VAR_LOAD_RESOLVE, VAR_LOAD_ALIAS, VAR_LOAD_UNDEFINED + + +operators = { + 'eq': '==', + 'ne': '!=', + 'gt': '>', + 'gteq': '>=', + 'lt': '<', + 'lteq': '<=', + 'in': 'in', + 'notin': 'not in' +} + +# what method to iterate over items do we want to use for dict iteration +# in generated code? on 2.x let's go with iteritems, on 3.x with items +if hasattr(dict, 'iteritems'): + dict_item_iter = 'iteritems' +else: + dict_item_iter = 'items' + +code_features = ['division'] + +# does this python version support generator stops? (PEP 0479) +try: + exec('from __future__ import generator_stop') + code_features.append('generator_stop') +except SyntaxError: + pass + +# does this python version support yield from? +try: + exec('def f(): yield from x()') +except SyntaxError: + supports_yield_from = False +else: + supports_yield_from = True + + +def optimizeconst(f): + def new_func(self, node, frame, **kwargs): + # Only optimize if the frame is not volatile + if self.optimized and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + if new_node != node: + return self.visit(new_node, frame) + return f(self, node, frame, **kwargs) + return update_wrapper(new_func, f) + + +def generate(node, environment, name, filename, stream=None, + defer_init=False, optimized=True): + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError('Can\'t compile non template nodes') + generator = environment.code_generator_class(environment, name, filename, + stream, defer_init, + optimized) + generator.visit(node) + if stream is None: + return generator.stream.getvalue() + + +def has_safe_repr(value): + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + if type(value) in (bool, int, float, complex, range_type, Markup) + string_types: + return True + if type(value) in (tuple, list, set, frozenset): + for item in value: + if not has_safe_repr(item): + return False + return True + elif type(value) is dict: + for key, value in iteritems(value): + if not has_safe_repr(key): + return False + if not has_safe_repr(value): + return False + return True + return False + + +def find_undeclared(nodes, names): + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef(object): + + def __init__(self, node): + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame(object): + """Holds compile time information for us.""" + + def __init__(self, eval_ctx, parent=None): + self.eval_ctx = eval_ctx + self.symbols = Symbols(parent and parent.symbols or None) + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = parent and parent.require_output_check + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer = None + + # the name of the block we're in, otherwise None. + self.block = parent and parent.block or None + + # the parent of this frame + self.parent = parent + + if parent is not None: + self.buffer = parent.buffer + + def copy(self): + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self): + """Return an inner frame.""" + return Frame(self.eval_ctx, self) + + def soft(self): + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements. + """ + rv = self.copy() + rv.rootlevel = False + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self): + self.filters = set() + self.tests = set() + + def visit_Filter(self, node): + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node): + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node): + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names): + self.names = set(names) + self.undeclared = set() + + def visit_Name(self, node): + if node.ctx == 'load' and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node): + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + + def __init__(self, environment, name, filename, stream=None, + defer_init=False, optimized=True): + if stream is None: + stream = NativeStringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimized = optimized + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests = {} + self.filters = {} + + # the debug information + self.debug_info = [] + self._write_debug_info = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack = [] + + # Tracks parameter definition blocks + self._param_def_block = [] + + # -- Various compilation helpers + + def fail(self, msg, lineno): + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self): + """Get a new unique identifier.""" + self._last_identifier += 1 + return 't_%d' % self._last_identifier + + def buffer(self, frame): + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline('%s = []' % frame.buffer) + + def return_buffer_contents(self, frame, force_unescaped=False): + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline('if context.eval_ctx.autoescape:') + self.indent() + self.writeline('return Markup(concat(%s))' % frame.buffer) + self.outdent() + self.writeline('else:') + self.indent() + self.writeline('return concat(%s)' % frame.buffer) + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline('return Markup(concat(%s))' % frame.buffer) + return + self.writeline('return concat(%s)' % frame.buffer) + + def indent(self): + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step=1): + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame, node=None): + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline('yield ', node) + else: + self.writeline('%s.append(' % frame.buffer, node) + + def end_write(self, frame): + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(')') + + def simple_write(self, s, frame, node=None): + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes, frame): + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline('pass') + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x): + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write('\n' * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, + self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(' ' * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline(self, x, node=None, extra=0): + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node=None, extra=0): + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature(self, node, frame, extra_kwargs=None): + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occour. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = False + for kwarg in chain((x.key for x in node.kwargs), extra_kwargs or ()): + if is_python_keyword(kwarg): + kwarg_workaround = True + break + + for arg in node.args: + self.write(', ') + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(', ') + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in iteritems(extra_kwargs): + self.write(', %s=%s' % (key, value)) + if node.dyn_args: + self.write(', *') + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(', **dict({') + else: + self.write(', **{') + for kwarg in node.kwargs: + self.write('%r: ' % kwarg.key) + self.visit(kwarg.value, frame) + self.write(', ') + if extra_kwargs is not None: + for key, value in iteritems(extra_kwargs): + self.write('%r: %s, ' % (key, value)) + if node.dyn_kwargs is not None: + self.write('}, **') + self.visit(node.dyn_kwargs, frame) + self.write(')') + else: + self.write('}') + + elif node.dyn_kwargs is not None: + self.write(', **') + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes): + """Pull all the dependencies.""" + visitor = DependencyFinderVisitor() + for node in nodes: + visitor.visit(node) + for dependency in 'filters', 'tests': + mapping = getattr(self, dependency) + for name in getattr(visitor, dependency): + if name not in mapping: + mapping[name] = self.temporary_identifier() + self.writeline('%s = environment.%s[%r]' % + (mapping[name], dependency, name)) + + def enter_frame(self, frame): + undefs = [] + for target, (action, param) in iteritems(frame.symbols.loads): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline('%s = resolve(%r)' % + (target, param)) + elif action == VAR_LOAD_ALIAS: + self.writeline('%s = %s' % (target, param)) + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError('unknown load instruction') + if undefs: + self.writeline('%s = missing' % ' = '.join(undefs)) + + def leave_frame(self, frame, with_python_scope=False): + if not with_python_scope: + undefs = [] + for target, _ in iteritems(frame.symbols.loads): + undefs.append(target) + if undefs: + self.writeline('%s = missing' % ' = '.join(undefs)) + + def func(self, name): + if self.environment.is_async: + return 'async def %s' % name + return 'def %s' % name + + def macro_body(self, node, frame): + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + for idx, arg in enumerate(node.args): + if arg.name == 'caller': + explicit_caller = idx + if arg.name in ('kwargs', 'varargs'): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ('caller', 'kwargs', 'varargs')) + + if 'caller' in undeclared: + # In older Jinja2 versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail('When defining macros or call blocks the ' + 'special "caller" argument must be omitted ' + 'or be given a default.', node.lineno) + else: + args.append(frame.symbols.declare_parameter('caller')) + macro_ref.accesses_caller = True + if 'kwargs' in undeclared and not 'kwargs' in skip_special_params: + args.append(frame.symbols.declare_parameter('kwargs')) + macro_ref.accesses_kwargs = True + if 'varargs' in undeclared and not 'varargs' in skip_special_params: + args.append(frame.symbols.declare_parameter('varargs')) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline('%s(%s):' % (self.func('macro'), ', '.join(args)), node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline('if %s is missing:' % ref) + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline('%s = undefined(%r, name=%r)' % ( + ref, + 'parameter %r was not provided' % arg.name, + arg.name)) + else: + self.writeline('%s = ' % ref) + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref, frame): + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ', '.join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, 'name', None) + if len(macro_ref.node.args) == 1: + arg_tuple += ',' + self.write('Macro(environment, macro, %r, (%s), %r, %r, %r, ' + 'context.eval_ctx.autoescape)' % + (name, arg_tuple, macro_ref.accesses_kwargs, + macro_ref.accesses_varargs, macro_ref.accesses_caller)) + + def position(self, node): + """Return a human readable position for the node.""" + rv = 'line %d' % node.lineno + if self.name is not None: + rv += ' in ' + repr(self.name) + return rv + + def dump_local_context(self, frame): + return '{%s}' % ', '.join( + '%r: %s' % (name, target) for name, target + in iteritems(frame.symbols.dump_stores())) + + def write_commons(self): + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline('resolve = context.resolve_or_missing') + self.writeline('undefined = environment.undefined') + self.writeline('if 0: yield None') + + def push_parameter_definitions(self, frame): + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self): + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target): + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def parameter_is_undeclared(self, target): + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self): + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame): + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if not frame.toplevel or not vars: + return + public_names = [x for x in vars if x[:1] != '_'] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + self.writeline('context.vars[%r] = %s' % (name, ref)) + else: + self.writeline('context.vars.update({') + for idx, name in enumerate(vars): + if idx: + self.write(', ') + ref = frame.symbols.ref(name) + self.write('%r: %s' % (name, ref)) + self.write('})') + if public_names: + if len(public_names) == 1: + self.writeline('context.exported_vars.add(%r)' % + public_names[0]) + else: + self.writeline('context.exported_vars.update((%s))' % + ', '.join(imap(repr, public_names))) + + # -- Statement Visitors + + def visit_Template(self, node, frame=None): + assert frame is None, 'no root frame allowed' + eval_ctx = EvalContext(self.environment, self.name) + + from jinja2.runtime import __all__ as exported + self.writeline('from __future__ import %s' % ', '.join(code_features)) + self.writeline('from jinja2.runtime import ' + ', '.join(exported)) + + if self.environment.is_async: + self.writeline('from jinja2.asyncsupport import auto_await, ' + 'auto_aiter, make_async_loop_context') + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = not self.defer_init and ', environment=environment' or '' + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail('block %r defined twice' % block.name, block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if '.' in imp: + module, obj = imp.rsplit('.', 1) + self.writeline('from %s import %s as %s' % + (module, obj, alias)) + else: + self.writeline('import %s as %s' % (imp, alias)) + + # add the load name + self.writeline('name = %r' % self.name) + + # generate the root render function. + self.writeline('%s(context, missing=missing%s):' % + (self.func('root'), envenv), extra=1) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if 'self' in find_undeclared(node.body, ('self',)): + ref = frame.symbols.declare_parameter('self') + self.writeline('%s = TemplateReference(context)' % ref) + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline('parent_template = None') + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline('if parent_template is not None:') + self.indent() + if supports_yield_from and not self.environment.is_async: + self.writeline('yield from parent_template.' + 'root_render_func(context)') + else: + self.writeline('%sfor event in parent_template.' + 'root_render_func(context):' % + (self.environment.is_async and 'async ' or '')) + self.indent() + self.writeline('yield event') + self.outdent() + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in iteritems(self.blocks): + self.writeline('%s(context, missing=missing%s):' % + (self.func('block_' + name), envenv), + block, 1) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + undeclared = find_undeclared(block.body, ('self', 'super')) + if 'self' in undeclared: + ref = block_frame.symbols.declare_parameter('self') + self.writeline('%s = TemplateReference(context)' % ref) + if 'super' in undeclared: + ref = block_frame.symbols.declare_parameter('super') + self.writeline('%s = context.super(%r, ' + 'block_%s)' % (ref, name, name)) + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x) + for x in self.blocks), + extra=1) + + # add a function that returns the debug info + self.writeline('debug_info = %r' % '&'.join('%s=%s' % x for x + in self.debug_info)) + + def visit_Block(self, node, frame): + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline('if parent_template is None:') + self.indent() + level += 1 + context = node.scoped and ( + 'context.derived(%s)' % self.dump_local_context(frame)) or 'context' + + if supports_yield_from and not self.environment.is_async and \ + frame.buffer is None: + self.writeline('yield from context.blocks[%r][0](%s)' % ( + node.name, context), node) + else: + loop = self.environment.is_async and 'async for' or 'for' + self.writeline('%s event in context.blocks[%r][0](%s):' % ( + loop, node.name, context), node) + self.indent() + self.simple_write('event', frame) + self.outdent() + + self.outdent(level) + + def visit_Extends(self, node, frame): + """Calls the extender.""" + if not frame.toplevel: + self.fail('cannot use extend from a non top-level scope', + node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline('if parent_template is not None:') + self.indent() + self.writeline('raise TemplateRuntimeError(%r)' % + 'extended multiple times') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline('parent_template = environment.get_template(', node) + self.visit(node.template, frame) + self.write(', %r)' % self.name) + self.writeline('for name, parent_block in parent_template.' + 'blocks.%s():' % dict_item_iter) + self.indent() + self.writeline('context.blocks.setdefault(name, []).' + 'append(parent_block)') + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node, frame): + """Handles includes.""" + if node.ignore_missing: + self.writeline('try:') + self.indent() + + func_name = 'get_or_select_template' + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, string_types): + func_name = 'get_template' + elif isinstance(node.template.value, (tuple, list)): + func_name = 'select_template' + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = 'select_template' + + self.writeline('template = environment.%s(' % func_name, node) + self.visit(node.template, frame) + self.write(', %r)' % self.name) + if node.ignore_missing: + self.outdent() + self.writeline('except TemplateNotFound:') + self.indent() + self.writeline('pass') + self.outdent() + self.writeline('else:') + self.indent() + + skip_event_yield = False + if node.with_context: + loop = self.environment.is_async and 'async for' or 'for' + self.writeline('%s event in template.root_render_func(' + 'template.new_context(context.get_all(), True, ' + '%s)):' % (loop, self.dump_local_context(frame))) + elif self.environment.is_async: + self.writeline('for event in (await ' + 'template._get_default_module_async())' + '._body_stream:') + else: + if supports_yield_from: + self.writeline('yield from template._get_default_module()' + '._body_stream') + skip_event_yield = True + else: + self.writeline('for event in template._get_default_module()' + '._body_stream:') + + if not skip_event_yield: + self.indent() + self.simple_write('event', frame) + self.outdent() + + if node.ignore_missing: + self.outdent() + + def visit_Import(self, node, frame): + """Visit regular imports.""" + self.writeline('%s = ' % frame.symbols.ref(node.target), node) + if frame.toplevel: + self.write('context.vars[%r] = ' % node.target) + if self.environment.is_async: + self.write('await ') + self.write('environment.get_template(') + self.visit(node.template, frame) + self.write(', %r).' % self.name) + if node.with_context: + self.write('make_module%s(context.get_all(), True, %s)' + % (self.environment.is_async and '_async' or '', + self.dump_local_context(frame))) + elif self.environment.is_async: + self.write('_get_default_module_async()') + else: + self.write('_get_default_module()') + if frame.toplevel and not node.target.startswith('_'): + self.writeline('context.exported_vars.discard(%r)' % node.target) + + def visit_FromImport(self, node, frame): + """Visit named imports.""" + self.newline(node) + self.write('included_template = %senvironment.get_template(' + % (self.environment.is_async and 'await ' or '')) + self.visit(node.template, frame) + self.write(', %r).' % self.name) + if node.with_context: + self.write('make_module%s(context.get_all(), True, %s)' + % (self.environment.is_async and '_async' or '', + self.dump_local_context(frame))) + elif self.environment.is_async: + self.write('_get_default_module_async()') + else: + self.write('_get_default_module()') + + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline('%s = getattr(included_template, ' + '%r, missing)' % (frame.symbols.ref(alias), name)) + self.writeline('if %s is missing:' % frame.symbols.ref(alias)) + self.indent() + self.writeline('%s = undefined(%r %% ' + 'included_template.__name__, ' + 'name=%r)' % + (frame.symbols.ref(alias), + 'the template %%r (imported on %s) does ' + 'not export the requested name %s' % ( + self.position(node), + repr(name) + ), name)) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith('_'): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline('context.vars[%r] = %s' % + (name, frame.symbols.ref(name))) + else: + self.writeline('context.vars.update({%s})' % ', '.join( + '%r: %s' % (name, frame.symbols.ref(name)) for name in var_names + )) + if discarded_names: + if len(discarded_names) == 1: + self.writeline('context.exported_vars.discard(%r)' % + discarded_names[0]) + else: + self.writeline('context.exported_vars.difference_' + 'update((%s))' % ', '.join(imap(repr, discarded_names))) + + def visit_For(self, node, frame): + loop_frame = frame.inner() + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body. + extended_loop = node.recursive or 'loop' in \ + find_undeclared(node.iter_child_nodes( + only=('body',)), ('loop',)) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter('loop') + + loop_frame.symbols.analyze_node(node, for_branch='body') + if node.else_: + else_frame.symbols.analyze_node(node, for_branch='else') + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch='test') + self.writeline('%s(fiter):' % self.func(loop_filter_func), node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.environment.is_async and 'async for ' or 'for ') + self.visit(node.target, loop_frame) + self.write(' in ') + self.write(self.environment.is_async and 'auto_aiter(fiter)' or 'fiter') + self.write(':') + self.indent() + self.writeline('if ', node.test) + self.visit(node.test, test_frame) + self.write(':') + self.indent() + self.writeline('yield ') + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline('%s(reciter, loop_render_func, depth=0):' % + self.func('loop'), node) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline('%s = missing' % loop_ref) + + for name in node.find_all(nodes.Name): + if name.ctx == 'store' and name.name == 'loop': + self.fail('Can\'t assign to special loop variable ' + 'in for-loop target', name.lineno) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline('%s = 1' % iteration_indicator) + + self.writeline(self.environment.is_async and 'async for ' or 'for ', node) + self.visit(node.target, loop_frame) + if extended_loop: + if self.environment.is_async: + self.write(', %s in await make_async_loop_context(' % loop_ref) + else: + self.write(', %s in LoopContext(' % loop_ref) + else: + self.write(' in ') + + if node.test: + self.write('%s(' % loop_filter_func) + if node.recursive: + self.write('reciter') + else: + if self.environment.is_async and not extended_loop: + self.write('auto_aiter(') + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(')') + if node.test: + self.write(')') + + if node.recursive: + self.write(', loop_render_func, depth):') + else: + self.write(extended_loop and '):' or ':') + + self.indent() + self.enter_frame(loop_frame) + + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline('%s = 0' % iteration_indicator) + self.outdent() + self.leave_frame(loop_frame, with_python_scope=node.recursive + and not node.else_) + + if node.else_: + self.writeline('if %s:' % iteration_indicator) + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + if self.environment.is_async: + self.write('await ') + self.write('loop(') + if self.environment.is_async: + self.write('auto_aiter(') + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(')') + self.write(', loop)') + self.end_write(frame) + + def visit_If(self, node, frame): + if_frame = frame.soft() + self.writeline('if ', node) + self.visit(node.test, if_frame) + self.write(':') + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + if node.else_: + self.writeline('else:') + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node, frame): + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith('_'): + self.write('context.exported_vars.add(%r)' % node.name) + ref = frame.symbols.ref(node.name) + self.writeline('context.vars[%r] = ' % node.name) + self.write('%s = ' % frame.symbols.ref(node.name)) + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node, frame): + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline('caller = ') + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node, frame): + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node, frame): + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for idx, (target, expr) in enumerate(izip(node.targets, node.values)): + self.newline() + self.visit(target, with_frame) + self.write(' = ') + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node, frame): + self.newline(node) + self.visit(node.node, frame) + + def visit_Output(self, node, frame): + # if we have a known extends statement, we don't output anything + # if we are in a require_output_check section + if self.has_known_extends and frame.require_output_check: + return + + allow_constant_finalize = True + if self.environment.finalize: + func = self.environment.finalize + if getattr(func, 'contextfunction', False) or \ + getattr(func, 'evalcontextfunction', False): + allow_constant_finalize = False + elif getattr(func, 'environmentfunction', False): + finalize = lambda x: text_type( + self.environment.finalize(self.environment, x)) + else: + finalize = lambda x: text_type(self.environment.finalize(x)) + else: + finalize = text_type + + # if we are inside a frame that requires output checking, we do so + outdent_later = False + if frame.require_output_check: + self.writeline('if parent_template is None:') + self.indent() + outdent_later = True + + # try to evaluate as many chunks as possible into a static + # string at compile time. + body = [] + for child in node.nodes: + try: + if not allow_constant_finalize: + raise nodes.Impossible() + const = child.as_const(frame.eval_ctx) + except nodes.Impossible: + body.append(child) + continue + # the frame can't be volatile here, becaus otherwise the + # as_const() function would raise an Impossible exception + # at that point. + try: + if frame.eval_ctx.autoescape: + if hasattr(const, '__html__'): + const = const.__html__() + else: + const = escape(const) + const = finalize(const) + except Exception: + # if something goes wrong here we evaluate the node + # at runtime for easier debugging + body.append(child) + continue + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + # if we have less than 3 nodes or a buffer we yield or extend/append + if len(body) < 3 or frame.buffer is not None: + if frame.buffer is not None: + # for one item we append, for more we extend + if len(body) == 1: + self.writeline('%s.append(' % frame.buffer) + else: + self.writeline('%s.extend((' % frame.buffer) + self.indent() + for item in body: + if isinstance(item, list): + val = repr(concat(item)) + if frame.buffer is None: + self.writeline('yield ' + val) + else: + self.writeline(val + ',') + else: + if frame.buffer is None: + self.writeline('yield ', item) + else: + self.newline(item) + close = 1 + if frame.eval_ctx.volatile: + self.write('(escape if context.eval_ctx.autoescape' + ' else to_string)(') + elif frame.eval_ctx.autoescape: + self.write('escape(') + else: + self.write('to_string(') + if self.environment.finalize is not None: + self.write('environment.finalize(') + if getattr(self.environment.finalize, + "contextfunction", False): + self.write('context, ') + close += 1 + self.visit(item, frame) + self.write(')' * close) + if frame.buffer is not None: + self.write(',') + if frame.buffer is not None: + # close the open parentheses + self.outdent() + self.writeline(len(body) == 1 and ')' or '))') + + # otherwise we create a format string as this is faster in that case + else: + format = [] + arguments = [] + for item in body: + if isinstance(item, list): + format.append(concat(item).replace('%', '%%')) + else: + format.append('%s') + arguments.append(item) + self.writeline('yield ') + self.write(repr(concat(format)) + ' % (') + self.indent() + for argument in arguments: + self.newline(argument) + close = 0 + if frame.eval_ctx.volatile: + self.write('(escape if context.eval_ctx.autoescape else' + ' to_string)(') + close += 1 + elif frame.eval_ctx.autoescape: + self.write('escape(') + close += 1 + if self.environment.finalize is not None: + self.write('environment.finalize(') + if getattr(self.environment.finalize, + 'contextfunction', False): + self.write('context, ') + elif getattr(self.environment.finalize, + 'evalcontextfunction', False): + self.write('context.eval_ctx, ') + elif getattr(self.environment.finalize, + 'environmentfunction', False): + self.write('environment, ') + close += 1 + self.visit(argument, frame) + self.write(')' * close + ', ') + self.outdent() + self.writeline(')') + + if outdent_later: + self.outdent() + + def visit_Assign(self, node, frame): + self.push_assign_tracking() + self.newline(node) + self.visit(node.target, frame) + self.write(' = ') + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node, frame): + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(' = (Markup if context.eval_ctx.autoescape ' + 'else identity)(concat(%s))' % block_frame.buffer) + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node, frame): + if node.ctx == 'store' and frame.toplevel: + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == 'load': + load = frame.symbols.find_load(ref) + if not (load is not None and load[0] == VAR_LOAD_PARAMETER and \ + not self.parameter_is_undeclared(ref)): + self.write('(undefined(name=%r) if %s is missing else %s)' % + (node.name, ref, ref)) + return + + self.write(ref) + + def visit_Const(self, node, frame): + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node, frame): + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write('(Markup if context.eval_ctx.autoescape else identity)(%r)' + % node.data) + + def visit_Tuple(self, node, frame): + self.write('(') + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(', ') + self.visit(item, frame) + self.write(idx == 0 and ',)' or ')') + + def visit_List(self, node, frame): + self.write('[') + for idx, item in enumerate(node.items): + if idx: + self.write(', ') + self.visit(item, frame) + self.write(']') + + def visit_Dict(self, node, frame): + self.write('{') + for idx, item in enumerate(node.items): + if idx: + self.write(', ') + self.visit(item.key, frame) + self.write(': ') + self.visit(item.value, frame) + self.write('}') + + def binop(operator, interceptable=True): + @optimizeconst + def visitor(self, node, frame): + if self.environment.sandboxed and \ + operator in self.environment.intercepted_binops: + self.write('environment.call_binop(context, %r, ' % operator) + self.visit(node.left, frame) + self.write(', ') + self.visit(node.right, frame) + else: + self.write('(') + self.visit(node.left, frame) + self.write(' %s ' % operator) + self.visit(node.right, frame) + self.write(')') + return visitor + + def uaop(operator, interceptable=True): + @optimizeconst + def visitor(self, node, frame): + if self.environment.sandboxed and \ + operator in self.environment.intercepted_unops: + self.write('environment.call_unop(context, %r, ' % operator) + self.visit(node.node, frame) + else: + self.write('(' + operator) + self.visit(node.node, frame) + self.write(')') + return visitor + + visit_Add = binop('+') + visit_Sub = binop('-') + visit_Mul = binop('*') + visit_Div = binop('/') + visit_FloorDiv = binop('//') + visit_Pow = binop('**') + visit_Mod = binop('%') + visit_And = binop('and', interceptable=False) + visit_Or = binop('or', interceptable=False) + visit_Pos = uaop('+') + visit_Neg = uaop('-') + visit_Not = uaop('not ', interceptable=False) + del binop, uaop + + @optimizeconst + def visit_Concat(self, node, frame): + if frame.eval_ctx.volatile: + func_name = '(context.eval_ctx.volatile and' \ + ' markup_join or unicode_join)' + elif frame.eval_ctx.autoescape: + func_name = 'markup_join' + else: + func_name = 'unicode_join' + self.write('%s((' % func_name) + for arg in node.nodes: + self.visit(arg, frame) + self.write(', ') + self.write('))') + + @optimizeconst + def visit_Compare(self, node, frame): + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + + def visit_Operand(self, node, frame): + self.write(' %s ' % operators[node.op]) + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node, frame): + self.write('environment.getattr(') + self.visit(node.node, frame) + self.write(', %r)' % node.attr) + + @optimizeconst + def visit_Getitem(self, node, frame): + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write('[') + self.visit(node.arg, frame) + self.write(']') + else: + self.write('environment.getitem(') + self.visit(node.node, frame) + self.write(', ') + self.visit(node.arg, frame) + self.write(')') + + def visit_Slice(self, node, frame): + if node.start is not None: + self.visit(node.start, frame) + self.write(':') + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(':') + self.visit(node.step, frame) + + @optimizeconst + def visit_Filter(self, node, frame): + if self.environment.is_async: + self.write('await auto_await(') + self.write(self.filters[node.name] + '(') + func = self.environment.filters.get(node.name) + if func is None: + self.fail('no filter named %r' % node.name, node.lineno) + if getattr(func, 'contextfilter', False): + self.write('context, ') + elif getattr(func, 'evalcontextfilter', False): + self.write('context.eval_ctx, ') + elif getattr(func, 'environmentfilter', False): + self.write('environment, ') + + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write('(context.eval_ctx.autoescape and' + ' Markup(concat(%s)) or concat(%s))' % + (frame.buffer, frame.buffer)) + elif frame.eval_ctx.autoescape: + self.write('Markup(concat(%s))' % frame.buffer) + else: + self.write('concat(%s)' % frame.buffer) + self.signature(node, frame) + self.write(')') + if self.environment.is_async: + self.write(')') + + @optimizeconst + def visit_Test(self, node, frame): + self.write(self.tests[node.name] + '(') + if node.name not in self.environment.tests: + self.fail('no test named %r' % node.name, node.lineno) + self.visit(node.node, frame) + self.signature(node, frame) + self.write(')') + + @optimizeconst + def visit_CondExpr(self, node, frame): + def write_expr2(): + if node.expr2 is not None: + return self.visit(node.expr2, frame) + self.write('undefined(%r)' % ('the inline if-' + 'expression on %s evaluated to false and ' + 'no else section was defined.' % self.position(node))) + + self.write('(') + self.visit(node.expr1, frame) + self.write(' if ') + self.visit(node.test, frame) + self.write(' else ') + write_expr2() + self.write(')') + + @optimizeconst + def visit_Call(self, node, frame, forward_caller=False): + if self.environment.is_async: + self.write('await auto_await(') + if self.environment.sandboxed: + self.write('environment.call(context, ') + else: + self.write('context.call(') + self.visit(node.node, frame) + extra_kwargs = forward_caller and {'caller': 'caller'} or None + self.signature(node, frame, extra_kwargs) + self.write(')') + if self.environment.is_async: + self.write(')') + + def visit_Keyword(self, node, frame): + self.write(node.key + '=') + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node, frame): + self.write('Markup(') + self.visit(node.expr, frame) + self.write(')') + + def visit_MarkSafeIfAutoescape(self, node, frame): + self.write('(context.eval_ctx.autoescape and Markup or identity)(') + self.visit(node.expr, frame) + self.write(')') + + def visit_EnvironmentAttribute(self, node, frame): + self.write('environment.' + node.name) + + def visit_ExtensionAttribute(self, node, frame): + self.write('environment.extensions[%r].%s' % (node.identifier, node.name)) + + def visit_ImportedName(self, node, frame): + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node, frame): + self.write(node.name) + + def visit_ContextReference(self, node, frame): + self.write('context') + + def visit_Continue(self, node, frame): + self.writeline('continue', node) + + def visit_Break(self, node, frame): + self.writeline('break', node) + + def visit_Scope(self, node, frame): + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_EvalContextModifier(self, node, frame): + for keyword in node.options: + self.writeline('context.eval_ctx.%s = ' % keyword.key) + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier(self, node, frame): + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline('%s = context.eval_ctx.save()' % old_ctx_name) + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline('context.eval_ctx.revert(%s)' % old_ctx_name) diff --git a/lib/spack/external/jinja2/constants.py b/lib/spack/external/jinja2/constants.py new file mode 100644 index 0000000000..11efd1ed15 --- /dev/null +++ b/lib/spack/external/jinja2/constants.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +""" + jinja.constants + ~~~~~~~~~~~~~~~ + + Various constants. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" + + +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = u'''\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate''' diff --git a/lib/spack/external/jinja2/debug.py b/lib/spack/external/jinja2/debug.py new file mode 100644 index 0000000000..07c21f1a8b --- /dev/null +++ b/lib/spack/external/jinja2/debug.py @@ -0,0 +1,372 @@ +# -*- coding: utf-8 -*- +""" + jinja2.debug + ~~~~~~~~~~~~ + + Implements the debug interface for Jinja. This module does some pretty + ugly stuff with the Python traceback system in order to achieve tracebacks + with correct line numbers, locals and contents. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +import sys +import traceback +from types import TracebackType, CodeType +from jinja2.utils import missing, internal_code +from jinja2.exceptions import TemplateSyntaxError +from jinja2._compat import iteritems, reraise, PY2 + +# on pypy we can take advantage of transparent proxies +try: + from __pypy__ import tproxy +except ImportError: + tproxy = None + + +# how does the raise helper look like? +try: + exec("raise TypeError, 'foo'") +except SyntaxError: + raise_helper = 'raise __jinja_exception__[1]' +except TypeError: + raise_helper = 'raise __jinja_exception__[0], __jinja_exception__[1]' + + +class TracebackFrameProxy(object): + """Proxies a traceback frame.""" + + def __init__(self, tb): + self.tb = tb + self._tb_next = None + + @property + def tb_next(self): + return self._tb_next + + def set_next(self, next): + if tb_set_next is not None: + try: + tb_set_next(self.tb, next and next.tb or None) + except Exception: + # this function can fail due to all the hackery it does + # on various python implementations. We just catch errors + # down and ignore them if necessary. + pass + self._tb_next = next + + @property + def is_jinja_frame(self): + return '__jinja_template__' in self.tb.tb_frame.f_globals + + def __getattr__(self, name): + return getattr(self.tb, name) + + +def make_frame_proxy(frame): + proxy = TracebackFrameProxy(frame) + if tproxy is None: + return proxy + def operation_handler(operation, *args, **kwargs): + if operation in ('__getattribute__', '__getattr__'): + return getattr(proxy, args[0]) + elif operation == '__setattr__': + proxy.__setattr__(*args, **kwargs) + else: + return getattr(proxy, operation)(*args, **kwargs) + return tproxy(TracebackType, operation_handler) + + +class ProcessedTraceback(object): + """Holds a Jinja preprocessed traceback for printing or reraising.""" + + def __init__(self, exc_type, exc_value, frames): + assert frames, 'no frames for this traceback?' + self.exc_type = exc_type + self.exc_value = exc_value + self.frames = frames + + # newly concatenate the frames (which are proxies) + prev_tb = None + for tb in self.frames: + if prev_tb is not None: + prev_tb.set_next(tb) + prev_tb = tb + prev_tb.set_next(None) + + def render_as_text(self, limit=None): + """Return a string with the traceback.""" + lines = traceback.format_exception(self.exc_type, self.exc_value, + self.frames[0], limit=limit) + return ''.join(lines).rstrip() + + def render_as_html(self, full=False): + """Return a unicode string with the traceback as rendered HTML.""" + from jinja2.debugrenderer import render_traceback + return u'%s\n\n' % ( + render_traceback(self, full=full), + self.render_as_text().decode('utf-8', 'replace') + ) + + @property + def is_template_syntax_error(self): + """`True` if this is a template syntax error.""" + return isinstance(self.exc_value, TemplateSyntaxError) + + @property + def exc_info(self): + """Exception info tuple with a proxy around the frame objects.""" + return self.exc_type, self.exc_value, self.frames[0] + + @property + def standard_exc_info(self): + """Standard python exc_info for re-raising""" + tb = self.frames[0] + # the frame will be an actual traceback (or transparent proxy) if + # we are on pypy or a python implementation with support for tproxy + if type(tb) is not TracebackType: + tb = tb.tb + return self.exc_type, self.exc_value, tb + + +def make_traceback(exc_info, source_hint=None): + """Creates a processed traceback object from the exc_info.""" + exc_type, exc_value, tb = exc_info + if isinstance(exc_value, TemplateSyntaxError): + exc_info = translate_syntax_error(exc_value, source_hint) + initial_skip = 0 + else: + initial_skip = 1 + return translate_exception(exc_info, initial_skip) + + +def translate_syntax_error(error, source=None): + """Rewrites a syntax error to please traceback systems.""" + error.source = source + error.translated = True + exc_info = (error.__class__, error, None) + filename = error.filename + if filename is None: + filename = '' + return fake_exc_info(exc_info, filename, error.lineno) + + +def translate_exception(exc_info, initial_skip=0): + """If passed an exc_info it will automatically rewrite the exceptions + all the way down to the correct line numbers and frames. + """ + tb = exc_info[2] + frames = [] + + # skip some internal frames if wanted + for x in range(initial_skip): + if tb is not None: + tb = tb.tb_next + initial_tb = tb + + while tb is not None: + # skip frames decorated with @internalcode. These are internal + # calls we can't avoid and that are useless in template debugging + # output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + # save a reference to the next frame if we override the current + # one with a faked one. + next = tb.tb_next + + # fake template exceptions + template = tb.tb_frame.f_globals.get('__jinja_template__') + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + tb = fake_exc_info(exc_info[:2] + (tb,), template.filename, + lineno)[2] + + frames.append(make_frame_proxy(tb)) + tb = next + + # if we don't have any exceptions in the frames left, we have to + # reraise it unchanged. + # XXX: can we backup here? when could this happen? + if not frames: + reraise(exc_info[0], exc_info[1], exc_info[2]) + + return ProcessedTraceback(exc_info[0], exc_info[1], frames) + + +def get_jinja_locals(real_locals): + ctx = real_locals.get('context') + if ctx: + locals = ctx.get_all() + else: + locals = {} + + local_overrides = {} + + for name, value in iteritems(real_locals): + if not name.startswith('l_') or value is missing: + continue + try: + _, depth, name = name.split('_', 2) + depth = int(depth) + except ValueError: + continue + cur_depth = local_overrides.get(name, (-1,))[0] + if cur_depth < depth: + local_overrides[name] = (depth, value) + + for name, (_, value) in iteritems(local_overrides): + if value is missing: + locals.pop(name, None) + else: + locals[name] = value + + return locals + + +def fake_exc_info(exc_info, filename, lineno): + """Helper for `translate_exception`.""" + exc_type, exc_value, tb = exc_info + + # figure the real context out + if tb is not None: + locals = get_jinja_locals(tb.tb_frame.f_locals) + + # if there is a local called __jinja_exception__, we get + # rid of it to not break the debug functionality. + locals.pop('__jinja_exception__', None) + else: + locals = {} + + # assamble fake globals we need + globals = { + '__name__': filename, + '__file__': filename, + '__jinja_exception__': exc_info[:2], + + # we don't want to keep the reference to the template around + # to not cause circular dependencies, but we mark it as Jinja + # frame for the ProcessedTraceback + '__jinja_template__': None + } + + # and fake the exception + code = compile('\n' * (lineno - 1) + raise_helper, filename, 'exec') + + # if it's possible, change the name of the code. This won't work + # on some python environments such as google appengine + try: + if tb is None: + location = 'template' + else: + function = tb.tb_frame.f_code.co_name + if function == 'root': + location = 'top-level template code' + elif function.startswith('block_'): + location = 'block "%s"' % function[6:] + else: + location = 'template' + + if PY2: + code = CodeType(0, code.co_nlocals, code.co_stacksize, + code.co_flags, code.co_code, code.co_consts, + code.co_names, code.co_varnames, filename, + location, code.co_firstlineno, + code.co_lnotab, (), ()) + else: + code = CodeType(0, code.co_kwonlyargcount, + code.co_nlocals, code.co_stacksize, + code.co_flags, code.co_code, code.co_consts, + code.co_names, code.co_varnames, filename, + location, code.co_firstlineno, + code.co_lnotab, (), ()) + except Exception as e: + pass + + # execute the code and catch the new traceback + try: + exec(code, globals, locals) + except: + exc_info = sys.exc_info() + new_tb = exc_info[2].tb_next + + # return without this frame + return exc_info[:2] + (new_tb,) + + +def _init_ugly_crap(): + """This function implements a few ugly things so that we can patch the + traceback objects. The function returned allows resetting `tb_next` on + any python traceback object. Do not attempt to use this on non cpython + interpreters + """ + import ctypes + from types import TracebackType + + if PY2: + # figure out size of _Py_ssize_t for Python 2: + if hasattr(ctypes.pythonapi, 'Py_InitModule4_64'): + _Py_ssize_t = ctypes.c_int64 + else: + _Py_ssize_t = ctypes.c_int + else: + # platform ssize_t on Python 3 + _Py_ssize_t = ctypes.c_ssize_t + + # regular python + class _PyObject(ctypes.Structure): + pass + _PyObject._fields_ = [ + ('ob_refcnt', _Py_ssize_t), + ('ob_type', ctypes.POINTER(_PyObject)) + ] + + # python with trace + if hasattr(sys, 'getobjects'): + class _PyObject(ctypes.Structure): + pass + _PyObject._fields_ = [ + ('_ob_next', ctypes.POINTER(_PyObject)), + ('_ob_prev', ctypes.POINTER(_PyObject)), + ('ob_refcnt', _Py_ssize_t), + ('ob_type', ctypes.POINTER(_PyObject)) + ] + + class _Traceback(_PyObject): + pass + _Traceback._fields_ = [ + ('tb_next', ctypes.POINTER(_Traceback)), + ('tb_frame', ctypes.POINTER(_PyObject)), + ('tb_lasti', ctypes.c_int), + ('tb_lineno', ctypes.c_int) + ] + + def tb_set_next(tb, next): + """Set the tb_next attribute of a traceback object.""" + if not (isinstance(tb, TracebackType) and + (next is None or isinstance(next, TracebackType))): + raise TypeError('tb_set_next arguments must be traceback objects') + obj = _Traceback.from_address(id(tb)) + if tb.tb_next is not None: + old = _Traceback.from_address(id(tb.tb_next)) + old.ob_refcnt -= 1 + if next is None: + obj.tb_next = ctypes.POINTER(_Traceback)() + else: + next = _Traceback.from_address(id(next)) + next.ob_refcnt += 1 + obj.tb_next = ctypes.pointer(next) + + return tb_set_next + + +# try to get a tb_set_next implementation if we don't have transparent +# proxies. +tb_set_next = None +if tproxy is None: + try: + tb_set_next = _init_ugly_crap() + except: + pass + del _init_ugly_crap diff --git a/lib/spack/external/jinja2/defaults.py b/lib/spack/external/jinja2/defaults.py new file mode 100644 index 0000000000..35903883cd --- /dev/null +++ b/lib/spack/external/jinja2/defaults.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +""" + jinja2.defaults + ~~~~~~~~~~~~~~~ + + Jinja default filters and tags. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +from jinja2._compat import range_type +from jinja2.utils import generate_lorem_ipsum, Cycler, Joiner + + +# defaults for the parser / lexer +BLOCK_START_STRING = '{%' +BLOCK_END_STRING = '%}' +VARIABLE_START_STRING = '{{' +VARIABLE_END_STRING = '}}' +COMMENT_START_STRING = '{#' +COMMENT_END_STRING = '#}' +LINE_STATEMENT_PREFIX = None +LINE_COMMENT_PREFIX = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE = '\n' +KEEP_TRAILING_NEWLINE = False + + +# default filters, tests and namespace +from jinja2.filters import FILTERS as DEFAULT_FILTERS +from jinja2.tests import TESTS as DEFAULT_TESTS +DEFAULT_NAMESPACE = { + 'range': range_type, + 'dict': dict, + 'lipsum': generate_lorem_ipsum, + 'cycler': Cycler, + 'joiner': Joiner +} + + +# default policies +DEFAULT_POLICIES = { + 'compiler.ascii_str': True, + 'urlize.rel': 'noopener', + 'urlize.target': None, + 'truncate.leeway': 5, + 'json.dumps_function': None, + 'json.dumps_kwargs': {'sort_keys': True}, +} + + +# export all constants +__all__ = tuple(x for x in locals().keys() if x.isupper()) diff --git a/lib/spack/external/jinja2/environment.py b/lib/spack/external/jinja2/environment.py new file mode 100644 index 0000000000..2a4d3d7da9 --- /dev/null +++ b/lib/spack/external/jinja2/environment.py @@ -0,0 +1,1276 @@ +# -*- coding: utf-8 -*- +""" + jinja2.environment + ~~~~~~~~~~~~~~~~~~ + + Provides a class that holds runtime and parsing time options. + + :copyright: (c) 2017 by the Jinja Team. + :license: BSD, see LICENSE for more details. +""" +import os +import sys +import weakref +from functools import reduce, partial +from jinja2 import nodes +from jinja2.defaults import BLOCK_START_STRING, \ + BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \ + COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \ + LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \ + DEFAULT_FILTERS, DEFAULT_TESTS, DEFAULT_NAMESPACE, \ + DEFAULT_POLICIES, KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS +from jinja2.lexer import get_lexer, TokenStream +from jinja2.parser import Parser +from jinja2.nodes import EvalContext +from jinja2.compiler import generate, CodeGenerator +from jinja2.runtime import Undefined, new_context, Context +from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \ + TemplatesNotFound, TemplateRuntimeError +from jinja2.utils import import_string, LRUCache, Markup, missing, \ + concat, consume, internalcode, have_async_gen +from jinja2._compat import imap, ifilter, string_types, iteritems, \ + text_type, reraise, implements_iterator, implements_to_string, \ + encode_filename, PY2, PYPY + + +# for direct template usage we have up to ten living environments +_spontaneous_environments = LRUCache(10) + +# the function to create jinja traceback objects. This is dynamically +# imported on the first exception in the exception handler. +_make_traceback = None + + +def get_spontaneous_environment(*args): + """Return a new spontaneous environment. A spontaneous environment is an + unnamed and unaccessible (in theory) environment that is used for + templates generated from a string and not from the file system. + """ + try: + env = _spontaneous_environments.get(args) + except TypeError: + return Environment(*args) + if env is not None: + return env + _spontaneous_environments[args] = env = Environment(*args) + env.shared = True + return env + + +def create_cache(size): + """Return the cache class for the given size.""" + if size == 0: + return None + if size < 0: + return {} + return LRUCache(size) + + +def copy_cache(cache): + """Create an empty copy of the given cache.""" + if cache is None: + return None + elif type(cache) is dict: + return {} + return LRUCache(cache.capacity) + + +def load_extensions(environment, extensions): + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated environments. + """ + result = {} + for extension in extensions: + if isinstance(extension, string_types): + extension = import_string(extension) + result[extension.identifier] = extension(environment) + return result + + +def fail_for_missing_callable(string, name): + msg = string % name + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = '%s (%s; did you forget to quote the callable name?)' % (msg, e) + raise TemplateRuntimeError(msg) + + +def _environment_sanity_check(environment): + """Perform a sanity check on the environment.""" + assert issubclass(environment.undefined, Undefined), 'undefined must ' \ + 'be a subclass of undefined because filters depend on it.' + assert environment.block_start_string != \ + environment.variable_start_string != \ + environment.comment_start_string, 'block, variable and comment ' \ + 'start strings must be different' + assert environment.newline_sequence in ('\r', '\r\n', '\n'), \ + 'newline_sequence set to unknown line ending string.' + return environment + + +class Environment(object): + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~jinja2.utils.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which allows + you to take advantage of newer Python features. This requires + Python 3.6 or later. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: these are currently EXPERIMENTAL undocumented features. + exception_handler = None + exception_formatter = None + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class = CodeGenerator + + #: the context class thatis used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class = Context + + def __init__(self, + block_start_string=BLOCK_START_STRING, + block_end_string=BLOCK_END_STRING, + variable_start_string=VARIABLE_START_STRING, + variable_end_string=VARIABLE_END_STRING, + comment_start_string=COMMENT_START_STRING, + comment_end_string=COMMENT_END_STRING, + line_statement_prefix=LINE_STATEMENT_PREFIX, + line_comment_prefix=LINE_COMMENT_PREFIX, + trim_blocks=TRIM_BLOCKS, + lstrip_blocks=LSTRIP_BLOCKS, + newline_sequence=NEWLINE_SEQUENCE, + keep_trailing_newline=KEEP_TRAILING_NEWLINE, + extensions=(), + optimized=True, + undefined=Undefined, + finalize=None, + autoescape=False, + loader=None, + cache_size=400, + auto_reload=True, + bytecode_cache=None, + enable_async=False): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.enable_async = enable_async + self.is_async = self.enable_async and have_async_gen + + _environment_sanity_check(self) + + def add_extension(self, extension): + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes): + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in iteritems(attributes): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay(self, block_start_string=missing, block_end_string=missing, + variable_start_string=missing, variable_end_string=missing, + comment_start_string=missing, comment_end_string=missing, + line_statement_prefix=missing, line_comment_prefix=missing, + trim_blocks=missing, lstrip_blocks=missing, + extensions=missing, optimized=missing, + undefined=missing, finalize=missing, autoescape=missing, + loader=missing, cache_size=missing, auto_reload=missing, + bytecode_cache=missing): + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + """ + args = dict(locals()) + del args['self'], args['cache_size'], args['extensions'] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in iteritems(args): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in iteritems(self.extensions): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + return _environment_sanity_check(rv) + + lexer = property(get_lexer, doc="The lexer for this environment.") + + def iter_extensions(self): + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), + key=lambda x: x.priority)) + + def getitem(self, obj, argument): + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, string_types): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj, attribute): + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a bytestring. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def call_filter(self, name, value, args=None, kwargs=None, + context=None, eval_ctx=None): + """Invokes a filter on a value the same way the compiler does it. + + Note that on Python 3 this might return a coroutine in case the + filter is running from an environment in async mode and the filter + supports async execution. It's your responsibility to await this + if needed. + + .. versionadded:: 2.7 + """ + func = self.filters.get(name) + if func is None: + fail_for_missing_callable('no filter named %r', name) + args = [value] + list(args or ()) + if getattr(func, 'contextfilter', False): + if context is None: + raise TemplateRuntimeError('Attempted to invoke context ' + 'filter without context') + args.insert(0, context) + elif getattr(func, 'evalcontextfilter', False): + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + args.insert(0, eval_ctx) + elif getattr(func, 'environmentfilter', False): + args.insert(0, self) + return func(*args, **(kwargs or {})) + + def call_test(self, name, value, args=None, kwargs=None): + """Invokes a test on a value the same way the compiler does it. + + .. versionadded:: 2.7 + """ + func = self.tests.get(name) + if func is None: + fail_for_missing_callable('no test named %r', name) + return func(value, *(args or ()), **(kwargs or {})) + + @internalcode + def parse(self, source, name=None, filename=None): + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja2 extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + exc_info = sys.exc_info() + self.handle_exception(exc_info, source_hint=source) + + def _parse(self, source, name, filename): + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, encode_filename(filename)).parse() + + def lex(self, source, name=None, filename=None): + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = text_type(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + exc_info = sys.exc_info() + self.handle_exception(exc_info, source_hint=source) + + def preprocess(self, source, name=None, filename=None): + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce(lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), text_type(source)) + + def _tokenize(self, source, name, filename=None, state=None): + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + return stream + + def _generate(self, source, name, filename, defer_init=False): + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate(source, self, name, filename, defer_init=defer_init, + optimized=self.optimized) + + def _compile(self, source, filename): + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, 'exec') + + @internalcode + def compile(self, source, name=None, filename=None, raw=False, + defer_init=False): + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, string_types): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, + defer_init=defer_init) + if raw: + return source + if filename is None: + filename = '